Merge "Validate pending intents"
diff --git a/StubLibraries.bp b/StubLibraries.bp
index 05bf7b6..4aab65e 100644
--- a/StubLibraries.bp
+++ b/StubLibraries.bp
@@ -142,11 +142,6 @@
baseline_file: "api/lint-baseline.txt",
},
},
- dist: {
- targets: ["sdk", "win_sdk"],
- dir: "apistubs/android/public/api",
- dest: "android.txt",
- },
jdiff_enabled: true,
}
@@ -209,11 +204,6 @@
baseline_file: "api/system-lint-baseline.txt",
},
},
- dist: {
- targets: ["sdk", "win_sdk"],
- dir: "apistubs/android/system/api",
- dest: "android.txt",
- },
jdiff_enabled: true,
}
@@ -294,11 +284,6 @@
baseline_file: "api/module-lib-lint-baseline.txt",
},
},
- dist: {
- targets: ["sdk", "win_sdk"],
- dir: "apistubs/android/module-lib/api",
- dest: "android.txt",
- },
}
droidstubs {
@@ -367,6 +352,7 @@
srcs: [ ":api-stubs-docs-non-updatable" ],
static_libs: [
"conscrypt.module.public.api.stubs",
+ "framework-appsearch.stubs",
"framework-graphics.stubs",
"framework-media.stubs",
"framework-mediaprovider.stubs",
diff --git a/api/Android.bp b/api/Android.bp
index f0218b8..388bb68 100644
--- a/api/Android.bp
+++ b/api/Android.bp
@@ -48,6 +48,7 @@
name: "frameworks-base-api-current-merged.txt",
srcs: [
":conscrypt.module.public.api{.public.api.txt}",
+ ":framework-appsearch{.public.api.txt}",
":framework-graphics{.public.api.txt}",
":framework-media{.public.api.txt}",
":framework-mediaprovider{.public.api.txt}",
@@ -61,12 +62,19 @@
out: ["current.txt"],
tools: ["metalava"],
cmd: "$(location metalava) --no-banner --format=v2 $(in) --api $(out)",
+ dist: {
+ targets: ["sdk", "win_sdk"],
+ dir: "apistubs/android/public/api",
+ dest: "android.txt",
+ },
}
genrule {
name: "frameworks-base-api-removed-merged.txt",
srcs: [
":conscrypt.module.public.api{.public.removed-api.txt}",
+ ":framework-appsearch{.public.removed-api.txt}",
+ ":framework-graphics{.public.removed-api.txt}",
":framework-media{.public.removed-api.txt}",
":framework-mediaprovider{.public.removed-api.txt}",
":framework-permission{.public.removed-api.txt}",
@@ -84,6 +92,7 @@
genrule {
name: "frameworks-base-api-system-current-merged.txt",
srcs: [
+ ":framework-appsearch{.system.api.txt}",
":framework-graphics{.system.api.txt}",
":framework-media{.system.api.txt}",
":framework-mediaprovider{.system.api.txt}",
@@ -97,11 +106,18 @@
out: ["system-current.txt"],
tools: ["metalava"],
cmd: "$(location metalava) --no-banner --format=v2 $(in) --api $(out)",
+ dist: {
+ targets: ["sdk", "win_sdk"],
+ dir: "apistubs/android/system/api",
+ dest: "android.txt",
+ },
}
genrule {
name: "frameworks-base-api-system-removed-merged.txt",
srcs: [
+ ":framework-appsearch{.system.removed-api.txt}",
+ ":framework-graphics{.system.removed-api.txt}",
":framework-media{.system.removed-api.txt}",
":framework-mediaprovider{.system.removed-api.txt}",
":framework-permission{.system.removed-api.txt}",
@@ -119,6 +135,7 @@
genrule {
name: "frameworks-base-api-module-lib-current-merged.txt",
srcs: [
+ ":framework-appsearch{.module-lib.api.txt}",
":framework-graphics{.module-lib.api.txt}",
":framework-media{.module-lib.api.txt}",
":framework-mediaprovider{.module-lib.api.txt}",
@@ -132,11 +149,18 @@
out: ["module-lib-current.txt"],
tools: ["metalava"],
cmd: "$(location metalava) --no-banner --format=v2 $(in) --api $(out)",
+ dist: {
+ targets: ["sdk", "win_sdk"],
+ dir: "apistubs/android/module-lib/api",
+ dest: "android.txt",
+ },
}
genrule {
name: "frameworks-base-api-module-lib-removed-merged.txt",
srcs: [
+ ":framework-appsearch{.module-lib.removed-api.txt}",
+ ":framework-graphics{.module-lib.removed-api.txt}",
":framework-media{.module-lib.removed-api.txt}",
":framework-mediaprovider{.module-lib.removed-api.txt}",
":framework-permission{.module-lib.removed-api.txt}",
diff --git a/api/current.txt b/api/current.txt
index c3fb70c..51b33ac 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -25456,6 +25456,7 @@
public static final class MediaCodec.CryptoInfo {
ctor public MediaCodec.CryptoInfo();
+ method @NonNull public android.media.MediaCodec.CryptoInfo.Pattern getPattern();
method public void set(int, @NonNull int[], @NonNull int[], @NonNull byte[], @NonNull byte[], int);
method public void setPattern(android.media.MediaCodec.CryptoInfo.Pattern);
field public byte[] iv;
@@ -26408,7 +26409,7 @@
method public boolean containsKey(String);
method public int describeContents();
method public android.graphics.Bitmap getBitmap(String);
- method @IntRange(from=0) public int getBitmapDimensionLimit();
+ method @IntRange(from=1) public int getBitmapDimensionLimit();
method @NonNull public android.media.MediaDescription getDescription();
method public long getLong(String);
method public android.media.Rating getRating(String);
@@ -26458,7 +26459,7 @@
method public android.media.MediaMetadata.Builder putRating(String, android.media.Rating);
method public android.media.MediaMetadata.Builder putString(String, String);
method public android.media.MediaMetadata.Builder putText(String, CharSequence);
- method @NonNull public android.media.MediaMetadata.Builder setBitmapDimensionLimit(int);
+ method @NonNull public android.media.MediaMetadata.Builder setBitmapDimensionLimit(@IntRange(from=1) int);
}
@Deprecated public abstract class MediaMetadataEditor {
diff --git a/api/module-lib-current.txt b/api/module-lib-current.txt
index 2d24d5b..dc92b52 100644
--- a/api/module-lib-current.txt
+++ b/api/module-lib-current.txt
@@ -53,6 +53,10 @@
field public static final int FLAG_FROM_KEY = 4096; // 0x1000
}
+ public class MediaMetadataRetriever implements java.lang.AutoCloseable {
+ field public static final int METADATA_KEY_VIDEO_CODEC_MIME_TYPE = 40; // 0x28
+ }
+
@Deprecated public final class MediaParceledListSlice<T extends android.os.Parcelable> implements android.os.Parcelable {
ctor @Deprecated public MediaParceledListSlice(@NonNull java.util.List<T>);
method @Deprecated public int describeContents();
diff --git a/api/test-current.txt b/api/test-current.txt
index 4e79dc2..7666337 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -23,6 +23,7 @@
field public static final String REMOVE_TASKS = "android.permission.REMOVE_TASKS";
field public static final String RESET_APP_ERRORS = "android.permission.RESET_APP_ERRORS";
field public static final String SUSPEND_APPS = "android.permission.SUSPEND_APPS";
+ field public static final String TEST_BIOMETRIC = "android.permission.TEST_BIOMETRIC";
field public static final String TEST_MANAGE_ROLLBACKS = "android.permission.TEST_MANAGE_ROLLBACKS";
field public static final String UPGRADE_RUNTIME_PERMISSIONS = "android.permission.UPGRADE_RUNTIME_PERMISSIONS";
field public static final String WRITE_DEVICE_CONFIG = "android.permission.WRITE_DEVICE_CONFIG";
@@ -1223,6 +1224,35 @@
}
+package android.hardware.biometrics {
+
+ public class BiometricManager {
+ method @NonNull @RequiresPermission(android.Manifest.permission.TEST_BIOMETRIC) public android.hardware.biometrics.BiometricTestSession getTestSession();
+ }
+
+ public class BiometricTestSession implements java.lang.AutoCloseable {
+ method @RequiresPermission(android.Manifest.permission.TEST_BIOMETRIC) public void authenticateReject(int, int);
+ method @RequiresPermission(android.Manifest.permission.TEST_BIOMETRIC) public void authenticateSuccess(int, int);
+ method @RequiresPermission(android.Manifest.permission.TEST_BIOMETRIC) public void close();
+ method @RequiresPermission(android.Manifest.permission.TEST_BIOMETRIC) public void enableTestHal(int, boolean);
+ method @RequiresPermission(android.Manifest.permission.TEST_BIOMETRIC) public void enrollFinish(int, int);
+ method @RequiresPermission(android.Manifest.permission.TEST_BIOMETRIC) public void enrollStart(int, int);
+ method @NonNull @RequiresPermission(android.Manifest.permission.TEST_BIOMETRIC) public java.util.List<android.hardware.biometrics.SensorProperties> getSensorProperties();
+ method @RequiresPermission(android.Manifest.permission.TEST_BIOMETRIC) public void internalCleanup(int, int);
+ method @RequiresPermission(android.Manifest.permission.TEST_BIOMETRIC) public void notifyAcquired(int, int);
+ method @RequiresPermission(android.Manifest.permission.TEST_BIOMETRIC) public void notifyError(int, int);
+ }
+
+ public class SensorProperties {
+ method public int getSensorId();
+ method public int getSensorStrength();
+ field public static final int STRENGTH_CONVENIENCE = 0; // 0x0
+ field public static final int STRENGTH_STRONG = 2; // 0x2
+ field public static final int STRENGTH_WEAK = 1; // 0x1
+ }
+
+}
+
package android.hardware.camera2 {
public abstract class CameraDevice implements java.lang.AutoCloseable {
@@ -1328,6 +1358,14 @@
}
+package android.hardware.fingerprint {
+
+ @Deprecated public class FingerprintManager {
+ method @Deprecated @NonNull @RequiresPermission(android.Manifest.permission.TEST_BIOMETRIC) public android.hardware.biometrics.BiometricTestSession getTestSession();
+ }
+
+}
+
package android.hardware.hdmi {
public final class HdmiControlManager {
@@ -1719,7 +1757,6 @@
method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void getCurrentLocation(@NonNull android.location.LocationRequest, @Nullable android.os.CancellationSignal, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<android.location.Location>);
method @NonNull public String[] getIgnoreSettingsWhitelist();
method @Deprecated @Nullable @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public java.util.List<java.lang.String> getProviderPackages(@NonNull String);
- method @NonNull public java.util.List<android.location.LocationRequest> getTestProviderCurrentRequests(String);
method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestLocationUpdates(@Nullable android.location.LocationRequest, @NonNull android.location.LocationListener, @Nullable android.os.Looper);
method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestLocationUpdates(@Nullable android.location.LocationRequest, @NonNull java.util.concurrent.Executor, @NonNull android.location.LocationListener);
method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestLocationUpdates(@Nullable android.location.LocationRequest, @NonNull android.app.PendingIntent);
diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto
index 90c8788..4beb748 100644
--- a/cmds/statsd/src/atoms.proto
+++ b/cmds/statsd/src/atoms.proto
@@ -493,6 +493,8 @@
WifiConnectionStateChanged wifi_connection_state_changed = 308 [(module) = "wifi"];
HdmiCecActiveSourceChanged hdmi_cec_active_source_changed = 309 [(module) = "framework"];
HdmiCecMessageReported hdmi_cec_message_reported = 310 [(module) = "framework"];
+ AirplaneMode airplane_mode = 311 [(module) = "telephony"];
+ ModemRestart modem_restart = 312 [(module) = "telephony"];
// StatsdStats tracks platform atoms with ids upto 500.
// Update StatsdStats::kMaxPushedAtomId when atom ids here approach that value.
@@ -4466,6 +4468,7 @@
// which requires reboot and not eligible for any reboot promotion strategy
// (e.g. soft restart, notification restart).
NO_REBOOT_PROMOTION_STRATEGY_ELIGIBLE = 30;
+ REBOOT_TRIGGER_FAILURE = 31;
}
optional State state = 6;
// Possible experiment ids for monitoring this push.
@@ -10575,12 +10578,48 @@
}
/**
+ * Push information about usage of airplane mode.
+ *
+ * Logged from:
+ * frameworks/opt/telephony/src/java/com/android/internal/telephony/metrics/AirplaneModeStats.java
+ */
+message AirplaneMode {
+ // Status of airplane mode
+ optional bool is_enabled = 1;
+
+ // When is_enabled is false, indicates if this was a very short airplane mode toggle
+ // (i.e. airplane mode was disabled after less than 10 seconds from enablement).
+ optional bool short_toggle = 2;
+
+ // Carrier ID of the SIM card.
+ // See https://source.android.com/devices/tech/config/carrierid.
+ optional int32 carrier_id = 3;
+}
+
+/**
+ * Push information about modem restarts.
+ *
+ * Logged from:
+ * frameworks/opt/telephony/src/java/com/android/internal/telephony/metrics/ModemRestartStats.java
+ */
+message ModemRestart {
+ // Software version of the modem, as provided by android.os.Build.getRadioVersion().
+ optional string baseband_version = 1;
+
+ // Reason of the modem restart, as provided in the modemReset indication of IRadio HAL.
+ optional string reason = 2;
+
+ // Carrier ID of the first SIM card.
+ // See https://source.android.com/devices/tech/config/carrierid.
+ optional int32 carrier_id = 3;
+}
+
+/**
* Logs gnss stats from location service provider
*
* Pulled from:
* frameworks/base/location/java/com/android/internal/location/gnssmetrics/GnssMetrics.java
*/
-
message GnssStats {
// Number of location reports since boot
optional int64 location_reports = 1;
diff --git a/cmds/statsd/src/metrics/GaugeMetricProducer.cpp b/cmds/statsd/src/metrics/GaugeMetricProducer.cpp
index 9dda248..2a37b58 100644
--- a/cmds/statsd/src/metrics/GaugeMetricProducer.cpp
+++ b/cmds/statsd/src/metrics/GaugeMetricProducer.cpp
@@ -17,9 +17,11 @@
#define DEBUG false // STOPSHIP if true
#include "Log.h"
-#include "../guardrail/StatsdStats.h"
#include "GaugeMetricProducer.h"
-#include "../stats_log_util.h"
+
+#include "guardrail/StatsdStats.h"
+#include "metrics/parsing_utils/metrics_manager_util.h"
+#include "stats_log_util.h"
using android::util::FIELD_COUNT_REPEATED;
using android::util::FIELD_TYPE_BOOL;
@@ -154,6 +156,58 @@
}
}
+bool GaugeMetricProducer::onConfigUpdatedLocked(
+ const StatsdConfig& config, const int configIndex, const int metricIndex,
+ const vector<sp<AtomMatchingTracker>>& allAtomMatchingTrackers,
+ const unordered_map<int64_t, int>& oldAtomMatchingTrackerMap,
+ const unordered_map<int64_t, int>& newAtomMatchingTrackerMap,
+ const sp<EventMatcherWizard>& matcherWizard,
+ const vector<sp<ConditionTracker>>& allConditionTrackers,
+ const unordered_map<int64_t, int>& conditionTrackerMap, const sp<ConditionWizard>& wizard,
+ const unordered_map<int64_t, int>& metricToActivationMap,
+ unordered_map<int, vector<int>>& trackerToMetricMap,
+ unordered_map<int, vector<int>>& conditionToMetricMap,
+ unordered_map<int, vector<int>>& activationAtomTrackerToMetricMap,
+ unordered_map<int, vector<int>>& deactivationAtomTrackerToMetricMap,
+ vector<int>& metricsWithActivation) {
+ if (!MetricProducer::onConfigUpdatedLocked(
+ config, configIndex, metricIndex, allAtomMatchingTrackers,
+ oldAtomMatchingTrackerMap, newAtomMatchingTrackerMap, matcherWizard,
+ allConditionTrackers, conditionTrackerMap, wizard, metricToActivationMap,
+ trackerToMetricMap, conditionToMetricMap, activationAtomTrackerToMetricMap,
+ deactivationAtomTrackerToMetricMap, metricsWithActivation)) {
+ return false;
+ }
+
+ const GaugeMetric& metric = config.gauge_metric(configIndex);
+ // Update appropriate indices: mWhatMatcherIndex, mConditionIndex and MetricsManager maps.
+ if (!handleMetricWithAtomMatchingTrackers(metric.what(), metricIndex, /*enforceOneAtom=*/false,
+ allAtomMatchingTrackers, newAtomMatchingTrackerMap,
+ trackerToMetricMap, mWhatMatcherIndex)) {
+ return false;
+ }
+
+ // Need to update maps since the index changed, but mTriggerAtomId will not change.
+ int triggerTrackerIndex;
+ if (metric.has_trigger_event() &&
+ !handleMetricWithAtomMatchingTrackers(metric.trigger_event(), metricIndex,
+ /*enforceOneAtom=*/true, allAtomMatchingTrackers,
+ newAtomMatchingTrackerMap, trackerToMetricMap,
+ triggerTrackerIndex)) {
+ return false;
+ }
+
+ if (metric.has_condition() &&
+ !handleMetricWithConditions(metric.condition(), metricIndex, conditionTrackerMap,
+ metric.links(), allConditionTrackers, mConditionTrackerIndex,
+ conditionToMetricMap)) {
+ return false;
+ }
+ sp<EventMatcherWizard> tmpEventWizard = mEventMatcherWizard;
+ mEventMatcherWizard = matcherWizard;
+ return true;
+}
+
void GaugeMetricProducer::dumpStatesLocked(FILE* out, bool verbose) const {
if (mCurrentSlicedBucket == nullptr ||
mCurrentSlicedBucket->size() == 0) {
diff --git a/cmds/statsd/src/metrics/GaugeMetricProducer.h b/cmds/statsd/src/metrics/GaugeMetricProducer.h
index e933d4b..9bdaac9 100644
--- a/cmds/statsd/src/metrics/GaugeMetricProducer.h
+++ b/cmds/statsd/src/metrics/GaugeMetricProducer.h
@@ -53,8 +53,8 @@
// This gauge metric producer first register the puller to automatically pull the gauge at the
// beginning of each bucket. If the condition is met, insert it to the bucket info. Otherwise
// proactively pull the gauge when the condition is changed to be true. Therefore, the gauge metric
-// producer always reports the guage at the earliest time of the bucket when the condition is met.
-class GaugeMetricProducer : public virtual MetricProducer, public virtual PullDataReceiver {
+// producer always reports the gauge at the earliest time of the bucket when the condition is met.
+class GaugeMetricProducer : public MetricProducer, public virtual PullDataReceiver {
public:
GaugeMetricProducer(
const ConfigKey& key, const GaugeMetric& gaugeMetric, const int conditionIndex,
@@ -142,7 +142,23 @@
void pullAndMatchEventsLocked(const int64_t timestampNs);
- const int mWhatMatcherIndex;
+ bool onConfigUpdatedLocked(
+ const StatsdConfig& config, const int configIndex, const int metricIndex,
+ const std::vector<sp<AtomMatchingTracker>>& allAtomMatchingTrackers,
+ const std::unordered_map<int64_t, int>& oldAtomMatchingTrackerMap,
+ const std::unordered_map<int64_t, int>& newAtomMatchingTrackerMap,
+ const sp<EventMatcherWizard>& matcherWizard,
+ const std::vector<sp<ConditionTracker>>& allConditionTrackers,
+ const std::unordered_map<int64_t, int>& conditionTrackerMap,
+ const sp<ConditionWizard>& wizard,
+ const std::unordered_map<int64_t, int>& metricToActivationMap,
+ std::unordered_map<int, std::vector<int>>& trackerToMetricMap,
+ std::unordered_map<int, std::vector<int>>& conditionToMetricMap,
+ std::unordered_map<int, std::vector<int>>& activationAtomTrackerToMetricMap,
+ std::unordered_map<int, std::vector<int>>& deactivationAtomTrackerToMetricMap,
+ std::vector<int>& metricsWithActivation) override;
+
+ int mWhatMatcherIndex;
sp<EventMatcherWizard> mEventMatcherWizard;
@@ -209,6 +225,8 @@
FRIEND_TEST(GaugeMetricProducerTest_PartialBucket, TestPushedEvents);
FRIEND_TEST(GaugeMetricProducerTest_PartialBucket, TestPulled);
+
+ FRIEND_TEST(ConfigUpdateTest, TestUpdateGaugeMetrics);
};
} // namespace statsd
diff --git a/cmds/statsd/src/metrics/MetricProducer.h b/cmds/statsd/src/metrics/MetricProducer.h
index 4360010..18e62d2 100644
--- a/cmds/statsd/src/metrics/MetricProducer.h
+++ b/cmds/statsd/src/metrics/MetricProducer.h
@@ -568,6 +568,7 @@
FRIEND_TEST(ConfigUpdateTest, TestUpdateMetricActivations);
FRIEND_TEST(ConfigUpdateTest, TestUpdateCountMetrics);
FRIEND_TEST(ConfigUpdateTest, TestUpdateEventMetrics);
+ FRIEND_TEST(ConfigUpdateTest, TestUpdateGaugeMetrics);
FRIEND_TEST(ConfigUpdateTest, TestUpdateMetricsMultipleTypes);
};
diff --git a/cmds/statsd/src/metrics/parsing_utils/config_update_utils.cpp b/cmds/statsd/src/metrics/parsing_utils/config_update_utils.cpp
index 8477dba..93795d4 100644
--- a/cmds/statsd/src/metrics/parsing_utils/config_update_utils.cpp
+++ b/cmds/statsd/src/metrics/parsing_utils/config_update_utils.cpp
@@ -556,6 +556,44 @@
return true;
}
+// Called when a metric is preserved during a config update. Finds the metric in oldMetricProducers
+// and calls onConfigUpdated to update all indices.
+optional<sp<MetricProducer>> updateMetric(
+ const StatsdConfig& config, const int configIndex, const int metricIndex,
+ const int64_t metricId, const vector<sp<AtomMatchingTracker>>& allAtomMatchingTrackers,
+ const unordered_map<int64_t, int>& oldAtomMatchingTrackerMap,
+ const unordered_map<int64_t, int>& newAtomMatchingTrackerMap,
+ const sp<EventMatcherWizard>& matcherWizard,
+ const vector<sp<ConditionTracker>>& allConditionTrackers,
+ const unordered_map<int64_t, int>& conditionTrackerMap, const sp<ConditionWizard>& wizard,
+ const unordered_map<int64_t, int>& oldMetricProducerMap,
+ const vector<sp<MetricProducer>>& oldMetricProducers,
+ const unordered_map<int64_t, int>& metricToActivationMap,
+ unordered_map<int, vector<int>>& trackerToMetricMap,
+ unordered_map<int, vector<int>>& conditionToMetricMap,
+ unordered_map<int, vector<int>>& activationAtomTrackerToMetricMap,
+ unordered_map<int, vector<int>>& deactivationAtomTrackerToMetricMap,
+ vector<int>& metricsWithActivation) {
+ const auto& oldMetricProducerIt = oldMetricProducerMap.find(metricId);
+ if (oldMetricProducerIt == oldMetricProducerMap.end()) {
+ ALOGE("Could not find Metric %lld in the previous config, but expected it "
+ "to be there",
+ (long long)metricId);
+ return nullopt;
+ }
+ const int oldIndex = oldMetricProducerIt->second;
+ sp<MetricProducer> producer = oldMetricProducers[oldIndex];
+ if (!producer->onConfigUpdated(config, configIndex, metricIndex, allAtomMatchingTrackers,
+ oldAtomMatchingTrackerMap, newAtomMatchingTrackerMap,
+ matcherWizard, allConditionTrackers, conditionTrackerMap, wizard,
+ metricToActivationMap, trackerToMetricMap, conditionToMetricMap,
+ activationAtomTrackerToMetricMap,
+ deactivationAtomTrackerToMetricMap, metricsWithActivation)) {
+ return nullopt;
+ }
+ return {producer};
+}
+
bool updateMetrics(const ConfigKey& key, const StatsdConfig& config, const int64_t timeBaseNs,
const int64_t currentTimeNs, const sp<StatsPullerManager>& pullerManager,
const unordered_map<int64_t, int>& oldAtomMatchingTrackerMap,
@@ -609,41 +647,29 @@
// Now, perform the update. Must iterate the metric types in the same order
int metricIndex = 0;
for (int i = 0; i < config.count_metric_size(); i++, metricIndex++) {
- newMetricProducerMap[config.count_metric(i).id()] = metricIndex;
const CountMetric& metric = config.count_metric(i);
+ newMetricProducerMap[metric.id()] = metricIndex;
+ optional<sp<MetricProducer>> producer;
switch (metricsToUpdate[metricIndex]) {
case UPDATE_PRESERVE: {
- const auto& oldMetricProducerIt = oldMetricProducerMap.find(metric.id());
- if (oldMetricProducerIt == oldMetricProducerMap.end()) {
- ALOGE("Could not find Metric %lld in the previous config, but expected it "
- "to be there",
- (long long)metric.id());
- return false;
- }
- const int oldIndex = oldMetricProducerIt->second;
- sp<MetricProducer> producer = oldMetricProducers[oldIndex];
- producer->onConfigUpdated(
- config, i, metricIndex, allAtomMatchingTrackers, oldAtomMatchingTrackerMap,
- newAtomMatchingTrackerMap, matcherWizard, allConditionTrackers,
- conditionTrackerMap, wizard, metricToActivationMap, trackerToMetricMap,
+ producer = updateMetric(
+ config, i, metricIndex, metric.id(), allAtomMatchingTrackers,
+ oldAtomMatchingTrackerMap, newAtomMatchingTrackerMap, matcherWizard,
+ allConditionTrackers, conditionTrackerMap, wizard, oldMetricProducerMap,
+ oldMetricProducers, metricToActivationMap, trackerToMetricMap,
conditionToMetricMap, activationAtomTrackerToMetricMap,
deactivationAtomTrackerToMetricMap, metricsWithActivation);
- newMetricProducers.push_back(producer);
break;
}
case UPDATE_REPLACE:
case UPDATE_NEW: {
- sp<MetricProducer> producer = createCountMetricProducerAndUpdateMetadata(
+ producer = createCountMetricProducerAndUpdateMetadata(
key, config, timeBaseNs, currentTimeNs, metric, metricIndex,
allAtomMatchingTrackers, newAtomMatchingTrackerMap, allConditionTrackers,
conditionTrackerMap, initialConditionCache, wizard, stateAtomIdMap,
allStateGroupMaps, metricToActivationMap, trackerToMetricMap,
conditionToMetricMap, activationAtomTrackerToMetricMap,
deactivationAtomTrackerToMetricMap, metricsWithActivation);
- if (producer == nullptr) {
- return false;
- }
- newMetricProducers.push_back(producer);
break;
}
default: {
@@ -652,42 +678,34 @@
return false;
}
}
+ if (!producer) {
+ return false;
+ }
+ newMetricProducers.push_back(producer.value());
}
for (int i = 0; i < config.event_metric_size(); i++, metricIndex++) {
newMetricProducerMap[config.event_metric(i).id()] = metricIndex;
const EventMetric& metric = config.event_metric(i);
+ optional<sp<MetricProducer>> producer;
switch (metricsToUpdate[metricIndex]) {
case UPDATE_PRESERVE: {
- const auto& oldMetricProducerIt = oldMetricProducerMap.find(metric.id());
- if (oldMetricProducerIt == oldMetricProducerMap.end()) {
- ALOGE("Could not find Metric %lld in the previous config, but expected it "
- "to be there",
- (long long)metric.id());
- return false;
- }
- const int oldIndex = oldMetricProducerIt->second;
- sp<MetricProducer> producer = oldMetricProducers[oldIndex];
- producer->onConfigUpdated(
- config, i, metricIndex, allAtomMatchingTrackers, oldAtomMatchingTrackerMap,
- newAtomMatchingTrackerMap, matcherWizard, allConditionTrackers,
- conditionTrackerMap, wizard, metricToActivationMap, trackerToMetricMap,
+ producer = updateMetric(
+ config, i, metricIndex, metric.id(), allAtomMatchingTrackers,
+ oldAtomMatchingTrackerMap, newAtomMatchingTrackerMap, matcherWizard,
+ allConditionTrackers, conditionTrackerMap, wizard, oldMetricProducerMap,
+ oldMetricProducers, metricToActivationMap, trackerToMetricMap,
conditionToMetricMap, activationAtomTrackerToMetricMap,
deactivationAtomTrackerToMetricMap, metricsWithActivation);
- newMetricProducers.push_back(producer);
break;
}
case UPDATE_REPLACE:
case UPDATE_NEW: {
- sp<MetricProducer> producer = createEventMetricProducerAndUpdateMetadata(
+ producer = createEventMetricProducerAndUpdateMetadata(
key, config, timeBaseNs, metric, metricIndex, allAtomMatchingTrackers,
newAtomMatchingTrackerMap, allConditionTrackers, conditionTrackerMap,
initialConditionCache, wizard, metricToActivationMap, trackerToMetricMap,
conditionToMetricMap, activationAtomTrackerToMetricMap,
deactivationAtomTrackerToMetricMap, metricsWithActivation);
- if (producer == nullptr) {
- return false;
- }
- newMetricProducers.push_back(producer);
break;
}
default: {
@@ -696,8 +714,49 @@
return false;
}
}
+ if (!producer) {
+ return false;
+ }
+ newMetricProducers.push_back(producer.value());
}
- // TODO: perform update for count, gauge, value, duration metric.
+ for (int i = 0; i < config.gauge_metric_size(); i++, metricIndex++) {
+ const GaugeMetric& metric = config.gauge_metric(i);
+ newMetricProducerMap[metric.id()] = metricIndex;
+ optional<sp<MetricProducer>> producer;
+ switch (metricsToUpdate[metricIndex]) {
+ case UPDATE_PRESERVE: {
+ producer = updateMetric(
+ config, i, metricIndex, metric.id(), allAtomMatchingTrackers,
+ oldAtomMatchingTrackerMap, newAtomMatchingTrackerMap, matcherWizard,
+ allConditionTrackers, conditionTrackerMap, wizard, oldMetricProducerMap,
+ oldMetricProducers, metricToActivationMap, trackerToMetricMap,
+ conditionToMetricMap, activationAtomTrackerToMetricMap,
+ deactivationAtomTrackerToMetricMap, metricsWithActivation);
+ break;
+ }
+ case UPDATE_REPLACE:
+ case UPDATE_NEW: {
+ producer = createGaugeMetricProducerAndUpdateMetadata(
+ key, config, timeBaseNs, currentTimeNs, pullerManager, metric, metricIndex,
+ allAtomMatchingTrackers, newAtomMatchingTrackerMap, allConditionTrackers,
+ conditionTrackerMap, initialConditionCache, wizard, matcherWizard,
+ metricToActivationMap, trackerToMetricMap, conditionToMetricMap,
+ activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap,
+ metricsWithActivation);
+ break;
+ }
+ default: {
+ ALOGE("Metric \"%lld\" update state is unknown. This should never happen",
+ (long long)metric.id());
+ return false;
+ }
+ }
+ if (!producer) {
+ return false;
+ }
+ newMetricProducers.push_back(producer.value());
+ }
+ // TODO: perform update for value, duration metric.
const set<int> atomsAllowedFromAnyUid(config.whitelisted_atom_ids().begin(),
config.whitelisted_atom_ids().end());
diff --git a/cmds/statsd/src/metrics/parsing_utils/metrics_manager_util.cpp b/cmds/statsd/src/metrics/parsing_utils/metrics_manager_util.cpp
index 98c6222..34e265c 100644
--- a/cmds/statsd/src/metrics/parsing_utils/metrics_manager_util.cpp
+++ b/cmds/statsd/src/metrics/parsing_utils/metrics_manager_util.cpp
@@ -348,7 +348,7 @@
return true;
}
-sp<MetricProducer> createCountMetricProducerAndUpdateMetadata(
+optional<sp<MetricProducer>> createCountMetricProducerAndUpdateMetadata(
const ConfigKey& key, const StatsdConfig& config, const int64_t timeBaseNs,
const int64_t currentTimeNs, const CountMetric& metric, const int metricIndex,
const vector<sp<AtomMatchingTracker>>& allAtomMatchingTrackers,
@@ -366,14 +366,14 @@
vector<int>& metricsWithActivation) {
if (!metric.has_id() || !metric.has_what()) {
ALOGW("cannot find metric id or \"what\" in CountMetric \"%lld\"", (long long)metric.id());
- return nullptr;
+ return nullopt;
}
int trackerIndex;
if (!handleMetricWithAtomMatchingTrackers(metric.what(), metricIndex,
metric.has_dimensions_in_what(),
allAtomMatchingTrackers, atomMatchingTrackerMap,
trackerToMetricMap, trackerIndex)) {
- return nullptr;
+ return nullopt;
}
int conditionIndex = -1;
@@ -381,12 +381,12 @@
if (!handleMetricWithConditions(metric.condition(), metricIndex, conditionTrackerMap,
metric.links(), allConditionTrackers, conditionIndex,
conditionToMetricMap)) {
- return nullptr;
+ return nullopt;
}
} else {
if (metric.links_size() > 0) {
ALOGW("metrics has a MetricConditionLink but doesn't have a condition");
- return nullptr;
+ return nullopt;
}
}
@@ -395,12 +395,12 @@
if (metric.slice_by_state_size() > 0) {
if (!handleMetricWithStates(config, metric.slice_by_state(), stateAtomIdMap,
allStateGroupMaps, slicedStateAtoms, stateGroupMap)) {
- return nullptr;
+ return nullopt;
}
} else {
if (metric.state_link_size() > 0) {
ALOGW("CountMetric has a MetricStateLink but doesn't have a slice_by_state");
- return nullptr;
+ return nullopt;
}
}
@@ -410,20 +410,20 @@
atomMatchingTrackerMap, activationAtomTrackerToMetricMap,
deactivationAtomTrackerToMetricMap, metricsWithActivation,
eventActivationMap, eventDeactivationMap)) {
- return nullptr;
+ return nullopt;
}
uint64_t metricHash;
if (!getMetricProtoHash(config, metric, metric.id(), metricToActivationMap, metricHash)) {
- return nullptr;
+ return nullopt;
}
- return new CountMetricProducer(key, metric, conditionIndex, initialConditionCache, wizard,
- metricHash, timeBaseNs, currentTimeNs, eventActivationMap,
- eventDeactivationMap, slicedStateAtoms, stateGroupMap);
+ return {new CountMetricProducer(key, metric, conditionIndex, initialConditionCache, wizard,
+ metricHash, timeBaseNs, currentTimeNs, eventActivationMap,
+ eventDeactivationMap, slicedStateAtoms, stateGroupMap)};
}
-sp<MetricProducer> createEventMetricProducerAndUpdateMetadata(
+optional<sp<MetricProducer>> createEventMetricProducerAndUpdateMetadata(
const ConfigKey& key, const StatsdConfig& config, const int64_t timeBaseNs,
const EventMetric& metric, const int metricIndex,
const vector<sp<AtomMatchingTracker>>& allAtomMatchingTrackers,
@@ -439,13 +439,13 @@
vector<int>& metricsWithActivation) {
if (!metric.has_id() || !metric.has_what()) {
ALOGW("cannot find the metric name or what in config");
- return nullptr;
+ return nullopt;
}
int trackerIndex;
if (!handleMetricWithAtomMatchingTrackers(metric.what(), metricIndex, false,
allAtomMatchingTrackers, atomMatchingTrackerMap,
trackerToMetricMap, trackerIndex)) {
- return nullptr;
+ return nullopt;
}
int conditionIndex = -1;
@@ -453,12 +453,12 @@
if (!handleMetricWithConditions(metric.condition(), metricIndex, conditionTrackerMap,
metric.links(), allConditionTrackers, conditionIndex,
conditionToMetricMap)) {
- return nullptr;
+ return nullopt;
}
} else {
if (metric.links_size() > 0) {
ALOGW("metrics has a MetricConditionLink but doesn't have a condition");
- return nullptr;
+ return nullopt;
}
}
@@ -472,12 +472,125 @@
uint64_t metricHash;
if (!getMetricProtoHash(config, metric, metric.id(), metricToActivationMap, metricHash)) {
- return nullptr;
+ return nullopt;
}
- return new EventMetricProducer(key, metric, conditionIndex, initialConditionCache, wizard,
- metricHash, timeBaseNs, eventActivationMap,
- eventDeactivationMap);
+ return {new EventMetricProducer(key, metric, conditionIndex, initialConditionCache, wizard,
+ metricHash, timeBaseNs, eventActivationMap,
+ eventDeactivationMap)};
+}
+
+optional<sp<MetricProducer>> createGaugeMetricProducerAndUpdateMetadata(
+ const ConfigKey& key, const StatsdConfig& config, const int64_t timeBaseNs,
+ const int64_t currentTimeNs, const sp<StatsPullerManager>& pullerManager,
+ const GaugeMetric& metric, const int metricIndex,
+ const vector<sp<AtomMatchingTracker>>& allAtomMatchingTrackers,
+ const unordered_map<int64_t, int>& atomMatchingTrackerMap,
+ vector<sp<ConditionTracker>>& allConditionTrackers,
+ const unordered_map<int64_t, int>& conditionTrackerMap,
+ const vector<ConditionState>& initialConditionCache, const sp<ConditionWizard>& wizard,
+ const sp<EventMatcherWizard>& matcherWizard,
+ const unordered_map<int64_t, int>& metricToActivationMap,
+ unordered_map<int, vector<int>>& trackerToMetricMap,
+ unordered_map<int, vector<int>>& conditionToMetricMap,
+ unordered_map<int, vector<int>>& activationAtomTrackerToMetricMap,
+ unordered_map<int, vector<int>>& deactivationAtomTrackerToMetricMap,
+ vector<int>& metricsWithActivation) {
+ if (!metric.has_id() || !metric.has_what()) {
+ ALOGW("cannot find metric id or \"what\" in GaugeMetric \"%lld\"", (long long)metric.id());
+ return nullopt;
+ }
+
+ if ((!metric.gauge_fields_filter().has_include_all() ||
+ (metric.gauge_fields_filter().include_all() == false)) &&
+ !hasLeafNode(metric.gauge_fields_filter().fields())) {
+ ALOGW("Incorrect field filter setting in GaugeMetric %lld", (long long)metric.id());
+ return nullopt;
+ }
+ if ((metric.gauge_fields_filter().has_include_all() &&
+ metric.gauge_fields_filter().include_all() == true) &&
+ hasLeafNode(metric.gauge_fields_filter().fields())) {
+ ALOGW("Incorrect field filter setting in GaugeMetric %lld", (long long)metric.id());
+ return nullopt;
+ }
+
+ int trackerIndex;
+ if (!handleMetricWithAtomMatchingTrackers(metric.what(), metricIndex,
+ metric.has_dimensions_in_what(),
+ allAtomMatchingTrackers, atomMatchingTrackerMap,
+ trackerToMetricMap, trackerIndex)) {
+ return nullopt;
+ }
+
+ sp<AtomMatchingTracker> atomMatcher = allAtomMatchingTrackers.at(trackerIndex);
+ // For GaugeMetric atom, it should be simple matcher with one tagId.
+ if (atomMatcher->getAtomIds().size() != 1) {
+ return nullopt;
+ }
+ int atomTagId = *(atomMatcher->getAtomIds().begin());
+ int pullTagId = pullerManager->PullerForMatcherExists(atomTagId) ? atomTagId : -1;
+
+ int triggerTrackerIndex;
+ int triggerAtomId = -1;
+ if (metric.has_trigger_event()) {
+ if (pullTagId == -1) {
+ ALOGW("Pull atom not specified for trigger");
+ return nullopt;
+ }
+ // trigger_event should be used with FIRST_N_SAMPLES
+ if (metric.sampling_type() != GaugeMetric::FIRST_N_SAMPLES) {
+ ALOGW("Gauge Metric with trigger event must have sampling type FIRST_N_SAMPLES");
+ return nullopt;
+ }
+ if (!handleMetricWithAtomMatchingTrackers(metric.trigger_event(), metricIndex,
+ /*enforceOneAtom=*/true, allAtomMatchingTrackers,
+ atomMatchingTrackerMap, trackerToMetricMap,
+ triggerTrackerIndex)) {
+ return nullopt;
+ }
+ sp<AtomMatchingTracker> triggerAtomMatcher =
+ allAtomMatchingTrackers.at(triggerTrackerIndex);
+ triggerAtomId = *(triggerAtomMatcher->getAtomIds().begin());
+ }
+
+ if (!metric.has_trigger_event() && pullTagId != -1 &&
+ metric.sampling_type() == GaugeMetric::FIRST_N_SAMPLES) {
+ ALOGW("FIRST_N_SAMPLES is only for pushed event or pull_on_trigger");
+ return nullopt;
+ }
+
+ int conditionIndex = -1;
+ if (metric.has_condition()) {
+ if (!handleMetricWithConditions(metric.condition(), metricIndex, conditionTrackerMap,
+ metric.links(), allConditionTrackers, conditionIndex,
+ conditionToMetricMap)) {
+ return nullopt;
+ }
+ } else {
+ if (metric.links_size() > 0) {
+ ALOGW("metrics has a MetricConditionLink but doesn't have a condition");
+ return nullopt;
+ }
+ }
+
+ unordered_map<int, shared_ptr<Activation>> eventActivationMap;
+ unordered_map<int, vector<shared_ptr<Activation>>> eventDeactivationMap;
+ if (!handleMetricActivation(config, metric.id(), metricIndex, metricToActivationMap,
+ atomMatchingTrackerMap, activationAtomTrackerToMetricMap,
+ deactivationAtomTrackerToMetricMap, metricsWithActivation,
+ eventActivationMap, eventDeactivationMap)) {
+ return nullopt;
+ }
+
+ uint64_t metricHash;
+ if (!getMetricProtoHash(config, metric, metric.id(), metricToActivationMap, metricHash)) {
+ return nullopt;
+ }
+
+ return {new GaugeMetricProducer(key, metric, conditionIndex, initialConditionCache, wizard,
+ metricHash, trackerIndex, matcherWizard, pullTagId,
+ triggerAtomId, atomTagId, timeBaseNs, currentTimeNs,
+ pullerManager, eventActivationMap, eventDeactivationMap)};
}
bool initAtomMatchingTrackers(const StatsdConfig& config, const sp<UidMap>& uidMap,
@@ -628,17 +741,17 @@
int metricIndex = allMetricProducers.size();
const CountMetric& metric = config.count_metric(i);
metricMap.insert({metric.id(), metricIndex});
- sp<MetricProducer> producer = createCountMetricProducerAndUpdateMetadata(
+ optional<sp<MetricProducer>> producer = createCountMetricProducerAndUpdateMetadata(
key, config, timeBaseTimeNs, currentTimeNs, metric, metricIndex,
allAtomMatchingTrackers, atomMatchingTrackerMap, allConditionTrackers,
conditionTrackerMap, initialConditionCache, wizard, stateAtomIdMap,
allStateGroupMaps, metricToActivationMap, trackerToMetricMap, conditionToMetricMap,
activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap,
metricsWithActivation);
- if (producer == nullptr) {
+ if (!producer) {
return false;
}
- allMetricProducers.push_back(producer);
+ allMetricProducers.push_back(producer.value());
}
// build DurationMetricProducer
@@ -762,16 +875,16 @@
int metricIndex = allMetricProducers.size();
const EventMetric& metric = config.event_metric(i);
metricMap.insert({metric.id(), metricIndex});
- sp<MetricProducer> producer = createEventMetricProducerAndUpdateMetadata(
+ optional<sp<MetricProducer>> producer = createEventMetricProducerAndUpdateMetadata(
key, config, timeBaseTimeNs, metric, metricIndex, allAtomMatchingTrackers,
atomMatchingTrackerMap, allConditionTrackers, conditionTrackerMap,
initialConditionCache, wizard, metricToActivationMap, trackerToMetricMap,
conditionToMetricMap, activationAtomTrackerToMetricMap,
deactivationAtomTrackerToMetricMap, metricsWithActivation);
- if (producer == nullptr) {
+ if (!producer) {
return false;
}
- allMetricProducers.push_back(producer);
+ allMetricProducers.push_back(producer.value());
}
// build ValueMetricProducer
@@ -871,104 +984,20 @@
// Gauge metrics.
for (int i = 0; i < config.gauge_metric_size(); i++) {
- const GaugeMetric& metric = config.gauge_metric(i);
- if (!metric.has_what()) {
- ALOGW("cannot find \"what\" in GaugeMetric \"%lld\"", (long long)metric.id());
- return false;
- }
-
- if ((!metric.gauge_fields_filter().has_include_all() ||
- (metric.gauge_fields_filter().include_all() == false)) &&
- !hasLeafNode(metric.gauge_fields_filter().fields())) {
- ALOGW("Incorrect field filter setting in GaugeMetric %lld", (long long)metric.id());
- return false;
- }
- if ((metric.gauge_fields_filter().has_include_all() &&
- metric.gauge_fields_filter().include_all() == true) &&
- hasLeafNode(metric.gauge_fields_filter().fields())) {
- ALOGW("Incorrect field filter setting in GaugeMetric %lld", (long long)metric.id());
- return false;
- }
-
int metricIndex = allMetricProducers.size();
+ const GaugeMetric& metric = config.gauge_metric(i);
metricMap.insert({metric.id(), metricIndex});
- int trackerIndex;
- if (!handleMetricWithAtomMatchingTrackers(metric.what(), metricIndex,
- metric.has_dimensions_in_what(),
- allAtomMatchingTrackers, atomMatchingTrackerMap,
- trackerToMetricMap, trackerIndex)) {
- return false;
- }
-
- sp<AtomMatchingTracker> atomMatcher = allAtomMatchingTrackers.at(trackerIndex);
- // For GaugeMetric atom, it should be simple matcher with one tagId.
- if (atomMatcher->getAtomIds().size() != 1) {
- return false;
- }
- int atomTagId = *(atomMatcher->getAtomIds().begin());
- int pullTagId = pullerManager->PullerForMatcherExists(atomTagId) ? atomTagId : -1;
-
- int triggerTrackerIndex;
- int triggerAtomId = -1;
- if (metric.has_trigger_event()) {
- if (pullTagId == -1) {
- ALOGW("Pull atom not specified for trigger");
- return false;
- }
- // event_trigger should be used with FIRST_N_SAMPLES
- if (metric.sampling_type() != GaugeMetric::FIRST_N_SAMPLES) {
- return false;
- }
- if (!handleMetricWithAtomMatchingTrackers(
- metric.trigger_event(), metricIndex, /*enforceOneAtom=*/true,
- allAtomMatchingTrackers, atomMatchingTrackerMap, trackerToMetricMap,
- triggerTrackerIndex)) {
- return false;
- }
- sp<AtomMatchingTracker> triggerAtomMatcher =
- allAtomMatchingTrackers.at(triggerTrackerIndex);
- triggerAtomId = *(triggerAtomMatcher->getAtomIds().begin());
- }
-
- if (!metric.has_trigger_event() && pullTagId != -1 &&
- metric.sampling_type() == GaugeMetric::FIRST_N_SAMPLES) {
- ALOGW("FIRST_N_SAMPLES is only for pushed event or pull_on_trigger");
- return false;
- }
-
- int conditionIndex = -1;
- if (metric.has_condition()) {
- bool good = handleMetricWithConditions(
- metric.condition(), metricIndex, conditionTrackerMap, metric.links(),
- allConditionTrackers, conditionIndex, conditionToMetricMap);
- if (!good) {
- return false;
- }
- } else {
- if (metric.links_size() > 0) {
- ALOGW("metrics has a MetricConditionLink but doesn't have a condition");
- return false;
- }
- }
-
- unordered_map<int, shared_ptr<Activation>> eventActivationMap;
- unordered_map<int, vector<shared_ptr<Activation>>> eventDeactivationMap;
- bool success = handleMetricActivation(
- config, metric.id(), metricIndex, metricToActivationMap, atomMatchingTrackerMap,
+ optional<sp<MetricProducer>> producer = createGaugeMetricProducerAndUpdateMetadata(
+ key, config, timeBaseTimeNs, currentTimeNs, pullerManager, metric, metricIndex,
+ allAtomMatchingTrackers, atomMatchingTrackerMap, allConditionTrackers,
+ conditionTrackerMap, initialConditionCache, wizard, matcherWizard,
+ metricToActivationMap, trackerToMetricMap, conditionToMetricMap,
activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap,
- metricsWithActivation, eventActivationMap, eventDeactivationMap);
- if (!success) return false;
-
- uint64_t metricHash;
- if (!getMetricProtoHash(config, metric, metric.id(), metricToActivationMap, metricHash)) {
+ metricsWithActivation);
+ if (!producer) {
return false;
}
-
- sp<MetricProducer> gaugeProducer = new GaugeMetricProducer(
- key, metric, conditionIndex, initialConditionCache, wizard, metricHash,
- trackerIndex, matcherWizard, pullTagId, triggerAtomId, atomTagId, timeBaseTimeNs,
- currentTimeNs, pullerManager, eventActivationMap, eventDeactivationMap);
- allMetricProducers.push_back(gaugeProducer);
+ allMetricProducers.push_back(producer.value());
}
for (int i = 0; i < config.no_report_metric_size(); ++i) {
const auto no_report_metric = config.no_report_metric(i);
diff --git a/cmds/statsd/src/metrics/parsing_utils/metrics_manager_util.h b/cmds/statsd/src/metrics/parsing_utils/metrics_manager_util.h
index f6b2b7d..f909aff 100644
--- a/cmds/statsd/src/metrics/parsing_utils/metrics_manager_util.h
+++ b/cmds/statsd/src/metrics/parsing_utils/metrics_manager_util.h
@@ -94,8 +94,8 @@
std::unordered_map<int, std::vector<shared_ptr<Activation>>>& newEventDeactivationMap);
// Creates a CountMetricProducer and updates the vectors/maps used by MetricsManager with
-// the appropriate indices. Returns an sp to the producer, or null if there was an error.
-sp<MetricProducer> createCountMetricProducerAndUpdateMetadata(
+// the appropriate indices. Returns an sp to the producer, or nullopt if there was an error.
+optional<sp<MetricProducer>> createCountMetricProducerAndUpdateMetadata(
const ConfigKey& key, const StatsdConfig& config, const int64_t timeBaseNs,
const int64_t currentTimeNs, const CountMetric& metric, const int metricIndex,
const std::vector<sp<AtomMatchingTracker>>& allAtomMatchingTrackers,
@@ -113,8 +113,8 @@
std::vector<int>& metricsWithActivation);
// Creates an EventMetricProducer and updates the vectors/maps used by MetricsManager with
-// the appropriate indices. Returns an sp to the producer, or null if there was an error.
-sp<MetricProducer> createEventMetricProducerAndUpdateMetadata(
+// the appropriate indices. Returns an sp to the producer, or nullopt if there was an error.
+optional<sp<MetricProducer>> createEventMetricProducerAndUpdateMetadata(
const ConfigKey& key, const StatsdConfig& config, const int64_t timeBaseNs,
const EventMetric& metric, const int metricIndex,
const std::vector<sp<AtomMatchingTracker>>& allAtomMatchingTrackers,
@@ -129,6 +129,25 @@
std::unordered_map<int, std::vector<int>>& deactivationAtomTrackerToMetricMap,
std::vector<int>& metricsWithActivation);
+// Creates a GaugeMetricProducer and updates the vectors/maps used by MetricsManager with
+// the appropriate indices. Returns an sp to the producer, or nullopt if there was an error.
+optional<sp<MetricProducer>> createGaugeMetricProducerAndUpdateMetadata(
+ const ConfigKey& key, const StatsdConfig& config, const int64_t timeBaseNs,
+ const int64_t currentTimeNs, const sp<StatsPullerManager>& pullerManager,
+ const GaugeMetric& metric, const int metricIndex,
+ const std::vector<sp<AtomMatchingTracker>>& allAtomMatchingTrackers,
+ const std::unordered_map<int64_t, int>& atomMatchingTrackerMap,
+ std::vector<sp<ConditionTracker>>& allConditionTrackers,
+ const std::unordered_map<int64_t, int>& conditionTrackerMap,
+ const std::vector<ConditionState>& initialConditionCache, const sp<ConditionWizard>& wizard,
+ const sp<EventMatcherWizard>& matcherWizard,
+ const std::unordered_map<int64_t, int>& metricToActivationMap,
+ std::unordered_map<int, std::vector<int>>& trackerToMetricMap,
+ std::unordered_map<int, std::vector<int>>& conditionToMetricMap,
+ std::unordered_map<int, std::vector<int>>& activationAtomTrackerToMetricMap,
+ std::unordered_map<int, std::vector<int>>& deactivationAtomTrackerToMetricMap,
+ std::vector<int>& metricsWithActivation);
+
// Helper functions for MetricsManager to initialize from StatsdConfig.
// *Note*: only initStatsdConfig() should be called from outside.
// All other functions are intermediate
diff --git a/cmds/statsd/tests/metrics/parsing_utils/config_update_utils_test.cpp b/cmds/statsd/tests/metrics/parsing_utils/config_update_utils_test.cpp
index 70e4dea..60705cf 100644
--- a/cmds/statsd/tests/metrics/parsing_utils/config_update_utils_test.cpp
+++ b/cmds/statsd/tests/metrics/parsing_utils/config_update_utils_test.cpp
@@ -27,6 +27,7 @@
#include "src/condition/CombinationConditionTracker.h"
#include "src/condition/SimpleConditionTracker.h"
#include "src/matchers/CombinationAtomMatchingTracker.h"
+#include "src/metrics/GaugeMetricProducer.h"
#include "src/metrics/parsing_utils/metrics_manager_util.h"
#include "tests/statsd_test_util.h"
@@ -137,6 +138,23 @@
return metric;
}
+GaugeMetric createGaugeMetric(string name, int64_t what, GaugeMetric::SamplingType samplingType,
+ optional<int64_t> condition, optional<int64_t> triggerEvent) {
+ GaugeMetric metric;
+ metric.set_id(StringToId(name));
+ metric.set_what(what);
+ metric.set_bucket(TEN_MINUTES);
+ metric.set_sampling_type(samplingType);
+ if (condition) {
+ metric.set_condition(condition.value());
+ }
+ if (triggerEvent) {
+ metric.set_trigger_event(triggerEvent.value());
+ }
+ metric.mutable_gauge_fields_filter()->set_include_all(true);
+ return metric;
+}
+
} // anonymous namespace
TEST_F(ConfigUpdateTest, TestSimpleMatcherPreserve) {
@@ -1278,11 +1296,8 @@
Predicate predicate = CreateScreenIsOnPredicate();
*config.add_predicate() = predicate;
- GaugeMetric* metric = config.add_gauge_metric();
- metric->set_id(12345);
- metric->set_what(whatMatcher.id());
- metric->set_condition(predicate.id());
- metric->mutable_gauge_fields_filter()->set_include_all(true);
+ *config.add_gauge_metric() = createGaugeMetric(
+ "GAUGE1", whatMatcher.id(), GaugeMetric::RANDOM_ONE_SAMPLE, predicate.id(), nullopt);
EXPECT_TRUE(initConfig(config));
@@ -1300,15 +1315,13 @@
AtomMatcher whatMatcher = CreateScreenBrightnessChangedAtomMatcher();
*config.add_atom_matcher() = whatMatcher;
- GaugeMetric* metric = config.add_gauge_metric();
- metric->set_id(12345);
- metric->set_what(whatMatcher.id());
- metric->mutable_gauge_fields_filter()->set_include_all(true);
+ *config.add_gauge_metric() = createGaugeMetric(
+ "GAUGE1", whatMatcher.id(), GaugeMetric::RANDOM_ONE_SAMPLE, nullopt, nullopt);
EXPECT_TRUE(initConfig(config));
// Change split bucket on app upgrade, which should change the proto, causing replacement.
- metric->set_split_bucket_for_app_upgrade(false);
+ config.mutable_gauge_metric(0)->set_split_bucket_for_app_upgrade(false);
unordered_map<int64_t, int> metricToActivationMap;
vector<UpdateStatus> metricsToUpdate(1, UPDATE_UNKNOWN);
@@ -1324,10 +1337,8 @@
AtomMatcher whatMatcher = CreateScreenBrightnessChangedAtomMatcher();
*config.add_atom_matcher() = whatMatcher;
- GaugeMetric* metric = config.add_gauge_metric();
- metric->set_id(12345);
- metric->set_what(whatMatcher.id());
- metric->mutable_gauge_fields_filter()->set_include_all(true);
+ *config.add_gauge_metric() = createGaugeMetric(
+ "GAUGE1", whatMatcher.id(), GaugeMetric::RANDOM_ONE_SAMPLE, nullopt, nullopt);
EXPECT_TRUE(initConfig(config));
@@ -1352,11 +1363,8 @@
Predicate predicate = CreateScreenIsOnPredicate();
*config.add_predicate() = predicate;
- GaugeMetric* metric = config.add_gauge_metric();
- metric->set_id(12345);
- metric->set_what(whatMatcher.id());
- metric->set_condition(predicate.id());
- metric->mutable_gauge_fields_filter()->set_include_all(true);
+ *config.add_gauge_metric() = createGaugeMetric(
+ "GAUGE1", whatMatcher.id(), GaugeMetric::RANDOM_ONE_SAMPLE, predicate.id(), nullopt);
EXPECT_TRUE(initConfig(config));
@@ -1376,14 +1384,9 @@
AtomMatcher whatMatcher = CreateTemperatureAtomMatcher();
*config.add_atom_matcher() = whatMatcher;
- GaugeMetric* metric = config.add_gauge_metric();
- metric->set_id(12345);
- metric->set_what(whatMatcher.id());
- metric->set_trigger_event(triggerEvent.id());
- metric->mutable_gauge_fields_filter()->set_include_all(true);
- metric->set_sampling_type(GaugeMetric::FIRST_N_SAMPLES);
+ *config.add_gauge_metric() = createGaugeMetric(
+ "GAUGE1", whatMatcher.id(), GaugeMetric::FIRST_N_SAMPLES, nullopt, triggerEvent.id());
- // Create an initial config.
EXPECT_TRUE(initConfig(config));
unordered_map<int64_t, int> metricToActivationMap;
@@ -1856,6 +1859,221 @@
EXPECT_EQ(screenState.mValue.int_value, android::view::DisplayStateEnum::DISPLAY_STATE_ON);
}
+TEST_F(ConfigUpdateTest, TestUpdateGaugeMetrics) {
+ StatsdConfig config;
+
+ // Add atom matchers/predicates/states. These are mostly needed for initStatsdConfig.
+ AtomMatcher matcher1 = CreateScreenTurnedOnAtomMatcher();
+ int64_t matcher1Id = matcher1.id();
+ *config.add_atom_matcher() = matcher1;
+
+ AtomMatcher matcher2 = CreateScreenTurnedOffAtomMatcher();
+ int64_t matcher2Id = matcher2.id();
+ *config.add_atom_matcher() = matcher2;
+
+ AtomMatcher matcher3 = CreateStartScheduledJobAtomMatcher();
+ int64_t matcher3Id = matcher3.id();
+ *config.add_atom_matcher() = matcher3;
+
+ AtomMatcher matcher4 = CreateTemperatureAtomMatcher();
+ int64_t matcher4Id = matcher4.id();
+ *config.add_atom_matcher() = matcher4;
+
+ AtomMatcher matcher5 = CreateSimpleAtomMatcher("SubsystemSleep", util::SUBSYSTEM_SLEEP_STATE);
+ int64_t matcher5Id = matcher5.id();
+ *config.add_atom_matcher() = matcher5;
+
+ Predicate predicate1 = CreateScreenIsOnPredicate();
+ int64_t predicate1Id = predicate1.id();
+ *config.add_predicate() = predicate1;
+
+ // Add a few gauge metrics.
+ // Will be preserved.
+ GaugeMetric gauge1 = createGaugeMetric("GAUGE1", matcher4Id, GaugeMetric::FIRST_N_SAMPLES,
+ predicate1Id, matcher1Id);
+ int64_t gauge1Id = gauge1.id();
+ *config.add_gauge_metric() = gauge1;
+
+ // Will be replaced.
+ GaugeMetric gauge2 =
+ createGaugeMetric("GAUGE2", matcher1Id, GaugeMetric::FIRST_N_SAMPLES, nullopt, nullopt);
+ int64_t gauge2Id = gauge2.id();
+ *config.add_gauge_metric() = gauge2;
+
+ // Will be replaced.
+ GaugeMetric gauge3 = createGaugeMetric("GAUGE3", matcher5Id, GaugeMetric::FIRST_N_SAMPLES,
+ nullopt, matcher3Id);
+ int64_t gauge3Id = gauge3.id();
+ *config.add_gauge_metric() = gauge3;
+
+ // Will be replaced.
+ GaugeMetric gauge4 = createGaugeMetric("GAUGE4", matcher3Id, GaugeMetric::RANDOM_ONE_SAMPLE,
+ predicate1Id, nullopt);
+ int64_t gauge4Id = gauge4.id();
+ *config.add_gauge_metric() = gauge4;
+
+ // Will be deleted.
+ GaugeMetric gauge5 =
+ createGaugeMetric("GAUGE5", matcher2Id, GaugeMetric::RANDOM_ONE_SAMPLE, nullopt, {});
+ int64_t gauge5Id = gauge5.id();
+ *config.add_gauge_metric() = gauge5;
+
+ EXPECT_TRUE(initConfig(config));
+
+ // Used later to ensure the condition wizard is replaced. Get it before doing the update.
+ sp<EventMatcherWizard> oldMatcherWizard =
+ static_cast<GaugeMetricProducer*>(oldMetricProducers[0].get())->mEventMatcherWizard;
+ EXPECT_EQ(oldMatcherWizard->getStrongCount(), 6);
+
+ // Change gauge2, causing it to be replaced.
+ gauge2.set_max_num_gauge_atoms_per_bucket(50);
+
+ // Mark matcher 3 as replaced. Causes gauge3 and gauge4 to be replaced.
+ set<int64_t> replacedMatchers = {matcher3Id};
+
+ // New gauge metric.
+ GaugeMetric gauge6 = createGaugeMetric("GAUGE6", matcher5Id, GaugeMetric::FIRST_N_SAMPLES,
+ predicate1Id, matcher3Id);
+ int64_t gauge6Id = gauge6.id();
+
+ // Map the matchers and predicates in reverse order to force the indices to change.
+ std::unordered_map<int64_t, int> newAtomMatchingTrackerMap;
+ const int matcher5Index = 0;
+ newAtomMatchingTrackerMap[matcher5Id] = 0;
+ const int matcher4Index = 1;
+ newAtomMatchingTrackerMap[matcher4Id] = 1;
+ const int matcher3Index = 2;
+ newAtomMatchingTrackerMap[matcher3Id] = 2;
+ const int matcher2Index = 3;
+ newAtomMatchingTrackerMap[matcher2Id] = 3;
+ const int matcher1Index = 4;
+ newAtomMatchingTrackerMap[matcher1Id] = 4;
+ // Use the existing matchers. A bit hacky, but saves code and we don't rely on them.
+ vector<sp<AtomMatchingTracker>> newAtomMatchingTrackers(5);
+ std::reverse_copy(oldAtomMatchingTrackers.begin(), oldAtomMatchingTrackers.end(),
+ newAtomMatchingTrackers.begin());
+
+ std::unordered_map<int64_t, int> newConditionTrackerMap;
+ const int predicate1Index = 0;
+ newConditionTrackerMap[predicate1Id] = 0;
+ // Use the existing conditionTrackers. A bit hacky, but saves code and we don't rely on them.
+ vector<sp<ConditionTracker>> newConditionTrackers(1);
+ std::reverse_copy(oldConditionTrackers.begin(), oldConditionTrackers.end(),
+ newConditionTrackers.begin());
+ // Say that predicate1 is unknown since the initial condition never changed.
+ vector<ConditionState> conditionCache = {ConditionState::kUnknown};
+
+ StatsdConfig newConfig;
+ *newConfig.add_gauge_metric() = gauge6;
+ const int gauge6Index = 0;
+ *newConfig.add_gauge_metric() = gauge3;
+ const int gauge3Index = 1;
+ *newConfig.add_gauge_metric() = gauge1;
+ const int gauge1Index = 2;
+ *newConfig.add_gauge_metric() = gauge4;
+ const int gauge4Index = 3;
+ *newConfig.add_gauge_metric() = gauge2;
+ const int gauge2Index = 4;
+
+ // Output data structures to validate.
+ unordered_map<int64_t, int> newMetricProducerMap;
+ vector<sp<MetricProducer>> newMetricProducers;
+ unordered_map<int, vector<int>> conditionToMetricMap;
+ unordered_map<int, vector<int>> trackerToMetricMap;
+ set<int64_t> noReportMetricIds;
+ unordered_map<int, vector<int>> activationAtomTrackerToMetricMap;
+ unordered_map<int, vector<int>> deactivationAtomTrackerToMetricMap;
+ vector<int> metricsWithActivation;
+ EXPECT_TRUE(updateMetrics(
+ key, newConfig, /*timeBaseNs=*/123, /*currentTimeNs=*/12345, new StatsPullerManager(),
+ oldAtomMatchingTrackerMap, newAtomMatchingTrackerMap, replacedMatchers,
+ newAtomMatchingTrackers, newConditionTrackerMap, /*replacedConditions=*/{},
+ newConditionTrackers, conditionCache, /*stateAtomIdMap=*/{}, /*allStateGroupMaps=*/{},
+ /*replacedStates=*/{}, oldMetricProducerMap, oldMetricProducers, newMetricProducerMap,
+ newMetricProducers, conditionToMetricMap, trackerToMetricMap, noReportMetricIds,
+ activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap,
+ metricsWithActivation));
+
+ unordered_map<int64_t, int> expectedMetricProducerMap = {
+ {gauge1Id, gauge1Index}, {gauge2Id, gauge2Index}, {gauge3Id, gauge3Index},
+ {gauge4Id, gauge4Index}, {gauge6Id, gauge6Index},
+ };
+ EXPECT_THAT(newMetricProducerMap, ContainerEq(expectedMetricProducerMap));
+
+ // Make sure preserved metrics are the same.
+ ASSERT_EQ(newMetricProducers.size(), 5);
+ EXPECT_EQ(oldMetricProducers[oldMetricProducerMap.at(gauge1Id)],
+ newMetricProducers[newMetricProducerMap.at(gauge1Id)]);
+
+ // Make sure replaced metrics are different.
+ EXPECT_NE(oldMetricProducers[oldMetricProducerMap.at(gauge2Id)],
+ newMetricProducers[newMetricProducerMap.at(gauge2Id)]);
+ EXPECT_NE(oldMetricProducers[oldMetricProducerMap.at(gauge3Id)],
+ newMetricProducers[newMetricProducerMap.at(gauge3Id)]);
+ EXPECT_NE(oldMetricProducers[oldMetricProducerMap.at(gauge4Id)],
+ newMetricProducers[newMetricProducerMap.at(gauge4Id)]);
+
+ // Verify the conditionToMetricMap.
+ ASSERT_EQ(conditionToMetricMap.size(), 1);
+ const vector<int>& condition1Metrics = conditionToMetricMap[predicate1Index];
+ EXPECT_THAT(condition1Metrics, UnorderedElementsAre(gauge1Index, gauge4Index, gauge6Index));
+
+ // Verify the trackerToMetricMap.
+ ASSERT_EQ(trackerToMetricMap.size(), 4);
+ const vector<int>& matcher1Metrics = trackerToMetricMap[matcher1Index];
+ EXPECT_THAT(matcher1Metrics, UnorderedElementsAre(gauge1Index, gauge2Index));
+ const vector<int>& matcher3Metrics = trackerToMetricMap[matcher3Index];
+ EXPECT_THAT(matcher3Metrics, UnorderedElementsAre(gauge3Index, gauge4Index, gauge6Index));
+ const vector<int>& matcher4Metrics = trackerToMetricMap[matcher4Index];
+ EXPECT_THAT(matcher4Metrics, UnorderedElementsAre(gauge1Index));
+ const vector<int>& matcher5Metrics = trackerToMetricMap[matcher5Index];
+ EXPECT_THAT(matcher5Metrics, UnorderedElementsAre(gauge3Index, gauge6Index));
+
+ // Verify event activation/deactivation maps.
+ ASSERT_EQ(activationAtomTrackerToMetricMap.size(), 0);
+ ASSERT_EQ(deactivationAtomTrackerToMetricMap.size(), 0);
+ ASSERT_EQ(metricsWithActivation.size(), 0);
+
+ // Verify tracker indices/ids/conditions/states are correct.
+ GaugeMetricProducer* gaugeProducer1 =
+ static_cast<GaugeMetricProducer*>(newMetricProducers[gauge1Index].get());
+ EXPECT_EQ(gaugeProducer1->getMetricId(), gauge1Id);
+ EXPECT_EQ(gaugeProducer1->mConditionTrackerIndex, predicate1Index);
+ EXPECT_EQ(gaugeProducer1->mCondition, ConditionState::kUnknown);
+ EXPECT_EQ(gaugeProducer1->mWhatMatcherIndex, matcher4Index);
+ GaugeMetricProducer* gaugeProducer2 =
+ static_cast<GaugeMetricProducer*>(newMetricProducers[gauge2Index].get());
+ EXPECT_EQ(gaugeProducer2->getMetricId(), gauge2Id);
+ EXPECT_EQ(gaugeProducer2->mConditionTrackerIndex, -1);
+ EXPECT_EQ(gaugeProducer2->mCondition, ConditionState::kTrue);
+ EXPECT_EQ(gaugeProducer2->mWhatMatcherIndex, matcher1Index);
+ GaugeMetricProducer* gaugeProducer3 =
+ static_cast<GaugeMetricProducer*>(newMetricProducers[gauge3Index].get());
+ EXPECT_EQ(gaugeProducer3->getMetricId(), gauge3Id);
+ EXPECT_EQ(gaugeProducer3->mConditionTrackerIndex, -1);
+ EXPECT_EQ(gaugeProducer3->mCondition, ConditionState::kTrue);
+ EXPECT_EQ(gaugeProducer3->mWhatMatcherIndex, matcher5Index);
+ GaugeMetricProducer* gaugeProducer4 =
+ static_cast<GaugeMetricProducer*>(newMetricProducers[gauge4Index].get());
+ EXPECT_EQ(gaugeProducer4->getMetricId(), gauge4Id);
+ EXPECT_EQ(gaugeProducer4->mConditionTrackerIndex, predicate1Index);
+ EXPECT_EQ(gaugeProducer4->mCondition, ConditionState::kUnknown);
+ EXPECT_EQ(gaugeProducer4->mWhatMatcherIndex, matcher3Index);
+ GaugeMetricProducer* gaugeProducer6 =
+ static_cast<GaugeMetricProducer*>(newMetricProducers[gauge6Index].get());
+ EXPECT_EQ(gaugeProducer6->getMetricId(), gauge6Id);
+ EXPECT_EQ(gaugeProducer6->mConditionTrackerIndex, predicate1Index);
+ EXPECT_EQ(gaugeProducer6->mCondition, ConditionState::kUnknown);
+ EXPECT_EQ(gaugeProducer6->mWhatMatcherIndex, matcher5Index);
+
+ sp<EventMatcherWizard> newMatcherWizard = gaugeProducer1->mEventMatcherWizard;
+ EXPECT_NE(newMatcherWizard, oldMatcherWizard);
+ EXPECT_EQ(newMatcherWizard->getStrongCount(), 6);
+ oldMetricProducers.clear();
+ // Only reference to the old wizard should be the one in the test.
+ EXPECT_EQ(oldMatcherWizard->getStrongCount(), 1);
+}
+
TEST_F(ConfigUpdateTest, TestUpdateMetricActivations) {
StatsdConfig config;
// Add atom matchers
@@ -1995,6 +2213,10 @@
int64_t matcher2Id = matcher2.id();
*config.add_atom_matcher() = matcher2;
+ AtomMatcher matcher3 = CreateTemperatureAtomMatcher();
+ int64_t matcher3Id = matcher3.id();
+ *config.add_atom_matcher() = matcher3;
+
Predicate predicate1 = CreateScreenIsOnPredicate();
int64_t predicate1Id = predicate1.id();
*config.add_predicate() = predicate1;
@@ -2010,24 +2232,35 @@
int64_t eventMetricId = eventMetric.id();
*config.add_event_metric() = eventMetric;
+ // Will be replaced because the definition changes - a predicate is added.
+ GaugeMetric gaugeMetric = createGaugeMetric("GAUGE1", matcher3Id,
+ GaugeMetric::RANDOM_ONE_SAMPLE, nullopt, nullopt);
+ int64_t gaugeMetricId = gaugeMetric.id();
+ *config.add_gauge_metric() = gaugeMetric;
+
EXPECT_TRUE(initConfig(config));
// Used later to ensure the condition wizard is replaced. Get it before doing the update.
sp<ConditionWizard> oldConditionWizard = oldMetricProducers[0]->mWizard;
- EXPECT_EQ(oldConditionWizard->getStrongCount(), 3);
+ EXPECT_EQ(oldConditionWizard->getStrongCount(), 4);
// Mark matcher 2 as replaced. Causes eventMetric to be replaced.
set<int64_t> replacedMatchers;
replacedMatchers.insert(matcher2Id);
+ // Add predicate1 as a predicate on gaugeMetric, causing it to be replaced.
+ gaugeMetric.set_condition(predicate1Id);
+
// Map the matchers and predicates in reverse order to force the indices to change.
std::unordered_map<int64_t, int> newAtomMatchingTrackerMap;
- const int matcher2Index = 0;
- newAtomMatchingTrackerMap[matcher2Id] = 0;
- const int matcher1Index = 1;
- newAtomMatchingTrackerMap[matcher1Id] = 1;
+ const int matcher3Index = 0;
+ newAtomMatchingTrackerMap[matcher3Id] = 0;
+ const int matcher2Index = 1;
+ newAtomMatchingTrackerMap[matcher2Id] = 1;
+ const int matcher1Index = 2;
+ newAtomMatchingTrackerMap[matcher1Id] = 2;
// Use the existing matchers. A bit hacky, but saves code and we don't rely on them.
- vector<sp<AtomMatchingTracker>> newAtomMatchingTrackers(2);
+ vector<sp<AtomMatchingTracker>> newAtomMatchingTrackers(3);
std::reverse_copy(oldAtomMatchingTrackers.begin(), oldAtomMatchingTrackers.end(),
newAtomMatchingTrackers.begin());
@@ -2045,6 +2278,8 @@
const int countMetricIndex = 0;
*newConfig.add_event_metric() = eventMetric;
const int eventMetricIndex = 1;
+ *newConfig.add_gauge_metric() = gaugeMetric;
+ const int gaugeMetricIndex = 2;
// Output data structures to validate.
unordered_map<int64_t, int> newMetricProducerMap;
@@ -2068,29 +2303,34 @@
unordered_map<int64_t, int> expectedMetricProducerMap = {
{countMetricId, countMetricIndex},
{eventMetricId, eventMetricIndex},
+ {gaugeMetricId, gaugeMetricIndex},
};
EXPECT_THAT(newMetricProducerMap, ContainerEq(expectedMetricProducerMap));
// Make sure preserved metrics are the same.
- ASSERT_EQ(newMetricProducers.size(), 2);
+ ASSERT_EQ(newMetricProducers.size(), 3);
EXPECT_EQ(oldMetricProducers[oldMetricProducerMap.at(countMetricId)],
newMetricProducers[newMetricProducerMap.at(countMetricId)]);
// Make sure replaced metrics are different.
EXPECT_NE(oldMetricProducers[oldMetricProducerMap.at(eventMetricId)],
newMetricProducers[newMetricProducerMap.at(eventMetricId)]);
+ EXPECT_NE(oldMetricProducers[oldMetricProducerMap.at(gaugeMetricId)],
+ newMetricProducers[newMetricProducerMap.at(gaugeMetricId)]);
// Verify the conditionToMetricMap.
ASSERT_EQ(conditionToMetricMap.size(), 1);
const vector<int>& condition1Metrics = conditionToMetricMap[predicate1Index];
- EXPECT_THAT(condition1Metrics, UnorderedElementsAre(countMetricIndex));
+ EXPECT_THAT(condition1Metrics, UnorderedElementsAre(countMetricIndex, gaugeMetricIndex));
// Verify the trackerToMetricMap.
- ASSERT_EQ(trackerToMetricMap.size(), 2);
+ ASSERT_EQ(trackerToMetricMap.size(), 3);
const vector<int>& matcher1Metrics = trackerToMetricMap[matcher1Index];
EXPECT_THAT(matcher1Metrics, UnorderedElementsAre(countMetricIndex));
const vector<int>& matcher2Metrics = trackerToMetricMap[matcher2Index];
EXPECT_THAT(matcher2Metrics, UnorderedElementsAre(eventMetricIndex));
+ const vector<int>& matcher3Metrics = trackerToMetricMap[matcher3Index];
+ EXPECT_THAT(matcher3Metrics, UnorderedElementsAre(gaugeMetricIndex));
// Verify event activation/deactivation maps.
ASSERT_EQ(activationAtomTrackerToMetricMap.size(), 0);
@@ -2104,10 +2344,13 @@
EXPECT_EQ(newMetricProducers[eventMetricIndex]->getMetricId(), eventMetricId);
EXPECT_EQ(newMetricProducers[eventMetricIndex]->mConditionTrackerIndex, -1);
EXPECT_EQ(newMetricProducers[eventMetricIndex]->mCondition, ConditionState::kTrue);
+ EXPECT_EQ(newMetricProducers[gaugeMetricIndex]->getMetricId(), gaugeMetricId);
+ EXPECT_EQ(newMetricProducers[gaugeMetricIndex]->mConditionTrackerIndex, predicate1Index);
+ EXPECT_EQ(newMetricProducers[gaugeMetricIndex]->mCondition, ConditionState::kUnknown);
sp<ConditionWizard> newConditionWizard = newMetricProducers[0]->mWizard;
EXPECT_NE(newConditionWizard, oldConditionWizard);
- EXPECT_EQ(newConditionWizard->getStrongCount(), 3);
+ EXPECT_EQ(newConditionWizard->getStrongCount(), 4);
oldMetricProducers.clear();
// Only reference to the old wizard should be the one in the test.
EXPECT_EQ(oldConditionWizard->getStrongCount(), 1);
diff --git a/core/java/android/app/ActivityOptions.java b/core/java/android/app/ActivityOptions.java
index 85cb120..3748a33 100644
--- a/core/java/android/app/ActivityOptions.java
+++ b/core/java/android/app/ActivityOptions.java
@@ -1284,10 +1284,10 @@
}
/**
- * Sets the id of the display where activity should be launched.
- * An app can launch activities on public displays or private displays that are owned by the app
- * or where an app already has activities. Otherwise, trying to launch on a private display
- * or providing an invalid display id will result in an exception.
+ * Sets the id of the display where the activity should be launched.
+ * An app can launch activities on public displays or displays where the app already has
+ * activities. Otherwise, trying to launch on a private display or providing an invalid display
+ * id will result in an exception.
* <p>
* Setting launch display id will be ignored on devices that don't have
* {@link android.content.pm.PackageManager#FEATURE_ACTIVITIES_ON_SECONDARY_DISPLAYS}.
diff --git a/core/java/android/hardware/biometrics/BiometricManager.java b/core/java/android/hardware/biometrics/BiometricManager.java
index 8d0cc68..35ef53b 100644
--- a/core/java/android/hardware/biometrics/BiometricManager.java
+++ b/core/java/android/hardware/biometrics/BiometricManager.java
@@ -16,14 +16,17 @@
package android.hardware.biometrics;
+import static android.Manifest.permission.TEST_BIOMETRIC;
import static android.Manifest.permission.USE_BIOMETRIC;
import static android.Manifest.permission.USE_BIOMETRIC_INTERNAL;
import static android.Manifest.permission.WRITE_DEVICE_CONFIG;
import android.annotation.IntDef;
+import android.annotation.NonNull;
import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
import android.annotation.SystemService;
+import android.annotation.TestApi;
import android.content.Context;
import android.os.RemoteException;
import android.security.keystore.KeyGenParameterSpec;
@@ -196,6 +199,17 @@
}
/**
+ * Retrieves a test session for BiometricManager/BiometricPrompt.
+ * @hide
+ */
+ @TestApi
+ @NonNull
+ @RequiresPermission(TEST_BIOMETRIC)
+ public BiometricTestSession getTestSession() {
+ return null; // TODO(169459906)
+ }
+
+ /**
* Determine if biometrics can be used. In other words, determine if
* {@link BiometricPrompt} can be expected to be shown (hardware available, templates enrolled,
* user-enabled). This is the equivalent of {@link #canAuthenticate(int)} with
diff --git a/core/java/android/hardware/biometrics/BiometricTestSession.java b/core/java/android/hardware/biometrics/BiometricTestSession.java
new file mode 100644
index 0000000..719efa8
--- /dev/null
+++ b/core/java/android/hardware/biometrics/BiometricTestSession.java
@@ -0,0 +1,202 @@
+/*
+ * 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 static android.Manifest.permission.TEST_BIOMETRIC;
+
+import android.annotation.NonNull;
+import android.annotation.RequiresPermission;
+import android.annotation.TestApi;
+import android.content.Context;
+import android.os.RemoteException;
+import android.util.Log;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Common set of interfaces to test biometric-related APIs, including {@link BiometricPrompt} and
+ * {@link android.hardware.fingerprint.FingerprintManager}.
+ * @hide
+ */
+@TestApi
+public class BiometricTestSession implements AutoCloseable {
+
+ private static final String TAG = "TestManager";
+
+ private final Context mContext;
+ private final ITestService mTestService;
+
+ /**
+ * @hide
+ */
+ public BiometricTestSession(@NonNull Context context, @NonNull ITestService testService) {
+ mContext = context;
+ mTestService = testService;
+ }
+
+ /**
+ * @return A list of {@link SensorProperties}
+ */
+ @NonNull
+ @RequiresPermission(TEST_BIOMETRIC)
+ public List<SensorProperties> getSensorProperties() {
+ try {
+ final List<SensorPropertiesInternal> internalProps =
+ mTestService.getSensorPropertiesInternal(mContext.getOpPackageName());
+ final List<SensorProperties> props = new ArrayList<>();
+ for (SensorPropertiesInternal internalProp : internalProps) {
+ props.add(new SensorProperties(internalProp.sensorId, internalProp.sensorStrength));
+ }
+ return props;
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Switches the specified sensor to use a test HAL. In this mode, the framework will not invoke
+ * any methods on the real HAL implementation. This allows the framework to test a substantial
+ * portion of the framework code that would otherwise require human interaction. Note that
+ * secure pathways such as HAT/Keystore are not testable, since they depend on the TEE or its
+ * equivalent for the secret key.
+ *
+ * @param sensorId Sensor that this command applies to.
+ * @param enableTestHal If true, enable testing with a fake HAL instead of the real HAL.
+ */
+ @RequiresPermission(TEST_BIOMETRIC)
+ public void enableTestHal(int sensorId, boolean enableTestHal) {
+ try {
+ mTestService.enableTestHal(sensorId, enableTestHal);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Remote exception", e);
+ }
+ }
+
+ /**
+ * Starts the enrollment process. This should generally be used when the test HAL is enabled.
+ *
+ * @param sensorId Sensor that this command applies to.
+ * @param userId User that this command applies to.
+ */
+ @RequiresPermission(TEST_BIOMETRIC)
+ public void enrollStart(int sensorId, int userId) {
+ try {
+ mTestService.enrollStart(sensorId, userId);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Remote exception", e);
+ }
+ }
+
+ /**
+ * Finishes the enrollment process. Simulates the HAL's callback.
+ *
+ * @param sensorId Sensor that this command applies to.
+ * @param userId User that this command applies to.
+ */
+ @RequiresPermission(TEST_BIOMETRIC)
+ public void enrollFinish(int sensorId, int userId) {
+ try {
+ mTestService.enrollFinish(sensorId, userId);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Remote exception", e);
+ }
+ }
+
+ /**
+ * Simulates a successful authentication, but does not provide a valid HAT.
+ *
+ * @param sensorId Sensor that this command applies to.
+ * @param userId User that this command applies to.
+ */
+ @RequiresPermission(TEST_BIOMETRIC)
+ public void authenticateSuccess(int sensorId, int userId) {
+ try {
+ mTestService.authenticateSuccess(sensorId, userId);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Remote exception", e);
+ }
+ }
+
+ /**
+ * Simulates a rejected attempt.
+ *
+ * @param sensorId Sensor that this command applies to.
+ * @param userId User that this command applies to.
+ */
+ @RequiresPermission(TEST_BIOMETRIC)
+ public void authenticateReject(int sensorId, int userId) {
+ try {
+ mTestService.authenticateReject(sensorId, userId);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Remote exception", e);
+ }
+ }
+
+ /**
+ * Simulates an acquired message from the HAL.
+ *
+ * @param sensorId Sensor that this command applies to.
+ * @param userId User that this command applies to.
+ */
+ @RequiresPermission(TEST_BIOMETRIC)
+ public void notifyAcquired(int sensorId, int userId) {
+ try {
+ mTestService.notifyAcquired(sensorId, userId);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Remote exception", e);
+ }
+ }
+
+ /**
+ * Simulates an error message from the HAL.
+ *
+ * @param sensorId Sensor that this command applies to.
+ * @param userId User that this command applies to.
+ */
+ @RequiresPermission(TEST_BIOMETRIC)
+ public void notifyError(int sensorId, int userId) {
+ try {
+ mTestService.notifyError(sensorId, userId);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Remote exception", e);
+ }
+ }
+
+ /**
+ * Matches the framework's cached enrollments against the HAL's enrollments. Any enrollment
+ * that isn't known by both sides are deleted. This should generally be used when the test
+ * HAL is disabled (e.g. to clean up after a test).
+ *
+ * @param sensorId Sensor that this command applies to.
+ * @param userId User that this command applies to.
+ */
+ @RequiresPermission(TEST_BIOMETRIC)
+ public void internalCleanup(int sensorId, int userId) {
+ try {
+ mTestService.internalCleanup(sensorId, userId);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Remote exception", e);
+ }
+ }
+
+ @Override
+ @RequiresPermission(TEST_BIOMETRIC)
+ public void close() {
+
+ }
+}
diff --git a/core/java/android/hardware/biometrics/ITestService.aidl b/core/java/android/hardware/biometrics/ITestService.aidl
new file mode 100644
index 0000000..6373132
--- /dev/null
+++ b/core/java/android/hardware/biometrics/ITestService.aidl
@@ -0,0 +1,57 @@
+/*
+ * 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.hardware.biometrics.SensorPropertiesInternal;
+
+/**
+ * A test service for FingerprintManager and BiometricPrompt.
+ * @hide
+ */
+interface ITestService {
+ // Returns a list of sensor properties supported by the interface.
+ List<SensorPropertiesInternal> getSensorPropertiesInternal(String opPackageName);
+
+ // Switches the specified sensor to use a test HAL. In this mode, the framework will not invoke
+ // any methods on the real HAL implementation. This allows the framework to test a substantial
+ // portion of the framework code that would otherwise require human interaction. Note that
+ // secure pathways such as HAT/Keystore are not testable, since they depend on the TEE or its
+ // equivalent for the secret key.
+ void enableTestHal(int sensorId, boolean enableTestHal);
+
+ // Starts the enrollment process. This should generally be used when the test HAL is enabled.
+ void enrollStart(int sensorId, int userId);
+
+ // Finishes the enrollment process. Simulates the HAL's callback.
+ void enrollFinish(int sensorId, int userId);
+
+ // Simulates a successful authentication, but does not provide a valid HAT.
+ void authenticateSuccess(int sensorId, int userId);
+
+ // Simulates a rejected attempt.
+ void authenticateReject(int sensorId, int userId);
+
+ // Simulates an acquired message from the HAL.
+ void notifyAcquired(int sensorId, int userId);
+
+ // Simulates an error message from the HAL.
+ void notifyError(int sensorId, int userId);
+
+ // Matches the framework's cached enrollments against the HAL's enrollments. Any enrollment
+ // that isn't known by both sides are deleted. This should generally be used when the test
+ // HAL is disabled (e.g. to clean up after a test).
+ void internalCleanup(int sensorId, int userId);
+}
diff --git a/core/java/android/hardware/biometrics/SensorProperties.java b/core/java/android/hardware/biometrics/SensorProperties.java
index b3dcb8f..5b1b5e6 100644
--- a/core/java/android/hardware/biometrics/SensorProperties.java
+++ b/core/java/android/hardware/biometrics/SensorProperties.java
@@ -17,6 +17,7 @@
package android.hardware.biometrics;
import android.annotation.IntDef;
+import android.annotation.TestApi;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -25,19 +26,18 @@
* The base class containing all modality-agnostic information.
* @hide
*/
+@TestApi
public class SensorProperties {
/**
* A sensor that meets the requirements for Class 1 biometrics as defined in the CDD. This does
* not correspond to a public BiometricManager.Authenticators constant. Sensors of this strength
* are not available to applications via the public API surface.
- * @hide
*/
public static final int STRENGTH_CONVENIENCE = 0;
/**
* A sensor that meets the requirements for Class 2 biometrics as defined in the CDD.
* Corresponds to BiometricManager.Authenticators.BIOMETRIC_WEAK.
- * @hide
*/
public static final int STRENGTH_WEAK = 1;
@@ -46,7 +46,6 @@
* Corresponds to BiometricManager.Authenticators.BIOMETRIC_STRONG.
*
* Notably, this is the only strength that allows generation of HardwareAuthToken(s).
- * @hide
*/
public static final int STRENGTH_STRONG = 2;
@@ -70,7 +69,6 @@
/**
* @return The sensor's unique identifier.
- * @hide
*/
public int getSensorId() {
return mSensorId;
@@ -78,7 +76,6 @@
/**
* @return The sensor's strength.
- * @hide
*/
@Strength
public int getSensorStrength() {
diff --git a/media/java/android/media/tv/TvChannelInfo.aidl b/core/java/android/hardware/biometrics/SensorPropertiesInternal.aidl
similarity index 80%
copy from media/java/android/media/tv/TvChannelInfo.aidl
copy to core/java/android/hardware/biometrics/SensorPropertiesInternal.aidl
index 71cd0a7..d85c788 100644
--- a/media/java/android/media/tv/TvChannelInfo.aidl
+++ b/core/java/android/hardware/biometrics/SensorPropertiesInternal.aidl
@@ -1,5 +1,5 @@
/*
- * Copyright 2020 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.
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+package android.hardware.biometrics;
-package android.media.tv;
-
-parcelable TvChannelInfo;
+parcelable SensorPropertiesInternal;
\ No newline at end of file
diff --git a/core/java/android/hardware/fingerprint/Fingerprint.java b/core/java/android/hardware/fingerprint/Fingerprint.java
index 57e52d9..9ce834ca 100644
--- a/core/java/android/hardware/fingerprint/Fingerprint.java
+++ b/core/java/android/hardware/fingerprint/Fingerprint.java
@@ -31,6 +31,10 @@
mGroupId = groupId;
}
+ public Fingerprint(CharSequence name, int fingerId, long deviceId) {
+ super(name, fingerId, deviceId);
+ }
+
private Fingerprint(Parcel in) {
super(in.readString(), in.readInt(), in.readLong());
mGroupId = in.readInt();
diff --git a/core/java/android/hardware/fingerprint/FingerprintManager.java b/core/java/android/hardware/fingerprint/FingerprintManager.java
index b76b877..84c5ea5 100644
--- a/core/java/android/hardware/fingerprint/FingerprintManager.java
+++ b/core/java/android/hardware/fingerprint/FingerprintManager.java
@@ -19,6 +19,7 @@
import static android.Manifest.permission.INTERACT_ACROSS_USERS;
import static android.Manifest.permission.MANAGE_FINGERPRINT;
import static android.Manifest.permission.RESET_FINGERPRINT_LOCKOUT;
+import static android.Manifest.permission.TEST_BIOMETRIC;
import static android.Manifest.permission.USE_BIOMETRIC;
import static android.Manifest.permission.USE_BIOMETRIC_INTERNAL;
import static android.Manifest.permission.USE_FINGERPRINT;
@@ -28,6 +29,7 @@
import android.annotation.RequiresFeature;
import android.annotation.RequiresPermission;
import android.annotation.SystemService;
+import android.annotation.TestApi;
import android.app.ActivityManager;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.Context;
@@ -35,6 +37,7 @@
import android.hardware.biometrics.BiometricAuthenticator;
import android.hardware.biometrics.BiometricFingerprintConstants;
import android.hardware.biometrics.BiometricPrompt;
+import android.hardware.biometrics.BiometricTestSession;
import android.hardware.biometrics.IBiometricServiceLockoutResetCallback;
import android.os.Binder;
import android.os.CancellationSignal;
@@ -94,6 +97,22 @@
private Fingerprint mRemovalFingerprint;
private Handler mHandler;
+ /**
+ * Retrieves a test session for FingerprintManager.
+ * @hide
+ */
+ @TestApi
+ @NonNull
+ @RequiresPermission(TEST_BIOMETRIC)
+ public BiometricTestSession getTestSession() {
+ try {
+ return new BiometricTestSession(mContext,
+ mService.getTestService(mContext.getOpPackageName()));
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
private class OnEnrollCancelListener implements OnCancelListener {
@Override
public void onCancel() {
diff --git a/core/java/android/hardware/fingerprint/IFingerprintService.aidl b/core/java/android/hardware/fingerprint/IFingerprintService.aidl
index f467b1d..518e3ca 100644
--- a/core/java/android/hardware/fingerprint/IFingerprintService.aidl
+++ b/core/java/android/hardware/fingerprint/IFingerprintService.aidl
@@ -17,6 +17,7 @@
import android.hardware.biometrics.IBiometricSensorReceiver;
import android.hardware.biometrics.IBiometricServiceLockoutResetCallback;
+import android.hardware.biometrics.ITestService;
import android.hardware.fingerprint.IFingerprintClientActiveCallback;
import android.hardware.fingerprint.IFingerprintServiceReceiver;
import android.hardware.fingerprint.IUdfpsOverlayController;
@@ -30,6 +31,10 @@
* @hide
*/
interface IFingerprintService {
+
+ // Retrieves a test service
+ ITestService getTestService(String opPackageName);
+
// Retrieve static sensor properties for all fingerprint sensors
List<FingerprintSensorPropertiesInternal> getSensorPropertiesInternal(String opPackageName);
diff --git a/core/java/android/provider/CalendarContract.java b/core/java/android/provider/CalendarContract.java
index e1aa21e..8ac1d84e 100644
--- a/core/java/android/provider/CalendarContract.java
+++ b/core/java/android/provider/CalendarContract.java
@@ -2618,7 +2618,8 @@
intent.setData(ContentUris.withAppendedId(CalendarContract.CONTENT_URI, alarmTime));
intent.putExtra(ALARM_TIME, alarmTime);
intent.setFlags(Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND);
- PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);
+ PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent,
+ PendingIntent.FLAG_IMMUTABLE);
manager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, alarmTime, pi);
}
diff --git a/core/java/android/service/notification/NotificationListenerService.java b/core/java/android/service/notification/NotificationListenerService.java
index a1e4c39..8f119fc 100644
--- a/core/java/android/service/notification/NotificationListenerService.java
+++ b/core/java/android/service/notification/NotificationListenerService.java
@@ -64,6 +64,7 @@
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
import java.util.Objects;
@@ -1802,7 +1803,7 @@
* {@link NotificationAssistantService}
*/
public @NonNull List<Notification.Action> getSmartActions() {
- return mSmartActions;
+ return mSmartActions == null ? Collections.emptyList() : mSmartActions;
}
/**
@@ -1810,7 +1811,7 @@
* {@link NotificationAssistantService}
*/
public @NonNull List<CharSequence> getSmartReplies() {
- return mSmartReplies;
+ return mSmartReplies == null ? Collections.emptyList() : mSmartReplies;
}
/**
diff --git a/core/java/com/android/internal/os/KernelSingleProcessCpuThreadReader.java b/core/java/com/android/internal/os/KernelSingleProcessCpuThreadReader.java
index 4f687f1..e6a9623 100644
--- a/core/java/com/android/internal/os/KernelSingleProcessCpuThreadReader.java
+++ b/core/java/com/android/internal/os/KernelSingleProcessCpuThreadReader.java
@@ -45,6 +45,7 @@
private static final String TAG = "KernelSingleProcCpuThreadRdr";
private static final boolean DEBUG = false;
+ private static final boolean NATIVE_ENABLED = true;
/**
* The name of the file to read CPU statistics from, must be found in {@code
@@ -64,7 +65,7 @@
private static final Path INITIAL_TIME_IN_STATE_PATH = Paths.get("self/time_in_state");
/** See https://man7.org/linux/man-pages/man5/proc.5.html */
- private static final int[] PROCESS_FULL_STATS_FORMAT = new int[]{
+ private static final int[] PROCESS_FULL_STATS_FORMAT = new int[] {
PROC_SPACE_TERM,
PROC_SPACE_TERM,
PROC_SPACE_TERM,
@@ -162,6 +163,7 @@
/**
* Get the total and per-thread CPU usage of the process with the PID specified in the
* constructor.
+ *
* @param selectedThreadIds a SORTED array of native Thread IDs whose CPU times should
* be aggregated as a group. This is expected to be a subset
* of all thread IDs owned by the process.
@@ -173,6 +175,20 @@
+ mPid);
}
+ int cpuFrequencyCount = getCpuFrequencyCount();
+ ProcessCpuUsage processCpuUsage = new ProcessCpuUsage(cpuFrequencyCount);
+
+ if (NATIVE_ENABLED) {
+ boolean result = readProcessCpuUsage(mProcPath.toString(), mPid,
+ selectedThreadIds, processCpuUsage.processCpuTimesMillis,
+ processCpuUsage.threadCpuTimesMillis,
+ processCpuUsage.selectedThreadCpuTimesMillis);
+ if (!result) {
+ return null;
+ }
+ return processCpuUsage;
+ }
+
if (!isSorted(selectedThreadIds)) {
throw new IllegalArgumentException("selectedThreadIds is not sorted: "
+ Arrays.toString(selectedThreadIds));
@@ -189,8 +205,6 @@
long processCpuTimeMillis = (utime + stime) * mJiffyMillis;
- int cpuFrequencyCount = getCpuFrequencyCount();
- ProcessCpuUsage processCpuUsage = new ProcessCpuUsage(cpuFrequencyCount);
try (DirectoryStream<Path> threadPaths = Files.newDirectoryStream(mThreadsDirectoryPath)) {
for (Path threadDirectory : threadPaths) {
readThreadCpuUsage(processCpuUsage, selectedThreadIds, threadDirectory);
@@ -274,4 +288,8 @@
}
return true;
}
+
+ private native boolean readProcessCpuUsage(String procPath, int pid, int[] selectedThreadIds,
+ long[] processCpuTimesMillis, long[] threadCpuTimesMillis,
+ long[] selectedThreadCpuTimesMillis);
}
diff --git a/core/java/com/android/internal/view/RecyclerViewCaptureHelper.java b/core/java/com/android/internal/view/RecyclerViewCaptureHelper.java
new file mode 100644
index 0000000..461e116
--- /dev/null
+++ b/core/java/com/android/internal/view/RecyclerViewCaptureHelper.java
@@ -0,0 +1,202 @@
+/*
+ * 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.internal.view;
+
+import android.animation.ValueAnimator;
+import android.annotation.NonNull;
+import android.graphics.Rect;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewParent;
+
+/**
+ * ScrollCapture for RecyclerView and <i>RecyclerView-like</i> ViewGroups.
+ * <p>
+ * Requirements for proper operation:
+ * <ul>
+ * <li>at least one visible child view</li>
+ * <li>scrolls by pixels in response to {@link View#scrollBy(int, int)}.
+ * <li>reports ability to scroll with {@link View#canScrollVertically(int)}
+ * <li>properly implements {@link ViewParent#requestChildRectangleOnScreen(View, Rect, boolean)}
+ * </ul>
+ *
+ * @see ScrollCaptureViewSupport
+ */
+public class RecyclerViewCaptureHelper implements ScrollCaptureViewHelper<ViewGroup> {
+
+ // Experiment
+ private static final boolean DISABLE_ANIMATORS = false;
+ // Experiment
+ private static final boolean STOP_RENDER_THREAD = false;
+
+ private static final String TAG = "RVCaptureHelper";
+ private int mScrollDelta;
+ private boolean mScrollBarWasEnabled;
+ private int mOverScrollMode;
+ private float mDurationScale;
+
+ @Override
+ public void onPrepareForStart(@NonNull ViewGroup view, Rect scrollBounds) {
+ mScrollDelta = 0;
+
+ mOverScrollMode = view.getOverScrollMode();
+ view.setOverScrollMode(View.OVER_SCROLL_NEVER);
+
+ mScrollBarWasEnabled = view.isVerticalScrollBarEnabled();
+ view.setVerticalScrollBarEnabled(false);
+ if (DISABLE_ANIMATORS) {
+ mDurationScale = ValueAnimator.getDurationScale();
+ ValueAnimator.setDurationScale(0);
+ }
+ if (STOP_RENDER_THREAD) {
+ view.getThreadedRenderer().stop();
+ }
+ }
+
+ @Override
+ public ScrollResult onScrollRequested(@NonNull ViewGroup recyclerView, Rect scrollBounds,
+ Rect requestRect) {
+ ScrollResult result = new ScrollResult();
+ result.requestedArea = new Rect(requestRect);
+ result.scrollDelta = mScrollDelta;
+ result.availableArea = new Rect(); // empty
+
+ Log.d(TAG, "current scrollDelta: " + mScrollDelta);
+ if (!recyclerView.isVisibleToUser() || recyclerView.getChildCount() == 0) {
+ Log.w(TAG, "recyclerView is empty or not visible, cannot continue");
+ return result; // result.availableArea == empty Rect
+ }
+
+ // move from scrollBounds-relative to parent-local coordinates
+ Rect requestedContainerBounds = new Rect(requestRect);
+ requestedContainerBounds.offset(0, -mScrollDelta);
+ requestedContainerBounds.offset(scrollBounds.left, scrollBounds.top);
+
+ // requestedContainerBounds is now in recyclerview-local coordinates
+ Log.d(TAG, "requestedContainerBounds: " + requestedContainerBounds);
+
+ // Save a copy for later
+ View anchor = findChildNearestTarget(recyclerView, requestedContainerBounds);
+ if (anchor == null) {
+ Log.d(TAG, "Failed to locate anchor view");
+ return result; // result.availableArea == null
+ }
+
+ Log.d(TAG, "Anchor view:" + anchor);
+ Rect requestedContentBounds = new Rect(requestedContainerBounds);
+ recyclerView.offsetRectIntoDescendantCoords(anchor, requestedContentBounds);
+
+ Log.d(TAG, "requestedContentBounds = " + requestedContentBounds);
+ int prevAnchorTop = anchor.getTop();
+ // Note: requestChildRectangleOnScreen may modify rectangle, must pass pass in a copy here
+ Rect input = new Rect(requestedContentBounds);
+ if (recyclerView.requestChildRectangleOnScreen(anchor, input, true)) {
+ int scrolled = prevAnchorTop - anchor.getTop(); // inverse of movement
+ Log.d(TAG, "RecyclerView scrolled by " + scrolled + " px");
+ mScrollDelta += scrolled; // view.top-- is equivalent to parent.scrollY++
+ result.scrollDelta = mScrollDelta;
+ Log.d(TAG, "requestedContentBounds, (post-request-rect) = " + requestedContentBounds);
+ }
+
+ requestedContainerBounds.set(requestedContentBounds);
+ recyclerView.offsetDescendantRectToMyCoords(anchor, requestedContainerBounds);
+ Log.d(TAG, "requestedContainerBounds, (post-scroll): " + requestedContainerBounds);
+
+ Rect recyclerLocalVisible = new Rect(scrollBounds);
+ recyclerView.getLocalVisibleRect(recyclerLocalVisible);
+ Log.d(TAG, "recyclerLocalVisible: " + recyclerLocalVisible);
+
+ if (!requestedContainerBounds.intersect(recyclerLocalVisible)) {
+ // Requested area is still not visible
+ Log.d(TAG, "requested bounds not visible!");
+ return result;
+ }
+ Rect available = new Rect(requestedContainerBounds);
+ available.offset(-scrollBounds.left, -scrollBounds.top);
+ available.offset(0, mScrollDelta);
+ result.availableArea = available;
+ Log.d(TAG, "availableArea: " + result.availableArea);
+ return result;
+ }
+
+ /**
+ * Find a view that is located "closest" to targetRect. Returns the first view to fully
+ * vertically overlap the target targetRect. If none found, returns the view with an edge
+ * nearest the target targetRect.
+ *
+ * @param parent the parent vertical layout
+ * @param targetRect a rectangle in local coordinates of <code>parent</code>
+ * @return a child view within parent matching the criteria or null
+ */
+ static View findChildNearestTarget(ViewGroup parent, Rect targetRect) {
+ View selected = null;
+ int minCenterDistance = Integer.MAX_VALUE;
+ int maxOverlap = 0;
+
+ // allowable center-center distance, relative to targetRect.
+ // if within this range, taller views are preferred
+ final float preferredRangeFromCenterPercent = 0.25f;
+ final int preferredDistance =
+ (int) (preferredRangeFromCenterPercent * targetRect.height());
+
+ Rect parentLocalVis = new Rect();
+ parent.getLocalVisibleRect(parentLocalVis);
+ Log.d(TAG, "findChildNearestTarget: parentVis=" + parentLocalVis
+ + " targetRect=" + targetRect);
+
+ Rect frame = new Rect();
+ for (int i = 0; i < parent.getChildCount(); i++) {
+ final View child = parent.getChildAt(i);
+ child.getHitRect(frame);
+ Log.d(TAG, "child #" + i + " hitRect=" + frame);
+
+ if (child.getVisibility() != View.VISIBLE) {
+ Log.d(TAG, "child #" + i + " is not visible");
+ continue;
+ }
+
+ int centerDistance = Math.abs(targetRect.centerY() - frame.centerY());
+ Log.d(TAG, "child #" + i + " : center to center: " + centerDistance + "px");
+
+ if (centerDistance < minCenterDistance) {
+ // closer to center
+ minCenterDistance = centerDistance;
+ selected = child;
+ } else if (frame.intersect(targetRect) && (frame.height() > preferredDistance)) {
+ // within X% pixels of center, but taller
+ selected = child;
+ }
+ }
+ return selected;
+ }
+
+
+ @Override
+ public void onPrepareForEnd(@NonNull ViewGroup view) {
+ // Restore original position and state
+ view.scrollBy(0, mScrollDelta);
+ view.setOverScrollMode(mOverScrollMode);
+ view.setVerticalScrollBarEnabled(mScrollBarWasEnabled);
+ if (DISABLE_ANIMATORS) {
+ ValueAnimator.setDurationScale(mDurationScale);
+ }
+ if (STOP_RENDER_THREAD) {
+ view.getThreadedRenderer().start();
+ }
+ }
+}
diff --git a/core/java/com/android/internal/view/ScrollCaptureInternal.java b/core/java/com/android/internal/view/ScrollCaptureInternal.java
index c589afde..ae1a815 100644
--- a/core/java/com/android/internal/view/ScrollCaptureInternal.java
+++ b/core/java/com/android/internal/view/ScrollCaptureInternal.java
@@ -17,8 +17,11 @@
package com.android.internal.view;
import android.annotation.Nullable;
+import android.content.Context;
+import android.content.res.Resources;
import android.graphics.Point;
import android.graphics.Rect;
+import android.util.Log;
import android.view.ScrollCaptureCallback;
import android.view.View;
import android.view.ViewGroup;
@@ -29,6 +32,12 @@
public class ScrollCaptureInternal {
private static final String TAG = "ScrollCaptureInternal";
+ // Log found scrolling views
+ private static final boolean DEBUG = true;
+
+ // Log all investigated views, as well as heuristic checks
+ private static final boolean DEBUG_VERBOSE = false;
+
private static final int UP = -1;
private static final int DOWN = 1;
@@ -57,38 +66,72 @@
* This needs to be fast and not alloc memory. It's called on everything in the tree not marked
* as excluded during scroll capture search.
*/
- public static int detectScrollingType(View view) {
+ private static int detectScrollingType(View view) {
// Must be a ViewGroup
if (!(view instanceof ViewGroup)) {
+ if (DEBUG_VERBOSE) {
+ Log.v(TAG, "hint: not a subclass of ViewGroup");
+ }
return TYPE_FIXED;
}
+ if (DEBUG_VERBOSE) {
+ Log.v(TAG, "hint: is a subclass of ViewGroup");
+ }
// Confirm that it can scroll.
if (!(view.canScrollVertically(DOWN) || view.canScrollVertically(UP))) {
// Nothing to scroll here, move along.
+ if (DEBUG_VERBOSE) {
+ Log.v(TAG, "hint: cannot be scrolled");
+ }
return TYPE_FIXED;
}
+ if (DEBUG_VERBOSE) {
+ Log.v(TAG, "hint: can be scrolled up or down");
+ }
// ScrollViews accept only a single child.
if (((ViewGroup) view).getChildCount() > 1) {
+ if (DEBUG_VERBOSE) {
+ Log.v(TAG, "hint: scrollable with multiple children");
+ }
return TYPE_RECYCLING;
}
+ if (DEBUG_VERBOSE) {
+ Log.v(TAG, "hint: less than two child views");
+ }
//Because recycling containers don't use scrollY, a non-zero value means Scroll view.
if (view.getScrollY() != 0) {
+ if (DEBUG_VERBOSE) {
+ Log.v(TAG, "hint: scrollY != 0");
+ }
return TYPE_SCROLLING;
}
+ Log.v(TAG, "hint: scrollY == 0");
// Since scrollY cannot be negative, this means a Recycling view.
if (view.canScrollVertically(UP)) {
+ if (DEBUG_VERBOSE) {
+ Log.v(TAG, "hint: able to scroll up");
+ }
return TYPE_RECYCLING;
}
- // canScrollVertically(UP) == false, getScrollY() == 0, getChildCount() == 1.
+ if (DEBUG_VERBOSE) {
+ Log.v(TAG, "hint: cannot be scrolled up");
+ }
+ // canScrollVertically(UP) == false, getScrollY() == 0, getChildCount() == 1.
// For Recycling containers, this should be a no-op (RecyclerView logs a warning)
view.scrollTo(view.getScrollX(), 1);
// A scrolling container would have moved by 1px.
if (view.getScrollY() == 1) {
view.scrollTo(view.getScrollX(), 0);
+ if (DEBUG_VERBOSE) {
+ Log.v(TAG, "hint: scrollTo caused scrollY to change");
+ }
return TYPE_SCROLLING;
}
+ if (DEBUG_VERBOSE) {
+ Log.v(TAG, "hint: scrollTo did not cause scrollY to change");
+ }
return TYPE_RECYCLING;
}
@@ -99,19 +142,61 @@
* @param localVisibleRect the visible area of the given view in local coordinates, as supplied
* by the view parent
* @param positionInWindow the offset of localVisibleRect within the window
- *
* @return a new callback or null if the View isn't supported
*/
@Nullable
public ScrollCaptureCallback requestCallback(View view, Rect localVisibleRect,
Point positionInWindow) {
// Nothing to see here yet.
+ if (DEBUG_VERBOSE) {
+ Log.v(TAG, "scroll capture: checking " + view.getClass().getName()
+ + "[" + resolveId(view.getContext(), view.getId()) + "]");
+ }
int i = detectScrollingType(view);
switch (i) {
case TYPE_SCROLLING:
+ if (DEBUG) {
+ Log.d(TAG, "scroll capture: FOUND " + view.getClass().getName()
+ + "[" + resolveId(view.getContext(), view.getId()) + "]"
+ + " -> TYPE_SCROLLING");
+ }
return new ScrollCaptureViewSupport<>((ViewGroup) view,
new ScrollViewCaptureHelper());
+ case TYPE_RECYCLING:
+ if (DEBUG) {
+ Log.d(TAG, "scroll capture: FOUND " + view.getClass().getName()
+ + "[" + resolveId(view.getContext(), view.getId()) + "]"
+ + " -> TYPE_RECYCLING");
+ }
+ return new ScrollCaptureViewSupport<>((ViewGroup) view,
+ new RecyclerViewCaptureHelper());
+ case TYPE_FIXED:
+ // ignore
+ break;
+
}
return null;
}
+
+ // Lifted from ViewDebug (package protected)
+
+ private static String formatIntToHexString(int value) {
+ return "0x" + Integer.toHexString(value).toUpperCase();
+ }
+
+ static String resolveId(Context context, int id) {
+ String fieldValue;
+ final Resources resources = context.getResources();
+ if (id >= 0) {
+ try {
+ fieldValue = resources.getResourceTypeName(id) + '/'
+ + resources.getResourceEntryName(id);
+ } catch (Resources.NotFoundException e) {
+ fieldValue = "id/" + formatIntToHexString(id);
+ }
+ } else {
+ fieldValue = "NO_ID";
+ }
+ return fieldValue;
+ }
}
diff --git a/core/java/com/android/internal/view/ScrollCaptureViewHelper.java b/core/java/com/android/internal/view/ScrollCaptureViewHelper.java
index a92e978..9829d0b 100644
--- a/core/java/com/android/internal/view/ScrollCaptureViewHelper.java
+++ b/core/java/com/android/internal/view/ScrollCaptureViewHelper.java
@@ -17,7 +17,6 @@
package com.android.internal.view;
import android.annotation.NonNull;
-import android.annotation.Nullable;
import android.graphics.Rect;
import android.view.View;
@@ -62,8 +61,8 @@
* @param view the view being captured
* @return true if the callback should respond to a request with scroll bounds
*/
- default boolean onAcceptSession(@Nullable V view) {
- return view != null && view.isVisibleToUser()
+ default boolean onAcceptSession(@NonNull V view) {
+ return view.isVisibleToUser()
&& (view.canScrollVertically(UP) || view.canScrollVertically(DOWN));
}
@@ -73,7 +72,7 @@
*
* @param view the view being captured
*/
- default Rect onComputeScrollBounds(@Nullable V view) {
+ @NonNull default Rect onComputeScrollBounds(@NonNull V view) {
return new Rect(view.getPaddingLeft(), view.getPaddingTop(),
view.getWidth() - view.getPaddingRight(),
view.getHeight() - view.getPaddingBottom());
@@ -88,7 +87,7 @@
* @param view the view being captured
* @param scrollBounds the bounds within {@code view} where content scrolls
*/
- void onPrepareForStart(@NonNull V view, Rect scrollBounds);
+ void onPrepareForStart(@NonNull V view, @NonNull Rect scrollBounds);
/**
* Map the request onto the screen.
@@ -105,7 +104,9 @@
* content to capture for the request
* @return the result of the request as a {@link ScrollResult}
*/
- ScrollResult onScrollRequested(@NonNull V view, Rect scrollBounds, Rect requestRect);
+ @NonNull
+ ScrollResult onScrollRequested(@NonNull V view, @NonNull Rect scrollBounds,
+ @NonNull Rect requestRect);
/**
* Restore the target after capture.
diff --git a/core/java/com/android/internal/view/ScrollCaptureViewSupport.java b/core/java/com/android/internal/view/ScrollCaptureViewSupport.java
index 7b4f73f..85fa791 100644
--- a/core/java/com/android/internal/view/ScrollCaptureViewSupport.java
+++ b/core/java/com/android/internal/view/ScrollCaptureViewSupport.java
@@ -23,8 +23,8 @@
import android.graphics.RectF;
import android.graphics.RenderNode;
import android.os.Handler;
-import android.os.SystemClock;
import android.util.DisplayMetrics;
+import android.util.Log;
import android.view.ScrollCaptureCallback;
import android.view.ScrollCaptureSession;
import android.view.Surface;
@@ -46,8 +46,12 @@
*/
public class ScrollCaptureViewSupport<V extends View> implements ScrollCaptureCallback {
+ public static final long NO_FRAME_PRODUCED = -1;
+
private static final String TAG = "ScrollCaptureViewSupport";
+ private static final boolean WAIT_FOR_ANIMATION = true;
+
private final WeakReference<V> mWeakView;
private final ScrollCaptureViewHelper<V> mViewHelper;
private ViewRenderer mRenderer;
@@ -99,12 +103,16 @@
V view = mWeakView.get();
if (view == null || !view.isVisibleToUser()) {
// Signal to the controller that we have a problem and can't continue.
- session.notifyBufferSent(0, null);
+ session.notifyBufferSent(NO_FRAME_PRODUCED, new Rect());
return;
}
// Ask the view to scroll as needed to bring this area into view.
ScrollResult scrollResult = mViewHelper.onScrollRequested(view, session.getScrollBounds(),
requestRect);
+ if (scrollResult.availableArea.isEmpty()) {
+ session.notifyBufferSent(NO_FRAME_PRODUCED, scrollResult.availableArea);
+ return;
+ }
view.invalidate(); // don't wait for vsync
// For image capture, shift back by scrollDelta to arrive at the location within the view
@@ -112,8 +120,19 @@
Rect viewCaptureArea = new Rect(scrollResult.availableArea);
viewCaptureArea.offset(0, -scrollResult.scrollDelta);
- mRenderer.renderView(view, viewCaptureArea, mUiHandler,
- (frameNumber) -> session.notifyBufferSent(frameNumber, scrollResult.availableArea));
+ if (WAIT_FOR_ANIMATION) {
+ Log.d(TAG, "render: delaying until animation");
+ view.postOnAnimation(() -> {
+ Log.d(TAG, "postOnAnimation(): rendering now");
+ long resultFrame = mRenderer.renderView(view, viewCaptureArea);
+ Log.d(TAG, "notifyBufferSent: " + scrollResult.availableArea);
+
+ session.notifyBufferSent(resultFrame, new Rect(scrollResult.availableArea));
+ });
+ } else {
+ long resultFrame = mRenderer.renderView(view, viewCaptureArea);
+ session.notifyBufferSent(resultFrame, new Rect(scrollResult.availableArea));
+ }
}
@Override
@@ -132,8 +151,7 @@
/**
* Internal helper class which assists in rendering sections of the view hierarchy relative to a
- * given view. Used by framework implementations of ScrollCaptureHandler to render and dispatch
- * image requests.
+ * given view.
*/
static final class ViewRenderer {
// alpha, "reasonable default" from Javadoc
@@ -157,14 +175,11 @@
private final Matrix mTempMatrix = new Matrix();
private final int[] mTempLocation = new int[2];
private long mLastRenderedSourceDrawingId = -1;
-
-
- public interface FrameCompleteListener {
- void onFrameComplete(long frameNumber);
- }
+ private Surface mSurface;
ViewRenderer() {
mRenderer = new HardwareRenderer();
+ mRenderer.setName("ScrollCapture");
mCaptureRenderNode = new RenderNode("ScrollCaptureRoot");
mRenderer.setContentRoot(mCaptureRenderNode);
@@ -173,6 +188,7 @@
}
public void setSurface(Surface surface) {
+ mSurface = surface;
mRenderer.setSurface(surface);
}
@@ -223,20 +239,38 @@
mCaptureRenderNode.endRecording();
}
- public void renderView(View view, Rect sourceRect, Handler handler,
- FrameCompleteListener frameListener) {
+ public long renderView(View view, Rect sourceRect) {
if (updateForView(view)) {
setupLighting(view);
}
view.invalidate();
updateRootNode(view, sourceRect);
HardwareRenderer.FrameRenderRequest request = mRenderer.createRenderRequest();
- request.setVsyncTime(SystemClock.elapsedRealtimeNanos());
- // private API b/c request.setFrameCommitCallback does not provide access to frameNumber
- mRenderer.setFrameCompleteCallback(
- frameNr -> handler.post(() -> frameListener.onFrameComplete(frameNr)));
+ long timestamp = System.nanoTime();
+ request.setVsyncTime(timestamp);
+
+ // Would be nice to access nextFrameNumber from HwR without having to hold on to Surface
+ final long frameNumber = mSurface.getNextFrameNumber();
+
+ // Block until a frame is presented to the Surface
request.setWaitForPresent(true);
- request.syncAndDraw();
+
+ switch (request.syncAndDraw()) {
+ case HardwareRenderer.SYNC_OK:
+ case HardwareRenderer.SYNC_REDRAW_REQUESTED:
+ return frameNumber;
+
+ case HardwareRenderer.SYNC_FRAME_DROPPED:
+ Log.e(TAG, "syncAndDraw(): SYNC_FRAME_DROPPED !");
+ break;
+ case HardwareRenderer.SYNC_LOST_SURFACE_REWARD_IF_FOUND:
+ Log.e(TAG, "syncAndDraw(): SYNC_LOST_SURFACE !");
+ break;
+ case HardwareRenderer.SYNC_CONTEXT_IS_STOPPED:
+ Log.e(TAG, "syncAndDraw(): SYNC_CONTEXT_IS_STOPPED !");
+ break;
+ }
+ return NO_FRAME_PRODUCED;
}
public void trimMemory() {
@@ -244,6 +278,7 @@
}
public void destroy() {
+ mSurface = null;
mRenderer.destroy();
}
@@ -254,6 +289,5 @@
mTempMatrix.mapRect(mTempRectF);
mTempRectF.round(outRect);
}
-
}
}
diff --git a/core/java/com/android/internal/view/ScrollViewCaptureHelper.java b/core/java/com/android/internal/view/ScrollViewCaptureHelper.java
index 1514b9a..a1d202e 100644
--- a/core/java/com/android/internal/view/ScrollViewCaptureHelper.java
+++ b/core/java/com/android/internal/view/ScrollViewCaptureHelper.java
@@ -57,10 +57,6 @@
public ScrollResult onScrollRequested(@NonNull ViewGroup view, Rect scrollBounds,
Rect requestRect) {
- final View contentView = view.getChildAt(0); // returns null, does not throw IOOBE
- if (contentView == null) {
- return null;
- }
/*
+---------+ <----+ Content [25,25 - 275,1025] (w=250,h=1000)
| |
@@ -88,9 +84,6 @@
\__ Requested Bounds[0,300 - 200,400] (200x100)
*/
- ScrollResult result = new ScrollResult();
- result.requestedArea = new Rect(requestRect);
-
// 0) adjust the requestRect to account for scroll change since start
//
// Scroll Bounds[50,50 - 250,250] (w=200,h=200)
@@ -99,6 +92,17 @@
// (y-100) (scrollY - mStartScrollY)
int scrollDelta = view.getScrollY() - mStartScrollY;
+ final ScrollResult result = new ScrollResult();
+ result.requestedArea = new Rect(requestRect);
+ result.scrollDelta = scrollDelta;
+ result.availableArea = new Rect();
+
+ final View contentView = view.getChildAt(0); // returns null, does not throw IOOBE
+ if (contentView == null) {
+ // No child view? Cannot continue.
+ return result;
+ }
+
// 1) Translate request rect to make it relative to container view
//
// Container View [0,0 - 300,300] (scrollY=200)
@@ -133,7 +137,7 @@
// TODO: crop capture area to avoid occlusions/minimize scroll changes
Point offset = new Point();
- final Rect available = new Rect(requestedContentBounds); // empty
+ final Rect available = new Rect(requestedContentBounds);
if (!view.getChildVisibleRect(contentView, available, offset)) {
available.setEmpty();
result.availableArea = available;
diff --git a/core/jni/Android.bp b/core/jni/Android.bp
index adb0fad..4f97975 100644
--- a/core/jni/Android.bp
+++ b/core/jni/Android.bp
@@ -184,6 +184,7 @@
"com_android_internal_os_ClassLoaderFactory.cpp",
"com_android_internal_os_FuseAppLoop.cpp",
"com_android_internal_os_KernelCpuUidBpfMapReader.cpp",
+ "com_android_internal_os_KernelSingleProcessCpuThreadReader.cpp",
"com_android_internal_os_KernelSingleUidTimeReader.cpp",
"com_android_internal_os_Zygote.cpp",
"com_android_internal_os_ZygoteInit.cpp",
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index 5b1196d..27b23bd 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -189,6 +189,7 @@
extern int register_com_android_internal_os_ClassLoaderFactory(JNIEnv* env);
extern int register_com_android_internal_os_FuseAppLoop(JNIEnv* env);
extern int register_com_android_internal_os_KernelCpuUidBpfMapReader(JNIEnv *env);
+extern int register_com_android_internal_os_KernelSingleProcessCpuThreadReader(JNIEnv* env);
extern int register_com_android_internal_os_KernelSingleUidTimeReader(JNIEnv *env);
extern int register_com_android_internal_os_Zygote(JNIEnv *env);
extern int register_com_android_internal_os_ZygoteInit(JNIEnv *env);
@@ -1581,6 +1582,7 @@
REG_JNI(register_com_android_internal_content_NativeLibraryHelper),
REG_JNI(register_com_android_internal_os_FuseAppLoop),
REG_JNI(register_com_android_internal_os_KernelCpuUidBpfMapReader),
+ REG_JNI(register_com_android_internal_os_KernelSingleProcessCpuThreadReader),
REG_JNI(register_com_android_internal_os_KernelSingleUidTimeReader),
};
diff --git a/core/jni/com_android_internal_os_KernelSingleProcessCpuThreadReader.cpp b/core/jni/com_android_internal_os_KernelSingleProcessCpuThreadReader.cpp
new file mode 100644
index 0000000..52bed6b
--- /dev/null
+++ b/core/jni/com_android_internal_os_KernelSingleProcessCpuThreadReader.cpp
@@ -0,0 +1,269 @@
+/*
+ * 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.
+ */
+
+#include "core_jni_helpers.h"
+
+#include <cputimeinstate.h>
+#include <dirent.h>
+
+#include <android-base/file.h>
+#include <android-base/parseint.h>
+#include <android-base/stringprintf.h>
+#include <android-base/strings.h>
+#include <android_runtime/Log.h>
+
+#include <nativehelper/ScopedPrimitiveArray.h>
+#include <nativehelper/ScopedUtfChars.h>
+
+namespace android {
+
+// Number of milliseconds in a jiffy - the unit of time measurement for processes and threads
+static const uint32_t gJiffyMillis = (uint32_t)(1000 / sysconf(_SC_CLK_TCK));
+
+// Given a PID, returns a vector of all TIDs for the process' tasks. Thread IDs are
+// file names in the /proc/<pid>/task directory.
+static bool getThreadIds(const std::string &procPath, const pid_t pid,
+ std::vector<pid_t> &outThreadIds) {
+ std::string taskPath = android::base::StringPrintf("%s/%u/task", procPath.c_str(), pid);
+
+ struct dirent **dirlist;
+ int threadCount = scandir(taskPath.c_str(), &dirlist, NULL, NULL);
+ if (threadCount == -1) {
+ ALOGE("Cannot read directory %s", taskPath.c_str());
+ return false;
+ }
+
+ outThreadIds.reserve(threadCount);
+
+ for (int i = 0; i < threadCount; i++) {
+ pid_t tid;
+ if (android::base::ParseInt<pid_t>(dirlist[i]->d_name, &tid)) {
+ outThreadIds.push_back(tid);
+ }
+ free(dirlist[i]);
+ }
+ free(dirlist);
+
+ return true;
+}
+
+// Reads contents of a time_in_state file and returns times as a vector of times per frequency
+// A time_in_state file contains pairs of frequency - time (in jiffies):
+//
+// cpu0
+// 300000 30
+// 403200 0
+// cpu4
+// 710400 10
+// 825600 20
+// 940800 30
+//
+static bool getThreadTimeInState(const std::string &procPath, const pid_t pid, const pid_t tid,
+ const size_t frequencyCount,
+ std::vector<uint64_t> &outThreadTimeInState) {
+ std::string timeInStateFilePath =
+ android::base::StringPrintf("%s/%u/task/%u/time_in_state", procPath.c_str(), pid, tid);
+ std::string data;
+
+ if (!android::base::ReadFileToString(timeInStateFilePath, &data)) {
+ ALOGE("Cannot read file: %s", timeInStateFilePath.c_str());
+ return false;
+ }
+
+ auto lines = android::base::Split(data, "\n");
+ size_t index = 0;
+ for (const auto &line : lines) {
+ if (line.empty()) {
+ continue;
+ }
+
+ auto numbers = android::base::Split(line, " ");
+ if (numbers.size() != 2) {
+ continue;
+ }
+ uint64_t timeInState;
+ if (!android::base::ParseUint<uint64_t>(numbers[1], &timeInState)) {
+ ALOGE("Invalid time_in_state file format: %s", timeInStateFilePath.c_str());
+ return false;
+ }
+ if (index < frequencyCount) {
+ outThreadTimeInState[index] = timeInState;
+ }
+ index++;
+ }
+
+ if (index != frequencyCount) {
+ ALOGE("Incorrect number of frequencies %u in %s. Expected %u",
+ (uint32_t)outThreadTimeInState.size(), timeInStateFilePath.c_str(),
+ (uint32_t)frequencyCount);
+ return false;
+ }
+
+ return true;
+}
+
+static int pidCompare(const void *a, const void *b) {
+ return (*(pid_t *)a - *(pid_t *)b);
+}
+
+static inline bool isSelectedThread(const pid_t tid, const pid_t *selectedThreadIds,
+ const size_t selectedThreadCount) {
+ return bsearch(&tid, selectedThreadIds, selectedThreadCount, sizeof(pid_t), pidCompare) != NULL;
+}
+
+// Reads all /proc/<pid>/task/*/time_in_state files and aggregates per-frequency
+// time in state data for all threads. Also, separately aggregates time in state for
+// selected threads whose TIDs are passes as selectedThreadIds.
+static void aggregateThreadCpuTimes(const std::string &procPath, const pid_t pid,
+ const std::vector<pid_t> &threadIds,
+ const size_t frequencyCount, const pid_t *selectedThreadIds,
+ const size_t selectedThreadCount,
+ uint64_t *threadCpuTimesMillis,
+ uint64_t *selectedThreadCpuTimesMillis) {
+ for (size_t j = 0; j < frequencyCount; j++) {
+ threadCpuTimesMillis[j] = 0;
+ selectedThreadCpuTimesMillis[j] = 0;
+ }
+
+ for (size_t i = 0; i < threadIds.size(); i++) {
+ pid_t tid = threadIds[i];
+ std::vector<uint64_t> timeInState(frequencyCount);
+ if (!getThreadTimeInState(procPath, pid, tid, frequencyCount, timeInState)) {
+ continue;
+ }
+
+ bool selectedThread = isSelectedThread(tid, selectedThreadIds, selectedThreadCount);
+ for (size_t j = 0; j < frequencyCount; j++) {
+ threadCpuTimesMillis[j] += timeInState[j];
+ if (selectedThread) {
+ selectedThreadCpuTimesMillis[j] += timeInState[j];
+ }
+ }
+ }
+ for (size_t i = 0; i < frequencyCount; i++) {
+ threadCpuTimesMillis[i] *= gJiffyMillis;
+ selectedThreadCpuTimesMillis[i] *= gJiffyMillis;
+ }
+}
+
+// Reads process utime and stime from the /proc/<pid>/stat file.
+// Format of this file is described in https://man7.org/linux/man-pages/man5/proc.5.html.
+static bool getProcessCpuTime(const std::string &procPath, const pid_t pid,
+ uint64_t &outTimeMillis) {
+ std::string statFilePath = android::base::StringPrintf("%s/%u/stat", procPath.c_str(), pid);
+ std::string data;
+ if (!android::base::ReadFileToString(statFilePath, &data)) {
+ return false;
+ }
+
+ auto fields = android::base::Split(data, " ");
+ uint64_t utime, stime;
+
+ // Field 14 (counting from 1) is utime - process time in user space, in jiffies
+ // Field 15 (counting from 1) is stime - process time in system space, in jiffies
+ if (fields.size() < 15 || !android::base::ParseUint(fields[13], &utime) ||
+ !android::base::ParseUint(fields[14], &stime)) {
+ ALOGE("Invalid file format %s", statFilePath.c_str());
+ return false;
+ }
+
+ outTimeMillis = (utime + stime) * gJiffyMillis;
+ return true;
+}
+
+// Estimates per cluster per frequency CPU time for the entire process
+// by distributing the total process CPU time proportionately to how much
+// CPU time its threads took on those clusters/frequencies. This algorithm
+// works more accurately when when we have equally distributed concurrency.
+// TODO(b/169279846): obtain actual process CPU times from the kernel
+static void estimateProcessTimeInState(const uint64_t processCpuTimeMillis,
+ const uint64_t *threadCpuTimesMillis,
+ const size_t frequencyCount,
+ uint64_t *processCpuTimesMillis) {
+ uint64_t totalCpuTimeAllThreads = 0;
+ for (size_t i = 0; i < frequencyCount; i++) {
+ totalCpuTimeAllThreads += threadCpuTimesMillis[i];
+ }
+
+ if (totalCpuTimeAllThreads != 0) {
+ for (size_t i = 0; i < frequencyCount; i++) {
+ processCpuTimesMillis[i] =
+ processCpuTimeMillis * threadCpuTimesMillis[i] / totalCpuTimeAllThreads;
+ }
+ } else {
+ for (size_t i = 0; i < frequencyCount; i++) {
+ processCpuTimesMillis[i] = 0;
+ }
+ }
+}
+
+static jboolean readProcessCpuUsage(JNIEnv *env, jclass, jstring procPath, jint pid,
+ jintArray selectedThreadIdArray,
+ jlongArray processCpuTimesMillisArray,
+ jlongArray threadCpuTimesMillisArray,
+ jlongArray selectedThreadCpuTimesMillisArray) {
+ ScopedUtfChars procPathChars(env, procPath);
+ ScopedIntArrayRO selectedThreadIds(env, selectedThreadIdArray);
+ ScopedLongArrayRW processCpuTimesMillis(env, processCpuTimesMillisArray);
+ ScopedLongArrayRW threadCpuTimesMillis(env, threadCpuTimesMillisArray);
+ ScopedLongArrayRW selectedThreadCpuTimesMillis(env, selectedThreadCpuTimesMillisArray);
+
+ std::string procPathStr(procPathChars.c_str());
+
+ // Get all thread IDs for the process.
+ std::vector<pid_t> threadIds;
+ if (!getThreadIds(procPathStr, pid, threadIds)) {
+ ALOGE("Could not obtain thread IDs from: %s", procPathStr.c_str());
+ return false;
+ }
+
+ size_t frequencyCount = processCpuTimesMillis.size();
+
+ if (threadCpuTimesMillis.size() != frequencyCount) {
+ ALOGE("Invalid array length: threadCpuTimesMillis");
+ return false;
+ }
+ if (selectedThreadCpuTimesMillis.size() != frequencyCount) {
+ ALOGE("Invalid array length: selectedThreadCpuTimesMillisArray");
+ return false;
+ }
+
+ aggregateThreadCpuTimes(procPathStr, pid, threadIds, frequencyCount, selectedThreadIds.get(),
+ selectedThreadIds.size(),
+ reinterpret_cast<uint64_t *>(threadCpuTimesMillis.get()),
+ reinterpret_cast<uint64_t *>(selectedThreadCpuTimesMillis.get()));
+
+ uint64_t processCpuTime;
+ bool ret = getProcessCpuTime(procPathStr, pid, processCpuTime);
+ if (ret) {
+ estimateProcessTimeInState(processCpuTime,
+ reinterpret_cast<uint64_t *>(threadCpuTimesMillis.get()),
+ frequencyCount,
+ reinterpret_cast<uint64_t *>(processCpuTimesMillis.get()));
+ }
+ return ret;
+}
+
+static const JNINativeMethod g_single_methods[] = {
+ {"readProcessCpuUsage", "(Ljava/lang/String;I[I[J[J[J)Z", (void *)readProcessCpuUsage},
+};
+
+int register_com_android_internal_os_KernelSingleProcessCpuThreadReader(JNIEnv *env) {
+ return RegisterMethodsOrDie(env, "com/android/internal/os/KernelSingleProcessCpuThreadReader",
+ g_single_methods, NELEM(g_single_methods));
+}
+
+} // namespace android
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 2ac2a1f..e2f4f2f 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -4541,6 +4541,12 @@
<permission android:name="android.permission.RESET_FINGERPRINT_LOCKOUT"
android:protectionLevel="signature" />
+ <!-- Allows access to TestApis for various components in the biometric stack, including
+ FingerprintService, FaceService, BiometricService. Used by com.android.server.biometrics
+ CTS tests. @hide @TestApi -->
+ <permission android:name="android.permission.TEST_BIOMETRIC"
+ android:protectionLevel="signature" />
+
<!-- Allows direct access to the <Biometric>Service interfaces. Reserved for the system. @hide -->
<permission android:name="android.permission.MANAGE_BIOMETRIC"
android:protectionLevel="signature" />
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index ffc5ff7..b9f0f58 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -327,7 +327,7 @@
<string name="capability_desc_canControlMagnification" msgid="2206586716709254805">"Controla el posicionamiento y el nivel de zoom de la pantalla."</string>
<string name="capability_title_canPerformGestures" msgid="9106545062106728987">"Realizar gestos"</string>
<string name="capability_desc_canPerformGestures" msgid="6619457251067929726">"Puedes tocar y pellizcar la pantalla, deslizar el dedo y hacer otros gestos."</string>
- <string name="capability_title_canCaptureFingerprintGestures" msgid="1189053104594608091">"Gestos de huellas digitales"</string>
+ <string name="capability_title_canCaptureFingerprintGestures" msgid="1189053104594608091">"Gestos de huella digital"</string>
<string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Puede capturar los gestos realizados en el sensor de huellas digitales del dispositivo."</string>
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Hacer captura"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Puede hacer capturas de la pantalla."</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index a99d4d6..907fe5b 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -1658,11 +1658,11 @@
<string name="accessibility_shortcut_disabling_service" msgid="8675244165062700619">"کلیدهای میزان صدا پایین نگه داشته شد. <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>
<string name="accessibility_button_prompt_text" msgid="8343213623338605305">"ویژگی را انتخاب کنید که هنگام ضربه زدن روی دکمه دسترسپذیری استفاده میشود:"</string>
- <string name="accessibility_gesture_prompt_text" msgid="8742535972130563952">"ویژگی را برای استفاده با اشاره دسترسپذیری انتخاب کنید (با دو انگشت صفحه را از پایین تند به بالا بکشید):"</string>
- <string name="accessibility_gesture_3finger_prompt_text" msgid="5211827854510660203">"ویزگی را برای استفاده با اشاره دسترسپذیری انتخاب کنید (با سه انگشت صفحه را از پایین تند به بالا بکشید):"</string>
+ <string name="accessibility_gesture_prompt_text" msgid="8742535972130563952">"ویژگی را برای استفاده با اشاره دسترسپذیری انتخاب کنید (با دو انگشت صفحه را از پایین تند بهبالا بکشید):"</string>
+ <string name="accessibility_gesture_3finger_prompt_text" msgid="5211827854510660203">"ویزگی را برای استفاده با اشاره دسترسپذیری انتخاب کنید (با سه انگشت صفحه را از پایین تند بهبالا بکشید):"</string>
<string name="accessibility_button_instructional_text" msgid="8853928358872550500">"برای جابهجایی بین ویژگیها، دکمه دسترسپذیری را لمس کنید و نگه دارید."</string>
- <string name="accessibility_gesture_instructional_text" msgid="9196230728837090497">"برای جابهجایی بین ویژگیها، با دو انگشت صفحه را تند به بالا بکشید و نگه دارید."</string>
- <string name="accessibility_gesture_3finger_instructional_text" msgid="3425123684990193765">"برای جابهجایی بین ویژگیها، با سه انگشت صفحه را تند به بالا بکشید و نگه دارید."</string>
+ <string name="accessibility_gesture_instructional_text" msgid="9196230728837090497">"برای جابهجایی بین ویژگیها، با دو انگشت صفحه را تند بهبالا بکشید و نگه دارید."</string>
+ <string name="accessibility_gesture_3finger_instructional_text" msgid="3425123684990193765">"برای جابهجایی بین ویژگیها، با سه انگشت صفحه را تند بهبالا بکشید و نگه دارید."</string>
<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>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index 59d4d77..d2bdbbb 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -327,7 +327,7 @@
<string name="capability_desc_canControlMagnification" msgid="2206586716709254805">"Contrôle le niveau de zoom et le positionnement de l\'écran."</string>
<string name="capability_title_canPerformGestures" msgid="9106545062106728987">"Effectuer des gestes"</string>
<string name="capability_desc_canPerformGestures" msgid="6619457251067929726">"Permet d\'appuyer sur l\'écran, de le balayer, de le pincer et d\'effectuer d\'autres gestes."</string>
- <string name="capability_title_canCaptureFingerprintGestures" msgid="1189053104594608091">"Gestes avec l\'empreinte digitale"</string>
+ <string name="capability_title_canCaptureFingerprintGestures" msgid="1189053104594608091">"Gestes d\'empreinte digitale"</string>
<string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Peut enregistrer des gestes effectués sur le lecteur d\'empreinte digitale de l\'appareil."</string>
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Prendre une capture d\'écran"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Peut prendre des captures d\'écran."</string>
diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml
index fcf64c1..ffe073c 100644
--- a/core/res/res/values-ml/strings.xml
+++ b/core/res/res/values-ml/strings.xml
@@ -327,7 +327,7 @@
<string name="capability_desc_canControlMagnification" msgid="2206586716709254805">"ഡിസ്പ്ലേയുടെ സൂം നിലയും പൊസിഷനിംഗും നിയന്ത്രിക്കുക."</string>
<string name="capability_title_canPerformGestures" msgid="9106545062106728987">"ജെസ്റ്ററുകൾ നിർവഹിക്കുക"</string>
<string name="capability_desc_canPerformGestures" msgid="6619457251067929726">"ടാപ്പുചെയ്യാനോ സ്വൈപ്പുചെയ്യാനോ പിഞ്ചുചെയ്യാനോ മറ്റ് ജെസ്റ്ററുകൾ നിർവഹിക്കാനോ കഴിയും."</string>
- <string name="capability_title_canCaptureFingerprintGestures" msgid="1189053104594608091">"ഫിംഗർപ്രിന്റ് ജെസ്റ്ററുകൾ"</string>
+ <string name="capability_title_canCaptureFingerprintGestures" msgid="1189053104594608091">"ഫിംഗർപ്രിന്റ് ജെസ്ച്ചറുകൾ"</string>
<string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"ഉപകരണത്തിന്റെ ഫിംഗർപ്രിന്റ് സെൻസറിൽ ചെയ്ത ജെസ്റ്ററുകൾ ക്യാപ്ചർ ചെയ്യാനാകും."</string>
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"സ്ക്രീന്ഷോട്ട് എടുക്കുക"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"ഡിസ്പ്ലേയുടെ സ്ക്രീൻഷോട്ട് എടുക്കാൻ കഴിയും."</string>
diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml
index 01ee79a9..2cdf709 100644
--- a/core/res/res/values-ne/strings.xml
+++ b/core/res/res/values-ne/strings.xml
@@ -1477,7 +1477,7 @@
<string name="add_account_button_label" msgid="322390749416414097">"खाता थप्नुहोस्"</string>
<string name="number_picker_increment_button" msgid="7621013714795186298">"बढाउनुहोस्"</string>
<string name="number_picker_decrement_button" msgid="5116948444762708204">"घटाउनुहोस्"</string>
- <string name="number_picker_increment_scroll_mode" msgid="8403893549806805985">"<xliff:g id="VALUE">%s</xliff:g> छोइराख्नुहोस्।"</string>
+ <string name="number_picker_increment_scroll_mode" msgid="8403893549806805985">"<xliff:g id="VALUE">%s</xliff:g> टच एण्ड होल्ड गर्नुहोस्।"</string>
<string name="number_picker_increment_scroll_action" msgid="8310191318914268271">"बढाउन माथि र घटाउन तल सार्नुहोस्।"</string>
<string name="time_picker_increment_minute_button" msgid="7195870222945784300">"मिनेट बढाउनुहोस्"</string>
<string name="time_picker_decrement_minute_button" msgid="230925389943411490">"मिनेट घटाउनुहोस्"</string>
@@ -1660,9 +1660,9 @@
<string name="accessibility_button_prompt_text" msgid="8343213623338605305">"तपाईंले पहुँचको बटन ट्याप गर्दा प्रयोग गर्न चाहनुभएको सुविधा छनौट गर्नुहोस्:"</string>
<string name="accessibility_gesture_prompt_text" msgid="8742535972130563952">"तपाईंले पहुँचको इसारामार्फत प्रयोग गर्न चाहनुभएको सुविधा छनौट गर्नुहोस् (दुईवटा औँलाले स्क्रिनको फेदबाट माथितिर स्वाइप गर्नुहोस्):"</string>
<string name="accessibility_gesture_3finger_prompt_text" msgid="5211827854510660203">"तपाईंले पहुँचको इसारामार्फत प्रयोग गर्न चाहनुभएको सुविधा छनौट गर्नुहोस् (तीनवटा औँलाले स्क्रिनको फेदबाट माथितिर स्वाइप गर्नुहोस्):"</string>
- <string name="accessibility_button_instructional_text" msgid="8853928358872550500">"एउटा सुविधाबाट अर्को सुविधामा जान पहुँच बटन छोइराख्नुहोस्।"</string>
- <string name="accessibility_gesture_instructional_text" msgid="9196230728837090497">"एउटा सुविधाबाट अर्को सुविधामा जान दुईवटा औँलाले माथितिर स्वाइप गरी स्क्रिनमा छोइराख्नुहोस्।"</string>
- <string name="accessibility_gesture_3finger_instructional_text" msgid="3425123684990193765">"एउटा सुविधाबाट अर्को सुविधामा जान तीनवटा औँलाले माथितिर स्वाइप गरी स्क्रिनमा छोइराख्नुहोस्।"</string>
+ <string name="accessibility_button_instructional_text" msgid="8853928358872550500">"एउटा सुविधाबाट अर्को सुविधामा जान पहुँच बटन टच एण्ड होल्ड गर्नुहोस्।"</string>
+ <string name="accessibility_gesture_instructional_text" msgid="9196230728837090497">"एउटा सुविधाबाट अर्को सुविधामा जान दुईवटा औँलाले माथितिर स्वाइप गरी स्क्रिनमा टच एण्ड होल्ड गर्नुहोस्।"</string>
+ <string name="accessibility_gesture_3finger_instructional_text" msgid="3425123684990193765">"एउटा सुविधाबाट अर्को सुविधामा जान तीनवटा औँलाले माथितिर स्वाइप गरी स्क्रिनमा टच एण्ड होल्ड गर्नुहोस्।"</string>
<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>
diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml
index 6ea5f52..11bfd78 100644
--- a/core/res/res/values-pa/strings.xml
+++ b/core/res/res/values-pa/strings.xml
@@ -432,23 +432,17 @@
<string name="permlab_modifyAudioSettings" msgid="6129039778010031815">"ਆਪਣੀਆਂ ਆਡੀਓ ਸੈਟਿੰਗਾਂ ਬਦਲੋ"</string>
<string name="permdesc_modifyAudioSettings" msgid="8687227609663124921">"ਐਪ ਨੂੰ ਗਲੋਬਲ ਆਡੀਓ ਸੈਟਿੰਗਾਂ ਸੰਸ਼ੋਧਿਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ ਜਿਵੇਂ ਅਵਾਜ਼ ਅਤੇ ਆਊਟਪੁਟ ਲਈ ਕਿਹੜਾ ਸਪੀਕਰ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ।"</string>
<string name="permlab_recordAudio" msgid="1208457423054219147">" ਆਡੀਓ ਰਿਕਾਰਡ ਕਰਨ"</string>
- <!-- no translation found for permdesc_recordAudio (5857246765327514062) -->
- <skip />
- <!-- no translation found for permlab_recordBackgroundAudio (5891032812308878254) -->
- <skip />
- <!-- no translation found for permdesc_recordBackgroundAudio (1992623135737407516) -->
- <skip />
+ <string name="permdesc_recordAudio" msgid="5857246765327514062">"ਇਹ ਐਪ ਵਰਤੋਂ ਵਿੱਚ ਹੋਣ ਵੇਲੇ ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਨੂੰ ਵਰਤ ਕੇ ਆਡੀਓ ਰਿਕਾਰਡ ਕਰ ਸਕਦੀ ਹੈ।"</string>
+ <string name="permlab_recordBackgroundAudio" msgid="5891032812308878254">"ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਆਡੀਓ ਰਿਕਾਰਡ ਕਰੋ"</string>
+ <string name="permdesc_recordBackgroundAudio" msgid="1992623135737407516">"ਇਹ ਐਪ ਕਿਸੇ ਵੇਲੇ ਵੀ ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਨੂੰ ਵਰਤ ਕੇ ਆਡੀਓ ਰਿਕਾਰਡ ਕਰ ਸਕਦੀ ਹੈ।"</string>
<string name="permlab_sim_communication" msgid="176788115994050692">"SIM ਨੂੰ ਕਮਾਂਡਾਂ ਭੇਜੋ"</string>
<string name="permdesc_sim_communication" msgid="4179799296415957960">"ਐਪ ਨੂੰ SIM ਨੂੰ ਕਮਾਂਡਾਂ ਭੇਜਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਹ ਬਹੁਤ ਘਾਤਕ ਹੈ।"</string>
<string name="permlab_activityRecognition" msgid="1782303296053990884">"ਸਰੀਰਕ ਸਰਗਰਮੀ ਨੂੰ ਪਛਾਣਨਾ"</string>
<string name="permdesc_activityRecognition" msgid="8667484762991357519">"ਇਹ ਐਪ ਤੁਹਾਡੀ ਸਰੀਰਕ ਸਰਗਰਮੀ ਨੂੰ ਪਛਾਣ ਸਕਦੀ ਹੈ।"</string>
<string name="permlab_camera" msgid="6320282492904119413">"ਤਸਵੀਰਾਂ ਅਤੇ ਵੀਡੀਓ ਬਣਾਓ"</string>
- <!-- no translation found for permdesc_camera (5240801376168647151) -->
- <skip />
- <!-- no translation found for permlab_backgroundCamera (7549917926079731681) -->
- <skip />
- <!-- no translation found for permdesc_backgroundCamera (1615291686191138250) -->
- <skip />
+ <string name="permdesc_camera" msgid="5240801376168647151">"ਇਹ ਐਪ ਵਰਤੋਂ ਵਿੱਚ ਹੋਣ ਵੇਲੇ ਕੈਮਰੇ ਨੂੰ ਵਰਤ ਕੇ ਤਸਵੀਰਾਂ ਖਿੱਚ ਸਕਦੀ ਹੈ ਅਤੇ ਵੀਡੀਓ ਰਿਕਾਰਡ ਕਰ ਸਕਦੀ ਹੈ।"</string>
+ <string name="permlab_backgroundCamera" msgid="7549917926079731681">"ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਤਸਵੀਰਾਂ ਖਿੱਚੋ ਅਤੇ ਵੀਡੀਓ ਰਿਕਾਰਡ ਕਰੋ"</string>
+ <string name="permdesc_backgroundCamera" msgid="1615291686191138250">"ਇਹ ਐਪ ਕਿਸੇ ਵੇਲੇ ਵੀ ਕੈਮਰੇ ਨੂੰ ਵਰਤ ਕੇ ਤਸਵੀਰਾਂ ਖਿੱਚ ਸਕਦੀ ਹੈ ਅਤੇ ਵੀਡੀਓ ਰਿਕਾਰਡ ਕਰ ਸਕਦੀ ਹੈ।"</string>
<string name="permlab_systemCamera" msgid="3642917457796210580">"ਸਿਸਟਮ ਕੈਮਰੇ ਨੂੰ ਤਸਵੀਰਾਂ ਅਤੇ ਵੀਡੀਓ ਬਣਾਉਣ ਲਈ ਐਪਲੀਕੇਸ਼ਨ ਜਾਂ ਸੇਵਾ ਤੱਕ ਪਹੁੰਚ ਦਿਓ"</string>
<string name="permdesc_systemCamera" msgid="5938360914419175986">"ਇਹ ਵਿਸ਼ੇਸ਼ ਅਧਿਕ੍ਰਿਤ ਜਾਂ ਸਿਸਟਮ ਐਪ ਕਿਸੇ ਵੇਲੇ ਵੀ ਸਿਸਟਮ ਕੈਮਰੇ ਨੂੰ ਵਰਤ ਕੇ ਤਸਵੀਰਾਂ ਖਿੱਚ ਸਕਦੀ ਹੈ ਅਤੇ ਵੀਡੀਓ ਫ਼ਾਈਲਾਂ ਰਿਕਾਰਡ ਕਰ ਸਕਦੀ ਹੈ। ਐਪ ਨੂੰ ਵੀ android.permission.CAMERA ਇਜਾਜ਼ਤ ਦੀ ਲੋੜ ਹੈ"</string>
<string name="permlab_cameraOpenCloseListener" msgid="5548732769068109315">"ਐਪਲੀਕੇਸ਼ਨ ਜਾਂ ਸੇਵਾ ਨੂੰ ਕੈਮਰਾ ਡੀਵਾਈਸਾਂ ਦੇ ਚਾਲੂ ਜਾਂ ਬੰਦ ਕੀਤੇ ਜਾਣ ਬਾਰੇ ਕਾਲਬੈਕ ਪ੍ਰਾਪਤ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ।"</string>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 0c15f9e..da41508 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -1137,7 +1137,7 @@
<string name="elapsed_time_short_format_mm_ss" msgid="8689459651807876423">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
<string name="elapsed_time_short_format_h_mm_ss" msgid="2302144714803345056">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
<string name="selectAll" msgid="1532369154488982046">"Вибрати все"</string>
- <string name="cut" msgid="2561199725874745819">"Виріз."</string>
+ <string name="cut" msgid="2561199725874745819">"Вирізати"</string>
<string name="copy" msgid="5472512047143665218">"Копіювати"</string>
<string name="failed_to_copy_to_clipboard" msgid="725919885138539875">"Не вдалося скопіювати в буфер обміну"</string>
<string name="paste" msgid="461843306215520225">"Вставити"</string>
diff --git a/core/tests/coretests/src/com/android/internal/view/RecyclerViewCaptureHelperTest.java b/core/tests/coretests/src/com/android/internal/view/RecyclerViewCaptureHelperTest.java
new file mode 100644
index 0000000..88bbcc2
--- /dev/null
+++ b/core/tests/coretests/src/com/android/internal/view/RecyclerViewCaptureHelperTest.java
@@ -0,0 +1,343 @@
+/*
+ * 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.internal.view;
+
+import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
+import static android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
+import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assert.fail;
+
+import android.app.Instrumentation;
+import android.content.Context;
+import android.graphics.Color;
+import android.graphics.PixelFormat;
+import android.graphics.Rect;
+import android.view.Gravity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.WindowManager;
+import android.widget.FrameLayout;
+import android.widget.TextView;
+
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import com.android.internal.view.ScrollCaptureViewHelper.ScrollResult;
+import com.android.internal.widget.LinearLayoutManager;
+import com.android.internal.widget.RecyclerView;
+
+import com.google.common.truth.Truth;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.Random;
+
+@RunWith(AndroidJUnit4.class)
+public class RecyclerViewCaptureHelperTest {
+ private static final int CHILD_VIEWS = 12;
+ private static final int CHILD_VIEW_HEIGHT = 300;
+ private static final int WINDOW_WIDTH = 800;
+ private static final int WINDOW_HEIGHT = 1200;
+ private static final int CAPTURE_HEIGHT = 600;
+
+ private FrameLayout mParent;
+ private RecyclerView mTarget;
+ private WindowManager mWm;
+
+ private WindowManager.LayoutParams mWindowLayoutParams;
+
+ private Context mContext;
+ private float mDensity;
+ private LinearLayoutManager mLinearLayoutManager;
+ private Instrumentation mInstrumentation;
+
+ @Before
+ @UiThreadTest
+ public void setUp() {
+ mInstrumentation = InstrumentationRegistry.getInstrumentation();
+ mContext = mInstrumentation.getContext();
+ mDensity = mContext.getResources().getDisplayMetrics().density;
+
+ mParent = new FrameLayout(mContext);
+
+ mTarget = new RecyclerView(mContext);
+ mParent.addView(mTarget, new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT));
+
+ mTarget.setAdapter(new TestAdapter());
+ mLinearLayoutManager =
+ new LinearLayoutManager(mContext, LinearLayoutManager.VERTICAL, false);
+ mTarget.setLayoutManager(mLinearLayoutManager);
+ mWm = mContext.getSystemService(WindowManager.class);
+
+ // Setup the window that we are going to use
+ mWindowLayoutParams = new WindowManager.LayoutParams(WINDOW_WIDTH, WINDOW_HEIGHT,
+ TYPE_APPLICATION_OVERLAY, FLAG_NOT_TOUCHABLE, PixelFormat.OPAQUE);
+ mWindowLayoutParams.setTitle("ScrollViewCaptureHelper");
+ mWindowLayoutParams.gravity = Gravity.CENTER;
+ mWm.addView(mParent, mWindowLayoutParams);
+ }
+
+ @After
+ @UiThreadTest
+ public void tearDown() {
+ mWm.removeViewImmediate(mParent);
+ }
+
+ @Test
+ @UiThreadTest
+ public void onScrollRequested_up_fromTop() {
+ mTarget.scrollBy(0, -(WINDOW_HEIGHT * 3));
+ // mTarget.createSnapshot(new ViewDebug.HardwareCanvasProvider(), false);
+
+ RecyclerViewCaptureHelper rvc = new RecyclerViewCaptureHelper();
+ Rect scrollBounds = rvc.onComputeScrollBounds(mTarget);
+ rvc.onPrepareForStart(mTarget, scrollBounds);
+
+ assertThat(scrollBounds.height()).isGreaterThan(CAPTURE_HEIGHT);
+
+ Rect request = new Rect(0, -CAPTURE_HEIGHT, scrollBounds.width(), 0);
+
+ ScrollResult scrollResult = rvc.onScrollRequested(mTarget,
+ scrollBounds, request);
+
+ // The result is an empty rectangle and no scrolling, since it
+ // is not possible to physically scroll further up to make the
+ // requested area visible at all (it doesn't exist).
+ assertEmpty(scrollResult.availableArea);
+ }
+
+ @Test
+ @UiThreadTest
+ public void onScrollRequested_down_fromTop() {
+ mTarget.scrollBy(0, -(WINDOW_HEIGHT * 3));
+
+ RecyclerViewCaptureHelper rvc = new RecyclerViewCaptureHelper();
+ Rect scrollBounds = rvc.onComputeScrollBounds(mTarget);
+ rvc.onPrepareForStart(mTarget, scrollBounds);
+
+ assertThat(scrollBounds.height()).isGreaterThan(CAPTURE_HEIGHT);
+
+ // Capture between y = +1200 to +1800 pixels BELOW current top
+ Rect request = new Rect(0, WINDOW_HEIGHT, scrollBounds.width(),
+ WINDOW_HEIGHT + CAPTURE_HEIGHT);
+
+ ScrollResult scrollResult = rvc.onScrollRequested(mTarget, scrollBounds, request);
+ assertThat(request).isEqualTo(scrollResult.requestedArea);
+ assertThat(request).isEqualTo(scrollResult.availableArea);
+ assertThat(scrollResult.scrollDelta).isEqualTo(CAPTURE_HEIGHT);
+ assertAvailableAreaCompletelyVisible(scrollResult, mTarget);
+ }
+
+ @Test
+ @UiThreadTest
+ public void onScrollRequested_up_fromMiddle() {
+ mTarget.scrollBy(0, WINDOW_HEIGHT);
+
+ RecyclerViewCaptureHelper helper = new RecyclerViewCaptureHelper();
+ Rect scrollBounds = helper.onComputeScrollBounds(mTarget);
+ helper.onPrepareForStart(mTarget, scrollBounds);
+
+ Rect request = new Rect(0, -CAPTURE_HEIGHT, scrollBounds.width(), 0);
+
+ ScrollResult scrollResult = helper.onScrollRequested(mTarget, scrollBounds, request);
+ assertThat(request).isEqualTo(scrollResult.requestedArea);
+ assertThat(request).isEqualTo(scrollResult.availableArea);
+ assertThat(scrollResult.scrollDelta).isEqualTo(-CAPTURE_HEIGHT);
+ assertAvailableAreaCompletelyVisible(scrollResult, mTarget);
+ }
+
+ @Test
+ @UiThreadTest
+ public void onScrollRequested_down_fromMiddle() {
+ mTarget.scrollBy(0, WINDOW_HEIGHT);
+
+ RecyclerViewCaptureHelper helper = new RecyclerViewCaptureHelper();
+ Rect scrollBounds = helper.onComputeScrollBounds(mTarget);
+ helper.onPrepareForStart(mTarget, scrollBounds);
+
+ Rect request = new Rect(0, WINDOW_HEIGHT, scrollBounds.width(),
+ WINDOW_HEIGHT + CAPTURE_HEIGHT);
+
+ ScrollResult scrollResult = helper.onScrollRequested(mTarget, scrollBounds, request);
+ assertThat(request).isEqualTo(scrollResult.requestedArea);
+ assertThat(request).isEqualTo(scrollResult.availableArea);
+ assertThat(scrollResult.scrollDelta).isEqualTo(CAPTURE_HEIGHT);
+ assertAvailableAreaCompletelyVisible(scrollResult, mTarget);
+ }
+
+ @Test
+ @UiThreadTest
+ public void onScrollRequested_up_fromBottom() {
+ mTarget.scrollBy(0, WINDOW_HEIGHT * 2);
+
+ RecyclerViewCaptureHelper helper = new RecyclerViewCaptureHelper();
+ Rect scrollBounds = helper.onComputeScrollBounds(mTarget);
+ helper.onPrepareForStart(mTarget, scrollBounds);
+
+ Rect request = new Rect(0, -CAPTURE_HEIGHT, scrollBounds.width(), 0);
+
+ ScrollResult scrollResult = helper.onScrollRequested(mTarget, scrollBounds, request);
+ assertThat(request).isEqualTo(scrollResult.requestedArea);
+ assertThat(request).isEqualTo(scrollResult.availableArea);
+ assertThat(scrollResult.scrollDelta).isEqualTo(-CAPTURE_HEIGHT);
+ assertAvailableAreaCompletelyVisible(scrollResult, mTarget);
+ }
+
+ @Test
+ @UiThreadTest
+ public void onScrollRequested_down_fromBottom() {
+ mTarget.scrollBy(0, WINDOW_HEIGHT * 3);
+
+ RecyclerViewCaptureHelper rvc = new RecyclerViewCaptureHelper();
+ Rect scrollBounds = rvc.onComputeScrollBounds(mTarget);
+ rvc.onPrepareForStart(mTarget, scrollBounds);
+
+ Rect request = new Rect(0, WINDOW_HEIGHT, scrollBounds.width(),
+ WINDOW_HEIGHT + CAPTURE_HEIGHT);
+
+ ScrollResult scrollResult = rvc.onScrollRequested(mTarget,
+ scrollBounds, request);
+ Truth.assertThat(request).isEqualTo(scrollResult.requestedArea);
+
+ // The result is an empty rectangle and no scrolling, since it
+ // is not possible to physically scroll further down to make the
+ // requested area visible at all (it doesn't exist).
+ assertEmpty(scrollResult.availableArea);
+ }
+
+ @Test
+ @UiThreadTest
+ public void onScrollRequested_offTopEdge() {
+ mTarget.scrollBy(0, -(WINDOW_HEIGHT * 3));
+
+ RecyclerViewCaptureHelper helper = new RecyclerViewCaptureHelper();
+ Rect scrollBounds = helper.onComputeScrollBounds(mTarget);
+ helper.onPrepareForStart(mTarget, scrollBounds);
+
+ // Create a request which lands halfway off the top of the content
+ //from -1500 to -900, (starting at 1200 = -300 to +300 within the content)
+ int top = 0;
+ Rect request = new Rect(
+ 0, top - (CAPTURE_HEIGHT / 2),
+ scrollBounds.width(), top + (CAPTURE_HEIGHT / 2));
+
+ ScrollResult scrollResult = helper.onScrollRequested(mTarget, scrollBounds, request);
+ assertThat(request).isEqualTo(scrollResult.requestedArea);
+
+ ScrollResult result = helper.onScrollRequested(mTarget, scrollBounds, request);
+ // The result is a partial result
+ Rect expectedResult = new Rect(request);
+ expectedResult.top += (CAPTURE_HEIGHT / 2); // top half clipped
+ assertThat(expectedResult).isEqualTo(result.availableArea);
+ assertThat(scrollResult.scrollDelta).isEqualTo(0);
+ assertAvailableAreaPartiallyVisible(scrollResult, mTarget);
+ }
+
+ @Test
+ @UiThreadTest
+ public void onScrollRequested_offBottomEdge() {
+ mTarget.scrollBy(0, WINDOW_HEIGHT * 2);
+
+ RecyclerViewCaptureHelper helper = new RecyclerViewCaptureHelper();
+ Rect scrollBounds = helper.onComputeScrollBounds(mTarget);
+ helper.onPrepareForStart(mTarget, scrollBounds);
+
+ // Create a request which lands halfway off the bottom of the content
+ //from 600 to to 1200, (starting at 2400 = 3000 to 3600 within the content)
+
+ int bottom = WINDOW_HEIGHT;
+ Rect request = new Rect(
+ 0, bottom - (CAPTURE_HEIGHT / 2),
+ scrollBounds.width(), bottom + (CAPTURE_HEIGHT / 2));
+
+ ScrollResult result = helper.onScrollRequested(mTarget, scrollBounds, request);
+
+ Rect expectedResult = new Rect(request);
+ expectedResult.bottom -= 300; // bottom half clipped
+ assertThat(expectedResult).isEqualTo(result.availableArea);
+ assertThat(result.scrollDelta).isEqualTo(0);
+ assertAvailableAreaPartiallyVisible(result, mTarget);
+ }
+
+ static final class TestViewHolder extends RecyclerView.ViewHolder {
+ TestViewHolder(View itemView) {
+ super(itemView);
+ }
+ }
+
+ static final class TestAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
+ private final Random mRandom = new Random();
+
+ @Override
+ public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+ return new TestViewHolder(new TextView(parent.getContext()));
+ }
+
+ @Override
+ public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
+ TextView view = (TextView) holder.itemView;
+ view.setText("Child #" + position);
+ view.setTextColor(Color.WHITE);
+ view.setTextSize(30f);
+ view.setBackgroundColor(Color.rgb(mRandom.nextFloat(), mRandom.nextFloat(),
+ mRandom.nextFloat()));
+ view.setMinHeight(CHILD_VIEW_HEIGHT);
+ }
+
+ @Override
+ public int getItemCount() {
+ return CHILD_VIEWS;
+ }
+ }
+
+ static void assertEmpty(Rect r) {
+ if (r != null && !r.isEmpty()) {
+ fail("Not true that " + r + " is empty");
+ }
+ }
+
+ static Rect getVisibleRect(View v) {
+ Rect r = new Rect(0, 0, v.getWidth(), v.getHeight());
+ v.getLocalVisibleRect(r);
+ return r;
+ }
+
+ static void assertAvailableAreaCompletelyVisible(ScrollResult result, View container) {
+ Rect requested = new Rect(result.availableArea);
+ requested.offset(0, -result.scrollDelta); // make relative
+ Rect localVisible = getVisibleRect(container);
+ if (!localVisible.contains(requested)) {
+ fail("Not true that all of " + requested + " is contained by " + localVisible);
+ }
+ }
+
+ static void assertAvailableAreaPartiallyVisible(ScrollResult result, View container) {
+ Rect requested = new Rect(result.availableArea);
+ requested.offset(0, -result.scrollDelta); // make relative
+ Rect localVisible = getVisibleRect(container);
+ if (!Rect.intersects(localVisible, requested)) {
+ fail("Not true that any of " + requested + " is contained by " + localVisible);
+ }
+ }
+}
diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml
index 81da5c8..4c3b36f 100644
--- a/data/etc/privapp-permissions-platform.xml
+++ b/data/etc/privapp-permissions-platform.xml
@@ -437,6 +437,9 @@
<permission name="android.permission.MANAGE_DEBUGGING" />
<!-- Permissions required for CTS test - TimeManagerTest -->
<permission name="android.permission.MANAGE_TIME_AND_ZONE_DETECTION" />
+ <!-- Permissions required for CTS test - android.server.biometrics -->
+ <permission name="android.permission.USE_BIOMETRIC" />
+ <permission name="android.permission.TEST_BIOMETRIC" />
</privapp-permissions>
<privapp-permissions package="com.android.statementservice">
diff --git a/graphics/java/android/graphics/ParcelableColorSpace.java b/graphics/java/android/graphics/ParcelableColorSpace.java
index d408ac3..3260849 100644
--- a/graphics/java/android/graphics/ParcelableColorSpace.java
+++ b/graphics/java/android/graphics/ParcelableColorSpace.java
@@ -73,6 +73,9 @@
}
}
+ /**
+ * @return the backing ColorSpace that this ParcelableColorSpace is wrapping.
+ */
public @NonNull ColorSpace getColorSpace() {
return mColorSpace;
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java
index 41c0a88..ea9c960 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java
@@ -61,7 +61,6 @@
private final DisplayInfo mTmpDisplayInfo = new DisplayInfo();
private final Rect mTmpInsetBounds = new Rect();
private final Rect mTmpNormalBounds = new Rect();
- protected final Rect mReentryBounds = new Rect();
private DisplayController mDisplayController;
private PipAppOpsListener mAppOpsListener;
@@ -396,8 +395,7 @@
public void onPipTransitionStarted(ComponentName activity, int direction, Rect pipBounds) {
if (isOutPipDirection(direction)) {
// Exiting PIP, save the reentry bounds to restore to when re-entering.
- updateReentryBounds(pipBounds);
- mPipBoundsHandler.onSaveReentryBounds(activity, mReentryBounds);
+ mPipBoundsHandler.onSaveReentryBounds(activity, pipBounds);
}
// Disable touches while the animation is running
mTouchHandler.setTouchEnabled(false);
@@ -406,16 +404,6 @@
}
}
- /**
- * Update the bounds used to save the re-entry size and snap fraction when exiting PIP.
- */
- public void updateReentryBounds(Rect bounds) {
- final Rect reentryBounds = mTouchHandler.getUserResizeBounds();
- float snapFraction = mPipBoundsHandler.getSnapFraction(bounds);
- mPipBoundsHandler.applySnapFraction(reentryBounds, snapFraction);
- mReentryBounds.set(reentryBounds);
- }
-
@Override
public void onPipTransitionFinished(ComponentName activity, int direction) {
onPipTransitionFinishedOrCanceled(direction);
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipAnimationControllerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipAnimationControllerTest.java
index 7d51886..255e749 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipAnimationControllerTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipAnimationControllerTest.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.systemui.pip;
+package com.android.wm.shell.pip;
import static com.android.wm.shell.pip.PipAnimationController.TRANSITION_DIRECTION_LEAVE_PIP;
import static com.android.wm.shell.pip.PipAnimationController.TRANSITION_DIRECTION_TO_PIP;
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipBoundsHandlerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipBoundsHandlerTest.java
index f514b0b..d9e3148 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipBoundsHandlerTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipBoundsHandlerTest.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.systemui.pip;
+package com.android.wm.shell.pip;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipControllerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipControllerTest.java
index d305c64..92f03e1 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipControllerTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipControllerTest.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.systemui.pip.phone;
+package com.android.wm.shell.pip.phone;
import static android.content.pm.PackageManager.FEATURE_PICTURE_IN_PICTURE;
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipTaskOrganizerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipTaskOrganizerTest.java
index 663169f..c66ba13 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipTaskOrganizerTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipTaskOrganizerTest.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.systemui.pip.phone;
+package com.android.wm.shell.pip.phone;
import static android.content.pm.PackageManager.FEATURE_PICTURE_IN_PICTURE;
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipTouchHandlerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipTouchHandlerTest.java
index c96cb20..93a45c4 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipTouchHandlerTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipTouchHandlerTest.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.systemui.pip.phone;
+package com.android.wm.shell.pip.phone;
import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.any;
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipTouchStateTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipTouchStateTest.java
index 2702130..40667f7 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipTouchStateTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipTouchStateTest.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.systemui.pip.phone;
+package com.android.wm.shell.pip.phone;
import static android.view.MotionEvent.ACTION_BUTTON_PRESS;
import static android.view.MotionEvent.ACTION_DOWN;
diff --git a/libs/hwui/hwui/MinikinUtils.cpp b/libs/hwui/hwui/MinikinUtils.cpp
index b802908..5f6b53a 100644
--- a/libs/hwui/hwui/MinikinUtils.cpp
+++ b/libs/hwui/hwui/MinikinUtils.cpp
@@ -21,7 +21,6 @@
#include <log/log.h>
#include <minikin/MeasuredText.h>
-#include <minikin/Measurement.h>
#include "Paint.h"
#include "SkPathMeasure.h"
#include "Typeface.h"
@@ -70,18 +69,6 @@
}
}
-void MinikinUtils::getBounds(const Paint* paint, minikin::Bidi bidiFlags, const Typeface* typeface,
- const uint16_t* buf, size_t bufSize, minikin::MinikinRect* out) {
- minikin::MinikinPaint minikinPaint = prepareMinikinPaint(paint, typeface);
-
- const minikin::U16StringPiece textBuf(buf, bufSize);
- const minikin::StartHyphenEdit startHyphen = paint->getStartHyphenEdit();
- const minikin::EndHyphenEdit endHyphen = paint->getEndHyphenEdit();
-
- minikin::getBounds(textBuf, minikin::Range(0, textBuf.size()), bidiFlags, minikinPaint,
- startHyphen, endHyphen, out);
-}
-
float MinikinUtils::measureText(const Paint* paint, minikin::Bidi bidiFlags,
const Typeface* typeface, const uint16_t* buf, size_t start,
size_t count, size_t bufSize, float* advances) {
diff --git a/libs/hwui/hwui/MinikinUtils.h b/libs/hwui/hwui/MinikinUtils.h
index a15803a..7c3f0d8 100644
--- a/libs/hwui/hwui/MinikinUtils.h
+++ b/libs/hwui/hwui/MinikinUtils.h
@@ -48,9 +48,6 @@
size_t contextStart, size_t contextCount,
minikin::MeasuredText* mt);
- static void getBounds(const Paint* paint, minikin::Bidi bidiFlags, const Typeface* typeface,
- const uint16_t* buf, size_t bufSize, minikin::MinikinRect* out);
-
static float measureText(const Paint* paint, minikin::Bidi bidiFlags,
const Typeface* typeface, const uint16_t* buf,
size_t start, size_t count, size_t bufSize,
diff --git a/libs/hwui/jni/Paint.cpp b/libs/hwui/jni/Paint.cpp
index 3c86b28..89ff9b2 100644
--- a/libs/hwui/jni/Paint.cpp
+++ b/libs/hwui/jni/Paint.cpp
@@ -339,13 +339,18 @@
}
static void doTextBounds(JNIEnv* env, const jchar* text, int count, jobject bounds,
- const Paint& paint, const Typeface* typeface, jint bidiFlagsInt) {
+ const Paint& paint, const Typeface* typeface, jint bidiFlags) {
SkRect r;
SkIRect ir;
+ minikin::Layout layout = MinikinUtils::doLayout(&paint,
+ static_cast<minikin::Bidi>(bidiFlags), typeface,
+ text, count, // text buffer
+ 0, count, // draw range
+ 0, count, // context range
+ nullptr);
minikin::MinikinRect rect;
- minikin::Bidi bidiFlags = static_cast<minikin::Bidi>(bidiFlagsInt);
- MinikinUtils::getBounds(&paint, bidiFlags, typeface, text, count, &rect);
+ layout.getBounds(&rect);
r.fLeft = rect.mLeft;
r.fTop = rect.mTop;
r.fRight = rect.mRight;
diff --git a/location/java/android/location/ILocationManager.aidl b/location/java/android/location/ILocationManager.aidl
index 5ae9dd2..42cf53b 100644
--- a/location/java/android/location/ILocationManager.aidl
+++ b/location/java/android/location/ILocationManager.aidl
@@ -106,11 +106,12 @@
boolean isProviderEnabledForUser(String provider, int userId);
boolean isLocationEnabledForUser(int userId);
void setLocationEnabledForUser(boolean enabled, int userId);
+
void addTestProvider(String name, in ProviderProperties properties, String packageName, String attributionTag);
void removeTestProvider(String provider, String packageName, String attributionTag);
void setTestProviderLocation(String provider, in Location location, String packageName, String attributionTag);
void setTestProviderEnabled(String provider, boolean enabled, String packageName, String attributionTag);
- List<LocationRequest> getTestProviderCurrentRequests(String provider);
+
LocationTime getGnssTimeMillis();
void sendExtraCommand(String provider, String command, inout Bundle extras);
diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java
index f87988c..30a4ada 100644
--- a/location/java/android/location/LocationManager.java
+++ b/location/java/android/location/LocationManager.java
@@ -1815,22 +1815,6 @@
public void clearTestProviderStatus(@NonNull String provider) {}
/**
- * Get the last list of {@link LocationRequest}s sent to the provider.
- *
- * @hide
- */
- @TestApi
- @NonNull
- public List<LocationRequest> getTestProviderCurrentRequests(String providerName) {
- Preconditions.checkArgument(providerName != null, "invalid null provider");
- try {
- return mService.getTestProviderCurrentRequests(providerName);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- }
-
- /**
* Sets a proximity alert for the location given by the position (latitude, longitude) and the
* given radius.
*
diff --git a/media/java/android/media/MediaCodec.java b/media/java/android/media/MediaCodec.java
index 0747ab13..ae97a71 100644
--- a/media/java/android/media/MediaCodec.java
+++ b/media/java/android/media/MediaCodec.java
@@ -2711,12 +2711,12 @@
}
};
- private final Pattern zeroPattern = new Pattern(0, 0);
+ private static final Pattern ZERO_PATTERN = new Pattern(0, 0);
/**
* The pattern applicable to the protected data in each subsample.
*/
- private Pattern pattern;
+ private Pattern mPattern = ZERO_PATTERN;
/**
* Set the subsample count, clear/encrypted sizes, key, IV and mode fields of
@@ -2735,22 +2735,30 @@
key = newKey;
iv = newIV;
mode = newMode;
- pattern = zeroPattern;
+ mPattern = ZERO_PATTERN;
+ }
+
+ /**
+ * Returns the {@link Pattern encryption pattern}.
+ */
+ public @NonNull Pattern getPattern() {
+ return new Pattern(mPattern.getEncryptBlocks(), mPattern.getSkipBlocks());
}
/**
* Set the encryption pattern on a {@link MediaCodec.CryptoInfo} instance.
- * See {@link MediaCodec.CryptoInfo.Pattern}.
+ * See {@link Pattern}.
*/
public void setPattern(Pattern newPattern) {
if (newPattern == null) {
- newPattern = zeroPattern;
+ newPattern = ZERO_PATTERN;
}
- pattern = newPattern;
+ setPattern(newPattern.getEncryptBlocks(), newPattern.getSkipBlocks());
}
+ // Accessed from android_media_MediaExtractor.cpp.
private void setPattern(int blocksToEncrypt, int blocksToSkip) {
- pattern = new Pattern(blocksToEncrypt, blocksToSkip);
+ mPattern = new Pattern(blocksToEncrypt, blocksToSkip);
}
@Override
@@ -2772,9 +2780,9 @@
builder.append(", encrypted ");
builder.append(Arrays.toString(numBytesOfEncryptedData));
builder.append(", pattern (encrypt: ");
- builder.append(pattern.mEncryptBlocks);
+ builder.append(mPattern.mEncryptBlocks);
builder.append(", skip: ");
- builder.append(pattern.mSkipBlocks);
+ builder.append(mPattern.mSkipBlocks);
builder.append(")");
return builder.toString();
}
diff --git a/media/java/android/media/MediaMetadata.java b/media/java/android/media/MediaMetadata.java
index dbf4ad0..78eeca1 100644
--- a/media/java/android/media/MediaMetadata.java
+++ b/media/java/android/media/MediaMetadata.java
@@ -427,7 +427,7 @@
private MediaMetadata(Parcel in) {
mBundle = in.readBundle();
- mBitmapDimensionLimit = Math.max(in.readInt(), 0);
+ mBitmapDimensionLimit = Math.max(in.readInt(), 1);
}
/**
@@ -518,17 +518,18 @@
/**
* Gets the width/height limit (in pixels) for the bitmaps when this metadata was created.
- * This method returns a positive value or zero.
+ * This method always returns a positive value.
* <p>
- * If it returns a positive value, then all the bitmaps in this metadata has width/height
+ * If it returns {@link Integer#MAX_VALUE}, then no scaling down was applied to the bitmaps
+ * when this metadata was created.
+ * <p>
+ * If it returns another positive value, then all the bitmaps in this metadata has width/height
* not greater than this limit. Bitmaps may have been scaled down according to the limit.
* <p>
- * If it returns zero, then no scaling down was applied to the bitmaps when this metadata
- * was created.
*
* @see Builder#setBitmapDimensionLimit(int)
*/
- public @IntRange(from = 0) int getBitmapDimensionLimit() {
+ public @IntRange(from = 1) int getBitmapDimensionLimit() {
return mBitmapDimensionLimit;
}
@@ -738,7 +739,7 @@
*/
public static final class Builder {
private final Bundle mBundle;
- private int mBitmapDimensionLimit;
+ private int mBitmapDimensionLimit = Integer.MAX_VALUE;
/**
* Create an empty Builder. Any field that should be included in the
@@ -925,14 +926,21 @@
* Bitmaps will be replaced with scaled down copies if their width (or height) is
* larger than {@code bitmapDimensionLimit}.
* <p>
- * In order to unset the limit, pass zero as {@code bitmapDimensionLimit}.
+ * In order to unset the limit, pass {@link Integer#MAX_VALUE} as
+ * {@code bitmapDimensionLimit}.
*
* @param bitmapDimensionLimit The maximum width/height (in pixels) for bitmaps
- * contained in the metadata. Pass {@code 0} to unset the limit.
+ * contained in the metadata. Non-positive values are ignored.
+ * Pass {@link Integer#MAX_VALUE} to unset the limit.
*/
@NonNull
- public Builder setBitmapDimensionLimit(int bitmapDimensionLimit) {
- mBitmapDimensionLimit = Math.max(bitmapDimensionLimit, 0);
+ public Builder setBitmapDimensionLimit(@IntRange(from = 1) int bitmapDimensionLimit) {
+ if (bitmapDimensionLimit > 0) {
+ mBitmapDimensionLimit = bitmapDimensionLimit;
+ } else {
+ Log.w(TAG, "setBitmapDimensionLimit(): Ignoring non-positive bitmapDimensionLimit: "
+ + bitmapDimensionLimit);
+ }
return this;
}
@@ -942,7 +950,7 @@
* @return The new MediaMetadata instance
*/
public MediaMetadata build() {
- if (mBitmapDimensionLimit > 0) {
+ if (mBitmapDimensionLimit != Integer.MAX_VALUE) {
for (String key : mBundle.keySet()) {
Object value = mBundle.get(key);
if (value instanceof Bitmap) {
diff --git a/media/java/android/media/MediaMetadataRetriever.java b/media/java/android/media/MediaMetadataRetriever.java
index cf03b06..835a709 100644
--- a/media/java/android/media/MediaMetadataRetriever.java
+++ b/media/java/android/media/MediaMetadataRetriever.java
@@ -16,10 +16,13 @@
package android.media;
+import static android.annotation.SystemApi.Client.MODULE_LIBRARIES;
+
import android.annotation.IntDef;
import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.SystemApi;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.ContentResolver;
import android.content.Context;
@@ -1331,7 +1334,6 @@
* @see MediaFormat#COLOR_RANGE_FULL
*/
public static final int METADATA_KEY_COLOR_RANGE = 37;
- // Add more here...
/**
* This key retrieves the sample rate in Hz, if available.
@@ -1344,4 +1346,13 @@
* This is a signed 32-bit integer formatted as a string in base 10.
*/
public static final int METADATA_KEY_BITS_PER_SAMPLE = 39;
+
+ /**
+ * This key retrieves the video codec mimetype if available.
+ * @hide
+ */
+ @SystemApi(client = MODULE_LIBRARIES)
+ public static final int METADATA_KEY_VIDEO_CODEC_MIME_TYPE = 40;
+
+ // Add more here...
}
diff --git a/media/java/android/media/tv/ITvInputManager.aidl b/media/java/android/media/tv/ITvInputManager.aidl
index 4380c13..ed99fad 100644
--- a/media/java/android/media/tv/ITvInputManager.aidl
+++ b/media/java/android/media/tv/ITvInputManager.aidl
@@ -25,7 +25,7 @@
import android.media.tv.ITvInputHardware;
import android.media.tv.ITvInputHardwareCallback;
import android.media.tv.ITvInputManagerCallback;
-import android.media.tv.TvChannelInfo;
+import android.media.tv.TunedInfo;
import android.media.tv.TvContentRatingSystemInfo;
import android.media.tv.TvInputHardwareInfo;
import android.media.tv.TvInputInfo;
@@ -89,7 +89,7 @@
void timeShiftSetPlaybackParams(in IBinder sessionToken, in PlaybackParams params, int userId);
void timeShiftEnablePositionTracking(in IBinder sessionToken, boolean enable, int userId);
- List<TvChannelInfo> getCurrentTvChannelInfos(int userId);
+ List<TunedInfo> getCurrentTunedInfos(int userId);
// For the recording session
void startRecording(in IBinder sessionToken, in Uri programUri, in Bundle params, int userId);
diff --git a/media/java/android/media/tv/ITvInputManagerCallback.aidl b/media/java/android/media/tv/ITvInputManagerCallback.aidl
index 9f80bf5..3128ba7 100644
--- a/media/java/android/media/tv/ITvInputManagerCallback.aidl
+++ b/media/java/android/media/tv/ITvInputManagerCallback.aidl
@@ -16,7 +16,7 @@
package android.media.tv;
-import android.media.tv.TvChannelInfo;
+import android.media.tv.TunedInfo;
import android.media.tv.TvInputInfo;
/**
@@ -29,5 +29,5 @@
void onInputUpdated(in String inputId);
void onInputStateChanged(in String inputId, int state);
void onTvInputInfoUpdated(in TvInputInfo TvInputInfo);
- void onCurrentTvChannelInfosUpdated(in List<TvChannelInfo> currentTvChannelInfos);
+ void onCurrentTunedInfosUpdated(in List<TunedInfo> currentTunedInfos);
}
diff --git a/media/java/android/media/tv/TvChannelInfo.aidl b/media/java/android/media/tv/TunedInfo.aidl
similarity index 95%
rename from media/java/android/media/tv/TvChannelInfo.aidl
rename to media/java/android/media/tv/TunedInfo.aidl
index 71cd0a7..b7c1d52 100644
--- a/media/java/android/media/tv/TvChannelInfo.aidl
+++ b/media/java/android/media/tv/TunedInfo.aidl
@@ -16,4 +16,4 @@
package android.media.tv;
-parcelable TvChannelInfo;
+parcelable TunedInfo;
diff --git a/media/java/android/media/tv/TvChannelInfo.java b/media/java/android/media/tv/TunedInfo.java
similarity index 88%
rename from media/java/android/media/tv/TvChannelInfo.java
rename to media/java/android/media/tv/TunedInfo.java
index 11cb1f7..6fc5784 100644
--- a/media/java/android/media/tv/TvChannelInfo.java
+++ b/media/java/android/media/tv/TunedInfo.java
@@ -31,11 +31,12 @@
/**
- * This class is used to specify information of a TV channel.
+ * Contains information about a {@link TvInputService.Session} that is currently tuned to a channel
+ * or pass-through input.
* @hide
*/
-public final class TvChannelInfo implements Parcelable {
- static final String TAG = "TvChannelInfo";
+public final class TunedInfo implements Parcelable {
+ static final String TAG = "TunedInfo";
/**
* App tag for {@link #getAppTag()}: the corresponding application of the channel is the same as
@@ -67,21 +68,21 @@
@Retention(RetentionPolicy.SOURCE)
public @interface AppType {}
- public static final @NonNull Parcelable.Creator<TvChannelInfo> CREATOR =
- new Parcelable.Creator<TvChannelInfo>() {
+ public static final @NonNull Parcelable.Creator<TunedInfo> CREATOR =
+ new Parcelable.Creator<TunedInfo>() {
@Override
- public TvChannelInfo createFromParcel(Parcel source) {
+ public TunedInfo createFromParcel(Parcel source) {
try {
- return new TvChannelInfo(source);
+ return new TunedInfo(source);
} catch (Exception e) {
- Log.e(TAG, "Exception creating TvChannelInfo from parcel", e);
+ Log.e(TAG, "Exception creating TunedInfo from parcel", e);
return null;
}
}
@Override
- public TvChannelInfo[] newArray(int size) {
- return new TvChannelInfo[size];
+ public TunedInfo[] newArray(int size) {
+ return new TunedInfo[size];
}
};
@@ -94,7 +95,7 @@
private final int mAppTag;
/** @hide */
- public TvChannelInfo(
+ public TunedInfo(
String inputId, @Nullable Uri channelUri, boolean isRecordingSession,
boolean isForeground, @AppType int appType, int appTag) {
mInputId = inputId;
@@ -106,7 +107,7 @@
}
- private TvChannelInfo(Parcel source) {
+ private TunedInfo(Parcel source) {
mInputId = source.readString();
String uriString = source.readString();
mChannelUri = uriString == null ? null : Uri.parse(uriString);
@@ -194,11 +195,11 @@
@Override
public boolean equals(Object o) {
- if (!(o instanceof TvChannelInfo)) {
+ if (!(o instanceof TunedInfo)) {
return false;
}
- TvChannelInfo other = (TvChannelInfo) o;
+ TunedInfo other = (TunedInfo) o;
return TextUtils.equals(mInputId, other.getInputId())
&& Objects.equals(mChannelUri, other.mChannelUri)
diff --git a/media/java/android/media/tv/TvInputManager.java b/media/java/android/media/tv/TvInputManager.java
index c80f3c6..73539fb 100644
--- a/media/java/android/media/tv/TvInputManager.java
+++ b/media/java/android/media/tv/TvInputManager.java
@@ -901,12 +901,13 @@
}
/**
- * This is called when the information about current TV channels has been updated.
+ * This is called when the information about current tuned information has been updated.
*
- * @param tvChannelInfos a list of {@link TvChannelInfo} objects of new current channels.
+ * @param tunedInfos a list of {@link TunedInfo} objects of new tuned information.
* @hide
*/
- public void onCurrentTvChannelInfosUpdated(@NonNull List<TvChannelInfo> tvChannelInfos) {
+ public void onCurrentTunedInfosUpdated(
+ @NonNull List<TunedInfo> tunedInfos) {
}
}
@@ -968,12 +969,11 @@
});
}
- public void postCurrentTvChannelInfosUpdated(
- final List<TvChannelInfo> currentTvChannelInfos) {
+ public void onCurrentTunedInfosUpdated(final List<TunedInfo> currentTunedInfos) {
mHandler.post(new Runnable() {
@Override
public void run() {
- mCallback.onCurrentTvChannelInfosUpdated(currentTvChannelInfos);
+ mCallback.onCurrentTunedInfosUpdated(currentTunedInfos);
}
});
}
@@ -1283,10 +1283,10 @@
}
@Override
- public void onCurrentTvChannelInfosUpdated(List<TvChannelInfo> currentTvChannelInfos) {
+ public void onCurrentTunedInfosUpdated(List<TunedInfo> currentTunedInfos) {
synchronized (mLock) {
for (TvInputCallbackRecord record : mCallbackRecords) {
- record.postCurrentTvChannelInfosUpdated(currentTvChannelInfos);
+ record.onCurrentTunedInfosUpdated(currentTunedInfos);
}
}
}
@@ -1981,18 +1981,18 @@
}
/**
- * Returns the list of TV channel information for {@link TvInputService.Session} that are
+ * Returns the list of session information for {@link TvInputService.Session} that are
* currently in use.
* <p> Permission com.android.providers.tv.permission.ACCESS_WATCHED_PROGRAMS is required to get
- * the channel URIs. If the permission is not granted, {@link TvChannelInfo#getChannelUri()}
- * returns {@code null}.
+ * the channel URIs. If the permission is not granted,
+ * {@link TunedInfo#getChannelUri()} returns {@code null}.
* @hide
*/
@RequiresPermission("com.android.providers.tv.permission.ACCESS_WATCHED_PROGRAMS")
@NonNull
- public List<TvChannelInfo> getCurrentTvChannelInfos() {
+ public List<TunedInfo> getCurrentTunedInfos() {
try {
- return mService.getCurrentTvChannelInfos(mUserId);
+ return mService.getCurrentTunedInfos(mUserId);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
diff --git a/media/jni/android_media_MediaCodec.cpp b/media/jni/android_media_MediaCodec.cpp
index 0b0e162..71c86cc 100644
--- a/media/jni/android_media_MediaCodec.cpp
+++ b/media/jni/android_media_MediaCodec.cpp
@@ -2662,7 +2662,7 @@
gFields.cryptoInfoModeID = env->GetFieldID(clazz.get(), "mode", "I");
CHECK(gFields.cryptoInfoModeID != NULL);
- gFields.cryptoInfoPatternID = env->GetFieldID(clazz.get(), "pattern",
+ gFields.cryptoInfoPatternID = env->GetFieldID(clazz.get(), "mPattern",
"Landroid/media/MediaCodec$CryptoInfo$Pattern;");
CHECK(gFields.cryptoInfoPatternID != NULL);
diff --git a/non-updatable-api/current.txt b/non-updatable-api/current.txt
index bd6ff5c..5837211 100644
--- a/non-updatable-api/current.txt
+++ b/non-updatable-api/current.txt
@@ -25438,6 +25438,7 @@
public static final class MediaCodec.CryptoInfo {
ctor public MediaCodec.CryptoInfo();
+ method @NonNull public android.media.MediaCodec.CryptoInfo.Pattern getPattern();
method public void set(int, @NonNull int[], @NonNull int[], @NonNull byte[], @NonNull byte[], int);
method public void setPattern(android.media.MediaCodec.CryptoInfo.Pattern);
field public byte[] iv;
@@ -26366,7 +26367,7 @@
method public boolean containsKey(String);
method public int describeContents();
method public android.graphics.Bitmap getBitmap(String);
- method @IntRange(from=0) public int getBitmapDimensionLimit();
+ method @IntRange(from=1) public int getBitmapDimensionLimit();
method @NonNull public android.media.MediaDescription getDescription();
method public long getLong(String);
method public android.media.Rating getRating(String);
@@ -26416,7 +26417,7 @@
method public android.media.MediaMetadata.Builder putRating(String, android.media.Rating);
method public android.media.MediaMetadata.Builder putString(String, String);
method public android.media.MediaMetadata.Builder putText(String, CharSequence);
- method @NonNull public android.media.MediaMetadata.Builder setBitmapDimensionLimit(int);
+ method @NonNull public android.media.MediaMetadata.Builder setBitmapDimensionLimit(@IntRange(from=1) int);
}
@Deprecated public abstract class MediaMetadataEditor {
diff --git a/non-updatable-api/module-lib-current.txt b/non-updatable-api/module-lib-current.txt
index 6e3cec6..b19ce48 100644
--- a/non-updatable-api/module-lib-current.txt
+++ b/non-updatable-api/module-lib-current.txt
@@ -53,6 +53,10 @@
field public static final int FLAG_FROM_KEY = 4096; // 0x1000
}
+ public class MediaMetadataRetriever implements java.lang.AutoCloseable {
+ field public static final int METADATA_KEY_VIDEO_CODEC_MIME_TYPE = 40; // 0x28
+ }
+
}
package android.media.session {
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/UserGridRecyclerView.java b/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/UserGridRecyclerView.java
index 023b5b4..6d63e31 100644
--- a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/UserGridRecyclerView.java
+++ b/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/UserGridRecyclerView.java
@@ -567,6 +567,9 @@
Log.e(TAG, "Failed to switch to new user: " + user.id);
}
}
+ if (mAddUserView != null) {
+ mAddUserView.setEnabled(true);
+ }
}
}
diff --git a/packages/InputDevices/res/raw/keyboard_layout_turkish_f.kcm b/packages/InputDevices/res/raw/keyboard_layout_turkish_f.kcm
new file mode 100644
index 0000000..5b96da0
--- /dev/null
+++ b/packages/InputDevices/res/raw/keyboard_layout_turkish_f.kcm
@@ -0,0 +1,366 @@
+# 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.
+
+#
+# Turkish F keyboard layout.
+#
+
+type OVERLAY
+
+map key 12 SLASH
+map key 13 MINUS
+map key 43 COMMA
+map key 51 EQUALS
+map key 52 BACKSLASH
+map key 53 PERIOD
+map key 86 PLUS
+
+### ROW 1
+
+key GRAVE {
+ label: '+'
+ base: '+'
+ shift: '*'
+ ralt: '\u00ac'
+}
+
+key 1 {
+ label: '1'
+ base: '1'
+ shift: '!'
+ ralt: '\u00b9'
+}
+
+key 2 {
+ label: '2'
+ base: '2'
+ shift: '"'
+ ralt: '\u00b2'
+}
+
+key 3 {
+ label: '3'
+ base: '3'
+ shift: '^'
+ ralt: '#'
+}
+
+key 4 {
+ label: '4'
+ base: '4'
+ shift: '$'
+ ralt: '\u00bc'
+}
+
+key 5 {
+ label: '5'
+ base: '5'
+ shift: '%'
+ ralt: '\u00bd'
+}
+
+key 6 {
+ label: '6'
+ base: '6'
+ shift: '&'
+ ralt: '\u00be'
+}
+
+key 7 {
+ label: '7'
+ base: '7'
+ shift: '\''
+ ralt: '{'
+}
+
+key 8 {
+ label: '8'
+ base: '8'
+ shift: '('
+ ralt: '['
+}
+
+key 9 {
+ label: '9'
+ base: '9'
+ shift: ')'
+ ralt: ']'
+}
+
+key 0 {
+ label: '0'
+ base: '0'
+ shift: '='
+ ralt: '}'
+}
+
+key SLASH {
+ label: '/'
+ base: '/'
+ shift: '?'
+ ralt: '\\'
+}
+
+key MINUS {
+ label: '-'
+ base: '-'
+ shift: '_'
+ ralt: '|'
+}
+
+### ROW 2
+
+key Q {
+ label: 'F'
+ base: 'f'
+ shift, capslock: 'F'
+ ralt: '@'
+}
+
+key W {
+ label: 'G'
+ base: 'g'
+ shift, capslock: 'G'
+}
+
+key E {
+ label: '\u011f'
+ base: '\u011f'
+ shift, capslock: '\u011e'
+}
+
+key R {
+ label: '\u0131'
+ base: '\u0131'
+ shift, capslock: 'I'
+ ralt: '\u00b6'
+ ralt+shift, ralt+capslock: '\u00ae'
+}
+
+key T {
+ label: 'O'
+ base: 'o'
+ shift, capslock: 'O'
+}
+
+key Y {
+ label: 'D'
+ base: 'd'
+ shift, capslock: 'D'
+ ralt: '\u00a5'
+}
+
+key U {
+ label: 'R'
+ base: 'r'
+ shift, capslock: 'R'
+}
+
+key I {
+ label: 'N'
+ base: 'n'
+ shift, capslock: 'N'
+}
+
+key O {
+ label: 'H'
+ base: 'h'
+ shift, capslock: 'H'
+ ralt: '\u00f8'
+ ralt+shift, ralt+capslock: '\u00d8'
+}
+
+key P {
+ label: 'P'
+ base: 'p'
+ shift, capslock: 'P'
+ ralt: '\u00a3'
+}
+
+key LEFT_BRACKET {
+ label: 'Q'
+ base: 'q'
+ shift, capslock: 'Q'
+ ralt: '"'
+}
+
+key RIGHT_BRACKET {
+ label: 'W'
+ base: 'w'
+ shift, capslock: 'W'
+ ralt: '~'
+}
+
+### ROW 3
+
+key A {
+ label: '\u0075'
+ base: '\u0075'
+ shift, capslock: '\u0055'
+ ralt: '\u00e6'
+ ralt+shift, ralt+capslock: '\u00c6'
+}
+
+key S {
+ label: 'i'
+ base: 'i'
+ shift, capslock: '\u0130'
+ ralt: '\u00df'
+ ralt+shift, ralt+capslock: '\u00a7'
+}
+
+key D {
+ label: 'E'
+ base: 'e'
+ shift, capslock: 'E'
+ ralt: '\u20ac'
+}
+
+key F {
+ label: 'A'
+ base: 'a'
+ shift, capslock: 'A'
+ ralt: '\u00aa'
+}
+
+key G {
+ label: '\u00fc'
+ base: '\u00fc'
+ shift, capslock: '\u00dc'
+}
+
+key H {
+ label: 'T'
+ base: 't'
+ shift, capslock: 'T'
+ ralt: '\u20ba'
+}
+
+key J {
+ label: 'K'
+ base: 'k'
+ shift, capslock: 'K'
+}
+
+key K {
+ label: 'M'
+ base: 'm'
+ shift, capslock: 'M'
+}
+
+key L {
+ label: 'L'
+ base: 'l'
+ shift, capslock: 'L'
+}
+
+key SEMICOLON {
+ label: 'Y'
+ base: 'y'
+ shift, capslock: 'Y'
+ ralt: '\u00b4'
+}
+
+key APOSTROPHE {
+ label: '\u015f'
+ base: '\u015f'
+ shift, capslock: '\u015e'
+}
+
+key COMMA {
+ label: 'X'
+ base: 'x'
+ shift: 'X'
+ ralt: '\u0060'
+}
+
+### ROW 4
+
+key PLUS {
+ label: '<'
+ base: '<'
+ shift: '>'
+ ralt: '|'
+ ralt+shift, ralt+capslock: '\u00a6'
+}
+
+key Z {
+ label: 'J'
+ base: 'j'
+ shift, capslock: 'J'
+ ralt: '\u00ab'
+ ralt+shift, ralt+capslock: '<'
+}
+
+key X {
+ label: '\u00f6'
+ base: '\u00f6'
+ shift, capslock: '\u00d6'
+ ralt: '\u00bb'
+ ralt+shift, ralt+capslock: '>'
+}
+
+key C {
+ label: 'V'
+ base: 'v'
+ shift, capslock: 'V'
+ ralt: '\u00a2'
+ ralt+shift, ralt+capslock: '\u00a9'
+}
+
+key V {
+ label: 'C'
+ base: 'c'
+ shift, capslock: 'C'
+}
+
+key B {
+ label: '\u00e7'
+ base: '\u00e7'
+ shift, capslock: '\u00c7'
+}
+
+key N {
+ label: 'Z'
+ base: 'z'
+ shift, capslock: 'Z'
+}
+
+key M {
+ label: 'S'
+ base: 's'
+ shift, capslock: 'S'
+ ralt: '\u00b5'
+ ralt+shift, ralt+capslock: '\u00ba'
+}
+
+key EQUALS {
+ label: 'B'
+ base: 'b'
+ shift, capslock: 'B'
+ ralt: '\u00d7'
+}
+
+key BACKSLASH {
+ label: '.'
+ base: '.'
+ shift, capslock: ':'
+ ralt: '\u00f7'
+}
+
+key PERIOD {
+ label: ','
+ base: ','
+ shift: ';'
+}
diff --git a/packages/InputDevices/res/values/strings.xml b/packages/InputDevices/res/values/strings.xml
index 9d068fe..1e13940 100644
--- a/packages/InputDevices/res/values/strings.xml
+++ b/packages/InputDevices/res/values/strings.xml
@@ -105,6 +105,9 @@
<!-- Turkish keyboard layout label. [CHAR LIMIT=35] -->
<string name="keyboard_layout_turkish">Turkish</string>
+ <!-- Turkish keyboard layout label. [CHAR LIMIT=35] -->
+ <string name="keyboard_layout_turkish_f">Turkish F</string>
+
<!-- Ukrainian keyboard layout label. [CHAR LIMIT=35] -->
<string name="keyboard_layout_ukrainian">Ukrainian</string>
diff --git a/packages/InputDevices/res/xml/keyboard_layouts.xml b/packages/InputDevices/res/xml/keyboard_layouts.xml
index 6b78b68..976a279 100644
--- a/packages/InputDevices/res/xml/keyboard_layouts.xml
+++ b/packages/InputDevices/res/xml/keyboard_layouts.xml
@@ -132,6 +132,10 @@
android:label="@string/keyboard_layout_turkish"
android:keyboardLayout="@raw/keyboard_layout_turkish" />
+ <keyboard-layout android:name="keyboard_layout_turkish_f"
+ android:label="@string/keyboard_layout_turkish_f"
+ android:keyboardLayout="@raw/keyboard_layout_turkish_f" />
+
<keyboard-layout android:name="keyboard_layout_ukrainian"
android:label="@string/keyboard_layout_ukrainian"
android:keyboardLayout="@raw/keyboard_layout_ukrainian" />
diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml
index a927997..bba29db 100644
--- a/packages/Shell/AndroidManifest.xml
+++ b/packages/Shell/AndroidManifest.xml
@@ -329,6 +329,12 @@
<!-- Permission needed for CTS test - TimeManagerTest -->
<uses-permission android:name="android.permission.MANAGE_TIME_AND_ZONE_DETECTION" />
+ <!-- Permission required for CTS test - android.server.biometrics -->
+ <uses-permission android:name="android.permission.USE_BIOMETRIC" />
+
+ <!-- Permission required for CTS test - android.server.biometrics -->
+ <uses-permission android:name="android.permission.TEST_BIOMETRIC" />
+
<application android:label="@string/app_label"
android:theme="@android:style/Theme.DeviceDefault.DayNight"
android:defaultToDeviceProtectedStorage="true"
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index 7d3390d..31faedf 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Instellings"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"Vergrotingvenster"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"Vergrotingvensterkontroles"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Zoem in"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"Zoem uit"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"Skuif op"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"Skuif af"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"Beweeg links"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"Beweeg regs"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Toestelkontroles"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Voeg kontroles vir jou gekoppelde toestelle by"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (ontkoppel)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"Kon nie koppel nie. Probeer weer."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"Bind nuwe toestel saam"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"Bounommer"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"Bounommer is na knipbord gekopieer."</string>
</resources>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index a91182e..41f6bed 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"ቅንብሮች"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"የማጉያ መስኮት"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"የማጉያ መስኮት መቆጣጠሪያዎች"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"አጉላ"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"አሳንስ"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"ወደ ላይ ውሰድ"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"ወደ ታች ውሰድ"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"ወደ ግራ ውሰድ"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"ወደ ቀኝ ውሰድ"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"የመሣሪያ መቆጣጠሪያዎች"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"ለእርስዎ የተገናኙ መሣሪያዎች መቆጣጠሪያዎችን ያክሉ"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (ግንኙነት ተቋርጧል)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"ማገናኘት አልተቻለም። እንደገና ይሞክሩ።"</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"አዲስ መሣሪያ ያጣምሩ"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"የግንብ ቁጥር"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"የገንባ ቁጥር ወደ ቅንጥብ ሰሌዳ ተቀድቷል።"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index 74a9b64..d1f98f0 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -1032,17 +1032,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"الإعدادات"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"نافذة التكبير"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"عناصر التحكم في نافذة التكبير"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"تكبير"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"تصغير"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"نقل للأعلى"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"نقل للأسفل"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"نقل لليسار"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"نقل لليمين"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"أدوات التحكم بالأجهزة"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"إضافة عناصر تحكّم لأجهزتك المتصلة"</string>
@@ -1111,8 +1113,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (غير متّصل)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"تعذّر الاتصال. يُرجى إعادة المحاولة."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"إقران جهاز جديد"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"رقم الإصدار"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"تم نسخ رقم الإصدار إلى الحافظة."</string>
</resources>
diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml
index 297d774..52b6c5a 100644
--- a/packages/SystemUI/res/values-as/strings.xml
+++ b/packages/SystemUI/res/values-as/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"ছেটিংসমূহ"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"বিবৰ্ধন ৱিণ্ড’"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"বিবৰ্ধন ৱিণ্ড’ৰ নিয়ন্ত্ৰণসমূহ"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"জুম ইন কৰক"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"জুম আউট কৰক"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"ওপৰলৈ নিয়ক"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"তললৈ নিয়ক"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"বাওঁফাললৈ নিয়ক"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"সোঁফাললৈ নিয়ক"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"ডিভাইচৰ নিয়ন্ত্ৰণসমূহ"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"আপোনাৰ সংযোজিত ডিভাইচসমূহৰ বাবে নিয়ন্ত্ৰণসমূহ যোগ কৰক"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (সংযোগ বিচ্ছিন্ন হৈছে)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"সংযোগ কৰিব পৰা নগ’ল। পুনৰ চেষ্টা কৰক।"</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"নতুন ডিভাইচ পেয়াৰ কৰক"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"বিল্ডৰ নম্বৰ"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"ক্লিপব’ৰ্ডলৈ বিল্ডৰ নম্বৰ প্ৰতিলিপি কৰা হ’ল।"</string>
</resources>
diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml
index debad02..b446718 100644
--- a/packages/SystemUI/res/values-az/strings.xml
+++ b/packages/SystemUI/res/values-az/strings.xml
@@ -797,7 +797,7 @@
<string name="keyboard_key_page_up" msgid="173914303254199845">"Yuxarı Səhifə"</string>
<string name="keyboard_key_page_down" msgid="9035902490071829731">"Aşağı Səhifə"</string>
<string name="keyboard_key_forward_del" msgid="5325501825762733459">"Silin"</string>
- <string name="keyboard_key_move_home" msgid="3496502501803911971">"Əsas səhifə"</string>
+ <string name="keyboard_key_move_home" msgid="3496502501803911971">"Home"</string>
<string name="keyboard_key_move_end" msgid="99190401463834854">"Son"</string>
<string name="keyboard_key_insert" msgid="4621692715704410493">"Daxil edin"</string>
<string name="keyboard_key_num_lock" msgid="7209960042043090548">"Nömrələr"</string>
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Ayarlar"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"Böyütmə Pəncərəsi"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"Böyütmə Pəncərəsi Kontrolları"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Yaxınlaşdırın"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"Uzaqlaşdırın"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"Yuxarı köçürün"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"Aşağı köçürün"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"Sola köçürün"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"Sağa köçürün"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Cihaz idarəetmələri"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Qoşulmuş cihazlarınız üçün nizamlayıcılar əlavə edin"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (bağlantı kəsilib)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"Qoşulmaq alınmadı. Yenə cəhd edin."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"Yeni cihazı qoşalaşdırın"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"Versiya nömrəsi"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"Versiya nömrəsi mübadilə buferinə kopyalandı."</string>
</resources>
diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
index be31c2d..3cc10d8 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
@@ -1017,17 +1017,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Podešavanja"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"Prozor za uvećanje"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"Kontrole prozora za uvećanje"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Uvećajte"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"Umanjite"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"Pomerite nagore"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"Pomerite nadole"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"Pomerite nalevo"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"Pomerite nadesno"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Kontrole uređaja"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Dodajte kontrole za povezane uređaje"</string>
@@ -1093,8 +1095,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (veza je prekinuta)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"Povezivanje nije uspelo. Probajte ponovo."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"Upari novi uređaj"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"Broj verzije"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"Broj verzije je kopiran u privremenu memoriju."</string>
</resources>
diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml
index e3831a8..07e7f8a 100644
--- a/packages/SystemUI/res/values-be/strings.xml
+++ b/packages/SystemUI/res/values-be/strings.xml
@@ -1022,17 +1022,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Налады"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"Акно павелічэння"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"Налады акна павелічэння"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Павялічыць маштаб"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"Паменшыць маштаб"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"Перамясціць уверх"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"Перамясціць ніжэй"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"Перамясціць улева"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"Перамясціць управа"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Элементы кіравання прыладай"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Дадайце элементы кіравання для падключаных прылад"</string>
@@ -1099,8 +1101,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (адключана)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"Не ўдалося падключыцца. Паўтарыце спробу."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"Спалучыць з новай прыладай"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"Нумар зборкі"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"Нумар зборкі скапіраваны ў буфер абмену."</string>
</resources>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index d959178..f33c5cf 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Настройки"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"Прозорец за ниво на мащаба"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"Контроли за прозореца за ниво на мащаба"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Увеличаване на мащаба"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"Намаляване на мащаба"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"Преместване нагоре"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"Преместване надолу"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"Преместване наляво"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"Преместване надясно"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Контроли за устройството"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Добавяне на контроли за свързаните ви устройства"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (връзката е прекратена)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"Неуспешно свързване. Опитайте отново."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"Сдвояване на ново устройство"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"Номер на компилацията"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"Номерът на компилацията е копиран в буферната памет."</string>
</resources>
diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml
index fffa555..0b5d65e 100644
--- a/packages/SystemUI/res/values-bn/strings.xml
+++ b/packages/SystemUI/res/values-bn/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"সেটিংস"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"উইন্ডো বড় করে দেখা"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"উইন্ডো কন্ট্রোল বড় করে দেখা"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"বড় করুন"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"ছোট করুন"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"উপরে তুলুন"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"নিচে নামান"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"বাঁদিকে সরান"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"ডানদিকে সরান"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"ডিভাইস কন্ট্রোল"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"আপনার কানেক্ট করা ডিভাইসের জন্য কন্ট্রোল যোগ করুন"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (কানেক্ট করা নেই)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"কানেক্ট করা যায়নি। আবার চেষ্টা করুন।"</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"নতুন ডিভাইস পেয়ার করুন"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"বিল্ড নম্বর"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"বিল্ড নম্বর ক্লিপবোর্ডে কপি করা হয়েছে।"</string>
</resources>
diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml
index f5410cf..ac68620 100644
--- a/packages/SystemUI/res/values-bs/strings.xml
+++ b/packages/SystemUI/res/values-bs/strings.xml
@@ -726,7 +726,7 @@
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nema nedavnih oblačića"</string>
<string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Nedavni i odbačeni oblačići će se pojaviti ovdje"</string>
<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_multichannel_desc" msgid="7414593090056236179">"Ovu grupu obavještenja nije moguće konfigurirati ovdje"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Obavještenje preko proksi servera"</string>
<string name="notification_channel_dialog_title" msgid="6856514143093200019">"Sva obavještenja aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="see_more_title" msgid="7409317011708185729">"Prikaži više"</string>
@@ -1017,17 +1017,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Postavke"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"Prozor za uvećavanje"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"Kontrole prozora za uvećavanje"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Uvećavanje"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"Umanjivanje"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"Pomjeranje prema gore"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"Pomjeranje prema dolje"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"Pomjeranje lijevo"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"Pomjeranje desno"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Kontrole uređaja"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Dodajte kontrole za povezane uređaje"</string>
@@ -1093,8 +1095,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (veza je prekinuta)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"Povezivanje nije uspjelo. Pokušajte ponovo."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"Uparite novi uređaj"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"Broj verzije"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"Broj verzije je kopiran u međumemoriju."</string>
</resources>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index 28bf3bb..5e64aee 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Configuració"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"Finestra d\'ampliació"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"Finestra de controls d\'ampliació"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Amplia"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"Redueix"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"Mou cap amunt"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"Mou cap avall"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"Mou cap a l\'esquerra"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"Mou cap a la dreta"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Controls de dispositius"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Afegeix controls per als teus dispositius connectats"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (desconnectat)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"No s\'ha pogut connectar. Torna-ho a provar."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"Vincula un dispositiu nou"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"Número de compilació"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"El número de compilació s\'ha copiat al porta-retalls."</string>
</resources>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index c66f200..5ca5df6 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -1022,17 +1022,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Nastavení"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"Zvětšovací okno"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"Ovládací prvky zvětšovacího okna"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Přiblížit"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"Oddálit"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"Přesunout nahoru"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"Přesunout dolů"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"Přesunout doleva"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"Přesunout doprava"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Ovládání zařízení"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Přidejte ovládací prvky pro připojená zařízení"</string>
@@ -1099,8 +1101,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (odpojeno)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"Spojení se nezdařilo. Zkuste to znovu."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"Spárovat nové zařízení"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"Číslo sestavení"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"Číslo sestavení bylo zkopírováno do schránky."</string>
</resources>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index 5b0566d..419740e 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Indstillinger"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"Vindue med forstørrelse"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"Vindue med forstørrelsesstyring"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Zoom ind"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"Zoom ud"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"Flyt op"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"Flyt ned"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"Flyt til venstre"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"Flyt til højre"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Enhedsstyring"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Tilføj styring af dine tilsluttede enheder"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (ingen forbindelse)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"Der kunne ikke oprettes forbindelse. Prøv igen."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"Par ny enhed"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"Buildnummer"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"Buildnummeret blev kopieret til udklipsholderen."</string>
</resources>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index 0ab1f0e..4b1be3b 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Einstellungen"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"Vergrößerungsfenster"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"Einstellungen für Vergrößerungsfenster"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Heranzoomen"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"Herauszoomen"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"Nach oben bewegen"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"Nach unten bewegen"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"Nach links bewegen"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"Nach rechts bewegen"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Gerätesteuerung"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Steuerelemente für verbundene Geräte hinzufügen"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (nicht verbunden)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"Verbindung nicht möglich. Versuch es noch einmal."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"Neues Gerät koppeln"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"Build-Nummer"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"Build-Nummer in Zwischenablage kopiert."</string>
</resources>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index 6d86e91..fc4e78b 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -1012,18 +1012,16 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Ρυθμίσεις"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"Παράθυρο μεγέθυνσης"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"Στοιχεία ελέγχου παραθύρου μεγέθυνσης"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
- <skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
- <skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
- <skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
- <skip />
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Μεγέθυνση"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"Σμίκρυνση"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"Μετακίνηση επάνω"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"Μετακίνηση κάτω"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"Μετακίνηση αριστερά"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"Μετακίνηση δεξιά"</string>
+ <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Εναλλαγή μεγιστοποίησης"</string>
+ <string name="magnification_mode_switch_state_full_screen" msgid="2882507327576770574">"Μεγέθυνση ολόκληρης της οθόνης"</string>
+ <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Μεγέθυνση μέρους της οθόνης"</string>
+ <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Εναλλαγή"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Στοιχεία ελέγχου συσκευής"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Προσθήκη στοιχείων ελέγχου για τις συνδεδεμένες συσκευές σας."</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Ρύθμιση στοιχείων ελέγχου συσκευής"</string>
@@ -1087,8 +1085,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (αποσυνδέθηκε)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"Δεν ήταν δυνατή η σύνδεση. Δοκιμάστε ξανά."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"Σύζευξη νέας συσκευής"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"Αριθμός έκδοσης"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"Ο αριθμός έκδοσης αντιγράφηκε στο πρόχειρο."</string>
</resources>
diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml
index cb03d40..709a506 100644
--- a/packages/SystemUI/res/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/strings.xml
@@ -1018,6 +1018,10 @@
<string name="accessibility_control_move_down" msgid="5390922476900974512">"Move down"</string>
<string name="accessibility_control_move_left" msgid="8156206978511401995">"Move left"</string>
<string name="accessibility_control_move_right" msgid="8926821093629582888">"Move right"</string>
+ <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Magnification switch"</string>
+ <string name="magnification_mode_switch_state_full_screen" msgid="2882507327576770574">"Magnify entire screen"</string>
+ <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Magnify part of screen"</string>
+ <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Switch"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Device controls"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Add controls for your connected devices"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Set up device controls"</string>
diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml
index 8e5849e..79a2844 100644
--- a/packages/SystemUI/res/values-en-rCA/strings.xml
+++ b/packages/SystemUI/res/values-en-rCA/strings.xml
@@ -1018,6 +1018,10 @@
<string name="accessibility_control_move_down" msgid="5390922476900974512">"Move down"</string>
<string name="accessibility_control_move_left" msgid="8156206978511401995">"Move left"</string>
<string name="accessibility_control_move_right" msgid="8926821093629582888">"Move right"</string>
+ <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Magnification switch"</string>
+ <string name="magnification_mode_switch_state_full_screen" msgid="2882507327576770574">"Magnify entire screen"</string>
+ <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Magnify part of screen"</string>
+ <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Switch"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Device controls"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Add controls for your connected devices"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Set up device controls"</string>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index cb03d40..709a506 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -1018,6 +1018,10 @@
<string name="accessibility_control_move_down" msgid="5390922476900974512">"Move down"</string>
<string name="accessibility_control_move_left" msgid="8156206978511401995">"Move left"</string>
<string name="accessibility_control_move_right" msgid="8926821093629582888">"Move right"</string>
+ <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Magnification switch"</string>
+ <string name="magnification_mode_switch_state_full_screen" msgid="2882507327576770574">"Magnify entire screen"</string>
+ <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Magnify part of screen"</string>
+ <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Switch"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Device controls"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Add controls for your connected devices"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Set up device controls"</string>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index cb03d40..709a506 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -1018,6 +1018,10 @@
<string name="accessibility_control_move_down" msgid="5390922476900974512">"Move down"</string>
<string name="accessibility_control_move_left" msgid="8156206978511401995">"Move left"</string>
<string name="accessibility_control_move_right" msgid="8926821093629582888">"Move right"</string>
+ <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Magnification switch"</string>
+ <string name="magnification_mode_switch_state_full_screen" msgid="2882507327576770574">"Magnify entire screen"</string>
+ <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Magnify part of screen"</string>
+ <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Switch"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Device controls"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Add controls for your connected devices"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Set up device controls"</string>
diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml
index e107ed5..ab6699b 100644
--- a/packages/SystemUI/res/values-en-rXC/strings.xml
+++ b/packages/SystemUI/res/values-en-rXC/strings.xml
@@ -1018,6 +1018,10 @@
<string name="accessibility_control_move_down" msgid="5390922476900974512">"Move down"</string>
<string name="accessibility_control_move_left" msgid="8156206978511401995">"Move left"</string>
<string name="accessibility_control_move_right" msgid="8926821093629582888">"Move right"</string>
+ <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Magnification switch"</string>
+ <string name="magnification_mode_switch_state_full_screen" msgid="2882507327576770574">"Magnify entire screen"</string>
+ <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Magnify part of screen"</string>
+ <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Switch"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Device controls"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Add controls for your connected devices"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Set up device controls"</string>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index be37623..a1e21a1 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -1012,18 +1012,16 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Configuración"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"Ventana de ampliación"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"Controles de ampliación de la ventana"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
- <skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
- <skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
- <skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
- <skip />
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Acercar"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"Alejar"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"Mover hacia arriba"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"Mover hacia abajo"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"Mover hacia la izquierda"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"Mover hacia la derecha"</string>
+ <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Botón de ampliación"</string>
+ <string name="magnification_mode_switch_state_full_screen" msgid="2882507327576770574">"Ampliar toda la pantalla"</string>
+ <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Ampliar parte de la pantalla"</string>
+ <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Botón"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Controles de dispositivos"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Agrega controles para los dispositivos conectados"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Configurar controles de dispositivos"</string>
@@ -1087,8 +1085,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (desconectado)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"No se pudo establecer la conexión. Vuelve a intentarlo."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"Vincular dispositivo nuevo"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"Número de compilación"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"Se copió el número de compilación en el portapapeles."</string>
</resources>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index 08b17cc..51c6d0d 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Ajustes"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"Ventana de ampliación"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"Ventana de controles de ampliación"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Ampliar"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"Reducir"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"Mover hacia arriba"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"Mover hacia abajo"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"Mover hacia la izquierda"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"Mover hacia la derecha"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Control de dispositivos"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Añade controles para tus dispositivos conectados"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (desconectado)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"No se ha podido conectar. Inténtalo de nuevo."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"Vincular nuevo dispositivo"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"Número de compilación"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"Número de compilación copiado en el portapapeles."</string>
</resources>
diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml
index b33ad01..6d616b8 100644
--- a/packages/SystemUI/res/values-et/strings.xml
+++ b/packages/SystemUI/res/values-et/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Seaded"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"Suurendamisaken"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"Suurendamisakna juhtelemendid"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Suumi sisse"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"Suumi välja"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"Teisalda üles"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"Teisalda alla"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"Teisalda vasakule"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"Teisalda paremale"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Seadmete juhikud"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Lisage juhtelemendid ühendatud seadmete jaoks"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (pole ühendatud)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"Ühenduse loomine ebaõnnestus. Proovige uuesti."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"Uue seadme sidumine"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"Järgunumber"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"Järgunumber kopeeriti lõikelauale."</string>
</resources>
diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml
index 3f1a53c..05e52f4 100644
--- a/packages/SystemUI/res/values-eu/strings.xml
+++ b/packages/SystemUI/res/values-eu/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Ezarpenak"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"Lupa-leihoa"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"Lupa-leihoaren aukerak"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Handitu"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"Txikitu"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"Eraman gora"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"Eraman behera"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"Eraman ezkerrera"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"Eraman eskuinera"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Gailuak kontrolatzeko widgetak"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Gehitu konektatutako gailuak kontrolatzeko widgetak"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (deskonektatuta)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"Ezin izan da konektatu. Saiatu berriro."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"Parekatu beste gailu batekin"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"Konpilazio-zenbakia"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"Kopiatu da konpilazio-zenbakia arbelean."</string>
</resources>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index e5606a2..1c16b33 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -431,7 +431,7 @@
<string name="quick_settings_screen_record_start" msgid="1574725369331638985">"شروع"</string>
<string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"توقف"</string>
<string name="media_seamless_remote_device" msgid="177033467332920464">"دستگاه"</string>
- <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"برای تغییر برنامهها، تند به بالا بکشید"</string>
+ <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"برای تغییر برنامهها، تند بهبالا بکشید"</string>
<string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"برای جابهجایی سریع میان برنامهها، به چپ بکشید"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"تغییر وضعیت نمای کلی"</string>
<string name="expanded_header_battery_charged" msgid="5307907517976548448">"شارژ کامل شد"</string>
@@ -450,8 +450,8 @@
<string name="keyguard_more_overflow_text" msgid="5819512373606638727">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="7248696377626341060">"اعلانهای کمتر فوری در زیر"</string>
<string name="notification_tap_again" msgid="4477318164947497249">"دوباره ضربه بزنید تا باز شود"</string>
- <string name="keyguard_unlock" msgid="8031975796351361601">"برای باز کردن، انگشتتان را تند به بالا بکشید"</string>
- <string name="keyguard_retry" msgid="886802522584053523">"برای امتحان مجدد، انگشتتان را تند به بالا بکشید"</string>
+ <string name="keyguard_unlock" msgid="8031975796351361601">"برای باز کردن، انگشتتان را تند بهبالا بکشید"</string>
+ <string name="keyguard_retry" msgid="886802522584053523">"برای امتحان مجدد، انگشتتان را تند بهبالا بکشید"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"این دستگاه به سازمان شما تعلق دارد"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"این دستگاه به <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> تعلق دارد"</string>
<string name="phone_hint" msgid="6682125338461375925">"انگشتتان را از نماد تلفن تند بکشید"</string>
@@ -740,7 +740,7 @@
<string name="feedback_promoted" msgid="8075757485407091976">"سیستمْ این اعلان را ارتقا داده است."</string>
<string name="feedback_demoted" msgid="5848066008939031913">"سیستمْ این اعلان را تنزل داده است."</string>
<string name="feedback_prompt" msgid="2278631214125128281">"این مورد درست بود؟"</string>
- <string name="feedback_response" msgid="4671729244976641339">"از بازخورد شما سپاسگذاریم!"</string>
+ <string name="feedback_response" msgid="4671729244976641339">"از بازخوردتان سپاسگزاریم!"</string>
<string name="feedback_ok" msgid="6481426753298857144">"تأیید"</string>
<string name="notification_channel_controls_opened_accessibility" msgid="6111817750774381094">"کنترلهای اعلان برای <xliff:g id="APP_NAME">%1$s</xliff:g> باز شد"</string>
<string name="notification_channel_controls_closed_accessibility" msgid="1561909368876911701">"کنترلهای اعلان برای <xliff:g id="APP_NAME">%1$s</xliff:g> بسته شد"</string>
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"تنظیمات"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"پنجره بزرگنمایی"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"کنترلهای پنجره بزرگنمایی"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"بزرگ کردن"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"کوچک کردن"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"انتقال به بالا"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"انتقال به پایین"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"انتقال به راست"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"انتقال به چپ"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"کنترلهای دستگاه"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"افزودن کنترلها برای دستگاههای متصل"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (اتصال قطع شد)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"متصل نشد. دوباره امتحان کنید."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"مرتبط کردن دستگاه جدید"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"شماره ساخت"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"شماره ساخت در بریدهدان کپی شد."</string>
</resources>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index e00b50e..1e900fb 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Asetukset"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"Suurennusikkuna"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"Suurennusikkunan ohjaimet"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Lähennä"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"Loitonna"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"Siirrä ylös"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"Siirrä alas"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"Siirrä vasemmalle"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"Siirrä oikealle"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Laitteiden hallinta"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Lisää ohjaimia yhdistettyjä laitteita varten"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (yhteys katkaistu)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"Ei yhteyttä. Yritä uudelleen."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"Muodosta uusi laitepari"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"Koontiversion numero"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"Koontiversion numero kopioitu leikepöydälle"</string>
</resources>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index 03e205d..f390693 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Paramètres"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"Fenêtre d\'agrandissement"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"Commandes pour la fenêtre d\'agrandissement"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Effectuer un zoom avant"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"Effectuer un zoom arrière"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"Déplacer vers le haut"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"Déplacer vers le bas"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"Déplacer vers la gauche"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"Déplacer vers la droite"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Commandes des appareils"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Ajoutez des commandes pour vos appareils connectés"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (déconnecté)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"Impossible de se connecter. Réessayez."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"Associer un autre appareil"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"Numéro de version"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"Le numéro de version a été copié dans le presse-papiers."</string>
</resources>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index 82df63a..df542bc 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Paramètres"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"Fenêtre d\'agrandissement"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"Fenêtre des commandes d\'agrandissement"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Faire un zoom avant"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"Faire un zoom arrière"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"Déplacer vers le haut"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"Déplacer vers le bas"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"Déplacer vers la gauche"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"Déplacer vers la droite"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Commandes des appareils"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Ajouter des commandes pour vos appareils connectés"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (déconnecté)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"Impossible de se connecter. Réessayez."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"Associer un nouvel appareil"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"Numéro de build"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"Numéro de build copié dans le presse-papiers."</string>
</resources>
diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml
index 9be451d..fedbe2c 100644
--- a/packages/SystemUI/res/values-gl/strings.xml
+++ b/packages/SystemUI/res/values-gl/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Configuración"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"Ventá de superposición"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"Controis de ampliación da ventá"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Achegar"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"Afastar"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"Mover cara arriba"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"Mover cara abaixo"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"Mover cara á esquerda"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"Mover cara á dereita"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Control de dispositivos"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Engade controis para os dispositivos conectados"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (dispositivo desconectado)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"Non se puido establecer a conexión. Téntao de novo."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"Vincular dispositivo novo"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"Número de compilación"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"Copiouse o número de compilación no portapapeis."</string>
</resources>
diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml
index 864d05f..d9c5b72 100644
--- a/packages/SystemUI/res/values-gu/strings.xml
+++ b/packages/SystemUI/res/values-gu/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"સેટિંગ"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"વિસ્તૃતીકરણ વિંડો"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"વિસ્તૃતીકરણ વિંડોના નિયંત્રણો"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"મોટું કરો"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"નાનું કરો"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"ઉપર ખસેડો"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"નીચે ખસેડો"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"ડાબી બાજુ ખસેડો"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"જમણી બાજુ ખસેડો"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"ડિવાઇસનાં નિયંત્રણો"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"તમારા કનેક્ટ કરેલા ડિવાઇસ માટે નિયંત્રણો ઉમેરો"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (ડિસ્કનેક્ટ થયેલું)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"કનેક્ટ કરી શકાયું નહીં. ફરી પ્રયાસ કરો."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"નવા ડિવાઇસ સાથે જોડાણ કરો"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"બિલ્ડ નંબર"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"બિલ્ડ નંબર ક્લિપબૉર્ડ પર કૉપિ કર્યો."</string>
</resources>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index e11055c..08149fb 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -1014,17 +1014,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"सेटिंग"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"स्क्रीन को बड़ा करके दिखाने वाली विंडो"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"स्क्रीन को बड़ा करके दिखाने वाली विंडो के नियंत्रण"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"ज़ूम इन करें"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"ज़ूम आउट करें"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"ऊपर ले जाएं"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"नीचे ले जाएं"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"बाईं ओर ले जाएं"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"दाईं ओर ले जाएं"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"डिवाइस कंट्रोल"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"कनेक्ट किए गए डिवाइस के लिए कंट्रोल जोड़ें"</string>
@@ -1089,8 +1091,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (डिसकनेक्ट किया गया)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"कनेक्ट नहीं किया जा सका. फिर से कोशिश करें."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"नया डिवाइस जोड़ें"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"बिल्ड नंबर"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"बिल्ड नंबर को क्लिपबोर्ड पर कॉपी किया गया."</string>
</resources>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index d5033fa..b01f58e 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -1017,17 +1017,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Postavke"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"Prozor za povećavanje"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"Kontrole prozora za povećavanje"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Povećaj"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"Smanji"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"Premjesti gore"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"Premjesti dolje"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"Premjesti ulijevo"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"Premjesti udesno"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Kontrole uređaja"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Dodavanje kontrola za povezane uređaje"</string>
@@ -1093,8 +1095,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (nije povezano)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"Povezivanje nije bilo moguće. Pokušajte ponovo."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"Upari novi uređaj"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"Broj međuverzije"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"Broj međuverzije kopiran je u međuspremnik."</string>
</resources>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index 6d960e7..1fcabcf 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Beállítások"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"Nagyítás ablaka"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"Nagyítási vezérlők ablaka"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Nagyítás"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"Kicsinyítés"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"Mozgatás felfelé"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"Mozgatás lefelé"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"Mozgatás balra"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"Mozgatás jobbra"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Eszközvezérlők"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Vezérlők hozzáadása a csatlakoztatott eszközökhöz"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (leválasztva)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"Sikertelen csatlakozás. Próbálja újra."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"Új eszköz párosítása"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"Buildszám"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"Buildszám a vágólapra másolva."</string>
</resources>
diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml
index 9e746fa..63737d2 100644
--- a/packages/SystemUI/res/values-hy/strings.xml
+++ b/packages/SystemUI/res/values-hy/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Կարգավորումներ"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"Խոշորացման պատուհան"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"Խոշորացման պատուհանի կառավարման տարրեր"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Մեծացնել"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"Փոքրացնել"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"Տեղափոխել վերև"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"Տեղափոխել ներքև"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"Տեղափոխել ձախ"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"Տեղափոխել աջ"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Սարքերի կառավարման տարրեր"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Ավելացրեք կառավարման տարրեր ձեր միացված սարքերի համար"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (անջատված է)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"Չհաջողվեց միանալ։ Նորից փորձեք։"</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"Նոր սարքի զուգակցում"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"Կառուցման համարը"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"Կառուցման համարը պատճենվեց սեղմատախտակին։"</string>
</resources>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index 380e943..da9af02 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Setelan"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"Jendela Pembesaran"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"Kontrol Jendela Pembesaran"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Perbesar"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"Perkecil"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"Pindahkan ke atas"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"Pindahkan ke bawah"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"Pindahkan ke kiri"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"Pindahkan ke kanan"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Kontrol perangkat"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Tambahkan kontrol untuk perangkat terhubung"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (terputus)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"Tidak dapat terhubung. Coba lagi."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"Sambungkan perangkat baru"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"Nomor versi"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"Nomor versi disalin ke papan klip."</string>
</resources>
diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml
index dd12ed6..64ad21f 100644
--- a/packages/SystemUI/res/values-is/strings.xml
+++ b/packages/SystemUI/res/values-is/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Stillingar"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"Stækkunargluggi"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"Stækkunarstillingar glugga"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Auka aðdrátt"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"Minnka aðdrátt"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"Færa upp"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"Færa niður"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"Færa til vinstri"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"Færa til hægri"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Tækjastjórnun"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Bæta við stýringum fyrir tengd tæki"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (aftengt)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"Tenging mistókst. Reyndu aftur."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"Para nýtt tæki"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"Útgáfunúmer smíðar"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"Útgáfunúmer smíðar afritað á klippiborð."</string>
</resources>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index 851228f..90f68d9 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Impostazioni"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"Finestra ingrandimento"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"Finestra controlli di ingrandimento"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Aumenta lo zoom"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"Diminuisci lo zoom"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"Sposta su"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"Sposta giù"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"Sposta a sinistra"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"Sposta a destra"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Controllo dei dispositivi"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Aggiungi controlli per i dispositivi connessi"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (disconnesso)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"Impossibile connettersi. Riprova."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"Accoppia nuovo dispositivo"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"Numero build"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"Numero build copiato negli appunti."</string>
</resources>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index d4ad45e..14b19c3 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -941,7 +941,7 @@
<string name="notification_channel_general" msgid="4384774889645929705">"הודעות כלליות"</string>
<string name="notification_channel_storage" msgid="2720725707628094977">"אחסון"</string>
<string name="notification_channel_hints" msgid="7703783206000346876">"טיפים"</string>
- <string name="instant_apps" msgid="8337185853050247304">"אפליקציות אינסטנט"</string>
+ <string name="instant_apps" msgid="8337185853050247304">"אפליקציות ללא התקנה"</string>
<string name="instant_apps_title" msgid="8942706782103036910">"<xliff:g id="APP">%1$s</xliff:g> פועלת"</string>
<string name="instant_apps_message" msgid="6112428971833011754">"האפליקציה נפתחת בלי התקנה."</string>
<string name="instant_apps_message_with_help" msgid="1816952263531203932">"האפליקציה נפתחת בלי התקנה. אפשר להקיש כדי לקבל מידע נוסף."</string>
@@ -1022,17 +1022,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"הגדרות"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"חלון הגדלה"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"בקרות של חלון ההגדלה"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"התקרבות"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"התרחקות"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"הזזה למעלה"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"הזזה למטה"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"הזזה שמאלה"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"הזזה ימינה"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"פקדי מכשירים"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"יש להוסיף פקדים למכשירים המחוברים"</string>
@@ -1099,8 +1101,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (מנותק)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"לא ניתן היה להתחבר. יש לנסות שוב."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"התאמה של מכשיר חדש"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"מספר Build"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"מספר ה-Build הועתק ללוח."</string>
</resources>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index 7547853..98e6984 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"設定"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"拡大ウィンドウ"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"拡大ウィンドウ コントロール"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"拡大"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"縮小"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"上に移動"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"下に移動"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"左に移動"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"右に移動"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"デバイス コントロール"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"接続済みデバイスのコントロールを追加します"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>(未接続)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"接続できませんでした。もう一度お試しください。"</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"新しいデバイスとのペア設定"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"ビルド番号"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"ビルド番号をクリップボードにコピーしました。"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml
index 69b1d14..0086868 100644
--- a/packages/SystemUI/res/values-ka/strings.xml
+++ b/packages/SystemUI/res/values-ka/strings.xml
@@ -1012,18 +1012,16 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"პარამეტრები"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"გადიდების ფანჯარა"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"გადიდების კონტროლის ფანჯარა"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
- <skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
- <skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
- <skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
- <skip />
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"მასშტაბის გადიდება"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"მასშტაბის შემცირება"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"ზემოთ გადატანა"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"ქვემოთ გადატანა"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"მარცხნივ გადატანა"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"მარჯვნივ გადატანა"</string>
+ <string name="magnification_mode_switch_description" msgid="2698364322069934733">"გადიდების გადართვა"</string>
+ <string name="magnification_mode_switch_state_full_screen" msgid="2882507327576770574">"მთლიანი ეკრანის გადიდება"</string>
+ <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"ეკრანის ნაწილის გადიდება"</string>
+ <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"გადართვა"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"მოწყობილ. მართვის საშუალებები"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"მართვის საშუალებების დამატება თქვენს დაკავშირებულ მოწყობილობებზე"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"მოწყობილობის მართვის საშუალებების დაყენება"</string>
@@ -1087,8 +1085,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (კავშირი გაწყვეტილია)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"დაკავშირება ვერ მოხერხდა. ცადეთ ხელახლა."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"ახალი მოწყობილობის დაწყვილება"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"ანაწყობის ნომერი"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"ანაწყობის ნომერი დაკოპირებულია გაცვლის ბუფერში."</string>
</resources>
diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml
index b86f32e..606350c 100644
--- a/packages/SystemUI/res/values-kk/strings.xml
+++ b/packages/SystemUI/res/values-kk/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Параметрлер"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"Ұлғайту терезесі"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"Ұлғайту терезесінің басқару элементтері"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Ұлғайту"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"Кішірейту"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"Жоғары қарай жылжыту"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"Төмен қарай жылжыту"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"Солға жылжыту"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"Оңға жылжыту"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Құрылғыны басқару элементтері"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Жалғанған құрылғылар үшін басқару виджеттерін қосу"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (ажыратылған)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"Қосылмады. Қайта қосылып көріңіз."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"Жаңа құрылғыны жұптау"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"Құрама нөмірі"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"Құрама нөмірі буферге көшірілді."</string>
</resources>
diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml
index e895140..9ed01c5 100644
--- a/packages/SystemUI/res/values-km/strings.xml
+++ b/packages/SystemUI/res/values-km/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"ការកំណត់"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"វិនដូការពង្រីក"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"វិនដូគ្រប់គ្រងការពង្រីក"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"ពង្រីក"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"បង្រួម"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"ផ្លាស់ទីឡើងលើ"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"ផ្លាស់ទីចុះក្រោម"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"ផ្លាស់ទីទៅឆ្វេង"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"ផ្លាស់ទីទៅស្តាំ"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"ផ្ទាំងគ្រប់គ្រងឧបករណ៍"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"បញ្ចូលផ្ទាំងគ្រប់គ្រងសម្រាប់ឧបករណ៍ដែលអ្នកបានភ្ជាប់"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (បានផ្ដាច់)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"មិនអាចភ្ជាប់បានទេ។ សូមព្យាយាមម្ដងទៀត។"</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"ផ្គូផ្គងឧបករណ៍ថ្មី"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"លេខកំណែបង្កើត"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"បានចម្លងលេខកំណែបង្កើតទៅឃ្លីបបត។"</string>
</resources>
diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml
index 2a9f649..116241c 100644
--- a/packages/SystemUI/res/values-kn/strings.xml
+++ b/packages/SystemUI/res/values-kn/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"ವರ್ಧನೆಯ ವಿಂಡೋ"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"ವರ್ಧನೆಯ ವಿಂಡೋ ನಿಯಂತ್ರಣಗಳು"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"ಝೂಮ್ ಇನ್ ಮಾಡಿ"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"ಝೂಮ್ ಔಟ್ ಮಾಡಿ"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"ಮೇಲೆಕ್ಕೆ ಸರಿಸಿ"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"ಕೆಳಗೆ ಸರಿಸಿ"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"ಎಡಕ್ಕೆ ಸರಿಸಿ"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"ಬಲಕ್ಕೆ ಸರಿಸಿ"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"ಸಾಧನ ನಿಯಂತ್ರಣಗಳು"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"ನಿಮ್ಮ ಸಂಪರ್ಕಿತ ಸಾಧನಗಳಿಗೆ ನಿಯಂತ್ರಣಗಳನ್ನು ಸೇರಿಸಿ"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸಲಾಗಿದೆ)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"ಸಂಪರ್ಕಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ. ಪುನಃ ಪ್ರಯತ್ನಿಸಿ."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"ಹೊಸ ಸಾಧನವನ್ನು ಜೋಡಿಸಿ"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"ಬಿಲ್ಡ್ ಸಂಖ್ಯೆ"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"ಬಿಲ್ಡ್ ಸಂಖ್ಯೆಯನ್ನು ಕ್ಲಿಪ್ಬೋರ್ಡ್ನಲ್ಲಿ ನಕಲಿಸಲಾಗಿದೆ."</string>
</resources>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index 559205c..5bb0d13 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"설정"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"확대 창"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"확대 창 컨트롤"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"확대"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"축소"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"위로 이동"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"아래로 이동"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"왼쪽으로 이동"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"오른쪽으로 이동"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"기기 컨트롤"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"연결된 기기의 컨트롤을 추가하세요."</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>(연결 끊김)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"연결할 수 없습니다. 다시 시도하세요."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"새 기기와 페어링"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"빌드 번호"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"빌드 번호가 클립보드에 복사되었습니다."</string>
</resources>
diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml
index a688150..dd85504 100644
--- a/packages/SystemUI/res/values-ky/strings.xml
+++ b/packages/SystemUI/res/values-ky/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Жөндөөлөр"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"Чоңойтуу терезеси"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"Чоңойтуу терезесин башкаруу каражаттары"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Жакындатуу"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"Алыстатуу"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"Жогору жылдыруу"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"Төмөн жылдыруу"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"Солго жылдыруу"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"Оңго жылдыруу"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Түзмөктү башкаруу элементтери"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Байланышкан түзмөктөрүңүздү башкаруу элементтерин кошосуз"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (ажыратылды)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"Байланышпай койду. Кайталоо."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"Жаңы түзмөктү жупташтыруу"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"Курама номери"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"Курама номери алмашуу буферине көчүрүлдү."</string>
</resources>
diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml
index 1a6c338..3553704 100644
--- a/packages/SystemUI/res/values-lo/strings.xml
+++ b/packages/SystemUI/res/values-lo/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"ການຕັ້ງຄ່າ"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"ໜ້າຈໍການຂະຫຍາຍ"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"ການຄວບຄຸມໜ້າຈໍການຂະຫຍາຍ"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"ຊູມເຂົ້າ"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"ຊູມອອກ"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"ຍ້າຍຂຶ້ນ"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"ຍ້າຍລົງ"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"ຍ້າຍໄປຊ້າຍ"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"ຍ້າຍໄປຂວາ"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"ການຄວບຄຸມອຸປະກອນ"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"ເພີ່ມການຄວບຄຸມສຳລັບອຸປະກອນທີ່ເຊື່ອມຕໍ່ແລ້ວຂອງທ່ານ"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (ຕັດການເຊື່ອມຕໍ່ແລ້ວ)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"ບໍ່ສາມາດເຊື່ອມຕໍ່ໄດ້. ລອງໃໝ່."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"ຈັບຄູ່ອຸປະກອນໃໝ່"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"ໝາຍເລກສ້າງ"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"ສຳເນົາໝາຍເລກສ້າງໄປໃສ່ຄລິບບອດແລ້ວ."</string>
</resources>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index 6fb84dd8..9a2a8f2 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -1028,6 +1028,14 @@
<string name="accessibility_control_move_down" msgid="5390922476900974512">"Perkelti žemyn"</string>
<string name="accessibility_control_move_left" msgid="8156206978511401995">"Perkelti kairėn"</string>
<string name="accessibility_control_move_right" msgid="8926821093629582888">"Perkelti dešinėn"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
+ <skip />
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
+ <skip />
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
+ <skip />
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
+ <skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Įrenginio valdikliai"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Pridėkite prijungtų įrenginių valdiklių"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Įrenginio valdiklių nustatymas"</string>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index 9864a61..94b66f3 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -1017,17 +1017,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Iestatījumi"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"Palielināšanas logs"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"Palielināšanas loga vadīklas"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Tuvināt"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"Tālināt"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"Pārvietot uz augšu"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"Pārvietot uz leju"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"Pārvietot pa kreisi"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"Pārvietot pa labi"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Ierīču vadīklas"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Pievienojiet vadīklas pievienotajām ierīcēm"</string>
@@ -1093,8 +1095,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (savienojums pārtraukts)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"Nevarēja izveidot savienojumu. Mēģiniet vēlreiz."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"Savienošana pārī ar jaunu ierīci"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"Versijas numurs"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"Versijas numurs ir kopēts starpliktuvē."</string>
</resources>
diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml
index 362cbdc..567afc0 100644
--- a/packages/SystemUI/res/values-mk/strings.xml
+++ b/packages/SystemUI/res/values-mk/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Поставки"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"Прозорец за зголемување"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"Контроли на прозорец за зголемување"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Зумирај"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"Одзумирај"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"Премести нагоре"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"Премести надолу"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"Премести налево"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"Премести надесно"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Контроли за уредите"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Додајте контроли за поврзаните уреди"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (исклучен)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"Не можеше да се поврзе. Обидете се повторно."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"Спарете нов уред"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"Број на верзија"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"Бројот на верзијата е копиран во привремената меморија."</string>
</resources>
diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml
index 95634b8..dc6fe4c 100644
--- a/packages/SystemUI/res/values-ml/strings.xml
+++ b/packages/SystemUI/res/values-ml/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"ക്രമീകരണം"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"മാഗ്നിഫിക്കേഷൻ വിൻഡോ"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"മാഗ്നിഫിക്കേഷൻ വിൻഡോ നിയന്ത്രണങ്ങൾ"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"സൂം ഇൻ ചെയ്യുക"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"സൂം ഔട്ട് ചെയ്യുക"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"മുകളിലേക്ക് നീക്കുക"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"താഴേക്ക് നീക്കുക"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"ഇടത്തേക്ക് നീക്കുക"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"വലത്തേക്ക് നീക്കുക"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"ഉപകരണ നിയന്ത്രണങ്ങൾ"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"കണക്റ്റ് ചെയ്ത ഉപകരണങ്ങൾക്ക് നിയന്ത്രണങ്ങൾ ചേർക്കുക"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (വിച്ഛേദിച്ചു)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"കണക്റ്റ് ചെയ്യാനായില്ല. വീണ്ടും ശ്രമിക്കുക."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"പുതിയ ഉപകരണവുമായി ജോടിയാക്കുക"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"ബിൽഡ് നമ്പർ"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"ക്ലിപ്പ്ബോർഡിലേക്ക് ബിൽഡ് നമ്പർ പകർത്തി."</string>
</resources>
diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml
index a2e1745..b12c4e0 100644
--- a/packages/SystemUI/res/values-mn/strings.xml
+++ b/packages/SystemUI/res/values-mn/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Тохиргоо"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"Томруулалтын цонх"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"Томруулалтын цонхны хяналт"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Томруулах"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"Жижигрүүлэх"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"Дээш зөөх"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"Доош зөөх"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"Зүүн тийш зөөх"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"Баруун тийш зөөх"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Төхөөрөмжийн хяналт"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Холбогдсон төхөөрөмжүүд дээрээ хяналт нэмэх"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (салсан)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"Холбогдож чадсангүй. Дахин оролдоно уу."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"Шинэ төхөөрөмж хослуулах"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"Хийгдсэн дугаар"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"Хийгдсэн дугаарыг түр санах ойд хуулсан."</string>
</resources>
diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml
index 7a62c17..40a51c7 100644
--- a/packages/SystemUI/res/values-mr/strings.xml
+++ b/packages/SystemUI/res/values-mr/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"सेटिंग्ज"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"मॅग्निफिकेशन विंडो"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"मॅग्निफिकेशन विंडो नियंत्रणे"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"झूम इन करा"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"झूम आउट करा"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"वर हलवा"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"खाली हलवा"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"डावीकडे हलवा"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"उजवीकडे हलवा"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"डिव्हाइस नियंत्रणे"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"तुमच्या कनेक्ट केलेल्या डिव्हाइससाठी नियंत्रणे जोडा"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (डिस्कनेक्ट केले)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"कनेक्ट करू शकलो नाही. पुन्हा प्रयत्न करा."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"नवीन डिव्हाइससोबत पेअर करा"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"बिल्ड नंबर"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"बिल्ड नंबर क्लिपबोर्डवर कॉपी केला."</string>
</resources>
diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml
index 2b501bb..aa302a9 100644
--- a/packages/SystemUI/res/values-ms/strings.xml
+++ b/packages/SystemUI/res/values-ms/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Tetapan"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"Tetingkap Pembesaran"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"Kawalan Tetingkap Pembesaran"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Zum masuk"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"Zum keluar"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"Alih ke atas"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"Alih ke bawah"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"Alih ke kiri"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"Alih ke kanan"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Kawalan peranti"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Tambah kawalan untuk peranti yang disambungkan"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (diputuskan sambungan)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"Tidak boleh menyambung. Cuba lagi."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"Gandingkan peranti baharu"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"Nombor binaan"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"Nombor binaan disalin ke papan keratan."</string>
</resources>
diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml
index 1cbf17fe..a296b46 100644
--- a/packages/SystemUI/res/values-my/strings.xml
+++ b/packages/SystemUI/res/values-my/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"ဆက်တင်များ"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"ဝင်းဒိုး ချဲ့ခြင်း"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"ဝင်းဒိုး ထိန်းချုပ်မှုများ ချဲ့ခြင်း"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"ဇူးမ်ဆွဲရန်"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"ဇူးမ်ဖြုတ်ရန်"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"အပေါ်သို့ရွှေ့ရန်"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"အောက်သို့ရွှေ့ရန်"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"ဘယ်ဘက်သို့ရွှေ့ရန်"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"ညာဘက်သို့ရွှေ့ရန်"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"စက်ထိန်းစနစ်"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"ချိတ်ဆက်စက်များအတွက် ထိန်းချုပ်မှုများထည့်ပါ"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (ချိတ်ဆက်မထားပါ)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"ချိတ်ဆက်၍ မရပါ။ ထပ်စမ်းကြည့်ပါ။"</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"စက်အသစ် တွဲချိတ်ရန်"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"တည်ဆောက်မှုနံပါတ်"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"တည်ဆောက်မှုနံပါတ်ကို ကလစ်ဘုတ်သို့ မိတ္တူကူးပြီးပါပြီ။"</string>
</resources>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index 6d6d66f..7ebed82 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Innstillinger"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"Forstørringsvindu"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"Kontroller for forstørringsvindu"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Zoom inn"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"Zoom ut"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"Flytt opp"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"Flytt ned"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"Flytt til venstre"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"Flytt til høyre"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Enhetsstyring"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Legg til kontroller for de tilkoblede enhetene dine"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (frakoblet)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"Kunne ikke koble til. Prøv på nytt."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"Koble til en ny enhet"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"Delversjonsnummer"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"Delversjonsnummeret er kopiert til utklippstavlen."</string>
</resources>
diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml
index e1dd8c0..6b77bb2 100644
--- a/packages/SystemUI/res/values-ne/strings.xml
+++ b/packages/SystemUI/res/values-ne/strings.xml
@@ -339,7 +339,7 @@
<string name="dessert_case" msgid="9104973640704357717">"Dessert Case"</string>
<string name="start_dreams" msgid="9131802557946276718">"स्क्रिन सेभर"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
- <string name="quick_settings_header_onboarding_text" msgid="1918085351115504765">"थप विकल्पहरूका लागि आइकनहरूमा छोइराख्नुहोस्"</string>
+ <string name="quick_settings_header_onboarding_text" msgid="1918085351115504765">"थप विकल्पहरूका लागि आइकनहरूमा टच एण्ड होल्ड गर्नुहोस्"</string>
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"बाधा नपुऱ्याउनुहोस्"</string>
<string name="quick_settings_dnd_priority_label" msgid="6251076422352664571">"प्राथमिकता मात्र"</string>
<string name="quick_settings_dnd_alarms_label" msgid="1241780970469630835">"अलार्महरू मात्र"</string>
@@ -591,16 +591,16 @@
<string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"असक्षम पार्नुहोस्"</string>
<string name="accessibility_output_chooser" msgid="7807898688967194183">"आउटपुट यन्त्र बदल्नुहोस्"</string>
<string name="screen_pinning_title" msgid="9058007390337841305">"एप पिन गरिएको छ"</string>
- <string name="screen_pinning_description" msgid="8699395373875667743">"तपाईंले अनपिन नगरेसम्म यसले त्यसलाई दृश्यमा कायम राख्छ। अनपिन गर्न पछाडि र परिदृश्य बटनलाई छोइराख्नुहोस्।"</string>
- <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"तपाईंले अनपिन नगरेसम्म यसले त्यसलाई दृश्यमा कायम राख्छ। अनपिन गर्न पछाडि र गृह नामक बटनहरूलाई छोइराख्नुहोस्।"</string>
+ <string name="screen_pinning_description" msgid="8699395373875667743">"तपाईंले अनपिन नगरेसम्म यसले त्यसलाई दृश्यमा कायम राख्छ। अनपिन गर्न पछाडि र परिदृश्य बटनलाई टच एण्ड होल्ड गर्नुहोस्।"</string>
+ <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"तपाईंले अनपिन नगरेसम्म यसले त्यसलाई दृश्यमा कायम राख्छ। अनपिन गर्न पछाडि र गृह नामक बटनहरूलाई टच एण्ड होल्ड गर्नुहोस्।"</string>
<string name="screen_pinning_description_gestural" msgid="7246323931831232068">"तपाईंले यो एप अनपिन नगरेसम्म यो एप यहाँ देखिइरहने छ। अनपिन गर्न माथितिर स्वाइप गरी होल्ड गर्नुहोस्।"</string>
- <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"तपाईंले अनपिन नगरेसम्म यसले त्यसलाई दृश्यमा कायम राख्छ। अनपिन गर्न परिदृश्य बटनलाई छोइराख्नुहोस्।"</string>
- <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"तपाईंले अनपिन नगरेसम्म यसले त्यसलाई दृश्यमा कायम राख्छ। अनपिन गर्न गृह नामक बटनलाई छोइराख्नुहोस्।"</string>
+ <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"तपाईंले अनपिन नगरेसम्म यसले त्यसलाई दृश्यमा कायम राख्छ। अनपिन गर्न परिदृश्य बटनलाई टच एण्ड होल्ड गर्नुहोस्।"</string>
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"तपाईंले अनपिन नगरेसम्म यसले त्यसलाई दृश्यमा कायम राख्छ। अनपिन गर्न गृह नामक बटनलाई टच एण्ड होल्ड गर्नुहोस्।"</string>
<string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"स्क्रिनमा व्यक्तिगत डेटा (जस्तै सम्पर्क ठेगाना र इमेलको सामग्री) देखिन सक्छ।"</string>
<string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"पिन गरिएको एपले अन्य एप खोल्न सक्छ।"</string>
- <string name="screen_pinning_toast" msgid="8177286912533744328">"यो एप अनपनि गर्न पछाडि र विवरण नामक बटनहरूलाई छोइराख्नुहोस्"</string>
- <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"यो एप अनपनि गर्न पछाडि र होम बटनलाई छोइराख्नुहोस्"</string>
- <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"यो एप अनपिन गर्न माथितिर स्वाइप गरी स्क्रिनमा छोइराख्नुहोस्"</string>
+ <string name="screen_pinning_toast" msgid="8177286912533744328">"यो एप अनपनि गर्न पछाडि र विवरण नामक बटनहरूलाई टच एण्ड होल्ड गर्नुहोस्"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"यो एप अनपनि गर्न पछाडि र होम बटनलाई टच एण्ड होल्ड गर्नुहोस्"</string>
+ <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"यो एप अनपिन गर्न माथितिर स्वाइप गरी स्क्रिनमा टच एण्ड होल्ड गर्नुहोस्"</string>
<string name="screen_pinning_positive" msgid="3285785989665266984">"बुझेँ"</string>
<string name="screen_pinning_negative" msgid="6882816864569211666">"धन्यवाद पर्दैन"</string>
<string name="screen_pinning_start" msgid="7483998671383371313">"एप पिन गरियो"</string>
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"सेटिङ"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"म्याग्निफिकेसन विन्डो"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"म्याग्निफिकेसन विन्डोका नियन्त्रणहरू"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"जुम इन गर्नुहोस्"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"जुम आउट गर्नुहोस्"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"माथि सार्नुहोस्"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"तल सार्नुहोस्"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"बायाँ सार्नुहोस्"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"दायाँ सार्नुहोस्"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"यन्त्र नियन्त्रण गर्ने विजेटहरू"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"आफ्ना जोडिएका यन्त्रहरूका लागि नियन्त्रण सुविधाहरू थप्नुहोस्"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (डिस्कनेक्ट गरिएको)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"कनेक्ट गर्न सकिएन। फेरि प्रयास गर्नुहोस्।"</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"नयाँ यन्त्रको जोडा बनाउनुहोस्"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"बिल्ड नम्बर"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"बिल्ड नम्बर कपी गरी क्लिपबोर्डमा सारियो।"</string>
</resources>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index e2db22c..19e1537 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Instellingen"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"Vergrotingsvenster"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"Bediening van vergrotingsvenster"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Inzoomen"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"Uitzoomen"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"Omhoog verplaatsen"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"Omlaag verplaatsen"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"Naar links verplaatsen"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"Naar rechts verplaatsen"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Apparaatbediening"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Bedieningselementen voor je gekoppelde apparaten toevoegen"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (verbinding verbroken)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"Kan geen verbinding maken. Probeer het nog eens."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"Nieuw apparaat koppelen"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"Build-nummer"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"Build-nummer naar klembord gekopieerd."</string>
</resources>
diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml
index 970e61c..d4e723f 100644
--- a/packages/SystemUI/res/values-or/strings.xml
+++ b/packages/SystemUI/res/values-or/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"ସେଟିଂସ୍"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"ମ୍ୟାଗ୍ନିଫିକେସନ୍ ୱିଣ୍ଡୋ"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"ମ୍ୟାଗ୍ନିଫିକେସନ୍ ୱିଣ୍ଡୋ ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକ"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"ଜୁମ୍ ଇନ୍ କରନ୍ତୁ"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"ଜୁମ୍ ଆଉଟ୍ କରନ୍ତୁ"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"ଉପରକୁ ମୁଭ୍ କରନ୍ତୁ"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"ତଳକୁ ମୁଭ୍ କରନ୍ତୁ"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"ବାମକୁ ମୁଭ୍ କରନ୍ତୁ"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"ଡାହାଣକୁ ମୁଭ୍ କରନ୍ତୁ"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"ଡିଭାଇସ୍ ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକ"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"ଆପଣଙ୍କ ସଂଯୁକ୍ତ ଡିଭାଇସଗୁଡ଼ିକ ପାଇଁ ନିୟନ୍ତ୍ରଣ ଯୋଗ କରନ୍ତୁ"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (ବିଚ୍ଛିନ୍ନ କରାଯାଇଛି)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"ସଂଯୋଗ କରାଯାଇପାରିଲା ନାହିଁ। ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।"</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"ନୂଆ ଡିଭାଇସକୁ ପେୟାର୍ କରନ୍ତୁ"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"ବିଲ୍ଡ ନମ୍ୱର"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"କ୍ଲିପବୋର୍ଡକୁ କପି କରାଯାଇଥିବା ବିଲ୍ଡ ନମ୍ୱର।"</string>
</resources>
diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml
index 690d6e5b..19715c5 100644
--- a/packages/SystemUI/res/values-pa/strings.xml
+++ b/packages/SystemUI/res/values-pa/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"ਸੈਟਿੰਗਾਂ"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"ਵੱਡਦਰਸ਼ੀਕਰਨ Window"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"ਵੱਡਦਰਸ਼ੀਕਰਨ Window ਦੇ ਕੰਟਰੋਲ"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"ਜ਼ੂਮ ਵਧਾਓ"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"ਜ਼ੂਮ ਘਟਾਓ"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"ਉੱਪਰ ਲਿਜਾਓ"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"ਹੇਠਾਂ ਲਿਜਾਓ"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"ਖੱਬੇ ਲਿਜਾਓ"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"ਸੱਜੇ ਲਿਜਾਓ"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"ਡੀਵਾਈਸ ਕੰਟਰੋਲ"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"ਆਪਣੇ ਕਨੈਕਟ ਕੀਤੇ ਡੀਵਾਈਸਾਂ ਲਈ ਕੰਟਰੋਲ ਸ਼ਾਮਲ ਕਰੋ"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (ਡਿਸਕਨੈਕਟ ਹੋਇਆ)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"ਕਨੈਕਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"ਨਵਾਂ ਡੀਵਾਈਸ ਜੋੜਾਬੱਧ ਕਰੋ"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"ਬਿਲਡ ਨੰਬਰ"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"ਬਿਲਡ ਨੰਬਰ ਨੂੰ ਕਲਿੱਪਬੋਰਡ \'ਤੇ ਕਾਪੀ ਕੀਤਾ ਗਿਆ।"</string>
</resources>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index 9b31c52..810ea37 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -1022,17 +1022,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Ustawienia"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"Okno powiększenia"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"Elementy sterujące okna powiększenia"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Powiększ"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"Pomniejsz"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"Przesuń w górę"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"Przesuń w dół"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"Przesuń w lewo"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"Przesuń w prawo"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Sterowanie urządzeniami"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Dodaj elementy sterujące połączonymi urządzeniami"</string>
@@ -1099,8 +1101,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (rozłączono)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"Nie udało się połączyć. Spróbuj ponownie."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"Sparuj nowe urządzenie"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"Numer kompilacji"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"Numer kompilacji został skopiowany do schowka."</string>
</resources>
diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml
index b76ebda..f8cf881 100644
--- a/packages/SystemUI/res/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/strings.xml
@@ -1018,6 +1018,10 @@
<string name="accessibility_control_move_down" msgid="5390922476900974512">"Mover para baixo"</string>
<string name="accessibility_control_move_left" msgid="8156206978511401995">"Mover para a esquerda"</string>
<string name="accessibility_control_move_right" msgid="8926821093629582888">"Mover para a direita"</string>
+ <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Chave de ampliação"</string>
+ <string name="magnification_mode_switch_state_full_screen" msgid="2882507327576770574">"Ampliar toda a tela"</string>
+ <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Ampliar parte da tela"</string>
+ <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Trocar"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Controles do dispositivo"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Adiciona controles aos dispositivos conectados"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Configurar controles do dispositivo"</string>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index 089bbd4..966f15c 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Definições"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"Janela de ampliação"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"Controlos da janela de ampliação"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Aumentar zoom"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"Diminuir zoom"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"Mover para cima"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"Mover para baixo"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"Mover para a esquerda"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"Mover para a direita"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Controlos de dispositivos"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Adicione controlos para os dispositivos associados."</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (desligado)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"Não foi possível ligar. Tente novamente."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"Sincronize o novo dispositivo"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"Número da compilação"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"Número da compilação copiado para a área de transferência."</string>
</resources>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index b76ebda..f8cf881 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -1018,6 +1018,10 @@
<string name="accessibility_control_move_down" msgid="5390922476900974512">"Mover para baixo"</string>
<string name="accessibility_control_move_left" msgid="8156206978511401995">"Mover para a esquerda"</string>
<string name="accessibility_control_move_right" msgid="8926821093629582888">"Mover para a direita"</string>
+ <string name="magnification_mode_switch_description" msgid="2698364322069934733">"Chave de ampliação"</string>
+ <string name="magnification_mode_switch_state_full_screen" msgid="2882507327576770574">"Ampliar toda a tela"</string>
+ <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Ampliar parte da tela"</string>
+ <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Trocar"</string>
<string name="quick_controls_title" msgid="6839108006171302273">"Controles do dispositivo"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Adiciona controles aos dispositivos conectados"</string>
<string name="quick_controls_setup_title" msgid="8901436655997849822">"Configurar controles do dispositivo"</string>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index 3194b9f..07653f1 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -1017,17 +1017,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Setări"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"Fereastra de mărire"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"Comenzi pentru fereastra de mărire"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Măriți"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"Micșorați"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"Deplasați în sus"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"Deplasați în jos"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"Deplasați spre stânga"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"Deplasați spre dreapta"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Comenzile dispozitivelor"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Adăugați comenzi pentru dispozitivele conectate"</string>
@@ -1093,8 +1095,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (s-a deconectat)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"Nu s-a putut conecta. Reîncercați."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"Asociați un nou dispozitiv"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"Numărul versiunii"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"Numărul versiunii s-a copiat în clipboard."</string>
</resources>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index 26e3433..5f9f115 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -1022,17 +1022,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Настройки"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"Окно увеличения"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"Настройки окна увеличения"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Увеличить"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"Уменьшить"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"Переместить вверх"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"Переместить вниз"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"Переместить влево"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"Переместить вправо"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Управление устройствами"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Добавьте виджеты для управления устройствами."</string>
@@ -1099,8 +1101,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (отключено)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"Не удалось подключиться. Повторите попытку."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"Подключить новое устройство"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"Номер сборки"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"Номер сборки скопирован в буфер обмена."</string>
</resources>
diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml
index 8eea1ed..64e24be 100644
--- a/packages/SystemUI/res/values-si/strings.xml
+++ b/packages/SystemUI/res/values-si/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"සැකසීම්"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"විශාලන කවුළුව"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"විශාලනය කිරීමේ කවුළු පාලන"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"විශාලනය වැඩි කරන්න"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"විශාලනය අඩු කරන්න"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"ඉහළට ගෙන යන්න"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"පහළට ගෙන යන්න"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"වමට ගෙන යන්න"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"දකුණට ගෙන යන්න"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"උපාංග පාලන"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"ඔබේ සම්බන්ධිත උපාංග සඳහා පාලන එක් කරන්න"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (විසන්ධි විය)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"සම්බන්ධ වීමට නොහැකි විය. නැවත උත්සාහ කරන්න."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"නව උපාංගය යුගල කරන්න"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"නිමැවුම් අංකය"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"නිමැවුම් අංකය පසුරු පුවරුවට පිටපත් කරන ලදි."</string>
</resources>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index 47045d8..bb75f8f 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -1022,17 +1022,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Nastavenia"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"Okno priblíženia"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"Ovládacie prvky okna priblíženia"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Priblížiť"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"Oddialiť"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"Posunúť nahor"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"Posunúť nadol"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"Posunúť doľava"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"Posunúť doprava"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Ovládanie zariadení"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Pridajte si ovládače pripojených zariadení"</string>
@@ -1099,8 +1101,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (odpojené)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"Nepodarilo sa pripojiť. Skúste to znova."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"Spárovať nové zariadenie"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"Číslo zostavy"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"Číslo zostavy bolo skopírované do schránky."</string>
</resources>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index 7b68a3a..98abf37 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -1022,17 +1022,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Nastavitve"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"Povečevalno okno"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"Kontrolniki povečevalnega okna"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Povečaj"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"Pomanjšaj"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"Premakni navzgor"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"Premakni navzdol"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"Premakni levo"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"Premakni desno"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Kontrolniki naprave"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Dodajte kontrolnike za povezane naprave"</string>
@@ -1099,8 +1101,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (povezava prekinjena)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"Povezave ni bilo mogoče vzpostaviti. Poskusite znova."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"Seznanitev nove naprave"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"Delovna različica"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"Delovna različica je bila kopirana v odložišče."</string>
</resources>
diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml
index b7ebb2a..154d53d 100644
--- a/packages/SystemUI/res/values-sq/strings.xml
+++ b/packages/SystemUI/res/values-sq/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Cilësimet"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"Dritarja e zmadhimit"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"Kontrollet e dritares së zmadhimit"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Zmadho"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"Zvogëlo"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"Lëvize lart"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"Lëvize poshtë"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"Lëvize majtas"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"Lëvize djathtas"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Kontrollet e pajisjes"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Shto kontrolle për pajisjet e tua të lidhura"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (e shkëputur)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"Nuk mund të lidhej. Provo sërish."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"Çifto pajisjen e re"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"Numri i ndërtimit"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"Numri i ndërtimit u kopjua te kujtesa e fragmenteve"</string>
</resources>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index b6a90cd..e59c0bb 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -1017,17 +1017,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Подешавања"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"Прозор за увећање"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"Контроле прозора за увећање"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Увећајте"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"Умањите"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"Померите нагоре"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"Померите надоле"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"Померите налево"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"Померите надесно"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Контроле уређаја"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Додајте контроле за повезане уређаје"</string>
@@ -1093,8 +1095,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (веза је прекинута)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"Повезивање није успело. Пробајте поново."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"Упари нови уређај"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"Број верзије"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"Број верзије је копиран у привремену меморију."</string>
</resources>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index 890f504..8213118 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Inställningar"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"Förstoringsfönster"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"Inställningar för förstoringsfönster"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Zooma in"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"Zooma ut"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"Flytta uppåt"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"Flytta nedåt"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"Flytta åt vänster"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"Flytta åt höger"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Enhetsstyrning"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Lägg till snabbkontroller för anslutna enheter"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (frånkopplad)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"Det gick inte att ansluta. Försök igen."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"Parkoppla en ny enhet"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"Versionsnummer"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"Versionsnumret har kopierats till urklipp."</string>
</resources>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index 34042ad..0a0e91a 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Mipangilio"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"Dirisha la Ukuzaji"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"Vidhibiti vya Dirisha la Ukuzaji"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Vuta karibu"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"Sogeza mbali"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"Sogeza juu"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"Sogeza chini"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"Sogeza kushoto"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"Sogeza kulia"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Vidhibiti vya vifaa"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Weka vidhibiti vya vifaa ulivyounganisha"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (hakijaunganishwa)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"Imeshindwa kuunganisha. Jaribu tena."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"Oanisha kifaa kipya"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"Nambari ya muundo"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"Nambari ya muundo imewekwa kwenye ubao wa kunakili."</string>
</resources>
diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml
index b30859f..27a9d06 100644
--- a/packages/SystemUI/res/values-ta/strings.xml
+++ b/packages/SystemUI/res/values-ta/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"அமைப்புகள்"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"பெரிதாக்கல் சாளரம்"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"பெரிதாக்கல் சாளரக் கட்டுப்பாடுகள்"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"பெரிதாக்கு"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"சிறிதாக்கு"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"மேலே நகர்த்து"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"கீழே நகர்த்து"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"இடப்புறம் நகர்த்து"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"வலப்புறம் நகர்த்து"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"சாதனக் கட்டுப்பாடுகள்"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"இணைக்கப்பட்ட சாதனங்களில் கட்டுப்பாடுகளைச் சேர்க்கலாம்"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (இணைப்பு துண்டிக்கப்பட்டது)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"இணைக்க முடியவில்லை. மீண்டும் முயலவும்."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"புதிய சாதனத்தை இணைத்தல்"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"பதிப்பு எண்"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"பதிப்பு எண் கிளிப்போர்டுக்கு நகலெடுக்கப்பட்டது."</string>
</resources>
diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml
index cb134a1..5e35a5c 100644
--- a/packages/SystemUI/res/values-te/strings.xml
+++ b/packages/SystemUI/res/values-te/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"సెట్టింగ్లు"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"మాగ్నిఫికేషన్ విండో"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"మాగ్నిఫికేషన్ నియంత్రణల విండో"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"దగ్గరగా జూమ్ చేయండి"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"దూరంగా జూమ్ చేయండి"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"పైకి పంపండి"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"కిందకి పంపండి"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"ఎడమవైపుగా జరపండి"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"కుడివైపుగా జరపండి"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"పరికరం నియంత్రణలు"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"మీ కనెక్ట్ అయిన పరికరాలకు నియంత్రణలను జోడించండి"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (డిస్కనెక్ట్ అయ్యింది)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"కనెక్ట్ చేయడం సాధ్యపడలేదు. మళ్లీ ట్రై చేయండి."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"కొత్త పరికరాన్ని పెయిర్ చేయండి"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"బిల్డ్ నంబర్"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"బిల్డ్ నంబర్, క్లిప్బోర్డ్కు కాపీ చేయబడింది."</string>
</resources>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index d678353..3f7e0da 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"การตั้งค่า"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"หน้าต่างการขยาย"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"การควบคุมหน้าต่างการขยาย"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"ซูมเข้า"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"ซูมออก"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"ย้ายขึ้น"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"ย้ายลง"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"ย้ายไปทางซ้าย"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"ย้ายไปทางขวา"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"ระบบควบคุมอุปกรณ์"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"เพิ่มตัวควบคุมของอุปกรณ์ที่เชื่อมต่อ"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (ยกเลิกการเชื่อมต่อแล้ว)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"เชื่อมต่อไม่ได้ ลองใหม่"</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"จับคู่อุปกรณ์ใหม่"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"หมายเลขบิวด์"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"คัดลอกหมายเลขบิวด์ไปยังคลิปบอร์ดแล้ว"</string>
</resources>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index 21fdd31..d03f0f8 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Mga Setting"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"Window ng Pag-magnify"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"Mga Kontrol sa Pag-magnify ng Window"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Mag-zoom in"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"Mag-zoom out"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"Itaas"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"Ibaba"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"Ilipat pakaliwa"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"Ilipat pakanan"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Mga kontrol ng device"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Magdagdag ng kontrol para sa mga nakakonektang device"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (nakadiskonekta)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"Hindi makakonekta. Subukan ulit."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"Magpares ng bagong device"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"Numero ng build"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"Nakopya sa clipboard ang numero ng build."</string>
</resources>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index 3e04d19..62f3671 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Ayarlar"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"Büyütme Penceresi"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"Büyütme Penceresi Kontrolleri"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Yakınlaştır"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"Uzaklaştır"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"Yukarı taşı"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"Aşağı taşı"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"Sola taşı"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"Sağa taşı"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Cihaz denetimleri"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Bağlı cihazlarınız için denetimler ekleyin"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (bağlı değil)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"Bağlanılamadı. Tekrar deneyin."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"Yeni cihaz eşle"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"Derleme numarası"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"Derleme numarası panoya kopyalandı."</string>
</resources>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index a7c6bef..069577f 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -1022,17 +1022,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Налаштування"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"Вікно збільшення"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"Елементи керування вікна збільшення"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Наблизити"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"Віддалити"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"Перемістити вгору"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"Перемістити вниз"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"Перемістити ліворуч"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"Перемістити праворуч"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Керування пристроями"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Додайте елементи керування для підключених пристроїв"</string>
@@ -1099,8 +1101,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (відключено)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"Не вдалося підключитися. Повторіть спробу."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"Підключити новий пристрій"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"Номер складання"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"Номер складання скопійовано в буфер обміну."</string>
</resources>
diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml
index f24492c..ffba2bd 100644
--- a/packages/SystemUI/res/values-ur/strings.xml
+++ b/packages/SystemUI/res/values-ur/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"ترتیبات"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"میگنیفکیشن ونڈو"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"میگنیفکیشن ونڈو کنٹرولز"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"زوم ان کریں"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"زوم آؤٹ کریں"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"اوپر منتقل کریں"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"نیچے منتقل کریں"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"بائیں منتقل کریں"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"دائیں منتقل کریں"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"آلہ کے کنٹرولز"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"اپنے منسلک آلات کے لیے کنٹرولز شامل کریں"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (غیر منسلک ہو گیا)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"منسلک نہیں ہو سکا۔ پھر کوشش کریں۔"</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"نئے آلہ کا جوڑا بنائیں"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"بلڈ نمبر"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"بلڈ نمبر کلپ بورڈ میں کاپی ہو گیا۔"</string>
</resources>
diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml
index 32c2406..433eadb 100644
--- a/packages/SystemUI/res/values-uz/strings.xml
+++ b/packages/SystemUI/res/values-uz/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Sozlamalar"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"Kattalashtirish oynasi"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"Kattalashtirish oynasi sozlamalari"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Yaqinlashtirish"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"Uzoqlashtirish"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"Tepaga siljitish"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"Pastga siljitish"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"Chapga siljitish"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"Oʻngga siljitish"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Qurilmalarni boshqarish"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Ulangan qurilmalar uchun boshqaruv elementlari"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (uzilgan)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"Ulanmadi. Qayta urining."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"Yangi qurilmani ulash"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"Nashr raqami"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"Nashr raqami vaqtinchalik xotiraga nusxalandi."</string>
</resources>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index d9c80df..e337c42 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Cài đặt"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"Cửa sổ phóng to"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"Các tùy chọn điều khiển cửa sổ phóng to"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Phóng to"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"Thu nhỏ"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"Di chuyển lên"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"Di chuyển xuống"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"Di chuyển sang trái"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"Di chuyển sang phải"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Điều khiển thiết bị"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Thêm các tùy chọn điều khiển cho các thiết bị đã kết nối của bạn"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (đã ngắt kết nối)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"Không thể kết nối. Hãy thử lại."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"Ghép nối thiết bị mới"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"Số bản dựng"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"Đã sao chép số bản dựng vào khay nhớ tạm."</string>
</resources>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index 9f9424d..254d974 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"设置"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"放大窗口"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"放大窗口控件"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"放大"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"缩小"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"上移"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"下移"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"左移"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"右移"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"设备控制器"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"为您所连接的设备添加控件"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>(已断开连接)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"无法连接。请重试。"</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"与新设备配对"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"版本号"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"已将版本号复制到剪贴板。"</string>
</resources>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index 2825a9e..e8afc0e 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"設定"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"放大視窗"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"放大視窗控制項"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"放大"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"縮細"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"向上移"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"向下移"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"向左移"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"向右移"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"裝置控制"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"為連接的裝置新增控制選項"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (已中斷連線)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"無法連線,請再試一次。"</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"配對新裝置"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"版本號碼"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"版本號碼已複製到剪貼簿。"</string>
</resources>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index 8acf2c6..0fc7db6 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"設定"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"放大視窗"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"放大視窗控制項"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"放大"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"縮小"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"向上移"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"向下移"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"向左移"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"向右移"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"裝置控制"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"新增已連結裝置的控制項"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (已中斷連線)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"無法連線,請再試一次。"</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"配對新裝置"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"版本號碼"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"已將版本號碼複製到剪貼簿。"</string>
</resources>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index 4935206..3ada5cc 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -1012,17 +1012,19 @@
<string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Amasethingi"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"Iwindi Lesikhulisi"</string>
<string name="magnification_controls_title" msgid="8421106606708891519">"Izilawuli Zewindi Lesikhulisi"</string>
- <!-- no translation found for accessibility_control_zoom_in (1189272315480097417) -->
+ <string name="accessibility_control_zoom_in" msgid="1189272315480097417">"Sondeza"</string>
+ <string name="accessibility_control_zoom_out" msgid="69578832020304084">"Hlehlisa"</string>
+ <string name="accessibility_control_move_up" msgid="6622825494014720136">"Khuphula"</string>
+ <string name="accessibility_control_move_down" msgid="5390922476900974512">"Yehlisa"</string>
+ <string name="accessibility_control_move_left" msgid="8156206978511401995">"Yisa kwesokunxele"</string>
+ <string name="accessibility_control_move_right" msgid="8926821093629582888">"Yisa kwesokudla"</string>
+ <!-- no translation found for magnification_mode_switch_description (2698364322069934733) -->
<skip />
- <!-- no translation found for accessibility_control_zoom_out (69578832020304084) -->
+ <!-- no translation found for magnification_mode_switch_state_full_screen (2882507327576770574) -->
<skip />
- <!-- no translation found for accessibility_control_move_up (6622825494014720136) -->
+ <!-- no translation found for magnification_mode_switch_state_window (8597100249594076965) -->
<skip />
- <!-- no translation found for accessibility_control_move_down (5390922476900974512) -->
- <skip />
- <!-- no translation found for accessibility_control_move_left (8156206978511401995) -->
- <skip />
- <!-- no translation found for accessibility_control_move_right (8926821093629582888) -->
+ <!-- no translation found for magnification_mode_switch_click_label (2786203505805898199) -->
<skip />
<string name="quick_controls_title" msgid="6839108006171302273">"Izilawuli zezinsiza"</string>
<string name="quick_controls_subtitle" msgid="1667408093326318053">"Engeza izilawuli zedivayisi yakho exhunyiwe"</string>
@@ -1087,8 +1089,6 @@
<string name="media_output_dialog_disconnected" msgid="1834473104836986046">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> (inqamukile)"</string>
<string name="media_output_dialog_connect_failed" msgid="3225190634236259010">"Ayikwazanga ukuxhumeka. Zama futhi."</string>
<string name="media_output_dialog_pairing_new" msgid="9099497976087485862">"Bhanqa idivayisi entsha"</string>
- <!-- no translation found for build_number_clip_data_label (3623176728412560914) -->
- <skip />
- <!-- no translation found for build_number_copy_toast (877720921605503046) -->
- <skip />
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"Yakha inombolo"</string>
+ <string name="build_number_copy_toast" msgid="877720921605503046">"Yakha inombolo ekopishelwe kubhodi yokunamathisela."</string>
</resources>
diff --git a/packages/SystemUI/src/com/android/systemui/Dependency.java b/packages/SystemUI/src/com/android/systemui/Dependency.java
index f24644b..9f28e09 100644
--- a/packages/SystemUI/src/com/android/systemui/Dependency.java
+++ b/packages/SystemUI/src/com/android/systemui/Dependency.java
@@ -47,6 +47,7 @@
import com.android.systemui.fragments.FragmentService;
import com.android.systemui.keyguard.ScreenLifecycle;
import com.android.systemui.keyguard.WakefulnessLifecycle;
+import com.android.systemui.media.dialog.MediaOutputDialogFactory;
import com.android.systemui.model.SysUiState;
import com.android.systemui.navigationbar.NavigationBarController;
import com.android.systemui.navigationbar.NavigationModeController;
@@ -344,6 +345,7 @@
@Inject Lazy<DisplayImeController> mDisplayImeController;
@Inject Lazy<RecordingController> mRecordingController;
@Inject Lazy<ProtoTracer> mProtoTracer;
+ @Inject Lazy<MediaOutputDialogFactory> mMediaOutputDialogFactory;
@Inject
public Dependency() {
@@ -541,6 +543,8 @@
mProviders.put(RecordingController.class, mRecordingController::get);
+ mProviders.put(MediaOutputDialogFactory.class, mMediaOutputDialogFactory::get);
+
Dependency.setInstance(this);
}
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationModeSwitch.java b/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationModeSwitch.java
index 1af3897..69a0d65 100644
--- a/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationModeSwitch.java
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationModeSwitch.java
@@ -46,9 +46,15 @@
*/
class MagnificationModeSwitch {
- private static final int DURATION_MS = 5000;
- private static final int START_DELAY_MS = 3000;
- private final Runnable mAnimationTask;
+ @VisibleForTesting
+ static final long FADING_ANIMATION_DURATION_MS = 300;
+ private static final int DEFAULT_FADE_OUT_ANIMATION_DELAY_MS = 3000;
+ // The button visible duration starting from the last showButton() called.
+ private int mVisibleDuration = DEFAULT_FADE_OUT_ANIMATION_DELAY_MS;
+ private final Runnable mFadeInAnimationTask;
+ private final Runnable mFadeOutAnimationTask;
+ @VisibleForTesting
+ boolean mIsFadeOutAnimating = false;
private final Context mContext;
private final WindowManager mWindowManager;
@@ -100,12 +106,19 @@
}
});
- mAnimationTask = () -> {
+ mFadeInAnimationTask = () -> {
+ mImageView.animate()
+ .alpha(1f)
+ .setDuration(FADING_ANIMATION_DURATION_MS)
+ .start();
+ };
+ mFadeOutAnimationTask = () -> {
mImageView.animate()
.alpha(0f)
- .setDuration(DURATION_MS)
+ .setDuration(FADING_ANIMATION_DURATION_MS)
.withEndAction(() -> removeButton())
.start();
+ mIsFadeOutAnimating = true;
};
}
@@ -128,7 +141,6 @@
}
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
- mImageView.setAlpha(1.0f);
mImageView.animate().cancel();
mLastDown.set(event.getRawX(), event.getRawY());
mLastDrag.set(event.getRawX(), event.getRawY());
@@ -169,9 +181,13 @@
if (!mIsVisible) {
return;
}
- mImageView.animate().cancel();
- mWindowManager.removeView(mImageView);
// Reset button status.
+ mImageView.removeCallbacks(mFadeInAnimationTask);
+ mImageView.removeCallbacks(mFadeOutAnimationTask);
+ mImageView.animate().cancel();
+ mIsFadeOutAnimating = false;
+ mImageView.setAlpha(0f);
+ mWindowManager.removeView(mImageView);
mIsVisible = false;
mParams.x = 0;
mParams.y = 0;
@@ -185,14 +201,15 @@
if (!mIsVisible) {
mWindowManager.addView(mImageView, mParams);
mIsVisible = true;
+ mImageView.postOnAnimation(mFadeInAnimationTask);
}
- mImageView.setAlpha(1.0f);
- // TODO(b/143852371): use accessibility timeout as a delay.
- // Dismiss the magnification switch button after the button is displayed for a period of
- // time.
- mImageView.animate().cancel();
- mImageView.removeCallbacks(mAnimationTask);
- mImageView.postDelayed(mAnimationTask, START_DELAY_MS);
+ if (mIsFadeOutAnimating) {
+ mImageView.animate().cancel();
+ mImageView.setAlpha(1f);
+ }
+ // Refresh the time slot of the fade-out task whenever this method is called.
+ mImageView.removeCallbacks(mFadeOutAnimationTask);
+ mImageView.postOnAnimationDelayed(mFadeOutAnimationTask, mVisibleDuration);
}
void onConfigurationChanged(int configDiff) {
@@ -222,6 +239,7 @@
imageView.setClickable(true);
imageView.setFocusable(true);
imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
+ imageView.setAlpha(0f);
return imageView;
}
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java
index f6571ef..5b096ea 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java
@@ -42,10 +42,10 @@
import androidx.constraintlayout.widget.ConstraintSet;
import com.android.settingslib.Utils;
-import com.android.settingslib.media.MediaOutputSliceConstants;
import com.android.settingslib.widget.AdaptiveIcon;
import com.android.systemui.R;
import com.android.systemui.dagger.qualifiers.Background;
+import com.android.systemui.media.dialog.MediaOutputDialogFactory;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.statusbar.phone.KeyguardDismissUtil;
import com.android.systemui.util.animation.TransitionLayout;
@@ -93,7 +93,7 @@
private int mAlbumArtRadius;
// This will provide the corners for the album art.
private final ViewOutlineProvider mViewOutlineProvider;
-
+ private final MediaOutputDialogFactory mMediaOutputDialogFactory;
/**
* Initialize a new control panel
* @param context
@@ -104,7 +104,8 @@
public MediaControlPanel(Context context, @Background Executor backgroundExecutor,
ActivityStarter activityStarter, MediaViewController mediaViewController,
SeekBarViewModel seekBarViewModel, Lazy<MediaDataManager> lazyMediaDataManager,
- KeyguardDismissUtil keyguardDismissUtil) {
+ KeyguardDismissUtil keyguardDismissUtil, MediaOutputDialogFactory
+ mediaOutputDialogFactory) {
mContext = context;
mBackgroundExecutor = backgroundExecutor;
mActivityStarter = activityStarter;
@@ -112,6 +113,7 @@
mMediaViewController = mediaViewController;
mMediaDataManagerLazy = lazyMediaDataManager;
mKeyguardDismissUtil = keyguardDismissUtil;
+ mMediaOutputDialogFactory = mediaOutputDialogFactory;
loadDimens();
mViewOutlineProvider = new ViewOutlineProvider() {
@@ -273,13 +275,7 @@
setVisibleAndAlpha(collapsedSet, R.id.media_seamless, true /*visible */);
setVisibleAndAlpha(expandedSet, R.id.media_seamless, true /*visible */);
mViewHolder.getSeamless().setOnClickListener(v -> {
- final Intent intent = new Intent()
- .setAction(MediaOutputSliceConstants.ACTION_MEDIA_OUTPUT)
- .putExtra(MediaOutputSliceConstants.EXTRA_PACKAGE_NAME,
- data.getPackageName())
- .putExtra(MediaOutputSliceConstants.KEY_MEDIA_SESSION_TOKEN, mToken);
- mActivityStarter.startActivity(intent, false, true /* dismissShade */,
- Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
+ mMediaOutputDialogFactory.create(data.getPackageName(), true);
});
ImageView iconView = mViewHolder.getSeamlessIcon();
diff --git a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseDialog.java b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseDialog.java
index 3b82999..caef536 100644
--- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseDialog.java
+++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseDialog.java
@@ -49,7 +49,7 @@
* Base dialog for media output UI
*/
public abstract class MediaOutputBaseDialog extends SystemUIDialog implements
- MediaOutputController.Callback {
+ MediaOutputController.Callback, Window.Callback {
private static final String TAG = "MediaOutputDialog";
@@ -210,4 +210,12 @@
public void dismissDialog() {
dismiss();
}
+
+ @Override
+ public void onWindowFocusChanged(boolean hasFocus) {
+ super.onWindowFocusChanged(hasFocus);
+ if (!hasFocus && isShowing()) {
+ dismiss();
+ }
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/MediaTransferManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/MediaTransferManager.java
index ac3523b..1b1a51b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/MediaTransferManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/MediaTransferManager.java
@@ -17,7 +17,6 @@
package com.android.systemui.statusbar;
import android.content.Context;
-import android.content.Intent;
import android.content.res.ColorStateList;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.GradientDrawable;
@@ -36,10 +35,9 @@
import com.android.settingslib.media.InfoMediaManager;
import com.android.settingslib.media.LocalMediaManager;
import com.android.settingslib.media.MediaDevice;
-import com.android.settingslib.media.MediaOutputSliceConstants;
import com.android.settingslib.widget.AdaptiveIcon;
import com.android.systemui.Dependency;
-import com.android.systemui.plugins.ActivityStarter;
+import com.android.systemui.media.dialog.MediaOutputDialogFactory;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
@@ -51,7 +49,7 @@
*/
public class MediaTransferManager {
private final Context mContext;
- private final ActivityStarter mActivityStarter;
+ private final MediaOutputDialogFactory mMediaOutputDialogFactory;
private MediaDevice mDevice;
private List<View> mViews = new ArrayList<>();
private LocalMediaManager mLocalMediaManager;
@@ -74,12 +72,7 @@
ViewParent parent = view.getParent();
StatusBarNotification statusBarNotification =
getRowForParent(parent).getEntry().getSbn();
- final Intent intent = new Intent()
- .setAction(MediaOutputSliceConstants.ACTION_MEDIA_OUTPUT)
- .putExtra(MediaOutputSliceConstants.EXTRA_PACKAGE_NAME,
- statusBarNotification.getPackageName());
- mActivityStarter.startActivity(intent, false, true /* dismissShade */,
- Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
+ mMediaOutputDialogFactory.create(statusBarNotification.getPackageName(), true);
return true;
}
};
@@ -107,7 +100,7 @@
public MediaTransferManager(Context context) {
mContext = context;
- mActivityStarter = Dependency.get(ActivityStarter.class);
+ mMediaOutputDialogFactory = Dependency.get(MediaOutputDialogFactory.class);
LocalBluetoothManager lbm = Dependency.get(LocalBluetoothManager.class);
InfoMediaManager imm = new InfoMediaManager(mContext, null, null, lbm);
mLocalMediaManager = new LocalMediaManager(mContext, lbm, imm, null);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/ConversationNotifications.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ConversationNotifications.kt
index 433c8b0..ddfa18e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/ConversationNotifications.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ConversationNotifications.kt
@@ -27,10 +27,10 @@
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.statusbar.notification.collection.NotificationEntry
+import com.android.systemui.statusbar.notification.collection.legacy.NotificationGroupManagerLegacy
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow
import com.android.systemui.statusbar.notification.row.NotificationContentView
import com.android.systemui.statusbar.notification.stack.StackStateAnimator
-import com.android.systemui.statusbar.notification.collection.legacy.NotificationGroupManagerLegacy
import java.util.concurrent.ConcurrentHashMap
import javax.inject.Inject
@@ -85,38 +85,43 @@
for (entry in activeConversationEntries) {
if (rankingMap.getRanking(entry.sbn.key, ranking) && ranking.isConversation) {
val important = ranking.channel.isImportantConversation
- val layouts = entry.row?.layouts?.asSequence()
+ var changed = false
+ entry.row?.layouts?.asSequence()
?.flatMap(::getLayouts)
?.mapNotNull { it as? ConversationLayout }
- ?: emptySequence()
- var changed = false
- for (layout in layouts) {
- if (important == layout.isImportantConversation) {
- continue
- }
- changed = true
- if (important && entry.isMarkedForUserTriggeredMovement) {
- // delay this so that it doesn't animate in until after
- // the notif has been moved in the shade
- mainHandler.postDelayed({
- layout.setIsImportantConversation(
- important, true /* animate */)
- }, IMPORTANCE_ANIMATION_DELAY.toLong())
- } else {
- layout.setIsImportantConversation(important)
- }
- }
+ ?.filterNot { it.isImportantConversation == important }
+ ?.forEach { layout ->
+ changed = true
+ if (important && entry.isMarkedForUserTriggeredMovement) {
+ // delay this so that it doesn't animate in until after
+ // the notif has been moved in the shade
+ mainHandler.postDelayed(
+ {
+ layout.setIsImportantConversation(
+ important,
+ true)
+ },
+ IMPORTANCE_ANIMATION_DELAY.toLong())
+ } else {
+ layout.setIsImportantConversation(important, false)
+ }
+ }
if (changed) {
notificationGroupManager.updateIsolation(entry)
+ // ensure that the conversation icon isn't hidden
+ // (ex: if it was showing in the shelf)
+ entry.row?.updateIconVisibilities()
}
}
}
}
override fun onEntryInflated(entry: NotificationEntry) {
- if (!entry.ranking.isConversation) return
+ if (!entry.ranking.isConversation) {
+ return
+ }
fun updateCount(isExpanded: Boolean) {
- if (isExpanded && (!notifPanelCollapsed || entry.isPinnedAndExpanded())) {
+ if (isExpanded && (!notifPanelCollapsed || entry.isPinnedAndExpanded)) {
resetCount(entry.key)
entry.row?.let(::resetBadgeUi)
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java
index 0e7a558..789e78e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java
@@ -329,11 +329,11 @@
return mRanking.canBubble();
}
- public @Nullable List<Notification.Action> getSmartActions() {
+ public @NonNull List<Notification.Action> getSmartActions() {
return mRanking.getSmartActions();
}
- public @Nullable List<CharSequence> getSmartReplies() {
+ public @NonNull List<CharSequence> getSmartReplies() {
return mRanking.getSmartReplies();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java
index 113c115..d8d412b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java
@@ -1478,8 +1478,9 @@
}
}
- private void updateIconVisibilities() {
- // The shelficon is never hidden for children in groups
+ /** Refreshes the visibility of notification icons */
+ public void updateIconVisibilities() {
+ // The shelf icon is never hidden for children in groups
boolean visible = !isChildInGroup() && mShelfIconVisible;
for (NotificationContentView l : mLayouts) {
l.setShelfIconVisible(visible);
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 fe70c81..17f326b 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
@@ -147,6 +147,8 @@
// hiding the conversationIcon will already do that via its listener.
return
}
+ } else {
+ conversationIconView.isForceHidden = false
}
super.setShelfIconVisible(visible)
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartRepliesAndActionsInflater.kt b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartRepliesAndActionsInflater.kt
index 5ec57e2..6a3a69c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartRepliesAndActionsInflater.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartRepliesAndActionsInflater.kt
@@ -204,32 +204,29 @@
}
// Apps didn't provide any smart replies / actions, use those from NAS (if any).
if (smartReplies == null && smartActions == null) {
- smartReplies = entry.smartReplies
- ?.takeIf { it.isNotEmpty() }
- ?.let { entryReplies -> freeformRemoteInputActionPair
- ?.takeIf {
- it.second.allowGeneratedReplies && it.second.actionIntent != null
- }?.let { freeformPair -> SmartReplies(
- entryReplies,
- freeformPair.first,
- freeformPair.second.actionIntent,
- true /* fromAssistant */)
- }
- }
- smartActions = entry.smartActions
- ?.takeIf {
- it.isNotEmpty() && notification.allowSystemGeneratedContextualActions
- }?.let { entryActions ->
- val systemGeneratedActions: List<Notification.Action> = when {
- activityManagerWrapper.isLockTaskKioskModeActive ->
- // Filter actions if we're in kiosk-mode - we don't care about
- // screen pinning mode, since notifications aren't shown there
- // anyway.
- filterAllowlistedLockTaskApps(entryActions)
- else -> entryActions
- }
- SmartActions(systemGeneratedActions, true /* fromAssistant */)
- }
+ val entryReplies = entry.smartReplies
+ val entryActions = entry.smartActions
+ if (entryReplies.isNotEmpty()
+ && freeformRemoteInputActionPair != null
+ && freeformRemoteInputActionPair.second.allowGeneratedReplies
+ && freeformRemoteInputActionPair.second.actionIntent != null) {
+ smartReplies = SmartReplies(
+ entryReplies,
+ freeformRemoteInputActionPair.first,
+ freeformRemoteInputActionPair.second.actionIntent,
+ true /* fromAssistant */)
+ }
+ if (entryActions.isNotEmpty()
+ && notification.allowSystemGeneratedContextualActions) {
+ val systemGeneratedActions: List<Notification.Action> = when {
+ activityManagerWrapper.isLockTaskKioskModeActive ->
+ // Filter actions if we're in kiosk-mode - we don't care about screen
+ // pinning mode, since notifications aren't shown there anyway.
+ filterAllowlistedLockTaskApps(entryActions)
+ else -> entryActions
+ }
+ smartActions = SmartActions(systemGeneratedActions, true /* fromAssistant */)
+ }
}
return SmartRepliesAndActions(smartReplies, smartActions)
}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
index 2081cfe..735338f 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
@@ -90,6 +90,7 @@
import com.android.systemui.Dependency;
import com.android.systemui.Prefs;
import com.android.systemui.R;
+import com.android.systemui.media.dialog.MediaOutputDialogFactory;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.VolumeDialog;
import com.android.systemui.plugins.VolumeDialogController;
@@ -519,6 +520,7 @@
Events.writeEvent(Events.EVENT_SETTINGS_CLICK);
Intent intent = new Intent(Settings.Panel.ACTION_VOLUME);
dismissH(DISMISS_REASON_SETTINGS_CLICKED);
+ Dependency.get(MediaOutputDialogFactory.class).dismiss();
Dependency.get(ActivityStarter.class).startActivity(intent,
true /* dismissShade */);
});
diff --git a/packages/SystemUI/tests/AndroidManifest.xml b/packages/SystemUI/tests/AndroidManifest.xml
index db87845..2b4ed4e 100644
--- a/packages/SystemUI/tests/AndroidManifest.xml
+++ b/packages/SystemUI/tests/AndroidManifest.xml
@@ -82,6 +82,10 @@
<activity android:name="com.android.systemui.screenshot.ScrollViewActivity"
android:exported="false" />
+
+ <activity android:name="com.android.systemui.screenshot.RecyclerViewActivity"
+ android:exported="false" />
+
<provider
android:name="androidx.lifecycle.ProcessLifecycleOwnerInitializer"
tools:replace="android:authorities"
diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationModeSwitchTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationModeSwitchTest.java
index 0a51b26..3c248c7 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationModeSwitchTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationModeSwitchTest.java
@@ -24,6 +24,7 @@
import static android.view.MotionEvent.ACTION_UP;
import static android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction.ACTION_CLICK;
+import static com.android.systemui.accessibility.MagnificationModeSwitch.FADING_ANIMATION_DURATION_MS;
import static com.android.systemui.accessibility.MagnificationModeSwitch.getIconResId;
import static junit.framework.Assert.assertEquals;
@@ -35,7 +36,6 @@
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doAnswer;
-import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -69,6 +69,9 @@
@RunWith(AndroidTestingRunner.class)
public class MagnificationModeSwitchTest extends SysuiTestCase {
+ private static final float FADE_IN_ALPHA = 1f;
+ private static final float FADE_OUT_ALPHA = 0f;
+
private ImageView mSpyImageView;
@Mock
private WindowManager mWindowManager;
@@ -87,49 +90,47 @@
).when(mWindowManager).getMaximumWindowMetrics();
mContext.addMockSystemService(Context.WINDOW_SERVICE, mWindowManager);
mSpyImageView = Mockito.spy(new ImageView(mContext));
- doAnswer(invocation -> null).when(mSpyImageView).setOnTouchListener(
- mTouchListenerCaptor.capture());
- initMockImageViewAndAnimator();
+ resetMockImageViewAndAnimator();
mMagnificationModeSwitch = new MagnificationModeSwitch(mContext, mSpyImageView);
}
@Test
- public void removeButton_removeView() {
+ public void removeButton_buttonIsShowing_removeView() {
mMagnificationModeSwitch.showButton(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW);
mMagnificationModeSwitch.removeButton();
verify(mWindowManager).removeView(mSpyImageView);
- // First invocation is in showButton.
- verify(mViewPropertyAnimator, times(2)).cancel();
+ verify(mViewPropertyAnimator).cancel();
}
@Test
public void showWindowModeButton_fullscreenMode_addViewAndSetImageResource() {
mMagnificationModeSwitch.showButton(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW);
-
- verify(mSpyImageView).setAlpha(1.0f);
verify(mSpyImageView).setImageResource(
getIconResId(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW));
- assertShowButtonAnimation();
+ assertShowFadingAnimation(FADE_IN_ALPHA);
+ assertShowFadingAnimation(FADE_OUT_ALPHA);
+
ArgumentCaptor<Runnable> captor = ArgumentCaptor.forClass(Runnable.class);
verify(mViewPropertyAnimator).withEndAction(captor.capture());
verify(mWindowManager).addView(eq(mSpyImageView), any(WindowManager.LayoutParams.class));
captor.getValue().run();
- // First invocation is in showButton.
- verify(mViewPropertyAnimator, times(2)).cancel();
+ verify(mViewPropertyAnimator).cancel();
verify(mWindowManager).removeView(mSpyImageView);
}
@Test
- public void onConfigurationChanged_setImageResource() {
+ public void onConfigurationChanged_buttonIsShowing_setImageResource() {
mMagnificationModeSwitch.showButton(ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN);
+ resetMockImageViewAndAnimator();
+
mMagnificationModeSwitch.onConfigurationChanged(ActivityInfo.CONFIG_DENSITY);
- verify(mSpyImageView, times(2)).setImageResource(
+ verify(mSpyImageView).setImageResource(
getIconResId(ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN));
}
@@ -162,7 +163,6 @@
Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE, 0);
listener.onTouch(mSpyImageView, MotionEvent.obtain(
0, 0, ACTION_DOWN, 100, 100, 0));
- verify(mSpyImageView).setAlpha(1.0f);
verify(mViewPropertyAnimator).cancel();
listener.onTouch(mSpyImageView, MotionEvent.obtain(
@@ -173,9 +173,8 @@
resetMockImageViewAndAnimator();
listener.onTouch(mSpyImageView, MotionEvent.obtain(
0, ViewConfiguration.getTapTimeout() + 10, ACTION_UP, 100 + offset, 100, 0));
- verify(mSpyImageView).setAlpha(1.0f);
assertModeUnchanged(previousMode);
- assertShowButtonAnimation();
+ assertShowFadingAnimation(FADE_OUT_ALPHA);
}
@Test
@@ -193,9 +192,8 @@
resetMockImageViewAndAnimator();
listener.onTouch(mSpyImageView, MotionEvent.obtain(
0, ViewConfiguration.getTapTimeout(), ACTION_CANCEL, 100, 100, 0));
- verify(mSpyImageView).setAlpha(1.0f);
assertModeUnchanged(previousMode);
- assertShowButtonAnimation();
+ assertShowFadingAnimation(FADE_OUT_ALPHA);
}
@Test
@@ -216,9 +214,8 @@
resetMockImageViewAndAnimator();
listener.onTouch(mSpyImageView, MotionEvent.obtain(
0, ViewConfiguration.getTapTimeout(), ACTION_CANCEL, 100 + offset, 100, 0));
- verify(mSpyImageView).setAlpha(1.0f);
assertModeUnchanged(previousMode);
- assertShowButtonAnimation();
+ assertShowFadingAnimation(FADE_OUT_ALPHA);
}
@Test
@@ -249,37 +246,55 @@
verifyTapAction(ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN);
}
+ @Test
+ public void showButton_showFadeOutAnimation_fadeOutAnimationCanceled() {
+ mMagnificationModeSwitch.showButton(ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN);
+ assertShowFadingAnimation(FADE_OUT_ALPHA);
+ resetMockImageViewAndAnimator();
+
+ mMagnificationModeSwitch.showButton(ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN);
+
+ verify(mViewPropertyAnimator).cancel();
+ assertEquals(1f, mSpyImageView.getAlpha());
+ assertShowFadingAnimation(FADE_OUT_ALPHA);
+ }
+
private void assertModeUnchanged(int expectedMode) {
final int actualMode = Settings.Secure.getInt(mContext.getContentResolver(),
Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE, 0);
assertEquals(expectedMode, actualMode);
}
- private void assertShowButtonAnimation() {
- verify(mViewPropertyAnimator).cancel();
- verify(mViewPropertyAnimator).setDuration(anyLong());
- verify(mViewPropertyAnimator).alpha(anyFloat());
+ private void assertShowFadingAnimation(float alpha) {
+ ArgumentCaptor<Runnable> runnableCaptor = ArgumentCaptor.forClass(Runnable.class);
+ if (alpha == FADE_IN_ALPHA) { // Fade-in
+ verify(mSpyImageView).postOnAnimation(runnableCaptor.capture());
+ } else { // Fade-out
+ verify(mSpyImageView).postOnAnimationDelayed(runnableCaptor.capture(), anyLong());
+ }
+ resetMockAnimator();
+
+ runnableCaptor.getValue().run();
+
+ verify(mViewPropertyAnimator).setDuration(eq(FADING_ANIMATION_DURATION_MS));
+ verify(mViewPropertyAnimator).alpha(alpha);
verify(mViewPropertyAnimator).start();
}
- private void initMockImageViewAndAnimator() {
+ private void resetMockImageViewAndAnimator() {
+ Mockito.reset(mSpyImageView);
+ doAnswer(invocation -> null).when(mSpyImageView).setOnTouchListener(
+ mTouchListenerCaptor.capture());
+ resetMockAnimator();
+ }
+
+ private void resetMockAnimator() {
+ Mockito.reset(mViewPropertyAnimator);
when(mViewPropertyAnimator.setDuration(anyLong())).thenReturn(mViewPropertyAnimator);
when(mViewPropertyAnimator.alpha(anyFloat())).thenReturn(mViewPropertyAnimator);
when(mViewPropertyAnimator.withEndAction(any(Runnable.class))).thenReturn(
mViewPropertyAnimator);
-
when(mSpyImageView.animate()).thenReturn(mViewPropertyAnimator);
- doAnswer(invocation -> {
- Runnable run = invocation.getArgument(0);
- run.run();
- return null;
- }).when(mSpyImageView).postDelayed(any(), anyLong());
- }
-
- private void resetMockImageViewAndAnimator() {
- Mockito.reset(mViewPropertyAnimator);
- Mockito.reset(mSpyImageView);
- initMockImageViewAndAnimator();
}
/**
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt
index 81139f19..182a056 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt
@@ -38,6 +38,7 @@
import androidx.lifecycle.LiveData
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
+import com.android.systemui.media.dialog.MediaOutputDialogFactory
import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.statusbar.phone.KeyguardDismissUtil
import com.android.systemui.util.animation.TransitionLayout
@@ -92,6 +93,7 @@
@Mock private lateinit var mediaDataManager: MediaDataManager
@Mock private lateinit var expandedSet: ConstraintSet
@Mock private lateinit var collapsedSet: ConstraintSet
+ @Mock private lateinit var mediaOutputDialogFactory: MediaOutputDialogFactory
private lateinit var appIcon: ImageView
private lateinit var appName: TextView
private lateinit var albumView: ImageView
@@ -126,7 +128,8 @@
whenever(mediaViewController.collapsedLayout).thenReturn(collapsedSet)
player = MediaControlPanel(context, bgExecutor, activityStarter, mediaViewController,
- seekBarViewModel, Lazy { mediaDataManager }, keyguardDismissUtil)
+ seekBarViewModel, Lazy { mediaDataManager }, keyguardDismissUtil,
+ mediaOutputDialogFactory)
whenever(seekBarViewModel.progress).thenReturn(seekBarData)
// Mock out a view holder for the player to attach to.
diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenshot/RecyclerViewActivity.java b/packages/SystemUI/tests/src/com/android/systemui/screenshot/RecyclerViewActivity.java
new file mode 100644
index 0000000..fde56ba
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/screenshot/RecyclerViewActivity.java
@@ -0,0 +1,80 @@
+/*
+ * 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.systemui.screenshot;
+
+import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
+
+import android.app.Activity;
+import android.graphics.Color;
+import android.os.Bundle;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import androidx.annotation.Nullable;
+
+import com.android.internal.widget.LinearLayoutManager;
+import com.android.internal.widget.RecyclerView;
+import com.android.internal.widget.RecyclerView.LayoutParams;
+
+import java.util.Random;
+
+public class RecyclerViewActivity extends Activity {
+ public static final int CHILD_VIEW_HEIGHT = 300;
+ private static final int CHILD_VIEWS = 12;
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ RecyclerView recyclerView = new RecyclerView(this);
+ recyclerView.setLayoutManager(new LinearLayoutManager(this));
+ recyclerView.setAdapter(new TestAdapter());
+ recyclerView.setLayoutParams(new LayoutParams(MATCH_PARENT, MATCH_PARENT));
+ setContentView(recyclerView);
+ }
+
+ static final class TestViewHolder extends RecyclerView.ViewHolder {
+ TestViewHolder(View itemView) {
+ super(itemView);
+ }
+ }
+
+ static final class TestAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
+ private final Random mRandom = new Random();
+
+ @Override
+ public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+ return new TestViewHolder(new TextView(parent.getContext()));
+ }
+
+ @Override
+ public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
+ TextView view = (TextView) holder.itemView;
+ view.setText("Child #" + position);
+ view.setTextColor(Color.WHITE);
+ view.setTextSize(30f);
+ view.setBackgroundColor(
+ Color.rgb(mRandom.nextFloat(), mRandom.nextFloat(), mRandom.nextFloat()));
+ view.setMinHeight(CHILD_VIEW_HEIGHT);
+ }
+
+ @Override
+ public int getItemCount() {
+ return CHILD_VIEWS;
+ }
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java
index 3e1616c..d04d8ee 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java
@@ -21,6 +21,8 @@
import static com.android.systemui.statusbar.notification.NotificationEntryManager.UNDEFINED_DISMISS_REASON;
+import static com.google.common.truth.Truth.assertThat;
+
import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertNull;
import static junit.framework.Assert.assertTrue;
@@ -346,7 +348,7 @@
setSmartActions(mEntry.getKey(), null);
mEntryManager.updateNotificationRanking(mRankingMap);
- assertNull(mEntry.getSmartActions());
+ assertThat(mEntry.getSmartActions()).isEmpty();
}
@Test
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index dbc77d8..9afda8c 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -12127,6 +12127,7 @@
app.setHasClientActivities(false);
mServices.killServicesLocked(app, allowRestart);
+ mPhantomProcessList.onAppDied(app.pid);
boolean restart = false;
diff --git a/services/core/java/com/android/server/am/PhantomProcessList.java b/services/core/java/com/android/server/am/PhantomProcessList.java
index e2fcf08..5167c57 100644
--- a/services/core/java/com/android/server/am/PhantomProcessList.java
+++ b/services/core/java/com/android/server/am/PhantomProcessList.java
@@ -27,15 +27,22 @@
import android.app.ApplicationExitInfo.SubReason;
import android.os.Handler;
import android.os.Process;
+import android.os.StrictMode;
import android.util.Slog;
import android.util.SparseArray;
import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.os.ProcStatsUtil;
import com.android.internal.os.ProcessCpuTracker;
import libcore.io.IoUtils;
import java.io.FileDescriptor;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collections;
@@ -78,18 +85,178 @@
@GuardedBy("mLock")
private final ArrayList<PhantomProcessRecord> mTempPhantomProcesses = new ArrayList<>();
+ /**
+ * The mapping between a phantom process ID to its parent process (an app process)
+ */
+ @GuardedBy("mLock")
+ private final SparseArray<ProcessRecord> mPhantomToAppProcessMap = new SparseArray<>();
+
+ @GuardedBy("mLock")
+ private final SparseArray<InputStream> mCgroupProcsFds = new SparseArray<>();
+
+ @GuardedBy("mLock")
+ private final byte[] mDataBuffer = new byte[4096];
+
@GuardedBy("mLock")
private boolean mTrimPhantomProcessScheduled = false;
@GuardedBy("mLock")
int mUpdateSeq;
+ @VisibleForTesting
+ Injector mInjector;
+
private final ActivityManagerService mService;
private final Handler mKillHandler;
PhantomProcessList(final ActivityManagerService service) {
mService = service;
mKillHandler = service.mProcessList.sKillHandler;
+ mInjector = new Injector();
+ }
+
+ @VisibleForTesting
+ @GuardedBy("mLock")
+ void lookForPhantomProcessesLocked() {
+ mPhantomToAppProcessMap.clear();
+ StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads();
+ try {
+ synchronized (mService.mPidsSelfLocked) {
+ for (int i = mService.mPidsSelfLocked.size() - 1; i >= 0; i--) {
+ final ProcessRecord app = mService.mPidsSelfLocked.valueAt(i);
+ lookForPhantomProcessesLocked(app);
+ }
+ }
+ } finally {
+ StrictMode.setThreadPolicy(oldPolicy);
+ }
+ }
+
+ @GuardedBy({"mLock", "mService.mPidsSelfLocked"})
+ private void lookForPhantomProcessesLocked(ProcessRecord app) {
+ if (app.appZygote || app.killed || app.killedByAm) {
+ // process forked from app zygote doesn't have its own acct entry
+ return;
+ }
+ InputStream input = mCgroupProcsFds.get(app.pid);
+ if (input == null) {
+ final String path = getCgroupFilePath(app.info.uid, app.pid);
+ try {
+ input = mInjector.openCgroupProcs(path);
+ } catch (FileNotFoundException | SecurityException e) {
+ if (DEBUG_PROCESSES) {
+ Slog.w(TAG, "Unable to open " + path, e);
+ }
+ return;
+ }
+ // Keep the FD open for better performance
+ mCgroupProcsFds.put(app.pid, input);
+ }
+ final byte[] buf = mDataBuffer;
+ try {
+ int read = 0;
+ int pid = 0;
+ long totalRead = 0;
+ do {
+ read = mInjector.readCgroupProcs(input, buf, 0, buf.length);
+ if (read == -1) {
+ break;
+ }
+ totalRead += read;
+ for (int i = 0; i < read; i++) {
+ final byte b = buf[i];
+ if (b == '\n') {
+ addChildPidLocked(app, pid);
+ pid = 0;
+ } else {
+ pid = pid * 10 + (b - '0');
+ }
+ }
+ if (read < buf.length) {
+ // we may break from here safely as sysfs reading should return the whole page
+ // if the remaining data is larger than a page
+ break;
+ }
+ } while (true);
+ if (pid != 0) {
+ addChildPidLocked(app, pid);
+ }
+ // rewind the fd for the next read
+ input.skip(-totalRead);
+ } catch (IOException e) {
+ Slog.e(TAG, "Error in reading cgroup procs from " + app, e);
+ IoUtils.closeQuietly(input);
+ mCgroupProcsFds.delete(app.pid);
+ }
+ }
+
+ @VisibleForTesting
+ static String getCgroupFilePath(int uid, int pid) {
+ return "/acct/uid_" + uid + "/pid_" + pid + "/cgroup.procs";
+ }
+
+ static String getProcessName(int pid) {
+ String procName = ProcStatsUtil.readTerminatedProcFile(
+ "/proc/" + pid + "/cmdline", (byte) '\0');
+ if (procName == null) {
+ return null;
+ }
+ int l = procName.lastIndexOf('/');
+ if (l > 0 && l < procName.length() - 1) {
+ procName = procName.substring(l + 1);
+ }
+ return procName;
+ }
+
+ @GuardedBy({"mLock", "mService.mPidsSelfLocked"})
+ private void addChildPidLocked(final ProcessRecord app, final int pid) {
+ if (app.pid != pid) {
+ // That's something else...
+ final ProcessRecord r = mService.mPidsSelfLocked.get(pid);
+ if (r != null) {
+ // Is this a process forked via app zygote?
+ if (!r.appZygote) {
+ // Unexpected...
+ if (DEBUG_PROCESSES) {
+ Slog.w(TAG, "Unexpected: " + r + " appears in the cgroup.procs of " + app);
+ }
+ } else {
+ // Just a child process of app zygote, no worries
+ }
+ } else {
+ final int index = mPhantomToAppProcessMap.indexOfKey(pid);
+ if (index >= 0) { // unlikely since we cleared the map at the beginning
+ final ProcessRecord current = mPhantomToAppProcessMap.valueAt(index);
+ if (app == current) {
+ // Okay it's unchanged
+ return;
+ }
+ mPhantomToAppProcessMap.setValueAt(index, app);
+ } else {
+ mPhantomToAppProcessMap.put(pid, app);
+ }
+ // Its UID isn't necessarily to be the same as the app.info.uid, since it could be
+ // forked from child processes of app zygote
+ final int uid = Process.getUidForPid(pid);
+ String procName = mInjector.getProcessName(pid);
+ if (procName == null || uid < 0) {
+ mPhantomToAppProcessMap.delete(pid);
+ return;
+ }
+ getOrCreatePhantomProcessIfNeededLocked(procName, uid, pid, true);
+ }
+ }
+ }
+
+ void onAppDied(final int pid) {
+ synchronized (mLock) {
+ final int index = mCgroupProcsFds.indexOfKey(pid);
+ if (index >= 0) {
+ final InputStream inputStream = mCgroupProcsFds.valueAt(index);
+ mCgroupProcsFds.removeAt(index);
+ IoUtils.closeQuietly(inputStream);
+ }
+ }
}
/**
@@ -99,7 +266,7 @@
*/
@GuardedBy("mLock")
PhantomProcessRecord getOrCreatePhantomProcessIfNeededLocked(final String processName,
- final int uid, final int pid) {
+ final int uid, final int pid, boolean createIfNeeded) {
// First check if it's actually an app process we know
if (isAppProcess(pid)) {
return null;
@@ -123,56 +290,47 @@
if (proc.equals(processName, uid, pid)) {
return proc;
}
- // Our zombie process information is outdated, let's remove this one, it shoud
+ // Our zombie process information is outdated, let's remove this one, it should
// have been gone.
mZombiePhantomProcesses.removeAt(idx);
}
}
- int ppid = getParentPid(pid);
+ if (!createIfNeeded) {
+ return null;
+ }
- // Walk through its parents and see if it could be traced back to an app process.
- while (ppid > 1) {
- if (isAppProcess(ppid)) {
- // It's a phantom process, bookkeep it
- try {
- final PhantomProcessRecord proc = new PhantomProcessRecord(
- processName, uid, pid, ppid, mService,
- this::onPhantomProcessKilledLocked);
- proc.mUpdateSeq = mUpdateSeq;
- mPhantomProcesses.put(pid, proc);
- SparseArray<PhantomProcessRecord> array = mAppPhantomProcessMap.get(ppid);
- if (array == null) {
- array = new SparseArray<>();
- mAppPhantomProcessMap.put(ppid, array);
- }
- array.put(pid, proc);
- if (proc.mPidFd != null) {
- mKillHandler.getLooper().getQueue().addOnFileDescriptorEventListener(
- proc.mPidFd, EVENT_INPUT | EVENT_ERROR,
- this::onPhantomProcessFdEvent);
- mPhantomProcessesPidFds.put(proc.mPidFd.getInt$(), proc);
- }
- scheduleTrimPhantomProcessesLocked();
- return proc;
- } catch (IllegalStateException e) {
- return null;
+ final ProcessRecord r = mPhantomToAppProcessMap.get(pid);
+
+ if (r != null) {
+ // It's a phantom process, bookkeep it
+ try {
+ final PhantomProcessRecord proc = new PhantomProcessRecord(
+ processName, uid, pid, r.pid, mService,
+ this::onPhantomProcessKilledLocked);
+ proc.mUpdateSeq = mUpdateSeq;
+ mPhantomProcesses.put(pid, proc);
+ SparseArray<PhantomProcessRecord> array = mAppPhantomProcessMap.get(r.pid);
+ if (array == null) {
+ array = new SparseArray<>();
+ mAppPhantomProcessMap.put(r.pid, array);
}
+ array.put(pid, proc);
+ if (proc.mPidFd != null) {
+ mKillHandler.getLooper().getQueue().addOnFileDescriptorEventListener(
+ proc.mPidFd, EVENT_INPUT | EVENT_ERROR,
+ this::onPhantomProcessFdEvent);
+ mPhantomProcessesPidFds.put(proc.mPidFd.getInt$(), proc);
+ }
+ scheduleTrimPhantomProcessesLocked();
+ return proc;
+ } catch (IllegalStateException e) {
+ return null;
}
-
- ppid = getParentPid(ppid);
}
return null;
}
- private static int getParentPid(int pid) {
- try {
- return Process.getParentPid(pid);
- } catch (Exception e) {
- }
- return -1;
- }
-
private boolean isAppProcess(int pid) {
synchronized (mService.mPidsSelfLocked) {
return mService.mPidsSelfLocked.get(pid) != null;
@@ -346,10 +504,14 @@
synchronized (mLock) {
// refresh the phantom process list with the latest cpu stats results.
mUpdateSeq++;
+
+ // Scan app process's accounting procs
+ lookForPhantomProcessesLocked();
+
for (int i = tracker.countStats() - 1; i >= 0; i--) {
final ProcessCpuTracker.Stats st = tracker.getStats(i);
final PhantomProcessRecord r =
- getOrCreatePhantomProcessIfNeededLocked(st.name, st.uid, st.pid);
+ getOrCreatePhantomProcessIfNeededLocked(st.name, st.uid, st.pid, false);
if (r != null) {
r.mUpdateSeq = mUpdateSeq;
r.mCurrentCputime += st.rel_utime + st.rel_stime;
@@ -392,4 +554,19 @@
proc.dump(pw, prefix + " ");
}
}
+
+ @VisibleForTesting
+ static class Injector {
+ InputStream openCgroupProcs(String path) throws FileNotFoundException, SecurityException {
+ return new FileInputStream(path);
+ }
+
+ int readCgroupProcs(InputStream input, byte[] buf, int offset, int len) throws IOException {
+ return input.read(buf, offset, len);
+ }
+
+ String getProcessName(final int pid) {
+ return PhantomProcessList.getProcessName(pid);
+ }
+ }
}
diff --git a/services/core/java/com/android/server/biometrics/HardwareAuthTokenUtils.java b/services/core/java/com/android/server/biometrics/HardwareAuthTokenUtils.java
new file mode 100644
index 0000000..eff4da3
--- /dev/null
+++ b/services/core/java/com/android/server/biometrics/HardwareAuthTokenUtils.java
@@ -0,0 +1,138 @@
+/*
+ * 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.biometrics;
+
+import static java.nio.ByteOrder.LITTLE_ENDIAN;
+
+import android.hardware.keymaster.HardwareAuthToken;
+import android.hardware.keymaster.Timestamp;
+
+import java.nio.ByteOrder;
+
+/**
+ * Utilities for converting between old and new HardwareAuthToken types. See
+ * {@link HardwareAuthToken}.
+ */
+public class HardwareAuthTokenUtils {
+ public static byte[] toByteArray(HardwareAuthToken hat) {
+ final byte[] array = new byte[69];
+
+ // Version, first byte. Used in hw_auth_token.h but not HardwareAuthToken
+ array[0] = 0;
+
+ // Challenge, 1:8.
+ writeLong(hat.challenge, array, 1 /* offset */);
+
+ // UserId, 9:16.
+ writeLong(hat.userId, array, 9 /* offset */);
+
+ // AuthenticatorId, 17:24.
+ writeLong(hat.authenticatorId, array, 17 /* offset */);
+
+ // AuthenticatorType, 25:28.
+ writeInt(flipIfNativelyLittle(hat.authenticatorType), array, 25 /* offset */);
+
+ // Timestamp, 29:36.
+ writeLong(flipIfNativelyLittle(hat.timestamp.milliSeconds), array, 29 /* offset */);
+
+ // MAC, 37:69. Byte array.
+ System.arraycopy(hat.mac, 0 /* srcPos */, array, 37 /* destPos */, hat.mac.length);
+
+ return array;
+ }
+
+ public static HardwareAuthToken toHardwareAuthToken(byte[] array) {
+ final HardwareAuthToken hardwareAuthToken = new HardwareAuthToken();
+
+ // First byte is version, which doesn't not exist in HardwareAuthToken anymore
+ // Next 8 bytes is the challenge.
+ hardwareAuthToken.challenge = getLong(array, 1 /* offset */);
+
+ // Next 8 bytes is the userId
+ hardwareAuthToken.userId = getLong(array, 9 /* offset */);
+
+ // Next 8 bytes is the authenticatorId.
+ hardwareAuthToken.authenticatorId = getLong(array, 17 /* offset */);
+
+ // Next 4 bytes is the authenticatorType.
+ hardwareAuthToken.authenticatorType = flipIfNativelyLittle(getInt(array, 25 /* offset */));
+
+ // Next 8 bytes is the timestamp.
+ final Timestamp timestamp = new Timestamp();
+ timestamp.milliSeconds = flipIfNativelyLittle(getLong(array, 29 /* offset */));
+ hardwareAuthToken.timestamp = timestamp;
+
+ // Last 32 bytes is the mac, 37:69
+ hardwareAuthToken.mac = new byte[32];
+ System.arraycopy(array, 37 /* srcPos */,
+ hardwareAuthToken.mac,
+ 0 /* destPos */,
+ 32 /* length */);
+
+ return hardwareAuthToken;
+ }
+
+ private static long flipIfNativelyLittle(long l) {
+ if (LITTLE_ENDIAN == ByteOrder.nativeOrder()) {
+ return Long.reverseBytes(l);
+ }
+ return l;
+ }
+
+ private static int flipIfNativelyLittle(int i) {
+ if (LITTLE_ENDIAN == ByteOrder.nativeOrder()) {
+ return Integer.reverseBytes(i);
+ }
+ return i;
+ }
+
+ private static void writeLong(long l, byte[] dest, int offset) {
+ dest[offset + 0] = (byte) l;
+ dest[offset + 1] = (byte) (l >> 8);
+ dest[offset + 2] = (byte) (l >> 16);
+ dest[offset + 3] = (byte) (l >> 24);
+ dest[offset + 4] = (byte) (l >> 32);
+ dest[offset + 5] = (byte) (l >> 40);
+ dest[offset + 6] = (byte) (l >> 48);
+ dest[offset + 7] = (byte) (l >> 56);
+ }
+
+ private static void writeInt(int i, byte[] dest, int offset) {
+ dest[offset + 0] = (byte) i;
+ dest[offset + 1] = (byte) (i >> 8);
+ dest[offset + 2] = (byte) (i >> 16);
+ dest[offset + 3] = (byte) (i >> 24);
+ }
+
+ private static long getLong(byte[] array, int offset) {
+ long result = 0;
+ // Lowest bit is LSB
+ for (int i = 0; i < 8; i++) {
+ result += (long) ((array[i + offset] & 0xffL) << (8 * i));
+ }
+ return result;
+ }
+
+ private static int getInt(byte[] array, int offset) {
+ int result = 0;
+ // Lowest bit is LSB
+ for (int i = 0; i < 4; i++) {
+ result += (int) (((int) array[i + offset] & 0xff) << (8 * i));
+ }
+ return result;
+ }
+}
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java
index 165755a..105fcec 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java
@@ -20,6 +20,7 @@
import static android.Manifest.permission.MANAGE_BIOMETRIC;
import static android.Manifest.permission.MANAGE_FINGERPRINT;
import static android.Manifest.permission.RESET_FINGERPRINT_LOCKOUT;
+import static android.Manifest.permission.TEST_BIOMETRIC;
import static android.Manifest.permission.USE_BIOMETRIC;
import static android.Manifest.permission.USE_BIOMETRIC_INTERNAL;
import static android.Manifest.permission.USE_FINGERPRINT;
@@ -34,6 +35,8 @@
import android.hardware.biometrics.IBiometricServiceLockoutResetCallback;
import android.hardware.biometrics.fingerprint.IFingerprint;
import android.hardware.biometrics.fingerprint.SensorProps;
+import android.hardware.biometrics.ITestService;
+import android.hardware.biometrics.SensorPropertiesInternal;
import android.hardware.fingerprint.Fingerprint;
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
import android.hardware.fingerprint.IFingerprintClientActiveCallback;
@@ -88,11 +91,74 @@
private final GestureAvailabilityDispatcher mGestureAvailabilityDispatcher;
private final LockPatternUtils mLockPatternUtils;
@NonNull private List<ServiceProvider> mServiceProviders;
+ @Nullable private TestService mTestService;
+
+ private final class TestService extends ITestService.Stub {
+
+ @Override
+ public List<SensorPropertiesInternal> getSensorPropertiesInternal(
+ String opPackageName) {
+ Utils.checkPermission(getContext(), TEST_BIOMETRIC);
+ return null;
+ }
+
+ @Override
+ public void enableTestHal(int sensorId, boolean enableTestHal) {
+ Utils.checkPermission(getContext(), TEST_BIOMETRIC);
+ }
+
+ @Override
+ public void enrollStart(int sensorId, int userId) {
+ Utils.checkPermission(getContext(), TEST_BIOMETRIC);
+ }
+
+ @Override
+ public void enrollFinish(int sensorId, int userId) {
+ Utils.checkPermission(getContext(), TEST_BIOMETRIC);
+ }
+
+ @Override
+ public void authenticateSuccess(int sensorId, int userId) {
+ Utils.checkPermission(getContext(), TEST_BIOMETRIC);
+ }
+
+ @Override
+ public void authenticateReject(int sensorId, int userId) {
+ Utils.checkPermission(getContext(), TEST_BIOMETRIC);
+ }
+
+ @Override
+ public void notifyAcquired(int sensorId, int userId) {
+ Utils.checkPermission(getContext(), TEST_BIOMETRIC);
+ }
+
+ @Override
+ public void notifyError(int sensorId, int userId) {
+ Utils.checkPermission(getContext(), TEST_BIOMETRIC);
+ }
+
+ @Override
+ public void internalCleanup(int sensorId, int userId) {
+ Utils.checkPermission(getContext(), TEST_BIOMETRIC);
+ }
+ }
/**
* Receives the incoming binder calls from FingerprintManager.
*/
private final class FingerprintServiceWrapper extends IFingerprintService.Stub {
+ @Override
+ public ITestService getTestService(String opPackageName) {
+ Utils.checkPermission(getContext(), TEST_BIOMETRIC);
+
+ synchronized (this) {
+ if (mTestService == null) {
+ mTestService = new TestService();
+ }
+ }
+ return mTestService;
+ }
+
@Override // Binder call
public List<FingerprintSensorPropertiesInternal> getSensorPropertiesInternal(
String opPackageName) {
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClient.java
index f91a119..33f5418 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClient.java
@@ -29,6 +29,7 @@
import android.os.RemoteException;
import android.util.Slog;
+import com.android.server.biometrics.HardwareAuthTokenUtils;
import com.android.server.biometrics.sensors.BiometricUtils;
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
import com.android.server.biometrics.sensors.EnrollClient;
@@ -82,8 +83,8 @@
protected void startHalOperation() {
UdfpsHelper.showUdfpsOverlay(getSensorId(), mUdfpsOverlayController);
try {
- // TODO(b/170163175): Need a way to convert byte arrays to HardwareAuthToken
- getFreshDaemon().enroll(mSequentialId, null /* hat */);
+ getFreshDaemon().enroll(mSequentialId,
+ HardwareAuthTokenUtils.toHardwareAuthToken(mHardwareAuthToken));
} catch (RemoteException e) {
Slog.e(TAG, "Remote exception when requesting enroll", e);
onError(BiometricFaceConstants.FACE_ERROR_UNABLE_TO_PROCESS, 0 /* vendorCode */);
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java
index 6245fd9..44a23cf 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java
@@ -79,8 +79,8 @@
prop.commonProps.maxEnrollmentsPerUser,
prop.sensorType,
true /* resetLockoutRequiresHardwareAuthToken */);
- final Sensor sensor = new Sensor(getTag() + "/" + sensorId, internalProp,
- gestureAvailabilityDispatcher);
+ final Sensor sensor = new Sensor(getTag() + "/" + sensorId, mContext, mHandler,
+ internalProp, gestureAvailabilityDispatcher);
mSensors.put(sensorId, sensor);
Slog.d(getTag(), "Added: " + internalProp);
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java
index 4151f5a..3c27f9c 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java
@@ -18,24 +18,40 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.content.Context;
+import android.hardware.biometrics.fingerprint.Error;
import android.hardware.biometrics.fingerprint.IFingerprint;
import android.hardware.biometrics.fingerprint.ISession;
import android.hardware.biometrics.fingerprint.ISessionCallback;
+import android.hardware.fingerprint.Fingerprint;
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
import android.hardware.keymaster.HardwareAuthToken;
+import android.os.Handler;
import android.os.RemoteException;
import android.util.Slog;
+import com.android.server.biometrics.HardwareAuthTokenUtils;
+import com.android.server.biometrics.Utils;
+import com.android.server.biometrics.sensors.AcquisitionClient;
+import com.android.server.biometrics.sensors.AuthenticationConsumer;
import com.android.server.biometrics.sensors.BiometricScheduler;
import com.android.server.biometrics.sensors.ClientMonitor;
+import com.android.server.biometrics.sensors.Interruptable;
+import com.android.server.biometrics.sensors.fingerprint.FingerprintUtils;
import com.android.server.biometrics.sensors.fingerprint.GestureAvailabilityDispatcher;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
/**
* Maintains the state of a single sensor within an instance of the
* {@link android.hardware.biometrics.fingerprint.IFingerprint} HAL.
*/
class Sensor {
@NonNull private final String mTag;
+ @NonNull private final Context mContext;
+ @NonNull private final Handler mHandler;
@NonNull private final FingerprintSensorPropertiesInternal mSensorProperties;
@NonNull private final BiometricScheduler mScheduler;
@@ -58,10 +74,12 @@
}
}
- Sensor(@NonNull String tag,
+ Sensor(@NonNull String tag, @NonNull Context context, @NonNull Handler handler,
@NonNull FingerprintSensorPropertiesInternal sensorProperties,
@NonNull GestureAvailabilityDispatcher gestureAvailabilityDispatcher) {
mTag = tag;
+ mContext = context;
+ mHandler = handler;
mSensorProperties = sensorProperties;
mScheduler = new BiometricScheduler(tag, gestureAvailabilityDispatcher);
mLazySession = () -> mCurrentSession != null ? mCurrentSession.mSession : null;
@@ -89,27 +107,102 @@
@Override
public void onAcquired(byte info, int vendorCode) {
+ mHandler.post(() -> {
+ final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ if (!(client instanceof AcquisitionClient)) {
+ Slog.e(mTag, "onAcquired for non-acquisition client: "
+ + Utils.getClientName(client));
+ return;
+ }
+ final AcquisitionClient<?> acquisitionClient = (AcquisitionClient<?>) client;
+ acquisitionClient.onAcquired(info, vendorCode);
+ });
}
@Override
public void onError(byte error, int vendorCode) {
+ mHandler.post(() -> {
+ final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ Slog.d(mTag, "onError"
+ + ", client: " + Utils.getClientName(client)
+ + ", error: " + error
+ + ", vendorCode: " + vendorCode);
+ if (!(client instanceof Interruptable)) {
+ Slog.e(mTag, "onError for non-error consumer: "
+ + Utils.getClientName(client));
+ return;
+ }
+ final Interruptable interruptable = (Interruptable) client;
+ interruptable.onError(error, vendorCode);
+
+ if (error == Error.HW_UNAVAILABLE) {
+ Slog.e(mTag, "Got ERROR_HW_UNAVAILABLE");
+ mCurrentSession = null;
+ }
+ });
}
@Override
public void onEnrollmentProgress(int enrollmentId, int remaining) {
+ mHandler.post(() -> {
+ final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ if (!(client instanceof FingerprintEnrollClient)) {
+ Slog.e(mTag, "onEnrollmentProgress for non-enroll client: "
+ + Utils.getClientName(client));
+ return;
+ }
+ final int currentUserId = client.getTargetUserId();
+ final CharSequence name = FingerprintUtils.getInstance()
+ .getUniqueName(mContext, currentUserId);
+ final Fingerprint fingerprint = new Fingerprint(name, enrollmentId, sensorId);
+
+ final FingerprintEnrollClient enrollClient = (FingerprintEnrollClient) client;
+ enrollClient.onEnrollResult(fingerprint, remaining);
+ });
}
@Override
public void onAuthenticationSucceeded(int enrollmentId, HardwareAuthToken hat) {
+ mHandler.post(() -> {
+ final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ if (!(client instanceof AuthenticationConsumer)) {
+ Slog.e(mTag, "onAuthenticationSucceeded for non-authentication consumer: "
+ + Utils.getClientName(client));
+ return;
+ }
+ final AuthenticationConsumer authenticationConsumer =
+ (AuthenticationConsumer) client;
+ final Fingerprint fp = new Fingerprint("", enrollmentId, sensorId);
+ final byte[] byteArray = HardwareAuthTokenUtils.toByteArray(hat);
+ final ArrayList<Byte> byteList = new ArrayList<>();
+ for (byte b : byteArray) {
+ byteList.add(b);
+ }
+
+ authenticationConsumer.onAuthenticated(fp, true /* authenticated */, byteList);
+ });
}
@Override
public void onAuthenticationFailed() {
+ mHandler.post(() -> {
+ final ClientMonitor<?> client = mScheduler.getCurrentClient();
+ if (!(client instanceof AuthenticationConsumer)) {
+ Slog.e(mTag, "onAuthenticationFailed for non-authentication consumer: "
+ + Utils.getClientName(client));
+ return;
+ }
+ final AuthenticationConsumer authenticationConsumer =
+ (AuthenticationConsumer) client;
+ final Fingerprint fp = new Fingerprint("", 0 /* enrollmentId */, sensorId);
+ authenticationConsumer
+ .onAuthenticated(fp, false /* authenticated */, null /* hat */);
+ });
}
@Override
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java
index 89d1d16..8ce99f4 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java
@@ -246,7 +246,7 @@
mHandler.post(() -> {
final ClientMonitor<?> client = mScheduler.getCurrentClient();
Slog.d(TAG, "handleError"
- + ", client: " + (client != null ? client.getOwnerString() : null)
+ + ", client: " + Utils.getClientName(client)
+ ", error: " + error
+ ", vendorCode: " + vendorCode);
if (!(client instanceof Interruptable)) {
diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java
index 09c01d7..1ed6b35 100644
--- a/services/core/java/com/android/server/connectivity/Vpn.java
+++ b/services/core/java/com/android/server/connectivity/Vpn.java
@@ -2152,7 +2152,11 @@
break;
}
- // Prepare arguments for mtpd.
+ // Prepare arguments for mtpd. MTU/MRU calculated conservatively. Only IPv4 supported
+ // because LegacyVpn.
+ // 1500 - 60 (Carrier-internal IPv6 + UDP + GTP) - 10 (PPP) - 16 (L2TP) - 8 (UDP)
+ // - 77 (IPsec w/ SHA-2 512, 256b trunc-len, AES-CBC) - 8 (UDP encap) - 20 (IPv4)
+ // - 28 (464xlat)
String[] mtpd = null;
switch (profile.type) {
case VpnProfile.TYPE_PPTP:
@@ -2160,7 +2164,7 @@
iface, "pptp", profile.server, "1723",
"name", profile.username, "password", profile.password,
"linkname", "vpn", "refuse-eap", "nodefaultroute",
- "usepeerdns", "idle", "1800", "mtu", "1400", "mru", "1400",
+ "usepeerdns", "idle", "1800", "mtu", "1270", "mru", "1270",
(profile.mppe ? "+mppe" : "nomppe"),
};
break;
@@ -2170,7 +2174,7 @@
iface, "l2tp", profile.server, "1701", profile.l2tpSecret,
"name", profile.username, "password", profile.password,
"linkname", "vpn", "refuse-eap", "nodefaultroute",
- "usepeerdns", "idle", "1800", "mtu", "1400", "mru", "1400",
+ "usepeerdns", "idle", "1800", "mtu", "1270", "mru", "1270",
};
break;
}
diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java
index af62aeb..ca94efc 100644
--- a/services/core/java/com/android/server/display/DisplayManagerService.java
+++ b/services/core/java/com/android/server/display/DisplayManagerService.java
@@ -1768,7 +1768,9 @@
final int callingUid = Binder.getCallingUid();
final long token = Binder.clearCallingIdentity();
try {
- return mLogicalDisplayMapper.getDisplayIdsLocked(callingUid);
+ synchronized (mSyncRoot) {
+ return mLogicalDisplayMapper.getDisplayIdsLocked(callingUid);
+ }
} finally {
Binder.restoreCallingIdentity(token);
}
diff --git a/services/core/java/com/android/server/location/LocationManagerService.java b/services/core/java/com/android/server/location/LocationManagerService.java
index f72fee6..cdb73d8 100644
--- a/services/core/java/com/android/server/location/LocationManagerService.java
+++ b/services/core/java/com/android/server/location/LocationManagerService.java
@@ -216,7 +216,7 @@
private final LocalService mLocalService;
private final GeofenceManager mGeofenceManager;
- @Nullable private volatile GnssManagerService mGnssManagerService = null;
+ private volatile @Nullable GnssManagerService mGnssManagerService = null;
private GeocoderProxy mGeocodeProvider;
@GuardedBy("mLock")
@@ -604,7 +604,8 @@
|| !request.getWorkSource().isEmpty();
if (usesSystemApi
&& isChangeEnabled(PREVENT_PENDING_INTENT_SYSTEM_API_USAGE, identity.getUid())) {
- throw new SecurityException("PendingIntent location requests may not use system APIs");
+ throw new SecurityException(
+ "PendingIntent location requests may not use system APIs: " + request);
}
request = validateLocationRequest(request, identity);
@@ -1091,19 +1092,6 @@
}
@Override
- @NonNull
- public List<LocationRequest> getTestProviderCurrentRequests(String provider) {
- mContext.enforceCallingOrSelfPermission(permission.READ_DEVICE_CONFIG, null);
-
- LocationProviderManager manager = getLocationProviderManager(provider);
- if (manager == null) {
- throw new IllegalArgumentException("provider doesn't exist: " + provider);
- }
-
- return manager.getMockProviderRequests();
- }
-
- @Override
public int handleShellCommand(ParcelFileDescriptor in, ParcelFileDescriptor out,
ParcelFileDescriptor err, String[] args) {
return new LocationShellCommand(this).exec(
diff --git a/services/core/java/com/android/server/location/LocationProviderManager.java b/services/core/java/com/android/server/location/LocationProviderManager.java
index 3b3c6f0..5206571 100644
--- a/services/core/java/com/android/server/location/LocationProviderManager.java
+++ b/services/core/java/com/android/server/location/LocationProviderManager.java
@@ -1391,16 +1391,6 @@
}
}
- public List<LocationRequest> getMockProviderRequests() {
- synchronized (mLock) {
- if (!mProvider.isMock()) {
- throw new IllegalArgumentException(mName + " provider is not a test provider");
- }
-
- return mProvider.getCurrentRequest().getLocationRequests();
- }
- }
-
@Nullable
public Location getLastLocation(CallerIdentity identity, @PermissionLevel int permissionLevel,
boolean ignoreLocationSettings) {
diff --git a/services/core/java/com/android/server/notification/ManagedServices.java b/services/core/java/com/android/server/notification/ManagedServices.java
index 74b7bd7..4040f41 100644
--- a/services/core/java/com/android/server/notification/ManagedServices.java
+++ b/services/core/java/com/android/server/notification/ManagedServices.java
@@ -833,6 +833,7 @@
public void onUserSwitched(int user) {
if (DEBUG) Slog.d(TAG, "onUserSwitched u=" + user);
+ unbindOtherUserServices(user);
rebindServices(true, user);
}
@@ -1219,6 +1220,27 @@
bindToServices(componentsToBind);
}
+ /**
+ * Called when user switched to unbind all services from other users.
+ */
+ @VisibleForTesting
+ void unbindOtherUserServices(int currentUser) {
+ final SparseArray<Set<ComponentName>> componentsToUnbind = new SparseArray<>();
+
+ synchronized (mMutex) {
+ final Set<ManagedServiceInfo> removableBoundServices = getRemovableConnectedServices();
+ for (ManagedServiceInfo info : removableBoundServices) {
+ if (info.userid != currentUser) {
+ Set<ComponentName> toUnbind =
+ componentsToUnbind.get(info.userid, new ArraySet<>());
+ toUnbind.add(info.component);
+ componentsToUnbind.put(info.userid, toUnbind);
+ }
+ }
+ }
+ unbindFromServices(componentsToUnbind);
+ }
+
protected void unbindFromServices(SparseArray<Set<ComponentName>> componentsToUnbind) {
for (int i = 0; i < componentsToUnbind.size(); i++) {
final int userId = componentsToUnbind.keyAt(i);
@@ -1264,7 +1286,8 @@
/**
* Version of registerService that takes the name of a service component to bind to.
*/
- private void registerService(final ComponentName name, final int userid) {
+ @VisibleForTesting
+ void registerService(final ComponentName name, final int userid) {
synchronized (mMutex) {
registerServiceLocked(name, userid);
}
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index d02f91d..23798c0 100755
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -140,6 +140,7 @@
import android.app.UriGrantsManager;
import android.app.admin.DevicePolicyManagerInternal;
import android.app.backup.BackupManager;
+import android.app.compat.CompatChanges;
import android.app.role.OnRoleHoldersChangedListener;
import android.app.role.RoleManager;
import android.app.usage.UsageEvents;
@@ -408,6 +409,15 @@
@EnabledAfter(targetSdkVersion = Build.VERSION_CODES.Q)
private static final long CHANGE_BACKGROUND_CUSTOM_TOAST_BLOCK = 128611929L;
+ /**
+ * Activity starts coming from broadcast receivers or services in response to notification and
+ * notification action clicks will be blocked for UX and performance reasons. Instead start the
+ * activity directly from the PendingIntent.
+ */
+ @ChangeId
+ @EnabledAfter(targetSdkVersion = Build.VERSION_CODES.R)
+ private static final long NOTIFICATION_TRAMPOLINE_BLOCK = 167676448L;
+
private IActivityManager mAm;
private ActivityTaskManagerInternal mAtm;
private ActivityManager mActivityManager;
@@ -10050,7 +10060,7 @@
* TODO(b/161957908): Remove dogfooder toast.
*/
private class NotificationTrampolineCallback implements BackgroundActivityStartCallback {
- private Set<String> mPackagesShown = new ArraySet<>();
+ private final Set<String> mPackagesShown = new ArraySet<>();
@Override
public IBinder getToken() {
@@ -10058,20 +10068,25 @@
}
@Override
- public void onExclusiveTokenActivityStart(String packageName) {
- Slog.w(TAG, "Indirect notification activity start from " + packageName);
- boolean isFirstOccurrence = mPackagesShown.add(packageName);
- if (!isFirstOccurrence) {
- return;
+ public boolean isActivityStartAllowed(int uid, String packageName) {
+ boolean block = CompatChanges.isChangeEnabled(NOTIFICATION_TRAMPOLINE_BLOCK, uid);
+ if (block || mPackagesShown.add(packageName)) {
+ mUiHandler.post(() ->
+ Toast.makeText(getUiContext(),
+ "Indirect activity start from "
+ + packageName + ". "
+ + "This will be blocked in S.\n"
+ + "See go/s-trampolines.",
+ Toast.LENGTH_LONG).show());
}
-
- mUiHandler.post(() ->
- Toast.makeText(getUiContext(),
- "Indirect activity start from "
- + packageName + ". "
- + "This will be blocked in S.\n"
- + "See go/s-trampolines.",
- Toast.LENGTH_LONG).show());
+ String message =
+ "Indirect notification activity start (trampoline) from " + packageName;
+ if (block) {
+ Slog.e(TAG, message + " blocked");
+ return false;
+ }
+ Slog.w(TAG, message + ", this should be avoided for performance reasons");
+ return true;
}
}
}
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
index 2ada613..3ec156f 100644
--- a/services/core/java/com/android/server/pm/UserManagerService.java
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
@@ -4708,9 +4708,12 @@
final UserInfo user = users.get(i);
final boolean running = am.isUserRunning(user.id, 0);
final boolean current = user.id == currentUser;
+ final boolean hasParent = user.profileGroupId != user.id
+ && user.profileGroupId != UserInfo.NO_PROFILE_GROUP_ID;
if (verbose) {
- pw.printf("%d: id=%d, name=%s, flags=%s%s%s%s%s%s\n", i, user.id, user.name,
+ pw.printf("%d: id=%d, name=%s, flags=%s%s%s%s%s%s%s\n", i, user.id, user.name,
UserInfo.flagsToString(user.flags),
+ hasParent ? " (parentId=" + user.profileGroupId + ")" : "",
running ? " (running)" : "",
user.partial ? " (partial)" : "",
user.preCreated ? " (pre-created)" : "",
@@ -4791,6 +4794,11 @@
pw.print(" "); pw.print(userInfo);
pw.print(" serialNo="); pw.print(userInfo.serialNumber);
pw.print(" isPrimary="); pw.print(userInfo.isPrimary());
+ if (userInfo.profileGroupId != userInfo.id
+ && userInfo.profileGroupId != UserInfo.NO_PROFILE_GROUP_ID) {
+ pw.print(" parentId="); pw.print(userInfo.profileGroupId);
+ }
+
if (mRemovingUserIds.get(userId)) {
pw.print(" <removing> ");
}
diff --git a/services/core/java/com/android/server/power/batterysaver/TEST_MAPPING b/services/core/java/com/android/server/power/batterysaver/TEST_MAPPING
new file mode 100644
index 0000000..17dba7d
--- /dev/null
+++ b/services/core/java/com/android/server/power/batterysaver/TEST_MAPPING
@@ -0,0 +1,19 @@
+{
+ "presubmit": [
+ {
+ "name": "CtsLocationCoarseTestCases"
+ },
+ {
+ "name": "CtsLocationFineTestCases"
+ },
+ {
+ "name": "CtsLocationNoneTestCases"
+ },
+ {
+ "name": "FrameworksMockingServicesTests",
+ "options": [
+ {"include-filter": "com.android.server.location"}
+ ]
+ }
+ ]
+}
diff --git a/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorService.java b/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorService.java
index d09cd38..68a086d 100644
--- a/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorService.java
+++ b/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorService.java
@@ -30,6 +30,7 @@
import android.os.RemoteException;
import android.os.ResultReceiver;
import android.os.ShellCallback;
+import android.os.SystemProperties;
import android.util.ArrayMap;
import android.util.IndentingPrintWriter;
import android.util.Slog;
@@ -58,11 +59,14 @@
private static final String TAG = "TimeZoneDetectorService";
/**
- * A compile time constant "feature switch" for enabling / disabling location-based time zone
- * detection on Android. If this is {@code false}, there should be few / little changes in
- * behavior with previous releases and little overhead associated with geolocation components.
+ * A "feature switch" for enabling / disabling location-based time zone detection. If this is
+ * {@code false}, there should be few / little changes in behavior with previous releases and
+ * little overhead associated with geolocation components.
+ * TODO(b/151304765) Remove this when the feature is on for all.
*/
- public static final boolean GEOLOCATION_TIME_ZONE_DETECTION_ENABLED = false;
+ public static final boolean GEOLOCATION_TIME_ZONE_DETECTION_ENABLED =
+ SystemProperties.getBoolean(
+ "persist.sys.location_time_zone_detection_feature_enabled", false);
/**
* Handles the service lifecycle for {@link TimeZoneDetectorService} and
diff --git a/services/core/java/com/android/server/tv/TvInputManagerService.java b/services/core/java/com/android/server/tv/TvInputManagerService.java
index 7b044ed..149dbd0 100755
--- a/services/core/java/com/android/server/tv/TvInputManagerService.java
+++ b/services/core/java/com/android/server/tv/TvInputManagerService.java
@@ -54,7 +54,7 @@
import android.media.tv.ITvInputServiceCallback;
import android.media.tv.ITvInputSession;
import android.media.tv.ITvInputSessionCallback;
-import android.media.tv.TvChannelInfo;
+import android.media.tv.TunedInfo;
import android.media.tv.TvContentRating;
import android.media.tv.TvContentRatingSystemInfo;
import android.media.tv.TvContract;
@@ -90,7 +90,6 @@
import com.android.internal.util.IndentingPrintWriter;
import com.android.server.IoThread;
import com.android.server.SystemService;
-import com.android.server.SystemService.TargetUser;
import java.io.File;
import java.io.FileDescriptor;
@@ -114,7 +113,7 @@
private static final boolean DEBUG = false;
private static final String TAG = "TvInputManagerService";
private static final String DVB_DIRECTORY = "/dev/dvb";
- private static final int APP_TAG_SELF = TvChannelInfo.APP_TAG_SELF;
+ private static final int APP_TAG_SELF = TunedInfo.APP_TAG_SELF;
private static final String PERMISSION_ACCESS_WATCHED_PROGRAMS =
"com.android.providers.tv.permission.ACCESS_WATCHED_PROGRAMS";
@@ -860,9 +859,9 @@
try {
ITvInputManagerCallback callback = userState.mCallbacks.getBroadcastItem(i);
Pair<Integer, Integer> pidUid = userState.callbackPidUidMap.get(callback);
- List<TvChannelInfo> infos = getCurrentTvChannelInfosInternalLocked(
+ List<TunedInfo> infos = getCurrentTunedInfosInternalLocked(
userState, pidUid.first, pidUid.second);
- callback.onCurrentTvChannelInfosUpdated(infos);
+ callback.onCurrentTunedInfosUpdated(infos);
} catch (RemoteException e) {
Slog.e(TAG, "failed to report updated current channel infos to callback", e);
}
@@ -2097,14 +2096,14 @@
}
@Override
- public List<TvChannelInfo> getCurrentTvChannelInfos(@UserIdInt int userId) {
+ public List<TunedInfo> getCurrentTunedInfos(@UserIdInt int userId) {
int callingPid = Binder.getCallingPid();
int callingUid = Binder.getCallingUid();
final int resolvedUserId = resolveCallingUserId(callingPid, callingUid, userId,
"getTvCurrentChannelInfos");
synchronized (mLock) {
UserState userState = getOrCreateUserStateLocked(resolvedUserId);
- return getCurrentTvChannelInfosInternalLocked(userState, callingPid, callingUid);
+ return getCurrentTunedInfosInternalLocked(userState, callingPid, callingUid);
}
}
@@ -2278,9 +2277,9 @@
}
}
- private List<TvChannelInfo> getCurrentTvChannelInfosInternalLocked(
+ private List<TunedInfo> getCurrentTunedInfosInternalLocked(
UserState userState, int callingPid, int callingUid) {
- List<TvChannelInfo> channelInfos = new ArrayList<>();
+ List<TunedInfo> channelInfos = new ArrayList<>();
boolean watchedProgramsAccess = hasAccessWatchedProgramsPermission(callingPid, callingUid);
for (SessionState state : userState.sessionStateMap.values()) {
if (state.isCurrent) {
@@ -2288,7 +2287,7 @@
int appType;
if (state.callingUid == callingUid) {
appTag = APP_TAG_SELF;
- appType = TvChannelInfo.APP_TYPE_SELF;
+ appType = TunedInfo.APP_TYPE_SELF;
} else {
appTag = userState.mAppTagMap.get(state.callingUid);
if (appTag == null) {
@@ -2296,10 +2295,10 @@
userState.mAppTagMap.put(state.callingUid, appTag);
}
appType = isSystemApp(state.componentName.getPackageName())
- ? TvChannelInfo.APP_TYPE_SYSTEM
- : TvChannelInfo.APP_TYPE_NON_SYSTEM;
+ ? TunedInfo.APP_TYPE_SYSTEM
+ : TunedInfo.APP_TYPE_NON_SYSTEM;
}
- channelInfos.add(new TvChannelInfo(
+ channelInfos.add(new TunedInfo(
state.inputId,
watchedProgramsAccess ? state.currentChannel : null,
state.isRecordingSession,
diff --git a/services/core/java/com/android/server/vcn/OWNERS b/services/core/java/com/android/server/vcn/OWNERS
new file mode 100644
index 0000000..33b9f0f
--- /dev/null
+++ b/services/core/java/com/android/server/vcn/OWNERS
@@ -0,0 +1,7 @@
+set noparent
+
+benedictwong@google.com
+ckesting@google.com
+evitayan@google.com
+nharold@google.com
+jchalard@google.com
\ No newline at end of file
diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java
index 28e71fa..c8a8f81 100644
--- a/services/core/java/com/android/server/wm/ActivityStarter.java
+++ b/services/core/java/com/android/server/wm/ActivityStarter.java
@@ -1358,6 +1358,12 @@
}
return false;
}
+ // don't abort if the callingUid has SYSTEM_ALERT_WINDOW permission
+ if (mService.hasSystemAlertWindowPermission(callingUid, callingPid, callingPackage)) {
+ Slog.w(TAG, "Background activity start for " + callingPackage
+ + " allowed because SYSTEM_ALERT_WINDOW permission is granted.");
+ return false;
+ }
// If we don't have callerApp at this point, no caller was provided to startActivity().
// That's the case for PendingIntent-based starts, since the creator's process might not be
// up and alive. If that's the case, we retrieve the WindowProcessController for the send()
@@ -1394,12 +1400,6 @@
}
}
}
- // don't abort if the callingUid has SYSTEM_ALERT_WINDOW permission
- if (mService.hasSystemAlertWindowPermission(callingUid, callingPid, callingPackage)) {
- Slog.w(TAG, "Background activity start for " + callingPackage
- + " allowed because SYSTEM_ALERT_WINDOW permission is granted.");
- return false;
- }
// anything that has fallen through would currently be aborted
Slog.w(TAG, "Background activity start [callingPackage: " + callingPackage
+ "; callingUid: " + callingUid
diff --git a/services/core/java/com/android/server/wm/BackgroundActivityStartCallback.java b/services/core/java/com/android/server/wm/BackgroundActivityStartCallback.java
index 4e742b9..af6c255 100644
--- a/services/core/java/com/android/server/wm/BackgroundActivityStartCallback.java
+++ b/services/core/java/com/android/server/wm/BackgroundActivityStartCallback.java
@@ -24,8 +24,8 @@
*/
public interface BackgroundActivityStartCallback {
/**
- * The token that allowed the activity start that triggered {@link
- * #onExclusiveTokenActivityStart()}.
+ * The token for which this callback is responsible for deciding whether the app can start
+ * background activities or not.
*
* Ideally this should just return a final variable, don't do anything costly here (don't hold
* any locks).
@@ -33,7 +33,10 @@
IBinder getToken();
/**
- * Called when the background activity start happens.
+ * Returns true if the background activity start due to originating token in {@link #getToken()}
+ * should be allowed or not.
+ *
+ * This will be called holding the WM lock, don't do anything costly here.
*/
- void onExclusiveTokenActivityStart(String packageName);
+ boolean isActivityStartAllowed(int uid, String packageName);
}
diff --git a/services/core/java/com/android/server/wm/RecentsAnimationController.java b/services/core/java/com/android/server/wm/RecentsAnimationController.java
index dda1e2d..4ad2575 100644
--- a/services/core/java/com/android/server/wm/RecentsAnimationController.java
+++ b/services/core/java/com/android/server/wm/RecentsAnimationController.java
@@ -389,9 +389,7 @@
final int taskCount = visibleTasks.size();
for (int i = 0; i < taskCount; i++) {
final Task task = visibleTasks.get(i);
- final WindowConfiguration config = task.getWindowConfiguration();
- if (config.tasksAreFloating()
- || config.getWindowingMode() == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY) {
+ if (skipAnimation(task)) {
continue;
}
addAnimation(task, !recentTaskIds.get(task.mTaskId));
@@ -434,6 +432,19 @@
}
}
+
+ /**
+ * Whether a task should be filtered from the recents animation. This can be true for tasks
+ * being displayed outside of recents.
+ */
+ private boolean skipAnimation(Task task) {
+ final WindowConfiguration config = task.getWindowConfiguration();
+ return task.isAlwaysOnTop()
+ || config.tasksAreFloating()
+ || config.getWindowingMode() == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
+ }
+
+
@VisibleForTesting
AnimationAdapter addAnimation(Task task, boolean isRecentTaskInvisible) {
return addAnimation(task, isRecentTaskInvisible, false /* hidden */,
@@ -529,8 +540,9 @@
void addTaskToTargets(Task task, OnAnimationFinishedCallback finishedCallback) {
if (mRunner != null) {
- // No need to send task appeared when the task target already exists.
- if (isAnimatingTask(task)) {
+ // No need to send task appeared when the task target already exists, or when the
+ // task is being managed as a multi-window mode outside of recents (e.g. bubbles).
+ if (isAnimatingTask(task) || skipAnimation(task)) {
return;
}
final RemoteAnimationTarget target = createTaskRemoteAnimation(task, finishedCallback);
diff --git a/services/core/java/com/android/server/wm/WindowProcessController.java b/services/core/java/com/android/server/wm/WindowProcessController.java
index fb9bdf5..e8a7a9c1 100644
--- a/services/core/java/com/android/server/wm/WindowProcessController.java
+++ b/services/core/java/com/android/server/wm/WindowProcessController.java
@@ -223,7 +223,7 @@
private boolean mRunningRemoteAnimation;
@Nullable
- private BackgroundActivityStartCallback mBackgroundActivityStartCallback;
+ private final BackgroundActivityStartCallback mBackgroundActivityStartCallback;
/** The state for oom-adjustment calculation. */
private final OomScoreReferenceState mOomRefState;
@@ -555,8 +555,7 @@
return true;
}
// allow if the flag was explicitly set
- if (!mBackgroundActivityStartTokens.isEmpty()) {
- onBackgroundStartAllowedByToken();
+ if (isBackgroundStartAllowedByToken()) {
if (DEBUG_ACTIVITY_STARTS) {
Slog.d(TAG, "[WindowProcessController(" + mPid
+ ")] Activity start allowed: process allowed by token");
@@ -566,18 +565,29 @@
return false;
}
- private void onBackgroundStartAllowedByToken() {
+ /**
+ * If there are no tokens, we don't allow *by token*. If there are tokens, we need to check if
+ * the callback handles all the tokens, if so we ask the callback if the activity should be
+ * started, otherwise we allow.
+ */
+ private boolean isBackgroundStartAllowedByToken() {
+ if (mBackgroundActivityStartTokens.isEmpty()) {
+ return false;
+ }
if (mBackgroundActivityStartCallback == null) {
- return;
+ // We have tokens but no callback to decide => allow
+ return true;
}
IBinder callbackToken = mBackgroundActivityStartCallback.getToken();
for (IBinder token : mBackgroundActivityStartTokens.values()) {
if (token != callbackToken) {
- return;
+ // The callback doesn't handle all the tokens => allow
+ return true;
}
}
- mAtm.mH.post(() ->
- mBackgroundActivityStartCallback.onExclusiveTokenActivityStart(mInfo.packageName));
+ // The callback handles all the tokens => callback decides
+ return mBackgroundActivityStartCallback.isActivityStartAllowed(mInfo.uid,
+ mInfo.packageName);
}
private boolean isBoundByForegroundUid() {
diff --git a/services/core/java/com/android/server/wm/WindowSurfaceController.java b/services/core/java/com/android/server/wm/WindowSurfaceController.java
index 160ad89..cbe0a42 100644
--- a/services/core/java/com/android/server/wm/WindowSurfaceController.java
+++ b/services/core/java/com/android/server/wm/WindowSurfaceController.java
@@ -30,7 +30,6 @@
import static com.android.server.wm.WindowSurfaceControllerProto.LAYER;
import static com.android.server.wm.WindowSurfaceControllerProto.SHOWN;
-import android.graphics.Rect;
import android.graphics.Region;
import android.os.Debug;
import android.os.Trace;
@@ -62,7 +61,6 @@
private float mSurfaceY = 0;
private int mSurfaceW = 0;
private int mSurfaceH = 0;
- private Rect mSurfaceCrop = new Rect(0, 0, -1, -1);
// Initialize to the identity matrix.
private float mLastDsdx = 1;
@@ -74,13 +72,6 @@
private int mSurfaceLayer = 0;
- // Surface flinger doesn't support crop rectangles where width or height is non-positive.
- // However, we need to somehow handle the situation where the cropping would completely hide
- // the window. We achieve this by explicitly hiding the surface and not letting it be shown.
- private boolean mHiddenForCrop = false;
-
- // Initially a surface is hidden after just being created.
- private boolean mHiddenForOtherReasons = true;
private final String title;
private final WindowManagerService mService;
@@ -140,13 +131,6 @@
Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
}
- void reparentChildrenInTransaction(WindowSurfaceController other) {
- ProtoLog.i(WM_SHOW_TRANSACTIONS, "REPARENT from: %s to: %s", this, other);
- if ((mSurfaceControl != null) && (other.mSurfaceControl != null)) {
- mSurfaceControl.reparentChildren(other.mSurfaceControl);
- }
- }
-
void detachChildren() {
ProtoLog.i(WM_SHOW_TRANSACTIONS, "SEVER CHILDREN");
mChildrenDetached = true;
@@ -157,7 +141,6 @@
void hide(SurfaceControl.Transaction transaction, String reason) {
ProtoLog.i(WM_SHOW_TRANSACTIONS, "SURFACE HIDE ( %s ): %s", reason, title);
- mHiddenForOtherReasons = true;
mAnimator.destroyPreservedSurfaceLocked();
if (mSurfaceShown) {
@@ -195,47 +178,6 @@
}
}
- void setCropInTransaction(Rect clipRect, boolean recoveringMemory) {
- ProtoLog.i(WM_SHOW_TRANSACTIONS, "SURFACE CROP %s: %s", clipRect.toShortString(), title);
- try {
- if (clipRect.width() > 0 && clipRect.height() > 0) {
- if (!clipRect.equals(mSurfaceCrop)) {
- mSurfaceControl.setWindowCrop(clipRect);
- mSurfaceCrop.set(clipRect);
- }
- mHiddenForCrop = false;
- updateVisibility();
- } else {
- mHiddenForCrop = true;
- mAnimator.destroyPreservedSurfaceLocked();
- updateVisibility();
- }
- } catch (RuntimeException e) {
- Slog.w(TAG, "Error setting crop surface of " + this
- + " crop=" + clipRect.toShortString(), e);
- if (!recoveringMemory) {
- mAnimator.reclaimSomeSurfaceMemory("crop", true);
- }
- }
- }
-
- void clearCropInTransaction(boolean recoveringMemory) {
- ProtoLog.i(WM_SHOW_TRANSACTIONS, "SURFACE CLEAR CROP: %s", title);
- try {
- Rect clipRect = new Rect(0, 0, -1, -1);
- if (mSurfaceCrop.equals(clipRect)) {
- return;
- }
- mSurfaceControl.setWindowCrop(clipRect);
- mSurfaceCrop.set(clipRect);
- } catch (RuntimeException e) {
- Slog.w(TAG, "Error setting clearing crop of " + this, e);
- if (!recoveringMemory) {
- mAnimator.reclaimSomeSurfaceMemory("crop", true);
- }
- }
- }
-
void setPosition(SurfaceControl.Transaction t, float left, float top,
boolean recoveringMemory) {
final boolean surfaceMoved = mSurfaceX != left || mSurfaceY != top;
@@ -287,31 +229,6 @@
}
}
- boolean setBufferSizeInTransaction(int width, int height, boolean recoveringMemory) {
- final boolean surfaceResized = mSurfaceW != width || mSurfaceH != height;
- if (surfaceResized) {
- mSurfaceW = width;
- mSurfaceH = height;
-
- try {
- ProtoLog.i(WM_SHOW_TRANSACTIONS, "SURFACE SIZE %dx%d: %s", width, height, title);
- mSurfaceControl.setBufferSize(width, height);
- } catch (RuntimeException e) {
- // If something goes wrong with the surface (such
- // as running out of memory), don't take down the
- // entire system.
- Slog.e(TAG, "Error resizing surface of " + title
- + " size=(" + width + "x" + height + ")", e);
- if (!recoveringMemory) {
- mAnimator.reclaimSomeSurfaceMemory("size", true);
- }
- return false;
- }
- return true;
- }
- return false;
- }
-
boolean prepareToShowInTransaction(float alpha,
float dsdx, float dtdx, float dsdy,
float dtdy, boolean recoveringMemory) {
@@ -404,35 +321,15 @@
}
}
- void getContainerRect(Rect rect) {
- mAnimator.getContainerRect(rect);
- }
-
boolean showRobustlyInTransaction() {
ProtoLog.i(WM_SHOW_TRANSACTIONS, "SURFACE SHOW (performLayout): %s", title);
if (DEBUG_VISIBILITY) Slog.v(TAG, "Showing " + this
+ " during relayout");
- mHiddenForOtherReasons = false;
- return updateVisibility();
- }
- private boolean updateVisibility() {
- if (mHiddenForCrop || mHiddenForOtherReasons) {
- if (mSurfaceShown) {
- hideSurface(mTmpTransaction);
- SurfaceControl.mergeToGlobalTransaction(mTmpTransaction);
- }
- return false;
- } else {
- if (!mSurfaceShown) {
- return showSurface();
- } else {
- return true;
- }
+ if (mSurfaceShown) {
+ return true;
}
- }
- private boolean showSurface() {
try {
setShown(true);
mSurfaceControl.show();
@@ -442,15 +339,9 @@
}
mAnimator.reclaimSomeSurfaceMemory("show", true);
-
return false;
}
- void deferTransactionUntil(SurfaceControl barrier, long frame) {
- // TODO: Logging
- mSurfaceControl.deferTransactionUntil(barrier, frame);
- }
-
void forceScaleableInTransaction(boolean force) {
// -1 means we don't override the default or client specified
// scaling mode.
@@ -472,7 +363,6 @@
return mSurfaceControl.getContentFrameStats(outStats);
}
-
boolean hasSurface() {
return mSurfaceControl != null;
}
@@ -487,10 +377,6 @@
}
}
- int getLayer() {
- return mSurfaceLayer;
- }
-
boolean getShown() {
return mSurfaceShown;
}
@@ -507,14 +393,6 @@
}
}
- float getX() {
- return mSurfaceX;
- }
-
- float getY() {
- return mSurfaceY;
- }
-
int getWidth() {
return mSurfaceW;
}
diff --git a/services/profcollect/Android.bp b/services/profcollect/Android.bp
index 68fba55..b7be5d4 100644
--- a/services/profcollect/Android.bp
+++ b/services/profcollect/Android.bp
@@ -30,6 +30,7 @@
java_library_static {
name: "services.profcollect",
+ defaults: ["services_defaults"],
srcs: [":services.profcollect-sources"],
libs: ["services.core"],
}
diff --git a/services/tests/mockingservicestests/src/com/android/server/am/AppChildProcessTest.java b/services/tests/mockingservicestests/src/com/android/server/am/AppChildProcessTest.java
index 04e8b63..b85da94 100644
--- a/services/tests/mockingservicestests/src/com/android/server/am/AppChildProcessTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/am/AppChildProcessTest.java
@@ -34,12 +34,12 @@
import android.os.HandlerThread;
import android.os.Process;
import android.platform.test.annotations.Presubmit;
+import android.util.ArrayMap;
import android.util.ArraySet;
import com.android.dx.mockito.inline.extended.StaticMockitoSession;
import com.android.server.LocalServices;
import com.android.server.ServiceThread;
-import com.android.server.am.ActivityManagerService.Injector;
import com.android.server.appop.AppOpsService;
import com.android.server.wm.ActivityTaskManagerService;
@@ -55,7 +55,11 @@
import org.mockito.MockitoAnnotations;
import org.mockito.quality.Strictness;
+import java.io.ByteArrayInputStream;
import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
@Presubmit
public class AppChildProcessTest {
@@ -68,6 +72,7 @@
private Context mContext = getInstrumentation().getTargetContext();
private TestInjector mInjector;
+ private PhantomTestInjector mPhantomInjector;
private ActivityManagerService mAms;
private ProcessList mProcessList;
private PhantomProcessList mPhantomProcessList;
@@ -94,6 +99,7 @@
mProcessList = spy(pList);
mInjector = new TestInjector(mContext);
+ mPhantomInjector = new PhantomTestInjector();
mAms = new ActivityManagerService(mInjector, mServiceThreadRule.getThread());
mAms.mActivityTaskManager = new ActivityTaskManagerService(mContext);
mAms.mActivityTaskManager.initialize(null, null, mContext.getMainLooper());
@@ -101,6 +107,7 @@
mAms.mPackageManagerInt = mPackageManagerInt;
pList.mService = mAms;
mPhantomProcessList = mAms.mPhantomProcessList;
+ mPhantomProcessList.mInjector = mPhantomInjector;
doReturn(new ComponentName("", "")).when(mPackageManagerInt).getSystemUiServiceComponent();
doReturn(false).when(() -> Process.supportsPidFd());
// Remove stale instance of PackageManagerInternal if there is any
@@ -136,47 +143,60 @@
final String child2ProcessName = "test1_child1_child2";
final String nativeProcessName = "test_native";
- makeParent(zygote64Pid, initPid);
- makeParent(zygote32Pid, initPid);
+ makeProcess(rootUid, zygote64Pid, zygote64ProcessName);
+ makeParent(rootUid, zygote64Pid, initPid);
+ makeProcess(rootUid, zygote32Pid, zygote32ProcessName);
+ makeParent(rootUid, zygote32Pid, initPid);
makeAppProcess(app1Pid, app1Uid, app1ProcessName, app1ProcessName);
- makeParent(app1Pid, zygote64Pid);
makeAppProcess(app2Pid, app2Uid, app2ProcessName, app2ProcessName);
- makeParent(app2Pid, zygote64Pid);
+
+ mPhantomProcessList.lookForPhantomProcessesLocked();
assertEquals(0, mPhantomProcessList.mPhantomProcesses.size());
// Verify zygote itself isn't a phantom process
assertEquals(null, mPhantomProcessList.getOrCreatePhantomProcessIfNeededLocked(
- zygote64ProcessName, rootUid, zygote64Pid));
+ zygote64ProcessName, rootUid, zygote64Pid, false));
assertEquals(null, mPhantomProcessList.getOrCreatePhantomProcessIfNeededLocked(
- zygote32ProcessName, rootUid, zygote32Pid));
+ zygote32ProcessName, rootUid, zygote32Pid, false));
// Verify none of the app isn't a phantom process
assertEquals(null, mPhantomProcessList.getOrCreatePhantomProcessIfNeededLocked(
- app1ProcessName, app1Uid, app1Pid));
+ app1ProcessName, app1Uid, app1Pid, false));
assertEquals(null, mPhantomProcessList.getOrCreatePhantomProcessIfNeededLocked(
- app2ProcessName, app2Uid, app2Pid));
+ app2ProcessName, app2Uid, app2Pid, false));
// "Fork" an app child process
- makeParent(child1Pid, app1Pid);
+ makeProcess(app1Uid, child1Pid, child1ProcessName);
+ makeParent(app1Uid, child1Pid, app1Pid);
+ mPhantomProcessList.lookForPhantomProcessesLocked();
+
PhantomProcessRecord pr = mPhantomProcessList
- .getOrCreatePhantomProcessIfNeededLocked(child1ProcessName, app1Uid, child1Pid);
+ .getOrCreatePhantomProcessIfNeededLocked(
+ child1ProcessName, app1Uid, child1Pid, true);
assertTrue(pr != null);
assertEquals(1, mPhantomProcessList.mPhantomProcesses.size());
assertEquals(pr, mPhantomProcessList.mPhantomProcesses.valueAt(0));
verifyPhantomProcessRecord(pr, child1ProcessName, app1Uid, child1Pid);
// Create another native process from init
- makeParent(nativePid, initPid);
+ makeProcess(rootUid, nativePid, nativeProcessName);
+ makeParent(rootUid, nativePid, initPid);
+ mPhantomProcessList.lookForPhantomProcessesLocked();
+
assertEquals(null, mPhantomProcessList.getOrCreatePhantomProcessIfNeededLocked(
- nativeProcessName, rootUid, nativePid));
+ nativeProcessName, rootUid, nativePid, false));
assertEquals(1, mPhantomProcessList.mPhantomProcesses.size());
assertEquals(pr, mPhantomProcessList.mPhantomProcesses.valueAt(0));
// "Fork" another app child process
- makeParent(child2Pid, child1Pid);
+ makeProcess(app1Uid, child2Pid, child2ProcessName);
+ makeParent(app1Uid, child2Pid, app1Pid);
+ mPhantomProcessList.lookForPhantomProcessesLocked();
+
PhantomProcessRecord pr2 = mPhantomProcessList
- .getOrCreatePhantomProcessIfNeededLocked(child2ProcessName, app1Uid, child2Pid);
+ .getOrCreatePhantomProcessIfNeededLocked(
+ child2ProcessName, app1Uid, child2Pid, false);
assertTrue(pr2 != null);
assertEquals(2, mPhantomProcessList.mPhantomProcesses.size());
verifyPhantomProcessRecord(pr2, child2ProcessName, app1Uid, child2Pid);
@@ -197,19 +217,27 @@
assertEquals(pid, pr.mPid);
}
+ private void makeProcess(int uid, int pid, String processName) {
+ doReturn(uid).when(() -> Process.getUidForPid(eq(pid)));
+ mPhantomInjector.mPidToName.put(pid, processName);
+ }
+
private void makeAppProcess(int pid, int uid, String packageName, String processName) {
+ makeProcess(uid, pid, processName);
ApplicationInfo ai = new ApplicationInfo();
ai.packageName = packageName;
+ ai.uid = uid;
ProcessRecord app = new ProcessRecord(mAms, ai, processName, uid);
app.pid = pid;
mAms.mPidsSelfLocked.doAddInternal(app);
+ mPhantomInjector.addToProcess(uid, pid, pid);
}
- private void makeParent(int pid, int ppid) {
- doReturn(ppid).when(() -> Process.getParentPid(eq(pid)));
+ private void makeParent(int uid, int pid, int ppid) {
+ mPhantomInjector.addToProcess(uid, ppid, pid);
}
- private class TestInjector extends Injector {
+ private class TestInjector extends ActivityManagerService.Injector {
TestInjector(Context context) {
super(context);
}
@@ -230,6 +258,56 @@
}
}
+ private class PhantomTestInjector extends PhantomProcessList.Injector {
+ ArrayMap<String, InputStream> mPathToInput = new ArrayMap<>();
+ ArrayMap<String, StringBuffer> mPathToData = new ArrayMap<>();
+ ArrayMap<InputStream, StringBuffer> mInputToData = new ArrayMap<>();
+ ArrayMap<Integer, String> mPidToName = new ArrayMap<>();
+
+ @Override
+ InputStream openCgroupProcs(String path) throws FileNotFoundException, SecurityException {
+ InputStream input = mPathToInput.get(path);
+ if (input != null) {
+ return input;
+ }
+ input = new ByteArrayInputStream(new byte[8]); // buf size doesn't matter here
+ mPathToInput.put(path, input);
+ StringBuffer sb = mPathToData.get(path);
+ if (sb == null) {
+ sb = new StringBuffer();
+ mPathToData.put(path, sb);
+ }
+ mInputToData.put(input, sb);
+ return input;
+ }
+
+ @Override
+ int readCgroupProcs(InputStream input, byte[] buf, int offset, int len) throws IOException {
+ StringBuffer sb = mInputToData.get(input);
+ if (sb == null) {
+ return -1;
+ }
+ byte[] avail = sb.toString().getBytes();
+ System.arraycopy(avail, 0, buf, offset, Math.min(len, avail.length));
+ return Math.min(len, avail.length);
+ }
+
+ @Override
+ String getProcessName(final int pid) {
+ return mPidToName.get(pid);
+ }
+
+ void addToProcess(int uid, int pid, int newPid) {
+ final String path = PhantomProcessList.getCgroupFilePath(uid, pid);
+ StringBuffer sb = mPathToData.get(path);
+ if (sb == null) {
+ sb = new StringBuffer();
+ mPathToData.put(path, sb);
+ }
+ sb.append(newPid).append('\n');
+ }
+ }
+
static class ServiceThreadRule implements TestRule {
private ServiceThread mThread;
diff --git a/services/tests/servicestests/src/com/android/server/biometrics/HardwareAuthTokenUtilsTest.java b/services/tests/servicestests/src/com/android/server/biometrics/HardwareAuthTokenUtilsTest.java
new file mode 100644
index 0000000..84987e6
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/biometrics/HardwareAuthTokenUtilsTest.java
@@ -0,0 +1,83 @@
+/*
+ * 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.biometrics;
+
+import static junit.framework.Assert.assertEquals;
+
+import android.hardware.keymaster.HardwareAuthToken;
+import android.hardware.keymaster.Timestamp;
+import android.platform.test.annotations.Presubmit;
+
+import androidx.test.filters.SmallTest;
+
+import org.junit.Test;
+
+@Presubmit
+@SmallTest
+public class HardwareAuthTokenUtilsTest {
+
+ @Test
+ public void testByteArrayLoopBack() {
+ final byte[] hat = new byte[69];
+ for (int i = 0; i < 69; i++) {
+ hat[i] = (byte) i;
+ }
+
+ final HardwareAuthToken hardwareAuthToken = HardwareAuthTokenUtils.toHardwareAuthToken(hat);
+ final byte[] hat2 = HardwareAuthTokenUtils.toByteArray(hardwareAuthToken);
+
+ for (int i = 0; i < hat.length; i++) {
+ assertEquals(hat[i], hat2[i]);
+ }
+ }
+
+ @Test
+ public void testHardwareAuthTokenLoopBack() {
+ final long testChallenge = 1000L;
+ final long testUserId = 2000L;
+ final long testAuthenticatorId = 3000L;
+ final int testAuthenticatorType = 4000;
+ final long testTimestamp = 5000L;
+
+ final HardwareAuthToken hardwareAuthToken = new HardwareAuthToken();
+ hardwareAuthToken.challenge = testChallenge;
+ hardwareAuthToken.userId = testUserId;
+ hardwareAuthToken.authenticatorId = testAuthenticatorId;
+ hardwareAuthToken.authenticatorType = testAuthenticatorType;
+ hardwareAuthToken.timestamp = new Timestamp();
+ hardwareAuthToken.timestamp.milliSeconds = testTimestamp;
+ hardwareAuthToken.mac = new byte[32];
+
+ for (int i = 0; i < hardwareAuthToken.mac.length; i++) {
+ hardwareAuthToken.mac[i] = (byte) i;
+ }
+
+ final byte[] hat = HardwareAuthTokenUtils.toByteArray(hardwareAuthToken);
+ final HardwareAuthToken hardwareAuthToken2 =
+ HardwareAuthTokenUtils.toHardwareAuthToken(hat);
+
+ assertEquals(testChallenge, hardwareAuthToken2.challenge);
+ assertEquals(testUserId, hardwareAuthToken2.userId);
+ assertEquals(testAuthenticatorId, hardwareAuthToken2.authenticatorId);
+ assertEquals(testAuthenticatorType, hardwareAuthToken2.authenticatorType);
+ assertEquals(testTimestamp, hardwareAuthToken2.timestamp.milliSeconds);
+
+ for (int i = 0; i < hardwareAuthToken.mac.length; i++) {
+ assertEquals(hardwareAuthToken.mac[i], hardwareAuthToken2.mac[i]);
+ }
+ }
+}
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ManagedServicesTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ManagedServicesTest.java
index d7e431f..e304083 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ManagedServicesTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ManagedServicesTest.java
@@ -690,6 +690,39 @@
}
@Test
+ public void unbindOtherUserServices() throws PackageManager.NameNotFoundException {
+ Context context = mock(Context.class);
+ PackageManager pm = mock(PackageManager.class);
+ ApplicationInfo ai = new ApplicationInfo();
+ ai.targetSdkVersion = Build.VERSION_CODES.CUR_DEVELOPMENT;
+
+ when(context.getPackageName()).thenReturn(mContext.getPackageName());
+ when(context.getUserId()).thenReturn(mContext.getUserId());
+ when(context.getPackageManager()).thenReturn(pm);
+ when(pm.getApplicationInfo(anyString(), anyInt())).thenReturn(ai);
+
+ ManagedServices service = new TestManagedServices(context, mLock, mUserProfiles, mIpm,
+ APPROVAL_BY_COMPONENT);
+ ComponentName cn = ComponentName.unflattenFromString("a/a");
+
+ when(context.bindServiceAsUser(any(), any(), anyInt(), any())).thenAnswer(invocation -> {
+ Object[] args = invocation.getArguments();
+ ServiceConnection sc = (ServiceConnection) args[1];
+ sc.onServiceConnected(cn, mock(IBinder.class));
+ return true;
+ });
+
+ service.registerService(cn, 0);
+ service.registerService(cn, 10);
+ service.registerService(cn, 11);
+ service.unbindOtherUserServices(11);
+
+ assertFalse(service.isBound(cn, 0));
+ assertFalse(service.isBound(cn, 10));
+ assertTrue(service.isBound(cn, 11));
+ }
+
+ @Test
public void testPackageUninstall_packageNoLongerInApprovedList() throws Exception {
for (int approvalLevel : new int[] {APPROVAL_BY_COMPONENT, APPROVAL_BY_PACKAGE}) {
ManagedServices service = new TestManagedServices(getContext(), mLock, mUserProfiles,
diff --git a/telecomm/java/android/telecom/Call.java b/telecomm/java/android/telecom/Call.java
index a6d7245..9f16543 100755
--- a/telecomm/java/android/telecom/Call.java
+++ b/telecomm/java/android/telecom/Call.java
@@ -966,6 +966,32 @@
/**
* Gets the verification status for the phone number of an incoming call as identified in
* ATIS-1000082.
+ * <p>
+ * For incoming calls, the number verification status indicates whether the device was
+ * able to verify the authenticity of the calling number using the STIR process outlined
+ * in ATIS-1000082. {@link Connection#VERIFICATION_STATUS_NOT_VERIFIED} indicates that
+ * the network was not able to use STIR to verify the caller's number (i.e. nothing is
+ * known regarding the authenticity of the number.
+ * {@link Connection#VERIFICATION_STATUS_PASSED} indicates that the network was able to
+ * use STIR to verify the caller's number. This indicates that the network has a high
+ * degree of confidence that the incoming call actually originated from the indicated
+ * number. {@link Connection#VERIFICATION_STATUS_FAILED} indicates that the network's
+ * STIR verification did not pass. This indicates that the incoming call may not
+ * actually be from the indicated number. This could occur if, for example, the caller
+ * is using an impersonated phone number.
+ * <p>
+ * A {@link CallScreeningService} can use this information to help determine if an
+ * incoming call is potentially an unwanted call. A verification status of
+ * {@link Connection#VERIFICATION_STATUS_FAILED} indicates that an incoming call may not
+ * actually be from the number indicated on the call (i.e. impersonated number) and that it
+ * should potentially be blocked. Likewise,
+ * {@link Connection#VERIFICATION_STATUS_PASSED} can be used as a positive signal to
+ * help clarify that the incoming call is originating from the indicated number and it
+ * is less likely to be an undesirable call.
+ * <p>
+ * An {@link InCallService} can use this information to provide a visual indicator to the
+ * user regarding the verification status of a call and to help identify calls from
+ * potentially impersonated numbers.
* @return the verification status.
*/
public @Connection.VerificationStatus int getCallerNumberVerificationStatus() {
diff --git a/tests/SilkFX/AndroidManifest.xml b/tests/SilkFX/AndroidManifest.xml
index 050e9c3..c30d761 100644
--- a/tests/SilkFX/AndroidManifest.xml
+++ b/tests/SilkFX/AndroidManifest.xml
@@ -4,9 +4,9 @@
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.
@@ -40,7 +40,14 @@
android:label="Glow Examples"/>
<activity android:name=".materials.GlassActivity"
- android:label="Glass Examples"/>
+ android:label="Glass Examples"
+ android:banner="@drawable/background1"
+ android:exported="true">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN"/>
+ <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
+ </intent-filter>
+ </activity>
</application>
</manifest>
diff --git a/tests/SilkFX/res/layout-television/activity_glass.xml b/tests/SilkFX/res/layout-television/activity_glass.xml
new file mode 100644
index 0000000..1f566860
--- /dev/null
+++ b/tests/SilkFX/res/layout-television/activity_glass.xml
@@ -0,0 +1,302 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+** Copyright 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.
+-->
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ tools:context=".MainActivity">
+
+ <ImageView
+ android:id="@+id/background"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:scaleType="matrix"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="parent"
+ tools:srcCompat="@drawable/background1" />
+
+ <com.android.test.silkfx.materials.GlassView
+ android:id="@+id/materialView"
+ android:layout_width="400dp"
+ android:layout_height="100dp"
+ android:layout_marginEnd="64dp"
+ android:layout_marginStart="64dp"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintEnd_toEndOf="@id/background"
+ app:layout_constraintStart_toStartOf="@id/background"
+ app:layout_constraintTop_toTopOf="parent">
+ <TextView
+ android:id="@+id/textOverlay"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textSize="18dp"
+ android:layout_gravity="center"
+ android:textColor="#ffffff"
+ android:text="Lorem Ipsum dolor sit amet." />
+ </com.android.test.silkfx.materials.GlassView>
+
+ <androidx.constraintlayout.widget.ConstraintLayout
+ android:id="@+id/bottomPanel"
+ android:layout_width="400dp"
+ android:layout_height="wrap_content"
+ android:background="?android:attr/colorBackground"
+ android:paddingTop="24dp"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintBottom_toBottomOf="parent">
+
+ <SeekBar
+ android:id="@+id/materialOpacity"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="12dp"
+ android:layout_marginEnd="12dp"
+ android:layout_marginBottom="16dp"
+ android:max="100"
+ android:progress="12"
+ app:layout_constraintBottom_toTopOf="@+id/scrimOpacityTitle"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintHorizontal_bias="1.0"
+ app:layout_constraintStart_toStartOf="parent" />
+
+ <SeekBar
+ android:id="@+id/zoom"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="16dp"
+ android:layout_marginEnd="12dp"
+ android:layout_marginStart="12dp"
+ android:min="-100"
+ android:max="100"
+ android:progress="-15"
+ app:layout_constraintBottom_toTopOf="@+id/blurRadiusTitle"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintHorizontal_bias="1.0"
+ app:layout_constraintStart_toStartOf="parent" />
+
+ <SeekBar
+ android:id="@+id/blurRadius"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="16dp"
+ android:layout_marginEnd="12dp"
+ android:layout_marginStart="12dp"
+ android:max="150"
+ android:progress="40"
+ app:layout_constraintBottom_toTopOf="@+id/materialOpacityTitle"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintHorizontal_bias="1.0"
+ app:layout_constraintStart_toStartOf="parent" />
+
+ <SeekBar
+ android:id="@+id/scrimOpacity"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="12dp"
+ android:layout_marginEnd="12dp"
+ android:layout_marginBottom="16dp"
+ android:max="100"
+ android:progress="50"
+ app:layout_constraintBottom_toTopOf="@+id/noiseOpacityTitle"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintHorizontal_bias="1.0"
+ app:layout_constraintStart_toStartOf="parent" />
+
+ <SeekBar
+ android:id="@+id/noiseOpacity"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="12dp"
+ android:layout_marginEnd="12dp"
+ android:layout_marginBottom="24dp"
+ android:max="100"
+ android:progress="15"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintHorizontal_bias="0.0"
+ app:layout_constraintStart_toStartOf="parent" />
+
+ <TextView
+ android:id="@+id/scrimOpacityTitle"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="24dp"
+ android:layout_marginBottom="8dp"
+ android:text="Scrim Opacity"
+ android:textColor="@android:color/white"
+ app:layout_constraintBottom_toTopOf="@+id/scrimOpacity"
+ app:layout_constraintStart_toStartOf="parent" />
+
+ <TextView
+ android:id="@+id/materialOpacityTitle"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="24dp"
+ android:layout_marginBottom="8dp"
+ android:text="Soft light Opacity"
+ android:textColor="@android:color/white"
+ app:layout_constraintBottom_toTopOf="@+id/materialOpacity"
+ app:layout_constraintStart_toStartOf="parent" />
+
+ <TextView
+ android:id="@+id/zoomTitle"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="24dp"
+ android:layout_marginBottom="8dp"
+ android:text="Zoom"
+ android:textColor="@android:color/white"
+ app:layout_constraintBottom_toTopOf="@+id/zoom"
+ app:layout_constraintStart_toStartOf="parent" />
+
+ <TextView
+ android:id="@+id/blurRadiusTitle"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="24dp"
+ android:layout_marginBottom="8dp"
+ android:text="Blur Radius"
+ android:textColor="@android:color/white"
+ app:layout_constraintBottom_toTopOf="@+id/blurRadius"
+ app:layout_constraintStart_toStartOf="parent" />
+
+ <TextView
+ android:id="@+id/noiseOpacityTitle"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="24dp"
+ android:layout_marginBottom="8dp"
+ android:textColor="@android:color/white"
+ android:text="Noise Opacity"
+ app:layout_constraintBottom_toTopOf="@+id/noiseOpacity"
+ app:layout_constraintStart_toStartOf="parent" />
+
+ <ImageView
+ android:id="@+id/background1"
+ android:layout_width="64dp"
+ android:layout_height="64dp"
+ android:layout_marginStart="24dp"
+ android:layout_marginBottom="16dp"
+ android:foreground="?android:attr/selectableItemBackgroundBorderless"
+ android:clickable="true"
+ android:onClick="onBackgroundClick"
+ android:scaleType="centerCrop"
+ app:layout_constraintBottom_toTopOf="@+id/lightMaterialSwitch"
+ app:layout_constraintStart_toStartOf="parent"
+ android:src="@drawable/background1" />
+
+ <ImageView
+ android:id="@+id/background2"
+ android:layout_width="64dp"
+ android:layout_height="64dp"
+ android:layout_marginStart="8dp"
+ android:foreground="?android:attr/selectableItemBackgroundBorderless"
+ android:clickable="true"
+ android:onClick="onBackgroundClick"
+ android:scaleType="centerCrop"
+ app:layout_constraintBottom_toBottomOf="@+id/background1"
+ app:layout_constraintStart_toEndOf="@+id/background1"
+ android:src="@drawable/background2" />
+
+ <ImageView
+ android:id="@+id/background3"
+ android:layout_width="64dp"
+ android:layout_height="64dp"
+ android:layout_marginStart="8dp"
+ android:scaleType="centerCrop"
+ android:foreground="?android:attr/selectableItemBackgroundBorderless"
+ android:clickable="true"
+ android:onClick="onBackgroundClick"
+ app:layout_constraintBottom_toBottomOf="@+id/background1"
+ app:layout_constraintStart_toEndOf="@+id/background2"
+ android:src="@drawable/background3" />
+
+ <Button
+ android:id="@+id/pickImage"
+ android:layout_width="64dp"
+ android:layout_height="64dp"
+ android:layout_marginStart="8dp"
+ android:scaleType="centerCrop"
+ android:foreground="?android:attr/selectableItemBackgroundBorderless"
+ android:clickable="true"
+ android:onClick="onPickImageClick"
+ app:layout_constraintBottom_toBottomOf="@+id/background1"
+ app:layout_constraintStart_toEndOf="@+id/background3"
+ android:text="Pick file" />
+
+ <Switch
+ android:id="@+id/lightMaterialSwitch"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="24dp"
+ android:layout_marginBottom="8dp"
+ android:text="Light Material"
+ app:layout_constraintBottom_toTopOf="@+id/zoomTitle"
+ app:layout_constraintStart_toStartOf="parent" />
+
+ <TextView
+ android:id="@+id/blurRadiusValue"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="TextView"
+ android:layout_marginLeft="8dp"
+ app:layout_constraintBottom_toBottomOf="@+id/blurRadiusTitle"
+ app:layout_constraintStart_toEndOf="@+id/blurRadiusTitle" />
+
+ <TextView
+ android:id="@+id/zoomValue"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="TextView"
+ android:layout_marginLeft="8dp"
+ app:layout_constraintBottom_toBottomOf="@+id/zoomTitle"
+ app:layout_constraintStart_toEndOf="@+id/zoomTitle" />
+
+ <TextView
+ android:id="@+id/materialOpacityValue"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="TextView"
+ android:layout_marginLeft="8dp"
+ app:layout_constraintBottom_toBottomOf="@+id/materialOpacityTitle"
+ app:layout_constraintStart_toEndOf="@+id/materialOpacityTitle" />
+
+ <TextView
+ android:id="@+id/noiseOpacityValue"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="TextView"
+ android:layout_marginLeft="8dp"
+ app:layout_constraintBottom_toBottomOf="@+id/noiseOpacityTitle"
+ app:layout_constraintStart_toEndOf="@+id/noiseOpacityTitle" />
+
+
+ <TextView
+ android:id="@+id/scrimOpacityValue"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="TextView"
+ android:layout_marginLeft="8dp"
+ app:layout_constraintBottom_toBottomOf="@+id/scrimOpacityTitle"
+ app:layout_constraintStart_toEndOf="@+id/scrimOpacityTitle" />
+
+ </androidx.constraintlayout.widget.ConstraintLayout>
+
+
+</androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/tests/net/java/com/android/server/connectivity/VpnTest.java b/tests/net/java/com/android/server/connectivity/VpnTest.java
index 7ab4d97..bc3db11 100644
--- a/tests/net/java/com/android/server/connectivity/VpnTest.java
+++ b/tests/net/java/com/android/server/connectivity/VpnTest.java
@@ -1155,7 +1155,7 @@
new String[] { EGRESS_IFACE, "l2tp", expectedAddr, "1701", profile.l2tpSecret,
"name", profile.username, "password", profile.password,
"linkname", "vpn", "refuse-eap", "nodefaultroute", "usepeerdns",
- "idle", "1800", "mtu", "1400", "mru", "1400" },
+ "idle", "1800", "mtu", "1270", "mru", "1270" },
deps.mtpdArgs.get(10, TimeUnit.SECONDS));
// Now wait for the runner to be ready before testing for the route.
legacyRunnerReady.block(10_000);
diff --git a/tests/vcn/OWNERS b/tests/vcn/OWNERS
new file mode 100644
index 0000000..33b9f0f
--- /dev/null
+++ b/tests/vcn/OWNERS
@@ -0,0 +1,7 @@
+set noparent
+
+benedictwong@google.com
+ckesting@google.com
+evitayan@google.com
+nharold@google.com
+jchalard@google.com
\ No newline at end of file