diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java index d7c6ddbb0c63e152924c432b50278ade6115b3ca..d7be2595e88ba496d897e5d21552ba3ae96ae987 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java +++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java @@ -472,7 +472,7 @@ public final class JobStatus { if (standbyBucket == RESTRICTED_INDEX) { addDynamicConstraints(DYNAMIC_RESTRICTED_CONSTRAINTS); } else { - mReadyDynamicSatisfied = true; + mReadyDynamicSatisfied = false; } mLastSuccessfulRunTime = lastSuccessfulRunTime; @@ -1132,8 +1132,8 @@ public final class JobStatus { } satisfiedConstraints = (satisfiedConstraints&~constraint) | (state ? constraint : 0); mSatisfiedConstraintsOfInterest = satisfiedConstraints & CONSTRAINTS_OF_INTEREST; - mReadyDynamicSatisfied = - mDynamicConstraints == (satisfiedConstraints & mDynamicConstraints); + mReadyDynamicSatisfied = mDynamicConstraints != 0 + && mDynamicConstraints == (satisfiedConstraints & mDynamicConstraints); if (STATS_LOG_ENABLED && (STATSD_CONSTRAINTS_TO_LOG & constraint) != 0) { FrameworkStatsLog.write_non_chained( FrameworkStatsLog.SCHEDULED_JOB_CONSTRAINT_CHANGED, @@ -1184,8 +1184,8 @@ public final class JobStatus { } mDynamicConstraints |= constraints; - mReadyDynamicSatisfied = - mDynamicConstraints == (satisfiedConstraints & mDynamicConstraints); + mReadyDynamicSatisfied = mDynamicConstraints != 0 + && mDynamicConstraints == (satisfiedConstraints & mDynamicConstraints); } /** @@ -1196,8 +1196,8 @@ public final class JobStatus { */ private void removeDynamicConstraints(int constraints) { mDynamicConstraints &= ~constraints; - mReadyDynamicSatisfied = - mDynamicConstraints == (satisfiedConstraints & mDynamicConstraints); + mReadyDynamicSatisfied = mDynamicConstraints != 0 + && mDynamicConstraints == (satisfiedConstraints & mDynamicConstraints); } public long getLastSuccessfulRunTime() { @@ -1241,8 +1241,8 @@ public final class JobStatus { break; default: satisfied |= constraint; - mReadyDynamicSatisfied = - mDynamicConstraints == (satisfied & mDynamicConstraints); + mReadyDynamicSatisfied = mDynamicConstraints != 0 + && mDynamicConstraints == (satisfied & mDynamicConstraints); break; } @@ -1262,8 +1262,8 @@ public final class JobStatus { mReadyWithinQuota = oldValue; break; default: - mReadyDynamicSatisfied = - mDynamicConstraints == (satisfiedConstraints & mDynamicConstraints); + mReadyDynamicSatisfied = mDynamicConstraints != 0 + && mDynamicConstraints == (satisfiedConstraints & mDynamicConstraints); break; } return toReturn; diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java index 8c55b50957da8406df80c5dc21cd7a095aee938a..d108f0b698f77c6b80d63e01b1177dae505525ff 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java +++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java @@ -241,10 +241,11 @@ public final class QuotaController extends StateController { + "bgJobCountInMaxPeriod=" + bgJobCountInMaxPeriod + ", " + "sessionCountInWindow=" + sessionCountInWindow + ", " + "inQuotaTime=" + inQuotaTimeElapsed + ", " - + "jobCountExpirationTime=" + jobRateLimitExpirationTimeElapsed + ", " - + "jobCountInRateLimitingWindow=" + jobCountInRateLimitingWindow + ", " - + "sessionCountExpirationTime=" + sessionRateLimitExpirationTimeElapsed + ", " - + "sessionCountInRateLimitingWindow=" + sessionCountInRateLimitingWindow; + + "rateLimitJobCountExpirationTime=" + jobRateLimitExpirationTimeElapsed + ", " + + "rateLimitJobCountWindow=" + jobCountInRateLimitingWindow + ", " + + "rateLimitSessionCountExpirationTime=" + + sessionRateLimitExpirationTimeElapsed + ", " + + "rateLimitSessionCountWindow=" + sessionCountInRateLimitingWindow; } @Override @@ -863,12 +864,19 @@ public final class QuotaController extends StateController { stats.executionTimeInMaxPeriodMs = 0; stats.bgJobCountInMaxPeriod = 0; stats.sessionCountInWindow = 0; - stats.inQuotaTimeElapsed = 0; + if (stats.jobCountLimit == 0 || stats.sessionCountLimit == 0) { + // App won't be in quota until configuration changes. + stats.inQuotaTimeElapsed = Long.MAX_VALUE; + } else { + stats.inQuotaTimeElapsed = 0; + } Timer timer = mPkgTimers.get(userId, packageName); final long nowElapsed = sElapsedRealtimeClock.millis(); stats.expirationTimeElapsed = nowElapsed + MAX_PERIOD_MS; if (timer != null && timer.isActive()) { + // Exclude active sessions from the session count so that new jobs aren't prevented + // from starting due to an app hitting the session limit. stats.executionTimeInWindowMs = stats.executionTimeInMaxPeriodMs = timer.getCurrentDuration(nowElapsed); stats.bgJobCountInWindow = stats.bgJobCountInMaxPeriod = timer.getBgJobCount(); @@ -883,6 +891,10 @@ public final class QuotaController extends StateController { stats.inQuotaTimeElapsed = Math.max(stats.inQuotaTimeElapsed, nowElapsed - mMaxExecutionTimeIntoQuotaMs + MAX_PERIOD_MS); } + if (stats.bgJobCountInWindow >= stats.jobCountLimit) { + stats.inQuotaTimeElapsed = Math.max(stats.inQuotaTimeElapsed, + nowElapsed + stats.windowSizeMs); + } } List sessions = mTimingSessions.get(userId, packageName); @@ -1303,6 +1315,13 @@ public final class QuotaController extends StateController { inQuotaTimeElapsed = Math.max(inQuotaTimeElapsed, stats.sessionRateLimitExpirationTimeElapsed); } + if (inQuotaTimeElapsed <= sElapsedRealtimeClock.millis()) { + final long nowElapsed = sElapsedRealtimeClock.millis(); + Slog.wtf(TAG, + "In quota time is " + (nowElapsed - inQuotaTimeElapsed) + "ms old. Now=" + + nowElapsed + ", inQuotaTime=" + inQuotaTimeElapsed + ": " + stats); + inQuotaTimeElapsed = nowElapsed + 5 * MINUTE_IN_MILLIS; + } mInQuotaAlarmListener.addAlarmLocked(userId, packageName, inQuotaTimeElapsed); } @@ -1916,8 +1935,8 @@ public final class QuotaController extends StateController { @GuardedBy("mLock") private void setNextAlarmLocked(long earliestTriggerElapsed) { if (mAlarmQueue.size() > 0) { - final long nextTriggerTimeElapsed = Math.max(earliestTriggerElapsed, - mAlarmQueue.peek().second); + final Pair alarm = mAlarmQueue.peek(); + final long nextTriggerTimeElapsed = Math.max(earliestTriggerElapsed, alarm.second); // Only schedule the alarm if one of the following is true: // 1. There isn't one currently scheduled // 2. The new alarm is significantly earlier than the previous alarm. If it's @@ -1928,7 +1947,8 @@ public final class QuotaController extends StateController { || nextTriggerTimeElapsed < mTriggerTimeElapsed - 3 * MINUTE_IN_MILLIS || mTriggerTimeElapsed < nextTriggerTimeElapsed) { if (DEBUG) { - Slog.d(TAG, "Scheduling start alarm at " + nextTriggerTimeElapsed); + Slog.d(TAG, "Scheduling start alarm at " + nextTriggerTimeElapsed + + " for app " + alarm.first); } mAlarmManager.set(AlarmManager.ELAPSED_REALTIME, nextTriggerTimeElapsed, ALARM_TAG_QUOTA_CHECK, this, mHandler); diff --git a/apex/media/framework/java/android/media/MediaParser.java b/apex/media/framework/java/android/media/MediaParser.java index 2746cba7688707b5f454c5c2be4db8a332a89ece..d22e998f6cabe11041422acd178414b84f0e67f2 100644 --- a/apex/media/framework/java/android/media/MediaParser.java +++ b/apex/media/framework/java/android/media/MediaParser.java @@ -120,7 +120,7 @@ import java.util.UUID; * @Override * public void onTrackDataFound(int i, @NonNull TrackData trackData) { * MediaFormat mediaFormat = trackData.mediaFormat; - * if (videoTrackIndex == -1 && + * if (videoTrackIndex == -1 && * mediaFormat * .getString(MediaFormat.KEY_MIME, /* defaultValue= */ "") * .startsWith("video/")) { @@ -178,7 +178,7 @@ import java.util.UUID; * * private void ensureSpaceInBuffer(int numberOfBytesToRead) { * int requiredLength = bytesWrittenCount + numberOfBytesToRead; - * if (requiredLength > sampleDataBuffer.length) { + * if (requiredLength > sampleDataBuffer.length) { * sampleDataBuffer = Arrays.copyOf(sampleDataBuffer, requiredLength); * } * } diff --git a/apex/sdkextensions/framework/java/android/os/ext/SdkExtensions.java b/apex/sdkextensions/framework/java/android/os/ext/SdkExtensions.java index c268ff4291e4462974d2a5d08cdd11d1e590c3f1..6c25f2849ceaa810f0a5251f2717ff74e0555b88 100644 --- a/apex/sdkextensions/framework/java/android/os/ext/SdkExtensions.java +++ b/apex/sdkextensions/framework/java/android/os/ext/SdkExtensions.java @@ -38,6 +38,9 @@ public class SdkExtensions { private static final int R_EXTENSION_INT; static { + // Note: when adding more extension versions, the logic that records current + // extension versions when saving a rollback must also be updated. + // At the time of writing this is in RollbackManagerServiceImpl#getExtensionVersions() R_EXTENSION_INT = SystemProperties.getInt("build.version.extensions.r", 0); } diff --git a/api/test-current.txt b/api/test-current.txt index 5df84ec97bf7a523f5a8b3e30e8032192b03cb9f..44fb63017ace87dbedeedf99d73c965146319050 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -732,6 +732,11 @@ package android.app.role { method public void onRoleHoldersChanged(@NonNull String, @NonNull android.os.UserHandle); } + public class RoleControllerManager { + method @RequiresPermission("android.permission.MANAGE_ROLE_HOLDERS") public void isApplicationVisibleForRole(@NonNull String, @NonNull String, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer); + method @RequiresPermission("android.permission.MANAGE_ROLE_HOLDERS") public void isRoleVisible(@NonNull String, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer); + } + public final class RoleManager { method @RequiresPermission("android.permission.OBSERVE_ROLE_HOLDERS") public void addOnRoleHoldersChangedListenerAsUser(@NonNull java.util.concurrent.Executor, @NonNull android.app.role.OnRoleHoldersChangedListener, @NonNull android.os.UserHandle); method @RequiresPermission("android.permission.MANAGE_ROLE_HOLDERS") public void addRoleHolderAsUser(@NonNull String, @NonNull String, int, @NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer); @@ -5272,18 +5277,19 @@ package android.widget { package android.window { public final class DisplayAreaInfo implements android.os.Parcelable { - ctor public DisplayAreaInfo(@NonNull android.window.WindowContainerToken, int); + ctor public DisplayAreaInfo(@NonNull android.window.WindowContainerToken, int, int); method public int describeContents(); method public void writeToParcel(@NonNull android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator CREATOR; field @NonNull public final android.content.res.Configuration configuration; field public final int displayId; + field public final int featureId; field @NonNull public final android.window.WindowContainerToken token; } public class DisplayAreaOrganizer extends android.window.WindowOrganizer { ctor public DisplayAreaOrganizer(); - method public void onDisplayAreaAppeared(@NonNull android.window.DisplayAreaInfo); + method public void onDisplayAreaAppeared(@NonNull android.window.DisplayAreaInfo, @NonNull android.view.SurfaceControl); method public void onDisplayAreaVanished(@NonNull android.window.DisplayAreaInfo); method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public void registerOrganizer(int); field public static final int FEATURE_DEFAULT_TASK_CONTAINER = 1; // 0x1 @@ -5303,7 +5309,7 @@ package android.window { method @Nullable @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public static android.window.WindowContainerToken getImeTarget(int); method @Nullable @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public static java.util.List getRootTasks(int, @NonNull int[]); method @BinderThread public void onBackPressedOnTaskRoot(@NonNull android.app.ActivityManager.RunningTaskInfo); - method @BinderThread public void onTaskAppeared(@NonNull android.app.ActivityManager.RunningTaskInfo); + method @BinderThread public void onTaskAppeared(@NonNull android.app.ActivityManager.RunningTaskInfo, @NonNull android.view.SurfaceControl); method @BinderThread public void onTaskInfoChanged(@NonNull android.app.ActivityManager.RunningTaskInfo); method @BinderThread public void onTaskVanished(@NonNull android.app.ActivityManager.RunningTaskInfo); method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public final void registerOrganizer(int); @@ -5314,7 +5320,6 @@ package android.window { public final class WindowContainerToken implements android.os.Parcelable { method public int describeContents(); - method @Nullable public android.view.SurfaceControl getLeash(); method public void writeToParcel(@NonNull android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator CREATOR; } diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto index 8d756281c431c1250744b2f48dd1d7268b09b1eb..674978b50d91a88d2b69a6067081fe7e8098a156 100644 --- a/cmds/statsd/src/atoms.proto +++ b/cmds/statsd/src/atoms.proto @@ -426,7 +426,7 @@ message Atom { UserLifecycleEventOccurred user_lifecycle_event_occurred = 265 [(module) = "framework"]; AccessibilityShortcutReported accessibility_shortcut_reported = 266 [(module) = "framework"]; - AccessibilityServiceReported accessibility_service_reported = 267 [(module) = "framework"]; + AccessibilityServiceReported accessibility_service_reported = 267 [(module) = "settings"]; SdkExtensionStatus sdk_extension_status = 354; // StatsdStats tracks platform atoms with ids upto 500. @@ -454,9 +454,9 @@ message Atom { BluetoothActivityInfo bluetooth_activity_info = 10007 [(module) = "framework"]; ProcessMemoryState process_memory_state = 10013 [(module) = "framework"]; SystemElapsedRealtime system_elapsed_realtime = 10014 [(module) = "framework"]; - SystemUptime system_uptime = 10015 [(module) = "framework", (module) = "statsdtest"]; + SystemUptime system_uptime = 10015 [(module) = "framework"]; CpuActiveTime cpu_active_time = 10016 [(module) = "framework", (module) = "statsdtest"]; - CpuClusterTime cpu_cluster_time = 10017 [(module) = "framework", (module) = "statsdtest"]; + CpuClusterTime cpu_cluster_time = 10017 [(module) = "framework"]; DiskSpace disk_space = 10018 [deprecated=true, (module) = "statsdtest"]; RemainingBatteryCapacity remaining_battery_capacity = 10019 [(module) = "framework"]; FullBatteryCapacity full_battery_capacity = 10020 [(module) = "framework"]; @@ -9453,7 +9453,7 @@ message UserLifecycleEventOccurred { * Logs when accessibility shortcut clicked. * * Logged from: - * frameworks/base/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java + * frameworks/base/services/accessibility/java/com/android/server/accessibility */ message AccessibilityShortcutReported { // The accessibility feature(including installed a11y service, framework a11y feature, @@ -9473,7 +9473,7 @@ message AccessibilityShortcutReported { * Logs when accessibility service status changed. * * Logged from: - * frameworks/base/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java + * packages/apps/Settings/src/com/android/settings/accessibility */ message AccessibilityServiceReported { // The accessibility service package name. diff --git a/cmds/statsd/src/logd/LogEvent.cpp b/cmds/statsd/src/logd/LogEvent.cpp index 10b1059796a02db3a6788e8f16a80ce2d65f0f5b..8ec0173ce461b16a3307de5217cd29f0fae97fe1 100644 --- a/cmds/statsd/src/logd/LogEvent.cpp +++ b/cmds/statsd/src/logd/LogEvent.cpp @@ -227,8 +227,8 @@ void LogEvent::parseAttributionChain(int32_t* pos, int32_t depth, bool* last, } // Check if at least one node was successfully parsed. if (mValues.size() - 1 > firstUidInChainIndex) { - mAttributionChainStartIndex = firstUidInChainIndex; - mAttributionChainEndIndex = mValues.size() - 1; + mAttributionChainStartIndex = static_cast(firstUidInChainIndex); + mAttributionChainEndIndex = static_cast(mValues.size() - 1); } parseAnnotations(numAnnotations, firstUidInChainIndex); @@ -249,7 +249,7 @@ void LogEvent::parseIsUidAnnotation(uint8_t annotationType) { } bool isUid = readNextValue(); - if (isUid) mUidFieldIndex = mValues.size() - 1; + if (isUid) mUidFieldIndex = static_cast(mValues.size() - 1); mValues[mValues.size() - 1].mAnnotations.setUidField(isUid); } @@ -290,7 +290,7 @@ void LogEvent::parseExclusiveStateAnnotation(uint8_t annotationType) { } const bool exclusiveState = readNextValue(); - mExclusiveStateFieldIndex = mValues.size() - 1; + mExclusiveStateFieldIndex = static_cast(mValues.size() - 1); mValues[getExclusiveStateFieldIndex()].mAnnotations.setExclusiveState(exclusiveState); } @@ -408,7 +408,7 @@ bool LogEvent::parseBuffer(uint8_t* buf, size_t len) { parseAttributionChain(pos, /*depth=*/0, last, getNumAnnotations(typeInfo)); break; case ERROR_TYPE: - mErrorBitmask = readNextValue(); + /* mErrorBitmask =*/ readNextValue(); mValid = false; break; default: @@ -577,8 +577,8 @@ bool LogEvent::hasAttributionChain(std::pair* indexRange) const { } if (nullptr != indexRange) { - indexRange->first = mAttributionChainStartIndex; - indexRange->second = mAttributionChainEndIndex; + indexRange->first = static_cast(mAttributionChainStartIndex); + indexRange->second = static_cast(mAttributionChainEndIndex); } return true; diff --git a/cmds/statsd/src/logd/LogEvent.h b/cmds/statsd/src/logd/LogEvent.h index 731b9661067a3f05fbd8991b47d7f2281d555eca..53fb5d93e3acdcf4da5fce2c5baa7678e0a63485 100644 --- a/cmds/statsd/src/logd/LogEvent.h +++ b/cmds/statsd/src/logd/LogEvent.h @@ -160,7 +160,7 @@ public: // } // Note that atomIndex is 1-indexed. inline int getUidFieldIndex() { - return mUidFieldIndex; + return static_cast(mUidFieldIndex); } // Returns whether this LogEvent has an AttributionChain. @@ -179,7 +179,7 @@ public: // } // Note that atomIndex is 1-indexed. inline int getExclusiveStateFieldIndex() const { - return mExclusiveStateFieldIndex; + return static_cast(mExclusiveStateFieldIndex); } // If a reset state is not sent in the StatsEvent, returns -1. Note that a @@ -212,10 +212,6 @@ public: return mValid; } - int32_t getErrorBitmask() const { - return mErrorBitmask; - } - private: /** * Only use this if copy is absolutely needed. @@ -316,16 +312,16 @@ private: // The pid of the logging client (defaults to -1). int32_t mLogPid = -1; - // Bitmask of errors sent by StatsEvent/AStatsEvent. - int32_t mErrorBitmask = 0; - // Annotations bool mTruncateTimestamp = false; - int mUidFieldIndex = -1; - int mAttributionChainStartIndex = -1; - int mAttributionChainEndIndex = -1; - int mExclusiveStateFieldIndex = -1; int mResetState = -1; + + // Indexes within the FieldValue vector can be stored in 7 bits because + // that's the assumption enforced by the encoding used in FieldValue. + int8_t mUidFieldIndex = -1; + int8_t mAttributionChainStartIndex = -1; + int8_t mAttributionChainEndIndex = -1; + int8_t mExclusiveStateFieldIndex = -1; }; void writeExperimentIdsToProto(const std::vector& experimentIds, std::vector* protoOut); diff --git a/cmds/statsd/tests/StatsLogProcessor_test.cpp b/cmds/statsd/tests/StatsLogProcessor_test.cpp index b809286da5f4e3b55b68eeef416853e062030a20..e6144c52c43673201b1f7e57fd8c18851cf7f1cc 100644 --- a/cmds/statsd/tests/StatsLogProcessor_test.cpp +++ b/cmds/statsd/tests/StatsLogProcessor_test.cpp @@ -1691,6 +1691,111 @@ TEST(StatsLogProcessorTest, TestActivationsPersistAcrossSystemServerRestart) { &buffer); } +TEST(StatsLogProcessorTest_mapIsolatedUidToHostUid, LogHostUid) { + int hostUid = 20; + int isolatedUid = 30; + uint64_t eventTimeNs = 12355; + int atomId = 89; + int field1 = 90; + int field2 = 28; + sp mockUidMap = makeMockUidMapForOneHost(hostUid, {isolatedUid}); + ConfigKey cfgKey; + StatsdConfig config = MakeConfig(false); + sp processor = + CreateStatsLogProcessor(1, 1, config, cfgKey, nullptr, 0, mockUidMap); + + shared_ptr logEvent = makeUidLogEvent(atomId, eventTimeNs, hostUid, field1, field2); + + processor->OnLogEvent(logEvent.get()); + + const vector* actualFieldValues = &logEvent->getValues(); + EXPECT_EQ(3, actualFieldValues->size()); + EXPECT_EQ(hostUid, actualFieldValues->at(0).mValue.int_value); + EXPECT_EQ(field1, actualFieldValues->at(1).mValue.int_value); + EXPECT_EQ(field2, actualFieldValues->at(2).mValue.int_value); +} + +TEST(StatsLogProcessorTest_mapIsolatedUidToHostUid, LogIsolatedUid) { + int hostUid = 20; + int isolatedUid = 30; + uint64_t eventTimeNs = 12355; + int atomId = 89; + int field1 = 90; + int field2 = 28; + sp mockUidMap = makeMockUidMapForOneHost(hostUid, {isolatedUid}); + ConfigKey cfgKey; + StatsdConfig config = MakeConfig(false); + sp processor = + CreateStatsLogProcessor(1, 1, config, cfgKey, nullptr, 0, mockUidMap); + + shared_ptr logEvent = + makeUidLogEvent(atomId, eventTimeNs, isolatedUid, field1, field2); + + processor->OnLogEvent(logEvent.get()); + + const vector* actualFieldValues = &logEvent->getValues(); + EXPECT_EQ(3, actualFieldValues->size()); + EXPECT_EQ(hostUid, actualFieldValues->at(0).mValue.int_value); + EXPECT_EQ(field1, actualFieldValues->at(1).mValue.int_value); + EXPECT_EQ(field2, actualFieldValues->at(2).mValue.int_value); +} + +TEST(StatsLogProcessorTest_mapIsolatedUidToHostUid, LogHostUidAttributionChain) { + int hostUid = 20; + int isolatedUid = 30; + uint64_t eventTimeNs = 12355; + int atomId = 89; + int field1 = 90; + int field2 = 28; + sp mockUidMap = makeMockUidMapForOneHost(hostUid, {isolatedUid}); + ConfigKey cfgKey; + StatsdConfig config = MakeConfig(false); + sp processor = + CreateStatsLogProcessor(1, 1, config, cfgKey, nullptr, 0, mockUidMap); + + shared_ptr logEvent = makeAttributionLogEvent(atomId, eventTimeNs, {hostUid, 200}, + {"tag1", "tag2"}, field1, field2); + + processor->OnLogEvent(logEvent.get()); + + const vector* actualFieldValues = &logEvent->getValues(); + EXPECT_EQ(6, actualFieldValues->size()); + EXPECT_EQ(hostUid, actualFieldValues->at(0).mValue.int_value); + EXPECT_EQ("tag1", actualFieldValues->at(1).mValue.str_value); + EXPECT_EQ(200, actualFieldValues->at(2).mValue.int_value); + EXPECT_EQ("tag2", actualFieldValues->at(3).mValue.str_value); + EXPECT_EQ(field1, actualFieldValues->at(4).mValue.int_value); + EXPECT_EQ(field2, actualFieldValues->at(5).mValue.int_value); +} + +TEST(StatsLogProcessorTest_mapIsolatedUidToHostUid, LogIsolatedUidAttributionChain) { + int hostUid = 20; + int isolatedUid = 30; + uint64_t eventTimeNs = 12355; + int atomId = 89; + int field1 = 90; + int field2 = 28; + sp mockUidMap = makeMockUidMapForOneHost(hostUid, {isolatedUid}); + ConfigKey cfgKey; + StatsdConfig config = MakeConfig(false); + sp processor = + CreateStatsLogProcessor(1, 1, config, cfgKey, nullptr, 0, mockUidMap); + + shared_ptr logEvent = makeAttributionLogEvent(atomId, eventTimeNs, {isolatedUid, 200}, + {"tag1", "tag2"}, field1, field2); + + processor->OnLogEvent(logEvent.get()); + + const vector* actualFieldValues = &logEvent->getValues(); + EXPECT_EQ(6, actualFieldValues->size()); + EXPECT_EQ(hostUid, actualFieldValues->at(0).mValue.int_value); + EXPECT_EQ("tag1", actualFieldValues->at(1).mValue.str_value); + EXPECT_EQ(200, actualFieldValues->at(2).mValue.int_value); + EXPECT_EQ("tag2", actualFieldValues->at(3).mValue.str_value); + EXPECT_EQ(field1, actualFieldValues->at(4).mValue.int_value); + EXPECT_EQ(field2, actualFieldValues->at(5).mValue.int_value); +} + #else GTEST_LOG_(INFO) << "This test does nothing.\n"; #endif diff --git a/cmds/statsd/tests/anomaly/AnomalyTracker_test.cpp b/cmds/statsd/tests/anomaly/AnomalyTracker_test.cpp index c10703c36b98179ab3aaad750a0e771c9b5505be..6bde79f52e33c336779c546d7bd7720768c9fa73 100644 --- a/cmds/statsd/tests/anomaly/AnomalyTracker_test.cpp +++ b/cmds/statsd/tests/anomaly/AnomalyTracker_test.cpp @@ -13,13 +13,15 @@ // limitations under the License. #include "src/anomaly/AnomalyTracker.h" -#include "../metrics/metrics_test_helper.h" #include #include #include + #include +#include "tests/statsd_test_util.h" + using namespace testing; using android::sp; using std::set; diff --git a/cmds/statsd/tests/external/puller_util_test.cpp b/cmds/statsd/tests/external/puller_util_test.cpp index c2cfb371d329eea57fe3a2558e817f85d1764e5e..a21dc8717776ec34932b2e3c2c6997a8b02ca570 100644 --- a/cmds/statsd/tests/external/puller_util_test.cpp +++ b/cmds/statsd/tests/external/puller_util_test.cpp @@ -21,9 +21,9 @@ #include #include "../metrics/metrics_test_helper.h" +#include "FieldValue.h" #include "annotations.h" #include "stats_event.h" -#include "statslog_statsdtest.h" #include "tests/statsd_test_util.h" #ifdef __ANDROID__ @@ -33,207 +33,371 @@ namespace os { namespace statsd { using namespace testing; -using std::make_shared; using std::shared_ptr; using std::vector; -using testing::Contains; /* * Test merge isolated and host uid */ namespace { -int uidAtomTagId = util::CPU_CLUSTER_TIME; -const vector uidAdditiveFields = {3}; -int nonUidAtomTagId = util::SYSTEM_UPTIME; -int timestamp = 1234; -int isolatedUid = 30; -int isolatedAdditiveData = 31; -int isolatedNonAdditiveData = 32; -int hostUid = 20; -int hostAdditiveData = 21; -int hostNonAdditiveData = 22; - -void extractIntoVector(vector> events, - vector>& ret) { - ret.clear(); - status_t err; - for (const auto& event : events) { - vector vec; - vec.push_back(event->GetInt(1, &err)); - vec.push_back(event->GetInt(2, &err)); - vec.push_back(event->GetInt(3, &err)); - ret.push_back(vec); - } +const int uidAtomTagId = 100; +const vector additiveFields = {3}; +const int nonUidAtomTagId = 200; +const int timestamp = 1234; +const int isolatedUid1 = 30; +const int isolatedUid2 = 40; +const int isolatedNonAdditiveData = 32; +const int isolatedAdditiveData = 31; +const int hostUid = 20; +const int hostNonAdditiveData = 22; +const int hostAdditiveData = 21; +const int attributionAtomTagId = 300; + +sp makeMockUidMap() { + return makeMockUidMapForOneHost(hostUid, {isolatedUid1, isolatedUid2}); } -std::shared_ptr makeUidLogEvent(uint64_t timestampNs, int uid, int data1, int data2) { - AStatsEvent* statsEvent = AStatsEvent_obtain(); - AStatsEvent_setAtomId(statsEvent, uidAtomTagId); - AStatsEvent_overwriteTimestamp(statsEvent, timestampNs); - - AStatsEvent_writeInt32(statsEvent, uid); - AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_IS_UID, true); - AStatsEvent_writeInt32(statsEvent, data1); - AStatsEvent_writeInt32(statsEvent, data2); +} // anonymous namespace - std::shared_ptr logEvent = std::make_unique(/*uid=*/0, /*pid=*/0); - parseStatsEventToLogEvent(statsEvent, logEvent.get()); - return logEvent; +TEST(PullerUtilTest, MergeNoDimension) { + vector> data = { + // 30->22->31 + makeUidLogEvent(uidAtomTagId, timestamp, isolatedUid1, hostNonAdditiveData, + isolatedAdditiveData), + + // 20->22->21 + makeUidLogEvent(uidAtomTagId, timestamp, hostUid, hostNonAdditiveData, + hostAdditiveData), + }; + + sp uidMap = makeMockUidMap(); + mapAndMergeIsolatedUidsToHostUid(data, uidMap, uidAtomTagId, additiveFields); + + ASSERT_EQ(1, (int)data.size()); + const vector* actualFieldValues = &data[0]->getValues(); + ASSERT_EQ(3, actualFieldValues->size()); + EXPECT_EQ(hostUid, actualFieldValues->at(0).mValue.int_value); + EXPECT_EQ(hostNonAdditiveData, actualFieldValues->at(1).mValue.int_value); + EXPECT_EQ(isolatedAdditiveData + hostAdditiveData, actualFieldValues->at(2).mValue.int_value); } -std::shared_ptr makeNonUidAtomLogEvent(uint64_t timestampNs, int data1) { - AStatsEvent* statsEvent = AStatsEvent_obtain(); - AStatsEvent_setAtomId(statsEvent, nonUidAtomTagId); - AStatsEvent_overwriteTimestamp(statsEvent, timestampNs); - AStatsEvent_writeInt32(statsEvent, data1); - - std::shared_ptr logEvent = std::make_unique(/*uid=*/0, /*pid=*/0); - parseStatsEventToLogEvent(statsEvent, logEvent.get()); - return logEvent; +TEST(PullerUtilTest, MergeWithDimension) { + vector> data = { + // 30->32->31 + makeUidLogEvent(uidAtomTagId, timestamp, isolatedUid1, isolatedNonAdditiveData, + isolatedAdditiveData), + + // 20->32->21 + makeUidLogEvent(uidAtomTagId, timestamp, hostUid, isolatedNonAdditiveData, + hostAdditiveData), + + // 20->22->21 + makeUidLogEvent(uidAtomTagId, timestamp, hostUid, hostNonAdditiveData, + hostAdditiveData), + }; + + sp uidMap = makeMockUidMap(); + mapAndMergeIsolatedUidsToHostUid(data, uidMap, uidAtomTagId, additiveFields); + + ASSERT_EQ(2, (int)data.size()); + + const vector* actualFieldValues = &data[0]->getValues(); + ASSERT_EQ(3, actualFieldValues->size()); + EXPECT_EQ(hostUid, actualFieldValues->at(0).mValue.int_value); + EXPECT_EQ(hostNonAdditiveData, actualFieldValues->at(1).mValue.int_value); + EXPECT_EQ(hostAdditiveData, actualFieldValues->at(2).mValue.int_value); + + actualFieldValues = &data[1]->getValues(); + ASSERT_EQ(3, actualFieldValues->size()); + EXPECT_EQ(hostUid, actualFieldValues->at(0).mValue.int_value); + EXPECT_EQ(isolatedNonAdditiveData, actualFieldValues->at(1).mValue.int_value); + EXPECT_EQ(hostAdditiveData + isolatedAdditiveData, actualFieldValues->at(2).mValue.int_value); } -} // anonymous namespace - -TEST(puller_util, MergeNoDimension) { - vector> inputData; - - // 30->22->31 - inputData.push_back( - makeUidLogEvent(timestamp, isolatedUid, hostNonAdditiveData, isolatedAdditiveData)); - - // 20->22->21 - inputData.push_back(makeUidLogEvent(timestamp, hostUid, hostNonAdditiveData, hostAdditiveData)); - - sp uidMap = new NaggyMock(); - EXPECT_CALL(*uidMap, getHostUidOrSelf(isolatedUid)).WillRepeatedly(Return(hostUid)); - EXPECT_CALL(*uidMap, getHostUidOrSelf(Ne(isolatedUid))).WillRepeatedly(ReturnArg<0>()); - mapAndMergeIsolatedUidsToHostUid(inputData, uidMap, uidAtomTagId, uidAdditiveFields); - - vector> actual; - extractIntoVector(inputData, actual); - vector expectedV1 = {20, 22, 52}; - EXPECT_EQ(1, (int)actual.size()); - EXPECT_THAT(actual, Contains(expectedV1)); +TEST(PullerUtilTest, NoMergeHostUidOnly) { + vector> data = { + // 20->32->31 + makeUidLogEvent(uidAtomTagId, timestamp, hostUid, isolatedNonAdditiveData, + isolatedAdditiveData), + + // 20->22->21 + makeUidLogEvent(uidAtomTagId, timestamp, hostUid, hostNonAdditiveData, + hostAdditiveData), + }; + + sp uidMap = makeMockUidMap(); + mapAndMergeIsolatedUidsToHostUid(data, uidMap, uidAtomTagId, additiveFields); + + ASSERT_EQ(2, (int)data.size()); + + const vector* actualFieldValues = &data[0]->getValues(); + ASSERT_EQ(3, actualFieldValues->size()); + EXPECT_EQ(hostUid, actualFieldValues->at(0).mValue.int_value); + EXPECT_EQ(hostNonAdditiveData, actualFieldValues->at(1).mValue.int_value); + EXPECT_EQ(hostAdditiveData, actualFieldValues->at(2).mValue.int_value); + + actualFieldValues = &data[1]->getValues(); + ASSERT_EQ(3, actualFieldValues->size()); + EXPECT_EQ(hostUid, actualFieldValues->at(0).mValue.int_value); + EXPECT_EQ(isolatedNonAdditiveData, actualFieldValues->at(1).mValue.int_value); + EXPECT_EQ(isolatedAdditiveData, actualFieldValues->at(2).mValue.int_value); } -TEST(puller_util, MergeWithDimension) { - vector> inputData; - - // 30->32->31 - inputData.push_back( - makeUidLogEvent(timestamp, isolatedUid, isolatedNonAdditiveData, isolatedAdditiveData)); +TEST(PullerUtilTest, IsolatedUidOnly) { + vector> data = { + // 30->32->31 + makeUidLogEvent(uidAtomTagId, timestamp, isolatedUid1, isolatedNonAdditiveData, + isolatedAdditiveData), - // 20->32->21 - inputData.push_back( - makeUidLogEvent(timestamp, hostUid, isolatedNonAdditiveData, hostAdditiveData)); + // 30->22->21 + makeUidLogEvent(uidAtomTagId, timestamp, isolatedUid1, hostNonAdditiveData, + hostAdditiveData), + }; - // 20->22->21 - inputData.push_back(makeUidLogEvent(timestamp, hostUid, hostNonAdditiveData, hostAdditiveData)); - - sp uidMap = new NaggyMock(); - EXPECT_CALL(*uidMap, getHostUidOrSelf(isolatedUid)).WillRepeatedly(Return(hostUid)); - EXPECT_CALL(*uidMap, getHostUidOrSelf(Ne(isolatedUid))).WillRepeatedly(ReturnArg<0>()); - mapAndMergeIsolatedUidsToHostUid(inputData, uidMap, uidAtomTagId, uidAdditiveFields); - - vector> actual; - extractIntoVector(inputData, actual); - vector expectedV1 = {20, 22, 21}; - vector expectedV2 = {20, 32, 52}; - EXPECT_EQ(2, (int)actual.size()); - EXPECT_THAT(actual, Contains(expectedV1)); - EXPECT_THAT(actual, Contains(expectedV2)); -} + sp uidMap = makeMockUidMap(); + mapAndMergeIsolatedUidsToHostUid(data, uidMap, uidAtomTagId, additiveFields); -TEST(puller_util, NoMergeHostUidOnly) { - vector> inputData; + ASSERT_EQ(2, (int)data.size()); // 20->32->31 - inputData.push_back( - makeUidLogEvent(timestamp, hostUid, isolatedNonAdditiveData, isolatedAdditiveData)); + const vector* actualFieldValues = &data[0]->getValues(); + ASSERT_EQ(3, actualFieldValues->size()); + EXPECT_EQ(hostUid, actualFieldValues->at(0).mValue.int_value); + EXPECT_EQ(hostNonAdditiveData, actualFieldValues->at(1).mValue.int_value); + EXPECT_EQ(hostAdditiveData, actualFieldValues->at(2).mValue.int_value); // 20->22->21 - inputData.push_back(makeUidLogEvent(timestamp, hostUid, hostNonAdditiveData, hostAdditiveData)); - - sp uidMap = new NaggyMock(); - EXPECT_CALL(*uidMap, getHostUidOrSelf(isolatedUid)).WillRepeatedly(Return(hostUid)); - EXPECT_CALL(*uidMap, getHostUidOrSelf(Ne(isolatedUid))).WillRepeatedly(ReturnArg<0>()); - mapAndMergeIsolatedUidsToHostUid(inputData, uidMap, uidAtomTagId, uidAdditiveFields); - - // 20->32->31 - // 20->22->21 - vector> actual; - extractIntoVector(inputData, actual); - vector expectedV1 = {20, 32, 31}; - vector expectedV2 = {20, 22, 21}; - EXPECT_EQ(2, (int)actual.size()); - EXPECT_THAT(actual, Contains(expectedV1)); - EXPECT_THAT(actual, Contains(expectedV2)); + actualFieldValues = &data[1]->getValues(); + ASSERT_EQ(3, actualFieldValues->size()); + EXPECT_EQ(hostUid, actualFieldValues->at(0).mValue.int_value); + EXPECT_EQ(isolatedNonAdditiveData, actualFieldValues->at(1).mValue.int_value); + EXPECT_EQ(isolatedAdditiveData, actualFieldValues->at(2).mValue.int_value); } -TEST(puller_util, IsolatedUidOnly) { - vector> inputData; +TEST(PullerUtilTest, MultipleIsolatedUidToOneHostUid) { + vector> data = { + // 30->32->31 + makeUidLogEvent(uidAtomTagId, timestamp, isolatedUid1, isolatedNonAdditiveData, + isolatedAdditiveData), - // 30->32->31 - inputData.push_back( - makeUidLogEvent(timestamp, hostUid, isolatedNonAdditiveData, isolatedAdditiveData)); + // 31->32->21 + makeUidLogEvent(uidAtomTagId, timestamp, isolatedUid2, isolatedNonAdditiveData, + hostAdditiveData), - // 30->22->21 - inputData.push_back(makeUidLogEvent(timestamp, hostUid, hostNonAdditiveData, hostAdditiveData)); + // 20->32->21 + makeUidLogEvent(uidAtomTagId, timestamp, hostUid, isolatedNonAdditiveData, + hostAdditiveData), + }; - sp uidMap = new NaggyMock(); - EXPECT_CALL(*uidMap, getHostUidOrSelf(isolatedUid)).WillRepeatedly(Return(hostUid)); - EXPECT_CALL(*uidMap, getHostUidOrSelf(Ne(isolatedUid))).WillRepeatedly(ReturnArg<0>()); - mapAndMergeIsolatedUidsToHostUid(inputData, uidMap, uidAtomTagId, uidAdditiveFields); + sp uidMap = makeMockUidMap(); + mapAndMergeIsolatedUidsToHostUid(data, uidMap, uidAtomTagId, additiveFields); - // 20->32->31 - // 20->22->21 - vector> actual; - extractIntoVector(inputData, actual); - vector expectedV1 = {20, 32, 31}; - vector expectedV2 = {20, 22, 21}; - EXPECT_EQ(2, (int)actual.size()); - EXPECT_THAT(actual, Contains(expectedV1)); - EXPECT_THAT(actual, Contains(expectedV2)); + ASSERT_EQ(1, (int)data.size()); + + const vector* actualFieldValues = &data[0]->getValues(); + ASSERT_EQ(3, actualFieldValues->size()); + EXPECT_EQ(hostUid, actualFieldValues->at(0).mValue.int_value); + EXPECT_EQ(isolatedNonAdditiveData, actualFieldValues->at(1).mValue.int_value); + EXPECT_EQ(isolatedAdditiveData + hostAdditiveData + hostAdditiveData, + actualFieldValues->at(2).mValue.int_value); } -TEST(puller_util, MultipleIsolatedUidToOneHostUid) { - vector> inputData; +TEST(PullerUtilTest, NoNeedToMerge) { + vector> data = { + // 32->31 + CreateTwoValueLogEvent(nonUidAtomTagId, timestamp, isolatedNonAdditiveData, + isolatedAdditiveData), - // 30->32->31 - inputData.push_back( - makeUidLogEvent(timestamp, isolatedUid, isolatedNonAdditiveData, isolatedAdditiveData)); + // 22->21 + CreateTwoValueLogEvent(nonUidAtomTagId, timestamp, hostNonAdditiveData, + hostAdditiveData), - // 31->32->21 - inputData.push_back( - makeUidLogEvent(timestamp, isolatedUid + 1, isolatedNonAdditiveData, hostAdditiveData)); + }; - // 20->32->21 - inputData.push_back( - makeUidLogEvent(timestamp, hostUid, isolatedNonAdditiveData, hostAdditiveData)); + sp uidMap = makeMockUidMap(); + mapAndMergeIsolatedUidsToHostUid(data, uidMap, nonUidAtomTagId, {} /*no additive fields*/); - sp uidMap = new NaggyMock(); - EXPECT_CALL(*uidMap, getHostUidOrSelf(_)).WillRepeatedly(Return(hostUid)); - mapAndMergeIsolatedUidsToHostUid(inputData, uidMap, uidAtomTagId, uidAdditiveFields); + ASSERT_EQ(2, (int)data.size()); - vector> actual; - extractIntoVector(inputData, actual); - vector expectedV1 = {20, 32, 73}; - EXPECT_EQ(1, (int)actual.size()); - EXPECT_THAT(actual, Contains(expectedV1)); + const vector* actualFieldValues = &data[0]->getValues(); + ASSERT_EQ(2, actualFieldValues->size()); + EXPECT_EQ(isolatedNonAdditiveData, actualFieldValues->at(0).mValue.int_value); + EXPECT_EQ(isolatedAdditiveData, actualFieldValues->at(1).mValue.int_value); + + actualFieldValues = &data[1]->getValues(); + ASSERT_EQ(2, actualFieldValues->size()); + EXPECT_EQ(hostNonAdditiveData, actualFieldValues->at(0).mValue.int_value); + EXPECT_EQ(hostAdditiveData, actualFieldValues->at(1).mValue.int_value); } -TEST(puller_util, NoNeedToMerge) { - vector> inputData; +TEST(PullerUtilTest, MergeNoDimensionAttributionChain) { + vector> data = { + // 30->tag1->400->tag2->22->31 + makeAttributionLogEvent(attributionAtomTagId, timestamp, {isolatedUid1, 400}, + {"tag1", "tag2"}, hostNonAdditiveData, isolatedAdditiveData), + + // 20->tag1->400->tag2->22->21 + makeAttributionLogEvent(attributionAtomTagId, timestamp, {hostUid, 400}, + {"tag1", "tag2"}, hostNonAdditiveData, hostAdditiveData), + }; + + sp uidMap = makeMockUidMap(); + mapAndMergeIsolatedUidsToHostUid(data, uidMap, attributionAtomTagId, additiveFields); + + ASSERT_EQ(1, (int)data.size()); + const vector* actualFieldValues = &data[0]->getValues(); + ASSERT_EQ(6, actualFieldValues->size()); + EXPECT_EQ(hostUid, actualFieldValues->at(0).mValue.int_value); + EXPECT_EQ("tag1", actualFieldValues->at(1).mValue.str_value); + EXPECT_EQ(400, actualFieldValues->at(2).mValue.int_value); + EXPECT_EQ("tag2", actualFieldValues->at(3).mValue.str_value); + EXPECT_EQ(hostNonAdditiveData, actualFieldValues->at(4).mValue.int_value); + EXPECT_EQ(isolatedAdditiveData + hostAdditiveData, actualFieldValues->at(5).mValue.int_value); +} - // 32 - inputData.push_back(makeNonUidAtomLogEvent(timestamp, isolatedNonAdditiveData)); +TEST(PullerUtilTest, MergeWithDimensionAttributionChain) { + vector> data = { + // 200->tag1->30->tag2->32->31 + makeAttributionLogEvent(attributionAtomTagId, timestamp, {200, isolatedUid1}, + {"tag1", "tag2"}, isolatedNonAdditiveData, + isolatedAdditiveData), + + // 200->tag1->20->tag2->32->21 + makeAttributionLogEvent(attributionAtomTagId, timestamp, {200, hostUid}, + {"tag1", "tag2"}, isolatedNonAdditiveData, hostAdditiveData), + + // 200->tag1->20->tag2->22->21 + makeAttributionLogEvent(attributionAtomTagId, timestamp, {200, hostUid}, + {"tag1", "tag2"}, hostNonAdditiveData, hostAdditiveData), + }; + + sp uidMap = makeMockUidMap(); + mapAndMergeIsolatedUidsToHostUid(data, uidMap, attributionAtomTagId, additiveFields); + + ASSERT_EQ(2, (int)data.size()); + + const vector* actualFieldValues = &data[0]->getValues(); + ASSERT_EQ(6, actualFieldValues->size()); + EXPECT_EQ(200, actualFieldValues->at(0).mValue.int_value); + EXPECT_EQ("tag1", actualFieldValues->at(1).mValue.str_value); + EXPECT_EQ(hostUid, actualFieldValues->at(2).mValue.int_value); + EXPECT_EQ("tag2", actualFieldValues->at(3).mValue.str_value); + EXPECT_EQ(hostNonAdditiveData, actualFieldValues->at(4).mValue.int_value); + EXPECT_EQ(hostAdditiveData, actualFieldValues->at(5).mValue.int_value); + + actualFieldValues = &data[1]->getValues(); + ASSERT_EQ(6, actualFieldValues->size()); + EXPECT_EQ(200, actualFieldValues->at(0).mValue.int_value); + EXPECT_EQ("tag1", actualFieldValues->at(1).mValue.str_value); + EXPECT_EQ(hostUid, actualFieldValues->at(2).mValue.int_value); + EXPECT_EQ("tag2", actualFieldValues->at(3).mValue.str_value); + EXPECT_EQ(isolatedNonAdditiveData, actualFieldValues->at(4).mValue.int_value); + EXPECT_EQ(hostAdditiveData + isolatedAdditiveData, actualFieldValues->at(5).mValue.int_value); +} - // 22 - inputData.push_back(makeNonUidAtomLogEvent(timestamp, hostNonAdditiveData)); +TEST(PullerUtilTest, NoMergeHostUidOnlyAttributionChain) { + vector> data = { + // 20->tag1->400->tag2->32->31 + makeAttributionLogEvent(attributionAtomTagId, timestamp, {hostUid, 400}, + {"tag1", "tag2"}, isolatedNonAdditiveData, + isolatedAdditiveData), + + // 20->tag1->400->tag2->22->21 + makeAttributionLogEvent(attributionAtomTagId, timestamp, {hostUid, 400}, + {"tag1", "tag2"}, hostNonAdditiveData, hostAdditiveData), + }; + + sp uidMap = makeMockUidMap(); + mapAndMergeIsolatedUidsToHostUid(data, uidMap, attributionAtomTagId, additiveFields); + + ASSERT_EQ(2, (int)data.size()); + + const vector* actualFieldValues = &data[0]->getValues(); + ASSERT_EQ(6, actualFieldValues->size()); + EXPECT_EQ(hostUid, actualFieldValues->at(0).mValue.int_value); + EXPECT_EQ("tag1", actualFieldValues->at(1).mValue.str_value); + EXPECT_EQ(400, actualFieldValues->at(2).mValue.int_value); + EXPECT_EQ("tag2", actualFieldValues->at(3).mValue.str_value); + EXPECT_EQ(hostNonAdditiveData, actualFieldValues->at(4).mValue.int_value); + EXPECT_EQ(hostAdditiveData, actualFieldValues->at(5).mValue.int_value); + + actualFieldValues = &data[1]->getValues(); + ASSERT_EQ(6, actualFieldValues->size()); + EXPECT_EQ(hostUid, actualFieldValues->at(0).mValue.int_value); + EXPECT_EQ("tag1", actualFieldValues->at(1).mValue.str_value); + EXPECT_EQ(400, actualFieldValues->at(2).mValue.int_value); + EXPECT_EQ("tag2", actualFieldValues->at(3).mValue.str_value); + EXPECT_EQ(isolatedNonAdditiveData, actualFieldValues->at(4).mValue.int_value); + EXPECT_EQ(isolatedAdditiveData, actualFieldValues->at(5).mValue.int_value); +} - sp uidMap = new NaggyMock(); - mapAndMergeIsolatedUidsToHostUid(inputData, uidMap, nonUidAtomTagId, {} /*no additive fields*/); +TEST(PullerUtilTest, IsolatedUidOnlyAttributionChain) { + vector> data = { + // 30->tag1->400->tag2->32->31 + makeAttributionLogEvent(attributionAtomTagId, timestamp, {isolatedUid1, 400}, + {"tag1", "tag2"}, isolatedNonAdditiveData, + isolatedAdditiveData), + + // 30->tag1->400->tag2->22->21 + makeAttributionLogEvent(attributionAtomTagId, timestamp, {isolatedUid1, 400}, + {"tag1", "tag2"}, hostNonAdditiveData, hostAdditiveData), + }; + + sp uidMap = makeMockUidMap(); + mapAndMergeIsolatedUidsToHostUid(data, uidMap, attributionAtomTagId, additiveFields); + + ASSERT_EQ(2, (int)data.size()); + + // 20->tag1->400->tag2->32->31 + const vector* actualFieldValues = &data[0]->getValues(); + ASSERT_EQ(6, actualFieldValues->size()); + EXPECT_EQ(hostUid, actualFieldValues->at(0).mValue.int_value); + EXPECT_EQ("tag1", actualFieldValues->at(1).mValue.str_value); + EXPECT_EQ(400, actualFieldValues->at(2).mValue.int_value); + EXPECT_EQ("tag2", actualFieldValues->at(3).mValue.str_value); + EXPECT_EQ(hostNonAdditiveData, actualFieldValues->at(4).mValue.int_value); + EXPECT_EQ(hostAdditiveData, actualFieldValues->at(5).mValue.int_value); + + // 20->tag1->400->tag2->22->21 + actualFieldValues = &data[1]->getValues(); + ASSERT_EQ(6, actualFieldValues->size()); + EXPECT_EQ(hostUid, actualFieldValues->at(0).mValue.int_value); + EXPECT_EQ("tag1", actualFieldValues->at(1).mValue.str_value); + EXPECT_EQ(400, actualFieldValues->at(2).mValue.int_value); + EXPECT_EQ("tag2", actualFieldValues->at(3).mValue.str_value); + EXPECT_EQ(isolatedNonAdditiveData, actualFieldValues->at(4).mValue.int_value); + EXPECT_EQ(isolatedAdditiveData, actualFieldValues->at(5).mValue.int_value); +} - EXPECT_EQ(2, (int)inputData.size()); +TEST(PullerUtilTest, MultipleIsolatedUidToOneHostUidAttributionChain) { + vector> data = { + // 30->tag1->400->tag2->32->31 + makeAttributionLogEvent(attributionAtomTagId, timestamp, {isolatedUid1, 400}, + {"tag1", "tag2"}, isolatedNonAdditiveData, + isolatedAdditiveData), + + // 31->tag1->400->tag2->32->21 + makeAttributionLogEvent(attributionAtomTagId, timestamp, {isolatedUid2, 400}, + {"tag1", "tag2"}, isolatedNonAdditiveData, hostAdditiveData), + + // 20->tag1->400->tag2->32->21 + makeAttributionLogEvent(attributionAtomTagId, timestamp, {hostUid, 400}, + {"tag1", "tag2"}, isolatedNonAdditiveData, hostAdditiveData), + }; + + sp uidMap = makeMockUidMap(); + mapAndMergeIsolatedUidsToHostUid(data, uidMap, attributionAtomTagId, additiveFields); + + ASSERT_EQ(1, (int)data.size()); + + const vector* actualFieldValues = &data[0]->getValues(); + ASSERT_EQ(6, actualFieldValues->size()); + EXPECT_EQ(hostUid, actualFieldValues->at(0).mValue.int_value); + EXPECT_EQ("tag1", actualFieldValues->at(1).mValue.str_value); + EXPECT_EQ(400, actualFieldValues->at(2).mValue.int_value); + EXPECT_EQ("tag2", actualFieldValues->at(3).mValue.str_value); + EXPECT_EQ(isolatedNonAdditiveData, actualFieldValues->at(4).mValue.int_value); + EXPECT_EQ(isolatedAdditiveData + hostAdditiveData + hostAdditiveData, + actualFieldValues->at(5).mValue.int_value); } } // namespace statsd diff --git a/cmds/statsd/tests/metrics/metrics_test_helper.h b/cmds/statsd/tests/metrics/metrics_test_helper.h index be410b10d43b2e1a58043e3af96af680b5f47cea..46ef0f613bbea30b99cc033cf936aa7da5715f85 100644 --- a/cmds/statsd/tests/metrics/metrics_test_helper.h +++ b/cmds/statsd/tests/metrics/metrics_test_helper.h @@ -48,12 +48,6 @@ public: void(const ConfigKey& configKey, wp provider)); }; -class MockUidMap : public UidMap { - public: - MOCK_CONST_METHOD1(getHostUidOrSelf, int(int uid)); - MOCK_CONST_METHOD1(getAppUid, std::set(const string& package)); -}; - HashableDimensionKey getMockedDimensionKey(int tagId, int key, std::string value); MetricDimensionKey getMockedMetricDimensionKey(int tagId, int key, std::string value); diff --git a/cmds/statsd/tests/statsd_test_util.cpp b/cmds/statsd/tests/statsd_test_util.cpp index 7216e1d8cc8e214962bc0cbc001b24a973aa49e6..2315fd7243bc76d427839c21788547ae03492ca9 100644 --- a/cmds/statsd/tests/statsd_test_util.cpp +++ b/cmds/statsd/tests/statsd_test_util.cpp @@ -563,6 +563,48 @@ shared_ptr CreateNoValuesLogEvent(int atomId, int64_t eventTimeNs) { return logEvent; } +shared_ptr makeUidLogEvent(int atomId, int64_t eventTimeNs, int uid, int data1, + int data2) { + AStatsEvent* statsEvent = AStatsEvent_obtain(); + AStatsEvent_setAtomId(statsEvent, atomId); + AStatsEvent_overwriteTimestamp(statsEvent, eventTimeNs); + + AStatsEvent_writeInt32(statsEvent, uid); + AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_IS_UID, true); + AStatsEvent_writeInt32(statsEvent, data1); + AStatsEvent_writeInt32(statsEvent, data2); + + shared_ptr logEvent = std::make_shared(/*uid=*/0, /*pid=*/0); + parseStatsEventToLogEvent(statsEvent, logEvent.get()); + return logEvent; +} + +shared_ptr makeAttributionLogEvent(int atomId, int64_t eventTimeNs, + const vector& uids, const vector& tags, + int data1, int data2) { + AStatsEvent* statsEvent = AStatsEvent_obtain(); + AStatsEvent_setAtomId(statsEvent, atomId); + AStatsEvent_overwriteTimestamp(statsEvent, eventTimeNs); + + writeAttribution(statsEvent, uids, tags); + AStatsEvent_writeInt32(statsEvent, data1); + AStatsEvent_writeInt32(statsEvent, data2); + + shared_ptr logEvent = std::make_shared(/*uid=*/0, /*pid=*/0); + parseStatsEventToLogEvent(statsEvent, logEvent.get()); + return logEvent; +} + +sp makeMockUidMapForOneHost(int hostUid, const vector& isolatedUids) { + sp uidMap = new NaggyMock(); + EXPECT_CALL(*uidMap, getHostUidOrSelf(_)).WillRepeatedly(ReturnArg<0>()); + for (const int isolatedUid : isolatedUids) { + EXPECT_CALL(*uidMap, getHostUidOrSelf(isolatedUid)).WillRepeatedly(Return(hostUid)); + } + + return uidMap; +} + std::unique_ptr CreateScreenStateChangedEvent( uint64_t timestampNs, const android::view::DisplayStateEnum state) { AStatsEvent* statsEvent = AStatsEvent_obtain(); @@ -878,8 +920,7 @@ std::unique_ptr CreateOverlayStateChangedEvent(int64_t timestampNs, co sp CreateStatsLogProcessor(const int64_t timeBaseNs, const int64_t currentTimeNs, const StatsdConfig& config, const ConfigKey& key, const shared_ptr& puller, - const int32_t atomTag) { - sp uidMap = new UidMap(); + const int32_t atomTag, const sp uidMap) { sp pullerManager = new StatsPullerManager(); if (puller != nullptr) { pullerManager->RegisterPullAtomCallback(/*uid=*/0, atomTag, NS_PER_SEC, NS_PER_SEC * 10, {}, diff --git a/cmds/statsd/tests/statsd_test_util.h b/cmds/statsd/tests/statsd_test_util.h index 4d68ea2ecb792b6f7f2f1e7c8bc36e18ad05ec01..dc012c5381ebed5c2ed1ca2fd6b1d476d4c7fc9a 100644 --- a/cmds/statsd/tests/statsd_test_util.h +++ b/cmds/statsd/tests/statsd_test_util.h @@ -17,6 +17,7 @@ #include #include #include +#include #include #include "frameworks/base/cmds/statsd/src/stats_log.pb.h" @@ -24,6 +25,7 @@ #include "src/StatsLogProcessor.h" #include "src/hash.h" #include "src/logd/LogEvent.h" +#include "src/packages/UidMap.h" #include "src/stats_log_util.h" #include "stats_event.h" #include "statslog_statsdtest.h" @@ -32,6 +34,7 @@ namespace android { namespace os { namespace statsd { +using namespace testing; using ::aidl::android::os::BnPullAtomCallback; using ::aidl::android::os::IPullAtomCallback; using ::aidl::android::os::IPullAtomResultReceiver; @@ -44,6 +47,12 @@ const int UID_PROCESS_STATE_ATOM_ID = util::UID_PROCESS_STATE_CHANGED; enum BucketSplitEvent { APP_UPGRADE, BOOT_COMPLETE }; +class MockUidMap : public UidMap { +public: + MOCK_METHOD(int, getHostUidOrSelf, (int uid), (const)); + MOCK_METHOD(std::set, getAppUid, (const string& package), (const)); +}; + // Converts a ProtoOutputStream to a StatsLogReport proto. StatsLogReport outputStreamToProto(ProtoOutputStream* proto); @@ -212,6 +221,15 @@ std::shared_ptr CreateNoValuesLogEvent(int atomId, int64_t eventTimeNs void CreateNoValuesLogEvent(LogEvent* logEvent, int atomId, int64_t eventTimeNs); +std::shared_ptr makeUidLogEvent(int atomId, int64_t eventTimeNs, int uid, int data1, + int data2); + +std::shared_ptr makeAttributionLogEvent(int atomId, int64_t eventTimeNs, + const vector& uids, + const vector& tags, int data1, int data2); + +sp makeMockUidMapForOneHost(int hostUid, const vector& isolatedUids); + // Create log event for screen state changed. std::unique_ptr CreateScreenStateChangedEvent( uint64_t timestampNs, const android::view::DisplayStateEnum state); @@ -293,7 +311,8 @@ std::unique_ptr CreateOverlayStateChangedEvent(int64_t timestampNs, co sp CreateStatsLogProcessor(const int64_t timeBaseNs, const int64_t currentTimeNs, const StatsdConfig& config, const ConfigKey& key, const shared_ptr& puller = nullptr, - const int32_t atomTag = 0 /*for puller only*/); + const int32_t atomTag = 0 /*for puller only*/, + const sp = new UidMap()); // Util function to sort the log events by timestamp. void sortLogEventsByTimestamp(std::vector> *events); diff --git a/cmds/statsd/tools/localtools/src/com/android/statsd/shelltools/testdrive/TestDrive.java b/cmds/statsd/tools/localtools/src/com/android/statsd/shelltools/testdrive/TestDrive.java index 8ac251e39a1871994437ca8fe50beea498641f79..a97f132a2d5f720f63dc6fa2b3ccb4552556fb08 100644 --- a/cmds/statsd/tools/localtools/src/com/android/statsd/shelltools/testdrive/TestDrive.java +++ b/cmds/statsd/tools/localtools/src/com/android/statsd/shelltools/testdrive/TestDrive.java @@ -25,6 +25,7 @@ import com.android.internal.os.StatsdConfigProto.SimpleAtomMatcher; import com.android.internal.os.StatsdConfigProto.StatsdConfig; import com.android.internal.os.StatsdConfigProto.TimeUnit; import com.android.os.AtomsProto.Atom; +import com.android.os.StatsLog; import com.android.os.StatsLog.ConfigMetricsReport; import com.android.os.StatsLog.ConfigMetricsReportList; import com.android.os.StatsLog.StatsLogReport; @@ -78,11 +79,12 @@ public class TestDrive { @VisibleForTesting String mDeviceSerial = null; + @VisibleForTesting + Dumper mDumper = new BasicDumper(); public static void main(String[] args) { final Configuration configuration = new Configuration(); - - TestDrive testDrive = new TestDrive(); + final TestDrive testDrive = new TestDrive(); Utils.setUpLogger(LOGGER, false); if (!testDrive.processArgs(configuration, args, @@ -94,7 +96,7 @@ public class TestDrive { configuration.createConfig(), configuration.hasPulledAtoms(), configuration.hasPushedAtoms()); if (reports != null) { - configuration.dumpMetrics(reports); + configuration.dumpMetrics(reports, testDrive.mDumper); } } @@ -116,6 +118,9 @@ public class TestDrive { if (remaining_args >= 2 && arg.equals("-one")) { LOGGER.info("Creating one event metric to catch all pushed atoms."); configuration.mOnePushedAtomEvent = true; + } else if (remaining_args >= 2 && arg.equals("-terse")) { + LOGGER.info("Terse output format."); + mDumper = new TerseDumper(); } else if (remaining_args >= 3 && arg.equals("-p")) { configuration.mAdditionalAllowedPackage = args[++first_arg]; } else if (remaining_args >= 3 && arg.equals("-s")) { @@ -198,12 +203,13 @@ public class TestDrive { String mAdditionalAllowedPackage = null; private final Set mTrackedMetrics = new HashSet<>(); - private void dumpMetrics(ConfigMetricsReportList reportList) { + private void dumpMetrics(ConfigMetricsReportList reportList, Dumper dumper) { // We may get multiple reports. Take the last one. ConfigMetricsReport report = reportList.getReports(reportList.getReportsCount() - 1); for (StatsLogReport statsLog : report.getMetricsList()) { if (isTrackedMetric(statsLog.getMetricId())) { LOGGER.info(statsLog.toString()); + dumper.dump(statsLog); } } } @@ -341,6 +347,51 @@ public class TestDrive { } } + interface Dumper { + void dump(StatsLogReport report); + } + + static class BasicDumper implements Dumper { + @Override + public void dump(StatsLogReport report) { + System.out.println(report.toString()); + } + } + + static class TerseDumper extends BasicDumper { + @Override + public void dump(StatsLogReport report) { + if (report.hasGaugeMetrics()) { + dumpGaugeMetrics(report); + } + if (report.hasEventMetrics()) { + dumpEventMetrics(report); + } + } + void dumpEventMetrics(StatsLogReport report) { + final List data = report.getEventMetrics().getDataList(); + if (data.isEmpty()) { + return; + } + long firstTimestampNanos = data.get(0).getElapsedTimestampNanos(); + for (StatsLog.EventMetricData event : data) { + final double deltaSec = (event.getElapsedTimestampNanos() - firstTimestampNanos) + / 1e9; + System.out.println( + String.format("+%.3fs: %s", deltaSec, event.getAtom().toString())); + } + } + void dumpGaugeMetrics(StatsLogReport report) { + final List data = report.getGaugeMetrics().getDataList(); + if (data.isEmpty()) { + return; + } + for (StatsLog.GaugeMetricData gauge : data) { + System.out.println(gauge.toString()); + } + } + } + private static String pushConfig(StatsdConfig config, String deviceSerial) throws IOException, InterruptedException { File configFile = File.createTempFile("statsdconfig", ".config"); diff --git a/cmds/statsd/tools/localtools/test/com/android/statsd/shelltools/testdrive/TestDriveTest.java b/cmds/statsd/tools/localtools/test/com/android/statsd/shelltools/testdrive/TestDriveTest.java index 9d986e7c09cf8e198c1ecb5f6629e5b5c67ad629..363fac0c78ba07ec621d07d272c1ef4a22b08830 100644 --- a/cmds/statsd/tools/localtools/test/com/android/statsd/shelltools/testdrive/TestDriveTest.java +++ b/cmds/statsd/tools/localtools/test/com/android/statsd/shelltools/testdrive/TestDriveTest.java @@ -41,24 +41,21 @@ public class TestDriveTest { static class Expect { public boolean success; public Integer[] atoms; - public boolean onePushedAtomEvent; - public String extraPackage; + public boolean onePushedAtomEvent = false; + public String extraPackage = null; public String target; + public boolean terse = false; static Expect success(Integer... atoms) { - return new Expect(true, atoms, false, null, + return new Expect(true, atoms, TARGET); } - Expect(boolean success, Integer[] atoms, boolean onePushedAtomEvent, String extraPackage, - String target) { + Expect(boolean success, Integer[] atoms, String target) { this.success = success; this.atoms = atoms; - this.onePushedAtomEvent = onePushedAtomEvent; - this.extraPackage = extraPackage; this.target = target; } - static final Expect FAILURE = new Expect(false, null, - false, null, null); + static final Expect FAILURE = new Expect(false, null, null); Expect onePushedAtomEvent() { this.onePushedAtomEvent = true; return this; @@ -67,6 +64,10 @@ public class TestDriveTest { this.extraPackage = TestDriveTest.PACKAGE; return this; } + Expect terse() { + this.terse = true; + return this; + } } @Parameterized.Parameter(0) @@ -118,6 +119,10 @@ public class TestDriveTest { Expect.FAILURE}, // Two connected devices, no indication of which to use new Object[]{new String[]{"-one", "244", "245"}, TARGET_ONLY, null, Expect.success(244, 245).onePushedAtomEvent()}, + new Object[]{new String[]{"-terse", "-one", "244", "245"}, TARGET_ONLY, null, + Expect.success(244, 245).onePushedAtomEvent().terse()}, + new Object[]{new String[]{"-one", "-terse", "244", "245"}, TARGET_ONLY, null, + Expect.success(244, 245).onePushedAtomEvent().terse()}, new Object[]{new String[]{"-p", PACKAGE, "244", "245"}, TARGET_ONLY, null, Expect.success(244, 245).extraPackage()}, new Object[]{new String[]{"-p", PACKAGE, "-one", "244", "245"}, TARGET_ONLY, null, @@ -132,7 +137,23 @@ public class TestDriveTest { Expect.success(244, 245).extraPackage().onePushedAtomEvent()}, new Object[]{new String[]{"-one", "-p", PACKAGE, "-s", TARGET, "244", "245"}, TARGET_AND_OTHER, null, - Expect.success(244, 245).extraPackage().onePushedAtomEvent()} + Expect.success(244, 245).extraPackage().onePushedAtomEvent()}, + new Object[]{new String[]{"-terse", "-one", "-p", PACKAGE, "-s", TARGET, + "244", "245"}, + TARGET_AND_OTHER, null, + Expect.success(244, 245).extraPackage().onePushedAtomEvent().terse()}, + new Object[]{new String[]{"-one", "-terse", "-p", PACKAGE, "-s", TARGET, + "244", "245"}, + TARGET_AND_OTHER, null, + Expect.success(244, 245).extraPackage().onePushedAtomEvent().terse()}, + new Object[]{new String[]{"-one", "-p", PACKAGE, "-terse", "-s", TARGET, + "244", "245"}, + TARGET_AND_OTHER, null, + Expect.success(244, 245).extraPackage().onePushedAtomEvent().terse()}, + new Object[]{new String[]{"-one", "-p", PACKAGE, "-s", TARGET, "-terse", + "244", "245"}, + TARGET_AND_OTHER, null, + Expect.success(244, 245).extraPackage().onePushedAtomEvent().terse()} ); } @@ -162,6 +183,11 @@ public class TestDriveTest { assertArrayEquals(mExpect.atoms, collectAtoms(mConfiguration)); assertEquals(mExpect.onePushedAtomEvent, mConfiguration.mOnePushedAtomEvent); assertEquals(mExpect.target, mTestDrive.mDeviceSerial); + if (mExpect.terse) { + assertEquals(TestDrive.TerseDumper.class, mTestDrive.mDumper.getClass()); + } else { + assertEquals(TestDrive.BasicDumper.class, mTestDrive.mDumper.getClass()); + } } else { assertFalse(result); } diff --git a/config/boot-image-profile.txt b/config/boot-image-profile.txt index 5f45d6932293a5c03ceb882f7cae8bb4445ca00a..95778b5b3648afa1884f1544ec2c78f5d305c130 100644 --- a/config/boot-image-profile.txt +++ b/config/boot-image-profile.txt @@ -19208,6 +19208,8 @@ HSPLandroid/telephony/PreciseDataConnectionState;->toString()Ljava/lang/String; HSPLandroid/telephony/PreciseDataConnectionState;->writeToParcel(Landroid/os/Parcel;I)V HSPLandroid/telephony/Rlog;->d(Ljava/lang/String;Ljava/lang/String;)I HSPLandroid/telephony/ServiceState;->createLocationInfoSanitizedCopy(Z)Landroid/telephony/ServiceState; +HSPLandroid/telephony/ServiceState;->fillInNotifierBundle(Landroid/os/Bundle;)V +HSPLandroid/telephony/ServiceState;->newFromBundle(Landroid/os/Bundle;)Landroid/telephony/ServiceState; PLandroid/telephony/SignalStrength;->(Landroid/telephony/SignalStrength;)V HPLandroid/telephony/SignalStrength;->copyFrom(Landroid/telephony/SignalStrength;)V HSPLandroid/telephony/SignalStrength;->isGsm()Z diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index e0ae750ba5ee096dfd5e7dba037a00b7e5574fb3..17720a34c4247c1620a6a7d0922ba21f295f8e0b 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -2748,11 +2748,7 @@ public class Activity extends ContextThemeWrapper * @return True if the activity is in multi-window mode. */ public boolean isInMultiWindowMode() { - try { - return ActivityTaskManager.getService().isInMultiWindowMode(mToken); - } catch (RemoteException e) { - } - return false; + return mLastDispatchedIsInMultiWindowMode == Boolean.TRUE; } /** @@ -2795,11 +2791,7 @@ public class Activity extends ContextThemeWrapper * @return True if the activity is in picture-in-picture mode. */ public boolean isInPictureInPictureMode() { - try { - return ActivityTaskManager.getService().isInPictureInPictureMode(mToken); - } catch (RemoteException e) { - } - return false; + return mLastDispatchedIsInPictureInPictureMode == Boolean.TRUE; } /** diff --git a/core/java/android/app/ActivityOptions.java b/core/java/android/app/ActivityOptions.java index 0129aabd49f82b7341da3e23e1bb2dbcd5c6204c..80d2e6c60f69d493016c7de9c0afbb83de5df2a5 100644 --- a/core/java/android/app/ActivityOptions.java +++ b/core/java/android/app/ActivityOptions.java @@ -265,6 +265,14 @@ public class ActivityOptions { private static final String KEY_DISALLOW_ENTER_PICTURE_IN_PICTURE_WHILE_LAUNCHING = "android:activity.disallowEnterPictureInPictureWhileLaunching"; + /** + * Indicates flags should be applied to the launching activity such that it will behave + * correctly in a bubble. + * @hide + */ + private static final String KEY_APPLY_ACTIVITY_FLAGS_FOR_BUBBLES = + "android:activity.applyActivityFlagsForBubbles"; + /** * For Activity transitions, the calling Activity's TransitionListener used to * notify the called Activity when the shared element and the exit transitions @@ -354,6 +362,7 @@ public class ActivityOptions { private int mSplitScreenCreateMode = SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT; private boolean mLockTaskMode = false; private boolean mDisallowEnterPictureInPictureWhileLaunching; + private boolean mApplyActivityFlagsForBubbles; private boolean mTaskAlwaysOnTop; private boolean mTaskOverlay; private boolean mTaskOverlayCanResume; @@ -1033,6 +1042,8 @@ public class ActivityOptions { SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT); mDisallowEnterPictureInPictureWhileLaunching = opts.getBoolean( KEY_DISALLOW_ENTER_PICTURE_IN_PICTURE_WHILE_LAUNCHING, false); + mApplyActivityFlagsForBubbles = opts.getBoolean( + KEY_APPLY_ACTIVITY_FLAGS_FOR_BUBBLES, false); if (opts.containsKey(KEY_ANIM_SPECS)) { Parcelable[] specs = opts.getParcelableArray(KEY_ANIM_SPECS); mAnimSpecs = new AppTransitionAnimationSpec[specs.length]; @@ -1465,6 +1476,16 @@ public class ActivityOptions { return mDisallowEnterPictureInPictureWhileLaunching; } + /** @hide */ + public void setApplyActivityFlagsForBubbles(boolean apply) { + mApplyActivityFlagsForBubbles = apply; + } + + /** @hide */ + public boolean isApplyActivityFlagsForBubbles() { + return mApplyActivityFlagsForBubbles; + } + /** * Update the current values in this ActivityOptions from those supplied * in otherOptions. Any values @@ -1663,6 +1684,9 @@ public class ActivityOptions { b.putBoolean(KEY_DISALLOW_ENTER_PICTURE_IN_PICTURE_WHILE_LAUNCHING, mDisallowEnterPictureInPictureWhileLaunching); } + if (mApplyActivityFlagsForBubbles) { + b.putBoolean(KEY_APPLY_ACTIVITY_FLAGS_FOR_BUBBLES, mApplyActivityFlagsForBubbles); + } if (mAnimSpecs != null) { b.putParcelableArray(KEY_ANIM_SPECS, mAnimSpecs); } diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 51eaff1ae99f280c201be060a1a8afcd7ad38f55..e97ebd7eee06ce98949800eca9264e0dd4ffc57d 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -17,6 +17,8 @@ package android.app; import static android.app.ActivityManager.PROCESS_STATE_UNKNOWN; +import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED; +import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; import static android.app.servertransaction.ActivityLifecycleItem.ON_CREATE; import static android.app.servertransaction.ActivityLifecycleItem.ON_DESTROY; import static android.app.servertransaction.ActivityLifecycleItem.ON_PAUSE; @@ -407,6 +409,9 @@ public final class ActivityThread extends ClientTransactionHandler { @GuardedBy("this") private @Nullable Map mRemoteCancellations; + private final Map mLastReportedWindowingMode = Collections.synchronizedMap( + new ArrayMap<>()); + private static final class ProviderKey { final String authority; final int userId; @@ -3087,6 +3092,11 @@ public final class ActivityThread extends ClientTransactionHandler { return mActivities.get(token); } + @VisibleForTesting(visibility = PACKAGE) + public Configuration getConfiguration() { + return mConfiguration; + } + @Override public void updatePendingConfiguration(Configuration config) { synchronized (mResourcesManager) { @@ -3324,6 +3334,8 @@ public final class ActivityThread extends ClientTransactionHandler { " did not call through to super.onCreate()"); } r.activity = activity; + mLastReportedWindowingMode.put(activity.getActivityToken(), + config.windowConfiguration.getWindowingMode()); } r.setState(ON_CREATE); @@ -3746,32 +3758,6 @@ public final class ActivityThread extends ClientTransactionHandler { } } - @Override - public void handleMultiWindowModeChanged(IBinder token, boolean isInMultiWindowMode, - Configuration overrideConfig) { - final ActivityClientRecord r = mActivities.get(token); - if (r != null) { - final Configuration newConfig = new Configuration(mConfiguration); - if (overrideConfig != null) { - newConfig.updateFrom(overrideConfig); - } - r.activity.dispatchMultiWindowModeChanged(isInMultiWindowMode, newConfig); - } - } - - @Override - public void handlePictureInPictureModeChanged(IBinder token, boolean isInPipMode, - Configuration overrideConfig) { - final ActivityClientRecord r = mActivities.get(token); - if (r != null) { - final Configuration newConfig = new Configuration(mConfiguration); - if (overrideConfig != null) { - newConfig.updateFrom(overrideConfig); - } - r.activity.dispatchPictureInPictureModeChanged(isInPipMode, newConfig); - } - } - @Override public void handlePictureInPictureRequested(IBinder token) { final ActivityClientRecord r = mActivities.get(token); @@ -5269,8 +5255,15 @@ public final class ActivityThread extends ClientTransactionHandler { throw e.rethrowFromSystemServer(); } + // Save the current windowing mode to be restored and compared to the new configuration's + // windowing mode (needed because we update the last reported windowing mode when launching + // an activity and we can't tell inside performLaunchActivity whether we are relaunching) + final int oldWindowingMode = mLastReportedWindowingMode.getOrDefault( + r.activity.getActivityToken(), WINDOWING_MODE_UNDEFINED); handleRelaunchActivityInner(r, configChanges, tmp.pendingResults, tmp.pendingIntents, pendingActions, tmp.startsNotResumed, tmp.overrideConfig, "handleRelaunchActivity"); + mLastReportedWindowingMode.put(r.activity.getActivityToken(), oldWindowingMode); + handleWindowingModeChangeIfNeeded(r.activity, r.activity.mCurrentConfig); if (pendingActions != null) { // Only report a successful relaunch to WindowManager. @@ -5553,6 +5546,10 @@ public final class ActivityThread extends ClientTransactionHandler { throw new IllegalArgumentException("Activity token not set. Is the activity attached?"); } + // multi-window / pip mode changes, if any, should be sent before the configuration change + // callback, see also PinnedStackTests#testConfigurationChangeOrderDuringTransition + handleWindowingModeChangeIfNeeded(activity, newConfig); + boolean shouldChangeConfig = false; if (activity.mCurrentConfig == null) { shouldChangeConfig = true; @@ -5746,6 +5743,35 @@ public final class ActivityThread extends ClientTransactionHandler { } } + /** + * Sends windowing mode change callbacks to {@link Activity} if applicable. + * + * See also {@link Activity#onMultiWindowModeChanged(boolean, Configuration)} and + * {@link Activity#onPictureInPictureModeChanged(boolean, Configuration)} + */ + private void handleWindowingModeChangeIfNeeded(Activity activity, + Configuration newConfiguration) { + final int newWindowingMode = newConfiguration.windowConfiguration.getWindowingMode(); + final IBinder token = activity.getActivityToken(); + final int oldWindowingMode = mLastReportedWindowingMode.getOrDefault(token, + WINDOWING_MODE_UNDEFINED); + if (oldWindowingMode == newWindowingMode) return; + // PiP callback is sent before the MW one. + if (newWindowingMode == WINDOWING_MODE_PINNED) { + activity.dispatchPictureInPictureModeChanged(true, newConfiguration); + } else if (oldWindowingMode == WINDOWING_MODE_PINNED) { + activity.dispatchPictureInPictureModeChanged(false, newConfiguration); + } + final boolean wasInMultiWindowMode = WindowConfiguration.inMultiWindowMode( + oldWindowingMode); + final boolean nowInMultiWindowMode = WindowConfiguration.inMultiWindowMode( + newWindowingMode); + if (wasInMultiWindowMode != nowInMultiWindowMode) { + activity.dispatchMultiWindowModeChanged(nowInMultiWindowMode, newConfiguration); + } + mLastReportedWindowingMode.put(token, newWindowingMode); + } + /** * Updates the application info. * diff --git a/core/java/android/app/AlarmManager.java b/core/java/android/app/AlarmManager.java index 00627ef381ab38023f10bace22adf8ad4443d291..ae8a2cbf5120685d19db0e8f691d3e24a770aaf6 100644 --- a/core/java/android/app/AlarmManager.java +++ b/core/java/android/app/AlarmManager.java @@ -31,7 +31,6 @@ import android.os.Parcelable; import android.os.RemoteException; import android.os.WorkSource; import android.text.TextUtils; -import android.util.ArrayMap; import android.util.Log; import android.util.proto.ProtoOutputStream; @@ -40,6 +39,8 @@ import libcore.timezone.ZoneInfoDb; import java.io.IOException; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.lang.ref.WeakReference; +import java.util.WeakHashMap; /** * This class provides access to the system alarm services. These allow you @@ -222,26 +223,12 @@ public class AlarmManager { } catch (RemoteException ex) { throw ex.rethrowFromSystemServer(); } - - synchronized (AlarmManager.class) { - if (sWrappers != null) { - sWrappers.remove(mListener); - } - } } @Override public void doAlarm(IAlarmCompleteListener alarmManager) { mCompletion = alarmManager; - // Remove this listener from the wrapper cache first; the server side - // already considers it gone - synchronized (AlarmManager.class) { - if (sWrappers != null) { - sWrappers.remove(mListener); - } - } - mHandler.post(this); } @@ -263,9 +250,14 @@ public class AlarmManager { } } - // Tracking of the OnAlarmListener -> wrapper mapping, for cancel() support. - // Access is synchronized on the AlarmManager class object. - private static ArrayMap sWrappers; + /** + * Tracking of the OnAlarmListener -> ListenerWrapper mapping, for cancel() support. + * An entry is guaranteed to stay in this map as long as its ListenerWrapper is held by the + * server. + * + *

Access is synchronized on the AlarmManager class object. + */ + private static WeakHashMap> sWrappers; /** * package private on purpose @@ -682,14 +674,17 @@ public class AlarmManager { if (listener != null) { synchronized (AlarmManager.class) { if (sWrappers == null) { - sWrappers = new ArrayMap(); + sWrappers = new WeakHashMap<>(); } - recipientWrapper = sWrappers.get(listener); + final WeakReference weakRef = sWrappers.get(listener); + if (weakRef != null) { + recipientWrapper = weakRef.get(); + } // no existing wrapper => build a new one if (recipientWrapper == null) { recipientWrapper = new ListenerWrapper(listener); - sWrappers.put(listener, recipientWrapper); + sWrappers.put(listener, new WeakReference<>(recipientWrapper)); } } @@ -948,7 +943,10 @@ public class AlarmManager { ListenerWrapper wrapper = null; synchronized (AlarmManager.class) { if (sWrappers != null) { - wrapper = sWrappers.get(listener); + final WeakReference weakRef = sWrappers.get(listener); + if (weakRef != null) { + wrapper = weakRef.get(); + } } } diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java index 37f683ef435fbe96394170743a17e898c96e148f..33bacf0d11467383c698ee7f5683ac6aeef76c39 100644 --- a/core/java/android/app/AppOpsManager.java +++ b/core/java/android/app/AppOpsManager.java @@ -1083,7 +1083,7 @@ public class AppOpsManager { * @hide */ public static final int OP_ACTIVATE_PLATFORM_VPN = AppProtoEnums.APP_OP_ACTIVATE_PLATFORM_VPN; - /** @hide */ + /** @hide Controls whether or not read logs are available for incremental installations. */ public static final int OP_LOADER_USAGE_STATS = AppProtoEnums.APP_OP_LOADER_USAGE_STATS; // App op deprecated/removed. diff --git a/core/java/android/app/ClientTransactionHandler.java b/core/java/android/app/ClientTransactionHandler.java index d2235f10da99e55643591dd683e656f6a958426e..83465b0f8d368723d15d9416b8a03f2bfeb202ca 100644 --- a/core/java/android/app/ClientTransactionHandler.java +++ b/core/java/android/app/ClientTransactionHandler.java @@ -146,17 +146,9 @@ public abstract class ClientTransactionHandler { /** Deliver result from another activity. */ public abstract void handleSendResult(IBinder token, List results, String reason); - /** Deliver multi-window mode change notification. */ - public abstract void handleMultiWindowModeChanged(IBinder token, boolean isInMultiWindowMode, - Configuration overrideConfig); - /** Deliver new intent. */ public abstract void handleNewIntent(IBinder token, List intents); - /** Deliver picture-in-picture mode change notification. */ - public abstract void handlePictureInPictureModeChanged(IBinder token, boolean isInPipMode, - Configuration overrideConfig); - /** Request that an activity enter picture-in-picture. */ public abstract void handlePictureInPictureRequested(IBinder token); diff --git a/core/java/android/app/IActivityTaskManager.aidl b/core/java/android/app/IActivityTaskManager.aidl index b7ceb6ae1b4ccd6ac83e303dda25304071f78f9a..3ce768944e4822b2b2c4da3f27276b2175c63393 100644 --- a/core/java/android/app/IActivityTaskManager.aidl +++ b/core/java/android/app/IActivityTaskManager.aidl @@ -300,8 +300,6 @@ interface IActivityTaskManager { void suppressResizeConfigChanges(boolean suppress); boolean moveTopActivityToPinnedStack(int stackId, in Rect bounds); - boolean isInMultiWindowMode(in IBinder token); - boolean isInPictureInPictureMode(in IBinder token); boolean enterPictureInPictureMode(in IBinder token, in PictureInPictureParams params); void setPictureInPictureParams(in IBinder token, in PictureInPictureParams params); void requestPictureInPictureMode(in IBinder token); diff --git a/core/java/android/app/NotificationChannel.java b/core/java/android/app/NotificationChannel.java index 9f8d3c4090d669b82e729a748498b78f4717d940..cf2f7690bc2c3ac3f50be38f6dd0eb7c477323e1 100644 --- a/core/java/android/app/NotificationChannel.java +++ b/core/java/android/app/NotificationChannel.java @@ -161,6 +161,19 @@ public final class NotificationChannel implements Parcelable { USER_LOCKED_ALLOW_BUBBLE }; + /** + * @hide + */ + public static final int DEFAULT_ALLOW_BUBBLE = -1; + /** + * @hide + */ + public static final int ALLOW_BUBBLE_ON = 1; + /** + * @hide + */ + public static final int ALLOW_BUBBLE_OFF = 0; + private static final int DEFAULT_LIGHT_COLOR = 0; private static final int DEFAULT_VISIBILITY = NotificationManager.VISIBILITY_NO_OVERRIDE; @@ -168,12 +181,6 @@ public final class NotificationChannel implements Parcelable { NotificationManager.IMPORTANCE_UNSPECIFIED; private static final boolean DEFAULT_DELETED = false; private static final boolean DEFAULT_SHOW_BADGE = true; - /** - * @hide - */ - public static final int DEFAULT_ALLOW_BUBBLE = -1; - private static final int ALLOW_BUBBLE_ON = 1; - private static final int ALLOW_BUBBLE_OFF = 0; @UnsupportedAppUsage private String mId; diff --git a/core/java/android/app/WindowConfiguration.java b/core/java/android/app/WindowConfiguration.java index 37e07de9809a4ba5ee75f5edf7c43892d2f2b302..a486b9501e0c9224570a46334a4e94528f24460d 100644 --- a/core/java/android/app/WindowConfiguration.java +++ b/core/java/android/app/WindowConfiguration.java @@ -726,6 +726,16 @@ public class WindowConfiguration implements Parcelable, Comparable callback) { @@ -141,6 +152,8 @@ public class RoleControllerManager { /** * @see RoleControllerService#onAddRoleHolder(String, String, int) + * + * @hide */ public void onAddRoleHolder(@NonNull String roleName, @NonNull String packageName, @RoleManager.ManageHoldersFlags int flags, @NonNull RemoteCallback callback) { @@ -155,6 +168,8 @@ public class RoleControllerManager { /** * @see RoleControllerService#onRemoveRoleHolder(String, String, int) + * + * @hide */ public void onRemoveRoleHolder(@NonNull String roleName, @NonNull String packageName, @RoleManager.ManageHoldersFlags int flags, @NonNull RemoteCallback callback) { @@ -169,6 +184,8 @@ public class RoleControllerManager { /** * @see RoleControllerService#onClearRoleHolders(String, int) + * + * @hide */ public void onClearRoleHolders(@NonNull String roleName, @RoleManager.ManageHoldersFlags int flags, @NonNull RemoteCallback callback) { @@ -186,6 +203,8 @@ public class RoleControllerManager { * * @deprecated Use {@link #isApplicationVisibleForRole(String, String, Executor, Consumer)} * instead. + * + * @hide */ @RequiresPermission(Manifest.permission.MANAGE_ROLE_HOLDERS) public void isApplicationQualifiedForRole(@NonNull String roleName, @NonNull String packageName, @@ -201,8 +220,11 @@ public class RoleControllerManager { /** * @see RoleControllerService#onIsApplicationVisibleForRole(String, String) + * + * @hide */ @RequiresPermission(Manifest.permission.MANAGE_ROLE_HOLDERS) + @TestApi public void isApplicationVisibleForRole(@NonNull String roleName, @NonNull String packageName, @NonNull @CallbackExecutor Executor executor, @NonNull Consumer callback) { AndroidFuture operation = mRemoteService.postAsync(service -> { @@ -216,8 +238,11 @@ public class RoleControllerManager { /** * @see RoleControllerService#onIsRoleVisible(String) + * + * @hide */ @RequiresPermission(Manifest.permission.MANAGE_ROLE_HOLDERS) + @TestApi public void isRoleVisible(@NonNull String roleName, @NonNull @CallbackExecutor Executor executor, @NonNull Consumer callback) { AndroidFuture operation = mRemoteService.postAsync(service -> { diff --git a/core/java/android/app/servertransaction/MultiWindowModeChangeItem.java b/core/java/android/app/servertransaction/MultiWindowModeChangeItem.java deleted file mode 100644 index b1507177f7e8e814ea030f32ff4031eaf42152d6..0000000000000000000000000000000000000000 --- a/core/java/android/app/servertransaction/MultiWindowModeChangeItem.java +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright 2017 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.app.servertransaction; - -import android.app.ClientTransactionHandler; -import android.content.res.Configuration; -import android.os.IBinder; -import android.os.Parcel; - -import java.util.Objects; - -/** - * Multi-window mode change message. - * @hide - */ -// TODO(lifecycler): Remove the use of this and just use the configuration change message to -// communicate multi-window mode change with WindowConfiguration. -public class MultiWindowModeChangeItem extends ClientTransactionItem { - - private boolean mIsInMultiWindowMode; - private Configuration mOverrideConfig; - - @Override - public void execute(ClientTransactionHandler client, IBinder token, - PendingTransactionActions pendingActions) { - client.handleMultiWindowModeChanged(token, mIsInMultiWindowMode, mOverrideConfig); - } - - - // ObjectPoolItem implementation - - private MultiWindowModeChangeItem() {} - - /** Obtain an instance initialized with provided params. */ - public static MultiWindowModeChangeItem obtain(boolean isInMultiWindowMode, - Configuration overrideConfig) { - MultiWindowModeChangeItem instance = ObjectPool.obtain(MultiWindowModeChangeItem.class); - if (instance == null) { - instance = new MultiWindowModeChangeItem(); - } - instance.mIsInMultiWindowMode = isInMultiWindowMode; - instance.mOverrideConfig = overrideConfig; - - return instance; - } - - @Override - public void recycle() { - mIsInMultiWindowMode = false; - mOverrideConfig = null; - ObjectPool.recycle(this); - } - - - // Parcelable implementation - - /** Write to Parcel. */ - @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeBoolean(mIsInMultiWindowMode); - dest.writeTypedObject(mOverrideConfig, flags); - } - - /** Read from Parcel. */ - private MultiWindowModeChangeItem(Parcel in) { - mIsInMultiWindowMode = in.readBoolean(); - mOverrideConfig = in.readTypedObject(Configuration.CREATOR); - } - - public static final @android.annotation.NonNull Creator CREATOR = - new Creator() { - public MultiWindowModeChangeItem createFromParcel(Parcel in) { - return new MultiWindowModeChangeItem(in); - } - - public MultiWindowModeChangeItem[] newArray(int size) { - return new MultiWindowModeChangeItem[size]; - } - }; - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - final MultiWindowModeChangeItem other = (MultiWindowModeChangeItem) o; - return mIsInMultiWindowMode == other.mIsInMultiWindowMode - && Objects.equals(mOverrideConfig, other.mOverrideConfig); - } - - @Override - public int hashCode() { - int result = 17; - result = 31 * result + (mIsInMultiWindowMode ? 1 : 0); - result = 31 * result + mOverrideConfig.hashCode(); - return result; - } - - @Override - public String toString() { - return "MultiWindowModeChangeItem{isInMultiWindowMode=" + mIsInMultiWindowMode - + ",overrideConfig=" + mOverrideConfig + "}"; - } -} diff --git a/core/java/android/app/servertransaction/PipModeChangeItem.java b/core/java/android/app/servertransaction/PipModeChangeItem.java deleted file mode 100644 index 1955897665beab04dde5f908f795dfa8aef57e8b..0000000000000000000000000000000000000000 --- a/core/java/android/app/servertransaction/PipModeChangeItem.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright 2017 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.app.servertransaction; - -import android.app.ClientTransactionHandler; -import android.content.res.Configuration; -import android.os.IBinder; -import android.os.Parcel; - -import java.util.Objects; - -/** - * Picture in picture mode change message. - * @hide - */ -// TODO(lifecycler): Remove the use of this and just use the configuration change message to -// communicate multi-window mode change with WindowConfiguration. -public class PipModeChangeItem extends ClientTransactionItem { - - private boolean mIsInPipMode; - private Configuration mOverrideConfig; - - @Override - public void execute(ClientTransactionHandler client, IBinder token, - PendingTransactionActions pendingActions) { - client.handlePictureInPictureModeChanged(token, mIsInPipMode, mOverrideConfig); - } - - - // ObjectPoolItem implementation - - private PipModeChangeItem() {} - - /** Obtain an instance initialized with provided params. */ - public static PipModeChangeItem obtain(boolean isInPipMode, Configuration overrideConfig) { - PipModeChangeItem instance = ObjectPool.obtain(PipModeChangeItem.class); - if (instance == null) { - instance = new PipModeChangeItem(); - } - instance.mIsInPipMode = isInPipMode; - instance.mOverrideConfig = overrideConfig; - - return instance; - } - - @Override - public void recycle() { - mIsInPipMode = false; - mOverrideConfig = null; - ObjectPool.recycle(this); - } - - - // Parcelable implementation - - /** Write to Parcel. */ - public void writeToParcel(Parcel dest, int flags) { - dest.writeBoolean(mIsInPipMode); - dest.writeTypedObject(mOverrideConfig, flags); - } - - /** Read from Parcel. */ - private PipModeChangeItem(Parcel in) { - mIsInPipMode = in.readBoolean(); - mOverrideConfig = in.readTypedObject(Configuration.CREATOR); - } - - public static final @android.annotation.NonNull Creator CREATOR = - new Creator() { - public PipModeChangeItem createFromParcel(Parcel in) { - return new PipModeChangeItem(in); - } - - public PipModeChangeItem[] newArray(int size) { - return new PipModeChangeItem[size]; - } - }; - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - final PipModeChangeItem other = (PipModeChangeItem) o; - return mIsInPipMode == other.mIsInPipMode - && Objects.equals(mOverrideConfig, other.mOverrideConfig); - } - - @Override - public int hashCode() { - int result = 17; - result = 31 * result + (mIsInPipMode ? 1 : 0); - result = 31 * result + mOverrideConfig.hashCode(); - return result; - } - - @Override - public String toString() { - return "PipModeChangeItem{isInPipMode=" + mIsInPipMode - + ",overrideConfig=" + mOverrideConfig + "}"; - } -} diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java index b37521b1189b7c9af2174965a54ff9a1720c172e..043953d1aabd5a93cb20b94a1d56f35464908166 100644 --- a/core/java/android/content/pm/ApplicationInfo.java +++ b/core/java/android/content/pm/ApplicationInfo.java @@ -25,7 +25,6 @@ import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; import android.content.Context; import android.content.pm.PackageManager.NameNotFoundException; -import android.content.pm.ProcessInfo; import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.os.Build; @@ -39,8 +38,6 @@ import android.util.SparseArray; import android.util.proto.ProtoOutputStream; import com.android.internal.util.ArrayUtils; -import com.android.internal.util.Parcelling; -import com.android.internal.util.Parcelling.BuiltIn.ForBoolean; import com.android.server.SystemConfig; import java.lang.annotation.Retention; @@ -1725,9 +1722,9 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { dest.writeString8(scanPublicSourceDir); dest.writeString8(sourceDir); dest.writeString8(publicSourceDir); - dest.writeStringArray(splitNames); - dest.writeStringArray(splitSourceDirs); - dest.writeStringArray(splitPublicSourceDirs); + dest.writeString8Array(splitNames); + dest.writeString8Array(splitSourceDirs); + dest.writeString8Array(splitPublicSourceDirs); dest.writeSparseArray((SparseArray) splitDependencies); dest.writeString8(nativeLibraryDir); dest.writeString8(secondaryNativeLibraryDir); @@ -1735,10 +1732,10 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { dest.writeInt(nativeLibraryRootRequiresIsa ? 1 : 0); dest.writeString8(primaryCpuAbi); dest.writeString8(secondaryCpuAbi); - dest.writeStringArray(resourceDirs); + dest.writeString8Array(resourceDirs); dest.writeString8(seInfo); dest.writeString8(seInfoUser); - dest.writeStringArray(sharedLibraryFiles); + dest.writeString8Array(sharedLibraryFiles); dest.writeTypedList(sharedLibraryInfos); dest.writeString8(dataDir); dest.writeString8(deviceProtectedDataDir); @@ -1760,7 +1757,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { dest.writeInt(category); dest.writeInt(targetSandboxVersion); dest.writeString8(classLoaderName); - dest.writeStringArray(splitClassLoaderNames); + dest.writeString8Array(splitClassLoaderNames); dest.writeInt(compileSdkVersion); dest.writeString8(compileSdkVersionCodename); dest.writeString8(appComponentFactory); @@ -1806,9 +1803,9 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { scanPublicSourceDir = source.readString8(); sourceDir = source.readString8(); publicSourceDir = source.readString8(); - splitNames = source.readStringArray(); - splitSourceDirs = source.readStringArray(); - splitPublicSourceDirs = source.readStringArray(); + splitNames = source.createString8Array(); + splitSourceDirs = source.createString8Array(); + splitPublicSourceDirs = source.createString8Array(); splitDependencies = source.readSparseArray(null); nativeLibraryDir = source.readString8(); secondaryNativeLibraryDir = source.readString8(); @@ -1816,10 +1813,10 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { nativeLibraryRootRequiresIsa = source.readInt() != 0; primaryCpuAbi = source.readString8(); secondaryCpuAbi = source.readString8(); - resourceDirs = source.readStringArray(); + resourceDirs = source.createString8Array(); seInfo = source.readString8(); seInfoUser = source.readString8(); - sharedLibraryFiles = source.readStringArray(); + sharedLibraryFiles = source.createString8Array(); sharedLibraryInfos = source.createTypedArrayList(SharedLibraryInfo.CREATOR); dataDir = source.readString8(); deviceProtectedDataDir = source.readString8(); @@ -1841,7 +1838,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { category = source.readInt(); targetSandboxVersion = source.readInt(); classLoaderName = source.readString8(); - splitClassLoaderNames = source.readStringArray(); + splitClassLoaderNames = source.createString8Array(); compileSdkVersion = source.readInt(); compileSdkVersionCodename = source.readString8(); appComponentFactory = source.readString8(); diff --git a/core/java/android/content/pm/IDataLoaderStatusListener.aidl b/core/java/android/content/pm/IDataLoaderStatusListener.aidl index 24a62c5638ec8a9d40c489dbf4879372103c966a..efb00a016da5d56eee9d296ae90b81618dcd71c3 100644 --- a/core/java/android/content/pm/IDataLoaderStatusListener.aidl +++ b/core/java/android/content/pm/IDataLoaderStatusListener.aidl @@ -40,11 +40,15 @@ oneway interface IDataLoaderStatusListener { /** Installation can't continue as DataLoader failed to stream necessary data. */ const int DATA_LOADER_IMAGE_NOT_READY = 6; + /** DataLoader instance can't run at the moment, but might recover later. + * It's up to system to decide if the app is still usable. */ + const int DATA_LOADER_UNAVAILABLE = 7; + /** DataLoader reports that this instance is invalid and can never be restored. * Warning: this is a terminal status that data loader should use carefully and * the system should almost never use - e.g. only if all recovery attempts * fail and all retry limits are exceeded. */ - const int DATA_LOADER_UNRECOVERABLE = 7; + const int DATA_LOADER_UNRECOVERABLE = 8; /** Data loader status callback */ void onStatusChanged(in int dataLoaderId, in int status); diff --git a/core/java/android/content/pm/InstrumentationInfo.java b/core/java/android/content/pm/InstrumentationInfo.java index 745a6c1a0dffb82f41806b3a3f105984205c8c67..bfbd4c60b291412777cc7bdf6de661d2fdd9f2d1 100644 --- a/core/java/android/content/pm/InstrumentationInfo.java +++ b/core/java/android/content/pm/InstrumentationInfo.java @@ -161,9 +161,9 @@ public class InstrumentationInfo extends PackageItemInfo implements Parcelable { dest.writeString8(targetProcesses); dest.writeString8(sourceDir); dest.writeString8(publicSourceDir); - dest.writeStringArray(splitNames); - dest.writeStringArray(splitSourceDirs); - dest.writeStringArray(splitPublicSourceDirs); + dest.writeString8Array(splitNames); + dest.writeString8Array(splitSourceDirs); + dest.writeString8Array(splitPublicSourceDirs); dest.writeSparseArray((SparseArray) splitDependencies); dest.writeString8(dataDir); dest.writeString8(deviceProtectedDataDir); @@ -193,9 +193,9 @@ public class InstrumentationInfo extends PackageItemInfo implements Parcelable { targetProcesses = source.readString8(); sourceDir = source.readString8(); publicSourceDir = source.readString8(); - splitNames = source.readStringArray(); - splitSourceDirs = source.readStringArray(); - splitPublicSourceDirs = source.readStringArray(); + splitNames = source.createString8Array(); + splitSourceDirs = source.createString8Array(); + splitPublicSourceDirs = source.createString8Array(); splitDependencies = source.readSparseArray(null); dataDir = source.readString8(); deviceProtectedDataDir = source.readString8(); diff --git a/core/java/android/content/pm/PackageInfo.java b/core/java/android/content/pm/PackageInfo.java index bb56ef7fd3a0bc9f78d22c6aee9fb1350c82d20c..d7abb68b96a56d984b9a83260a4ba36256d5ee57 100644 --- a/core/java/android/content/pm/PackageInfo.java +++ b/core/java/android/content/pm/PackageInfo.java @@ -442,7 +442,7 @@ public class PackageInfo implements Parcelable { // Allow ApplicationInfo to be squashed. final boolean prevAllowSquashing = dest.allowSquashing(); dest.writeString8(packageName); - dest.writeStringArray(splitNames); + dest.writeString8Array(splitNames); dest.writeInt(versionCode); dest.writeInt(versionCodeMajor); dest.writeString8(versionName); @@ -465,7 +465,7 @@ public class PackageInfo implements Parcelable { dest.writeTypedArray(providers, parcelableFlags); dest.writeTypedArray(instrumentation, parcelableFlags); dest.writeTypedArray(permissions, parcelableFlags); - dest.writeStringArray(requestedPermissions); + dest.writeString8Array(requestedPermissions); dest.writeIntArray(requestedPermissionsFlags); dest.writeTypedArray(signatures, parcelableFlags); dest.writeTypedArray(configPreferences, parcelableFlags); @@ -509,7 +509,7 @@ public class PackageInfo implements Parcelable { @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023) private PackageInfo(Parcel source) { packageName = source.readString8(); - splitNames = source.createStringArray(); + splitNames = source.createString8Array(); versionCode = source.readInt(); versionCodeMajor = source.readInt(); versionName = source.readString8(); @@ -530,7 +530,7 @@ public class PackageInfo implements Parcelable { providers = source.createTypedArray(ProviderInfo.CREATOR); instrumentation = source.createTypedArray(InstrumentationInfo.CREATOR); permissions = source.createTypedArray(PermissionInfo.CREATOR); - requestedPermissions = source.createStringArray(); + requestedPermissions = source.createString8Array(); requestedPermissionsFlags = source.createIntArray(); signatures = source.createTypedArray(Signature.CREATOR); configPreferences = source.createTypedArray(ConfigurationInfo.CREATOR); diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 6a5e6ca289b3554ec822476105797ce88fd71de0..5795cd24f4b1af2944d15ca81545c3aa829d05d2 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -180,6 +180,7 @@ public abstract class PackageManager { GET_DISABLED_UNTIL_USED_COMPONENTS, GET_UNINSTALLED_PACKAGES, MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS, + MATCH_APEX, }) @Retention(RetentionPolicy.SOURCE) public @interface ApplicationInfoFlags {} @@ -5951,9 +5952,9 @@ public abstract class PackageManager { /** * Return the label to use for this application. * - * @return Returns the label associated with this application, or null if - * it could not be found for any reason. - * @param info The application to get the label of. + * @return Returns a {@link CharSequence} containing the label associated with + * this application, or its name the item does not have a label. + * @param info The {@link ApplicationInfo} of the application to get the label of. */ @NonNull public abstract CharSequence getApplicationLabel(@NonNull ApplicationInfo info); diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index 8a57f826ad2ea2c47a7fbdfe9feff5f097c403ca..addac9853f9233890fa65ba9df735889be6dd3d1 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -6016,7 +6016,7 @@ public class PackageParser { // the last entry in pastSigningCertificates is the current signer, ignore it for (int i = 0; i < pastSigningCertificates.length - 1; i++) { - if (pastSigningCertificates[i].equals(oldDetails.signatures[i])) { + if (pastSigningCertificates[i].equals(oldDetails.signatures[0])) { return true; } } diff --git a/core/java/android/content/pm/PermissionInfo.java b/core/java/android/content/pm/PermissionInfo.java index c6c288239d1fc6e1f15d306be4e64072c54a7dad..5f6befdcbaef8c3d35e3c3cd48aab8508d776414 100644 --- a/core/java/android/content/pm/PermissionInfo.java +++ b/core/java/android/content/pm/PermissionInfo.java @@ -618,8 +618,8 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { super.writeToParcel(dest, parcelableFlags); dest.writeInt(protectionLevel); dest.writeInt(flags); - dest.writeString(group); - dest.writeString(backgroundPermission); + dest.writeString8(group); + dest.writeString8(backgroundPermission); dest.writeInt(descriptionRes); dest.writeInt(requestRes); TextUtils.writeToParcel(nonLocalizedDescription, dest, parcelableFlags); @@ -678,8 +678,8 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { super(source); protectionLevel = source.readInt(); flags = source.readInt(); - group = source.readString(); - backgroundPermission = source.readString(); + group = source.readString8(); + backgroundPermission = source.readString8(); descriptionRes = source.readInt(); requestRes = source.readInt(); nonLocalizedDescription = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source); diff --git a/core/java/android/content/pm/ResolveInfo.java b/core/java/android/content/pm/ResolveInfo.java index 82b07f24a9063ab6066f78ed301778c15e409ea1..4f2bf65adfcabb5d8b8c97460eceb721b274c555 100644 --- a/core/java/android/content/pm/ResolveInfo.java +++ b/core/java/android/content/pm/ResolveInfo.java @@ -443,7 +443,7 @@ public class ResolveInfo implements Parcelable { dest.writeInt(labelRes); TextUtils.writeToParcel(nonLocalizedLabel, dest, parcelableFlags); dest.writeInt(icon); - dest.writeString(resolvePackageName); + dest.writeString8(resolvePackageName); dest.writeInt(targetUserId); dest.writeInt(system ? 1 : 0); dest.writeInt(noResourceId ? 1 : 0); @@ -491,7 +491,7 @@ public class ResolveInfo implements Parcelable { nonLocalizedLabel = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source); icon = source.readInt(); - resolvePackageName = source.readString(); + resolvePackageName = source.readString8(); targetUserId = source.readInt(); system = source.readInt() != 0; noResourceId = source.readInt() != 0; diff --git a/core/java/android/content/pm/SharedLibraryInfo.java b/core/java/android/content/pm/SharedLibraryInfo.java index fe4b36fd9ae30b183cf348d9e3e145cbe860b9c8..da2a3d885fc6f3352b328136e9675a15f386acc1 100644 --- a/core/java/android/content/pm/SharedLibraryInfo.java +++ b/core/java/android/content/pm/SharedLibraryInfo.java @@ -26,6 +26,7 @@ import android.os.Parcelable; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -111,10 +112,19 @@ public final class SharedLibraryInfo implements Parcelable { } private SharedLibraryInfo(Parcel parcel) { - this(parcel.readString(), parcel.readString(), parcel.readArrayList(null), - parcel.readString(), parcel.readLong(), - parcel.readInt(), parcel.readParcelable(null), parcel.readArrayList(null), - parcel.createTypedArrayList(SharedLibraryInfo.CREATOR)); + mPath = parcel.readString8(); + mPackageName = parcel.readString8(); + if (parcel.readInt() != 0) { + mCodePaths = Arrays.asList(parcel.createString8Array()); + } else { + mCodePaths = null; + } + mName = parcel.readString8(); + mVersion = parcel.readLong(); + mType = parcel.readInt(); + mDeclaringPackage = parcel.readParcelable(null); + mDependentPackages = parcel.readArrayList(null); + mDependencies = parcel.createTypedArrayList(SharedLibraryInfo.CREATOR); } /** @@ -296,10 +306,15 @@ public final class SharedLibraryInfo implements Parcelable { @Override public void writeToParcel(Parcel parcel, int flags) { - parcel.writeString(mPath); - parcel.writeString(mPackageName); - parcel.writeList(mCodePaths); - parcel.writeString(mName); + parcel.writeString8(mPath); + parcel.writeString8(mPackageName); + if (mCodePaths != null) { + parcel.writeInt(1); + parcel.writeString8Array(mCodePaths.toArray(new String[mCodePaths.size()])); + } else { + parcel.writeInt(0); + } + parcel.writeString8(mName); parcel.writeLong(mVersion); parcel.writeInt(mType); parcel.writeParcelable(mDeclaringPackage, flags); diff --git a/core/java/android/content/pm/ShortcutInfo.java b/core/java/android/content/pm/ShortcutInfo.java index 41f9a6e4a274a36627e285dd678a25cbaf16cef1..85bf11ceb723e39a83769dbbd2bac77142bf12d5 100644 --- a/core/java/android/content/pm/ShortcutInfo.java +++ b/core/java/android/content/pm/ShortcutInfo.java @@ -2059,8 +2059,8 @@ public final class ShortcutInfo implements Parcelable { final ClassLoader cl = getClass().getClassLoader(); mUserId = source.readInt(); - mId = source.readString(); - mPackageName = source.readString(); + mId = source.readString8(); + mPackageName = source.readString8(); mActivity = source.readParcelable(cl); mFlags = source.readInt(); mIconResId = source.readInt(); @@ -2082,12 +2082,12 @@ public final class ShortcutInfo implements Parcelable { mIntentPersistableExtrases = source.readParcelableArray(cl, PersistableBundle.class); mRank = source.readInt(); mExtras = source.readParcelable(cl); - mBitmapPath = source.readString(); + mBitmapPath = source.readString8(); - mIconResName = source.readString(); - mTitleResName = source.readString(); - mTextResName = source.readString(); - mDisabledMessageResName = source.readString(); + mIconResName = source.readString8(); + mTitleResName = source.readString8(); + mTextResName = source.readString8(); + mDisabledMessageResName = source.readString8(); int N = source.readInt(); if (N == 0) { @@ -2095,20 +2095,20 @@ public final class ShortcutInfo implements Parcelable { } else { mCategories = new ArraySet<>(N); for (int i = 0; i < N; i++) { - mCategories.add(source.readString().intern()); + mCategories.add(source.readString8().intern()); } } mPersons = source.readParcelableArray(cl, Person.class); mLocusId = source.readParcelable(cl); - mIconUri = source.readString(); + mIconUri = source.readString8(); } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(mUserId); - dest.writeString(mId); - dest.writeString(mPackageName); + dest.writeString8(mId); + dest.writeString8(mPackageName); dest.writeParcelable(mActivity, flags); dest.writeInt(mFlags); dest.writeInt(mIconResId); @@ -2133,18 +2133,18 @@ public final class ShortcutInfo implements Parcelable { dest.writeParcelableArray(mIntentPersistableExtrases, flags); dest.writeInt(mRank); dest.writeParcelable(mExtras, flags); - dest.writeString(mBitmapPath); + dest.writeString8(mBitmapPath); - dest.writeString(mIconResName); - dest.writeString(mTitleResName); - dest.writeString(mTextResName); - dest.writeString(mDisabledMessageResName); + dest.writeString8(mIconResName); + dest.writeString8(mTitleResName); + dest.writeString8(mTextResName); + dest.writeString8(mDisabledMessageResName); if (mCategories != null) { final int N = mCategories.size(); dest.writeInt(N); for (int i = 0; i < N; i++) { - dest.writeString(mCategories.valueAt(i)); + dest.writeString8(mCategories.valueAt(i)); } } else { dest.writeInt(0); @@ -2152,7 +2152,7 @@ public final class ShortcutInfo implements Parcelable { dest.writeParcelableArray(mPersons, flags); dest.writeParcelable(mLocusId, flags); - dest.writeString(mIconUri); + dest.writeString8(mIconUri); } public static final @android.annotation.NonNull Creator CREATOR = diff --git a/core/java/android/content/pm/UserInfo.java b/core/java/android/content/pm/UserInfo.java index f1506645d10caaadcb499ad05a1dab757532c72f..aca5b458a2d61465b34280351262f2ca02462d03 100644 --- a/core/java/android/content/pm/UserInfo.java +++ b/core/java/android/content/pm/UserInfo.java @@ -457,14 +457,14 @@ public class UserInfo implements Parcelable { @Override public void writeToParcel(Parcel dest, int parcelableFlags) { dest.writeInt(id); - dest.writeString(name); - dest.writeString(iconPath); + dest.writeString8(name); + dest.writeString8(iconPath); dest.writeInt(flags); - dest.writeString(userType); + dest.writeString8(userType); dest.writeInt(serialNumber); dest.writeLong(creationTime); dest.writeLong(lastLoggedInTime); - dest.writeString(lastLoggedInFingerprint); + dest.writeString8(lastLoggedInFingerprint); dest.writeBoolean(partial); dest.writeBoolean(preCreated); dest.writeInt(profileGroupId); @@ -486,14 +486,14 @@ public class UserInfo implements Parcelable { private UserInfo(Parcel source) { id = source.readInt(); - name = source.readString(); - iconPath = source.readString(); + name = source.readString8(); + iconPath = source.readString8(); flags = source.readInt(); - userType = source.readString(); + userType = source.readString8(); serialNumber = source.readInt(); creationTime = source.readLong(); lastLoggedInTime = source.readLong(); - lastLoggedInFingerprint = source.readString(); + lastLoggedInFingerprint = source.readString8(); partial = source.readBoolean(); preCreated = source.readBoolean(); profileGroupId = source.readInt(); diff --git a/core/java/android/content/pm/VersionedPackage.java b/core/java/android/content/pm/VersionedPackage.java index 21df7ecef01566b371e6baf2f9018a5050c9b313..2987557a54b4da0d57a50427628d10a62da9f9c1 100644 --- a/core/java/android/content/pm/VersionedPackage.java +++ b/core/java/android/content/pm/VersionedPackage.java @@ -60,7 +60,7 @@ public final class VersionedPackage implements Parcelable { } private VersionedPackage(Parcel parcel) { - mPackageName = parcel.readString(); + mPackageName = parcel.readString8(); mVersionCode = parcel.readLong(); } @@ -116,7 +116,7 @@ public final class VersionedPackage implements Parcelable { @Override public void writeToParcel(Parcel parcel, int flags) { - parcel.writeString(mPackageName); + parcel.writeString8(mPackageName); parcel.writeLong(mVersionCode); } diff --git a/core/java/android/content/pm/parsing/ParsingPackageUtils.java b/core/java/android/content/pm/parsing/ParsingPackageUtils.java index 4e189796bc48b6782fab53a2c1871904c6c92f67..197ad7412a1fef76d26160bafa4b25cb60eb50e1 100644 --- a/core/java/android/content/pm/parsing/ParsingPackageUtils.java +++ b/core/java/android/content/pm/parsing/ParsingPackageUtils.java @@ -346,12 +346,11 @@ public class ParsingPackageUtils { } final ParsingPackage pkg = result.getResult(); - if (pkg.getTargetSdkVersion() >= Build.VERSION_CODES.R - && assets.containsAllocatedTable()) { + if (assets.containsAllocatedTable()) { final ParseResult deferResult = input.deferError( - "Targeting R+ (version" + Build.VERSION_CODES.R + " and above) requires the" - + " resources.arsc of installed APKs to be stored uncompressed and" - + " aligned on a 4-byte boundary", + "Targeting R+ (version " + Build.VERSION_CODES.R + " and above) requires" + + " the resources.arsc of installed APKs to be stored uncompressed" + + " and aligned on a 4-byte boundary", DeferredError.RESOURCES_ARSC_COMPRESSED); if (deferResult.isError()) { return input.error(INSTALL_PARSE_FAILED_RESOURCES_ARSC_COMPRESSED, diff --git a/core/java/android/hardware/camera2/impl/CameraMetadataNative.java b/core/java/android/hardware/camera2/impl/CameraMetadataNative.java index 786db6e20d1409f442e9839c0de202b74bac438c..986e6eafac2ad8a1bab4fdfe5727ff2e065e17a6 100644 --- a/core/java/android/hardware/camera2/impl/CameraMetadataNative.java +++ b/core/java/android/hardware/camera2/impl/CameraMetadataNative.java @@ -71,6 +71,8 @@ import android.util.Log; import android.util.Range; import android.util.Size; +import dalvik.annotation.optimization.FastNative; + import java.io.IOException; import java.nio.ByteBuffer; import java.nio.ByteOrder; @@ -356,7 +358,7 @@ public class CameraMetadataNative implements Parcelable { */ public CameraMetadataNative(CameraMetadataNative other) { super(); - mMetadataPtr = nativeAllocateCopy(other); + mMetadataPtr = nativeAllocateCopy(other.mMetadataPtr); if (mMetadataPtr == 0) { throw new OutOfMemoryError("Failed to allocate native CameraMetadata"); } @@ -398,7 +400,7 @@ public class CameraMetadataNative implements Parcelable { @Override public void writeToParcel(Parcel dest, int flags) { - nativeWriteToParcel(dest); + nativeWriteToParcel(dest, mMetadataPtr); } /** @@ -440,7 +442,7 @@ public class CameraMetadataNative implements Parcelable { } public void readFromParcel(Parcel in) { - nativeReadFromParcel(in); + nativeReadFromParcel(in, mMetadataPtr); } /** @@ -528,9 +530,9 @@ public class CameraMetadataNative implements Parcelable { public static final int NUM_TYPES = 6; private void close() { - // this sets mMetadataPtr to 0 - nativeClose(); - mMetadataPtr = 0; // set it to 0 again to prevent eclipse from making this field final + // Delete native pointer, but does not clear it + nativeClose(mMetadataPtr); + mMetadataPtr = 0; } private T getBase(CameraCharacteristics.Key key) { @@ -550,7 +552,7 @@ public class CameraMetadataNative implements Parcelable { if (key.hasTag()) { tag = key.getTag(); } else { - tag = nativeGetTagFromKeyLocal(key.getName()); + tag = nativeGetTagFromKeyLocal(mMetadataPtr, key.getName()); key.cacheTag(tag); } byte[] values = readValues(tag); @@ -560,14 +562,14 @@ public class CameraMetadataNative implements Parcelable { if (key.mFallbackName == null) { return null; } - tag = nativeGetTagFromKeyLocal(key.mFallbackName); + tag = nativeGetTagFromKeyLocal(mMetadataPtr, key.mFallbackName); values = readValues(tag); if (values == null) { return null; } } - int nativeType = nativeGetTypeFromTagLocal(tag); + int nativeType = nativeGetTypeFromTagLocal(mMetadataPtr, tag); Marshaler marshaler = getMarshalerForKey(key, nativeType); ByteBuffer buffer = ByteBuffer.wrap(values).order(ByteOrder.nativeOrder()); return marshaler.unmarshal(buffer); @@ -1514,7 +1516,7 @@ public class CameraMetadataNative implements Parcelable { if (key.hasTag()) { tag = key.getTag(); } else { - tag = nativeGetTagFromKeyLocal(key.getName()); + tag = nativeGetTagFromKeyLocal(mMetadataPtr, key.getName()); key.cacheTag(tag); } if (value == null) { @@ -1523,7 +1525,7 @@ public class CameraMetadataNative implements Parcelable { return; } // else update the entry to a new value - int nativeType = nativeGetTypeFromTagLocal(tag); + int nativeType = nativeGetTypeFromTagLocal(mMetadataPtr, tag); Marshaler marshaler = getMarshalerForKey(key, nativeType); int size = marshaler.calculateMarshalSize(value); @@ -1684,32 +1686,47 @@ public class CameraMetadataNative implements Parcelable { @UnsupportedAppUsage private long mMetadataPtr; // native std::shared_ptr* - private native long nativeAllocate(); - private native long nativeAllocateCopy(CameraMetadataNative other) + @FastNative + private static native long nativeAllocate(); + @FastNative + private static native long nativeAllocateCopy(long ptr) throws NullPointerException; - private native synchronized void nativeWriteToParcel(Parcel dest); - private native synchronized void nativeReadFromParcel(Parcel source); - private native synchronized void nativeSwap(CameraMetadataNative other) + @FastNative + private static synchronized native void nativeWriteToParcel(Parcel dest, long ptr); + @FastNative + private static synchronized native void nativeReadFromParcel(Parcel source, long ptr); + @FastNative + private static synchronized native void nativeSwap(long ptr, long otherPtr) throws NullPointerException; - private native synchronized void nativeClose(); - private native synchronized boolean nativeIsEmpty(); - private native synchronized int nativeGetEntryCount(); + @FastNative + private static synchronized native void nativeClose(long ptr); + @FastNative + private static synchronized native boolean nativeIsEmpty(long ptr); + @FastNative + private static synchronized native int nativeGetEntryCount(long ptr); @UnsupportedAppUsage - private native synchronized byte[] nativeReadValues(int tag); - private native synchronized void nativeWriteValues(int tag, byte[] src); - private native synchronized void nativeDump() throws IOException; // dump to ALOGD - - private native synchronized ArrayList nativeGetAllVendorKeys(Class keyClass); + @FastNative + private static synchronized native byte[] nativeReadValues(int tag, long ptr); + @FastNative + private static synchronized native void nativeWriteValues(int tag, byte[] src, long ptr); + private static synchronized native void nativeDump(long ptr) throws IOException; // dump to LOGD + + @FastNative + private static synchronized native ArrayList nativeGetAllVendorKeys(long ptr, Class keyClass); @UnsupportedAppUsage - private native synchronized int nativeGetTagFromKeyLocal(String keyName) + @FastNative + private static synchronized native int nativeGetTagFromKeyLocal(long ptr, String keyName) throws IllegalArgumentException; @UnsupportedAppUsage - private native synchronized int nativeGetTypeFromTagLocal(int tag) + @FastNative + private static synchronized native int nativeGetTypeFromTagLocal(long ptr, int tag) throws IllegalArgumentException; + @FastNative private static native int nativeGetTagFromKey(String keyName, long vendorId) throws IllegalArgumentException; + @FastNative private static native int nativeGetTypeFromTag(int tag, long vendorId) throws IllegalArgumentException; @@ -1723,7 +1740,7 @@ public class CameraMetadataNative implements Parcelable { * @hide */ public void swap(CameraMetadataNative other) { - nativeSwap(other); + nativeSwap(mMetadataPtr, other.mMetadataPtr); mCameraId = other.mCameraId; mHasMandatoryConcurrentStreams = other.mHasMandatoryConcurrentStreams; mDisplaySize = other.mDisplaySize; @@ -1733,7 +1750,7 @@ public class CameraMetadataNative implements Parcelable { * @hide */ public int getEntryCount() { - return nativeGetEntryCount(); + return nativeGetEntryCount(mMetadataPtr); } /** @@ -1742,12 +1759,12 @@ public class CameraMetadataNative implements Parcelable { * @hide */ public boolean isEmpty() { - return nativeIsEmpty(); + return nativeIsEmpty(mMetadataPtr); } /** - * Retrieves the pointer to the native CameraMetadata as a Java long. + * Retrieves the pointer to the native shared_ptr as a Java long. * * @hide */ @@ -1764,7 +1781,7 @@ public class CameraMetadataNative implements Parcelable { if (keyClass == null) { throw new NullPointerException(); } - return (ArrayList) nativeGetAllVendorKeys(keyClass); + return (ArrayList) nativeGetAllVendorKeys(mMetadataPtr, keyClass); } /** @@ -1816,7 +1833,7 @@ public class CameraMetadataNative implements Parcelable { * @hide */ public void writeValues(int tag, byte[] src) { - nativeWriteValues(tag, src); + nativeWriteValues(tag, src, mMetadataPtr); } /** @@ -1832,7 +1849,7 @@ public class CameraMetadataNative implements Parcelable { */ public byte[] readValues(int tag) { // TODO: Optimization. Native code returns a ByteBuffer instead. - return nativeReadValues(tag); + return nativeReadValues(tag, mMetadataPtr); } /** @@ -1845,7 +1862,7 @@ public class CameraMetadataNative implements Parcelable { */ public void dumpToLog() { try { - nativeDump(); + nativeDump(mMetadataPtr); } catch (IOException e) { Log.wtf(TAG, "Dump logging failed", e); } diff --git a/core/java/android/hardware/soundtrigger/SoundTrigger.java b/core/java/android/hardware/soundtrigger/SoundTrigger.java index d12142c0be79134257d9c2e90316ee390c69620c..4bed985489ef8c8153c90fbe1c25e435fac8e00c 100644 --- a/core/java/android/hardware/soundtrigger/SoundTrigger.java +++ b/core/java/android/hardware/soundtrigger/SoundTrigger.java @@ -1945,7 +1945,7 @@ public class SoundTrigger { Looper looper = handler != null ? handler.getLooper() : Looper.getMainLooper(); try { return new SoundTriggerModule(getService(), moduleId, listener, looper); - } catch (RemoteException e) { + } catch (Exception e) { Log.e(TAG, "", e); return null; } diff --git a/core/java/android/inputmethodservice/InputMethodService.java b/core/java/android/inputmethodservice/InputMethodService.java index 93ce88b767bc68944d2ac8582952d810f7be1472..d3464fde4b75cd9afd3c8dec1ff19ed0ed4db3b3 100644 --- a/core/java/android/inputmethodservice/InputMethodService.java +++ b/core/java/android/inputmethodservice/InputMethodService.java @@ -784,10 +784,19 @@ public class InputMethodService extends AbstractInputMethodService { } } - // TODO(b/137800469): Add detailed docs explaining the inline suggestions process. /** - * This method should be implemented by subclass which supports displaying autofill inline - * suggestion. + * Called when Autofill is requesting an {@link InlineSuggestionsRequest} from the IME. + * + *

The Autofill Framework will first request the IME to create and send an + * {@link InlineSuggestionsRequest} back. Once Autofill Framework receives a valid request and + * also receives valid inline suggestions, they will be returned via + * {@link #onInlineSuggestionsResponse(InlineSuggestionsResponse)}.

+ * + *

IME Lifecycle - The request will wait to be created after inputStarted

+ * + *

If the IME wants to support displaying inline suggestions, they must set + * supportsInlineSuggestions in its XML and implement this method to return a valid + * {@link InlineSuggestionsRequest}.

* * @param uiExtras the extras that contain the UI renderer related information * @return an {@link InlineSuggestionsRequest} to be sent to Autofill. diff --git a/core/java/android/net/Ikev2VpnProfile.java b/core/java/android/net/Ikev2VpnProfile.java index 81d03f07d0be8999984ad1dbf3c5eebfdead106e..afa63039b6f70703a23a5da7cfdba94589c3eb3a 100644 --- a/core/java/android/net/Ikev2VpnProfile.java +++ b/core/java/android/net/Ikev2VpnProfile.java @@ -70,6 +70,15 @@ public final class Ikev2VpnProfile extends PlatformVpnProfile { private static final String MISSING_PARAM_MSG_TMPL = "Required parameter was not provided: %s"; private static final String EMPTY_CERT = ""; + /** @hide */ + public static final List DEFAULT_ALGORITHMS = + Collections.unmodifiableList(Arrays.asList( + IpSecAlgorithm.CRYPT_AES_CBC, + IpSecAlgorithm.AUTH_HMAC_SHA256, + IpSecAlgorithm.AUTH_HMAC_SHA384, + IpSecAlgorithm.AUTH_HMAC_SHA512, + IpSecAlgorithm.AUTH_CRYPT_AES_GCM)); + @NonNull private final String mServerAddr; @NonNull private final String mUserIdentity; @@ -172,7 +181,56 @@ public final class Ikev2VpnProfile extends PlatformVpnProfile { throw new IllegalArgumentException("Invalid auth method set"); } - VpnProfile.validateAllowedAlgorithms(mAllowedAlgorithms); + validateAllowedAlgorithms(mAllowedAlgorithms); + } + + /** + * Validates that the allowed algorithms are a valid set for IPsec purposes + * + *

In order for the algorithm list to be a valid set, it must contain at least one algorithm + * that provides Authentication, and one that provides Encryption. Authenticated Encryption with + * Associated Data (AEAD) algorithms are counted as providing Authentication and Encryption. + * + * @param allowedAlgorithms The list to be validated + */ + private static void validateAllowedAlgorithms(@NonNull List algorithmNames) { + VpnProfile.validateAllowedAlgorithms(algorithmNames); + + // First, make sure no insecure algorithms were proposed. + if (algorithmNames.contains(IpSecAlgorithm.AUTH_HMAC_MD5) + || algorithmNames.contains(IpSecAlgorithm.AUTH_HMAC_SHA1)) { + throw new IllegalArgumentException("Algorithm not supported for IKEv2 VPN profiles"); + } + + // Validate that some valid combination (AEAD or AUTH + CRYPT) is present + if (hasAeadAlgorithms(algorithmNames) || hasNormalModeAlgorithms(algorithmNames)) { + return; + } + + throw new IllegalArgumentException("Algorithm set missing support for Auth, Crypt or both"); + } + + /** + * Checks if the provided list has AEAD algorithms + * + * @hide + */ + public static boolean hasAeadAlgorithms(@NonNull List algorithmNames) { + return algorithmNames.contains(IpSecAlgorithm.AUTH_CRYPT_AES_GCM); + } + + /** + * Checks the provided list has acceptable (non-AEAD) authentication and encryption algorithms + * + * @hide + */ + public static boolean hasNormalModeAlgorithms(@NonNull List algorithmNames) { + final boolean hasCrypt = algorithmNames.contains(IpSecAlgorithm.CRYPT_AES_CBC); + final boolean hasAuth = algorithmNames.contains(IpSecAlgorithm.AUTH_HMAC_SHA256) + || algorithmNames.contains(IpSecAlgorithm.AUTH_HMAC_SHA384) + || algorithmNames.contains(IpSecAlgorithm.AUTH_HMAC_SHA512); + + return hasCrypt && hasAuth; } /** Retrieves the server address string. */ @@ -559,7 +617,7 @@ public final class Ikev2VpnProfile extends PlatformVpnProfile { @Nullable private X509Certificate mUserCert; @Nullable private ProxyInfo mProxyInfo; - @NonNull private List mAllowedAlgorithms = new ArrayList<>(); + @NonNull private List mAllowedAlgorithms = DEFAULT_ALGORITHMS; private boolean mIsBypassable = false; private boolean mIsMetered = true; private int mMaxMtu = PlatformVpnProfile.MAX_MTU_DEFAULT; @@ -756,7 +814,19 @@ public final class Ikev2VpnProfile extends PlatformVpnProfile { /** * Sets the allowable set of IPsec algorithms * - *

A list of allowed IPsec algorithms as defined in {@link IpSecAlgorithm} + *

If set, this will constrain the set of algorithms that the IPsec tunnel will use for + * integrity verification and encryption to the provided list. + * + *

The set of allowed IPsec algorithms is defined in {@link IpSecAlgorithm}. Adding of + * algorithms that are considered insecure (such as AUTH_HMAC_MD5 and AUTH_HMAC_SHA1) is not + * permitted, and will result in an IllegalArgumentException being thrown. + * + *

The provided algorithm list must contain at least one algorithm that provides + * Authentication, and one that provides Encryption. Authenticated Encryption with + * Associated Data (AEAD) algorithms provide both Authentication and Encryption. + * + *

By default, this profile will use any algorithm defined in {@link IpSecAlgorithm}, + * with the exception of those considered insecure (as described above). * * @param algorithmNames the list of supported IPsec algorithms * @return this {@link Builder} object to facilitate chaining of method calls @@ -765,7 +835,7 @@ public final class Ikev2VpnProfile extends PlatformVpnProfile { @NonNull public Builder setAllowedAlgorithms(@NonNull List algorithmNames) { checkNotNull(algorithmNames, MISSING_PARAM_MSG_TMPL, "algorithmNames"); - VpnProfile.validateAllowedAlgorithms(algorithmNames); + validateAllowedAlgorithms(algorithmNames); mAllowedAlgorithms = algorithmNames; return this; diff --git a/core/java/android/net/TelephonyNetworkSpecifier.java b/core/java/android/net/TelephonyNetworkSpecifier.java index aafebd7ecfc85e1e8b83d42cfd3192fc1c7c4de0..33c71d5b312a7e2786bd1bf7eb6b9a2ca8babc51 100644 --- a/core/java/android/net/TelephonyNetworkSpecifier.java +++ b/core/java/android/net/TelephonyNetworkSpecifier.java @@ -98,9 +98,10 @@ public final class TelephonyNetworkSpecifier extends NetworkSpecifier implements /** @hide */ @Override public boolean canBeSatisfiedBy(NetworkSpecifier other) { - // Any generic requests should be satisfied by a specific telephony network. - // For simplicity, we treat null same as MatchAllNetworkSpecifier - return equals(other) || other == null || other instanceof MatchAllNetworkSpecifier; + // Although the only caller, NetworkCapabilities, already handled the case of + // MatchAllNetworkSpecifier, we do it again here in case the API will be used by others. + // TODO(b/154959809): consider implementing bi-directional specifier instead. + return equals(other) || other instanceof MatchAllNetworkSpecifier; } diff --git a/core/java/android/os/Environment.java b/core/java/android/os/Environment.java index c7355dd695f02a8e45ba8d537913b19052a9d35d..9e13f05129a22aeac8707620d79da81ce4e932bc 100644 --- a/core/java/android/os/Environment.java +++ b/core/java/android/os/Environment.java @@ -974,6 +974,15 @@ public class Environment { return sCurrentUser.buildExternalStorageAndroidDataDirs(); } + /** + * Returns the path for android-specific OBB data on the SD card. + * @hide + */ + public static File[] buildExternalStorageAndroidObbDirs() { + throwIfUserRequired(); + return sCurrentUser.buildExternalStorageAndroidObbDirs(); + } + /** * Generates the raw path to an application's data * @hide diff --git a/core/java/android/os/LocaleList.java b/core/java/android/os/LocaleList.java index 0bf387e6d0a6713ebfe03b4066ab0b7e44acb0bf..ab4bb0b9f2cd069e6624d131a6dbe9074cd29d38 100644 --- a/core/java/android/os/LocaleList.java +++ b/core/java/android/os/LocaleList.java @@ -137,7 +137,7 @@ public final class LocaleList implements Parcelable { @Override public void writeToParcel(Parcel dest, int parcelableFlags) { - dest.writeString(mStringRepresentation); + dest.writeString8(mStringRepresentation); } /** @@ -239,7 +239,7 @@ public final class LocaleList implements Parcelable { = new Parcelable.Creator() { @Override public LocaleList createFromParcel(Parcel source) { - return LocaleList.forLanguageTags(source.readString()); + return LocaleList.forLanguageTags(source.readString8()); } @Override diff --git a/core/java/android/os/Parcel.java b/core/java/android/os/Parcel.java index 93f6607ff9d465dfbff0101d2980e30efbe46acc..e5bab6fc9230e51864d62a248d195cc4336722a1 100644 --- a/core/java/android/os/Parcel.java +++ b/core/java/android/os/Parcel.java @@ -1396,24 +1396,39 @@ public final class Parcel { } public final void writeStringArray(@Nullable String[] val) { + writeString16Array(val); + } + + @Nullable + public final String[] createStringArray() { + return createString16Array(); + } + + public final void readStringArray(@NonNull String[] val) { + readString16Array(val); + } + + /** {@hide} */ + public final void writeString8Array(@Nullable String[] val) { if (val != null) { int N = val.length; writeInt(N); for (int i=0; i= 0) { String[] val = new String[N]; for (int i=0; i= 0) { + String[] val = new String[N]; + for (int i=0; i= 0) - { - array = new String[length]; - - for (int i = 0 ; i < length ; i++) - { - array[i] = readString(); - } - } - - return array; + return createString16Array(); } /** diff --git a/core/java/android/os/RegistrantList.java b/core/java/android/os/RegistrantList.java index 98f949bbfd843586629238aef0dc97133a16ff52..81750021fdd52534e74bca60b2def62d71d8a30e 100644 --- a/core/java/android/os/RegistrantList.java +++ b/core/java/android/os/RegistrantList.java @@ -66,6 +66,10 @@ public class RegistrantList } } + public synchronized void removeAll() { + registrants.clear(); + } + @UnsupportedAppUsage public synchronized int size() diff --git a/core/java/android/os/UpdateEngine.java b/core/java/android/os/UpdateEngine.java index de274c082c80754cf02c118b56ab51ae6c07d039..e907e2204b7b2c164c067a27589e91ea6edc508c 100644 --- a/core/java/android/os/UpdateEngine.java +++ b/core/java/android/os/UpdateEngine.java @@ -614,9 +614,6 @@ public class UpdateEngine { * encountered. Device is corrupted, and future updates must not be applied. * The device cannot recover without flashing and factory resets. * - * - * @throws ServiceSpecificException if other transient errors has occurred. - * A reboot may or may not help resolving the issue. */ @WorkerThread @ErrorCode diff --git a/core/java/android/os/storage/StorageVolume.java b/core/java/android/os/storage/StorageVolume.java index e251f8072b1fac95613723d79a4a97440ac4c798..a63b82e44f06b2e97e4f5cef3f975c417ee4eb7d 100644 --- a/core/java/android/os/storage/StorageVolume.java +++ b/core/java/android/os/storage/StorageVolume.java @@ -149,18 +149,18 @@ public final class StorageVolume implements Parcelable { } private StorageVolume(Parcel in) { - mId = in.readString(); - mPath = new File(in.readString()); - mInternalPath = new File(in.readString()); - mDescription = in.readString(); + mId = in.readString8(); + mPath = new File(in.readString8()); + mInternalPath = new File(in.readString8()); + mDescription = in.readString8(); mPrimary = in.readInt() != 0; mRemovable = in.readInt() != 0; mEmulated = in.readInt() != 0; mAllowMassStorage = in.readInt() != 0; mMaxFileSize = in.readLong(); mOwner = in.readParcelable(null); - mFsUuid = in.readString(); - mState = in.readString(); + mFsUuid = in.readString8(); + mState = in.readString8(); } /** @@ -503,17 +503,17 @@ public final class StorageVolume implements Parcelable { @Override public void writeToParcel(Parcel parcel, int flags) { - parcel.writeString(mId); - parcel.writeString(mPath.toString()); - parcel.writeString(mInternalPath.toString()); - parcel.writeString(mDescription); + parcel.writeString8(mId); + parcel.writeString8(mPath.toString()); + parcel.writeString8(mInternalPath.toString()); + parcel.writeString8(mDescription); parcel.writeInt(mPrimary ? 1 : 0); parcel.writeInt(mRemovable ? 1 : 0); parcel.writeInt(mEmulated ? 1 : 0); parcel.writeInt(mAllowMassStorage ? 1 : 0); parcel.writeLong(mMaxFileSize); parcel.writeParcelable(mOwner, flags); - parcel.writeString(mFsUuid); - parcel.writeString(mState); + parcel.writeString8(mFsUuid); + parcel.writeString8(mState); } } diff --git a/core/java/android/os/storage/VolumeInfo.java b/core/java/android/os/storage/VolumeInfo.java index fb9065568e9bd0bc605e4c76eef95476ad6f28b0..d7aaa4d6cbf966385be00f0427c76073a9bd5b43 100644 --- a/core/java/android/os/storage/VolumeInfo.java +++ b/core/java/android/os/storage/VolumeInfo.java @@ -181,22 +181,22 @@ public class VolumeInfo implements Parcelable { @UnsupportedAppUsage public VolumeInfo(Parcel parcel) { - id = parcel.readString(); + id = parcel.readString8(); type = parcel.readInt(); if (parcel.readInt() != 0) { disk = DiskInfo.CREATOR.createFromParcel(parcel); } else { disk = null; } - partGuid = parcel.readString(); + partGuid = parcel.readString8(); mountFlags = parcel.readInt(); mountUserId = parcel.readInt(); state = parcel.readInt(); - fsType = parcel.readString(); - fsUuid = parcel.readString(); - fsLabel = parcel.readString(); - path = parcel.readString(); - internalPath = parcel.readString(); + fsType = parcel.readString8(); + fsUuid = parcel.readString8(); + fsLabel = parcel.readString8(); + path = parcel.readString8(); + internalPath = parcel.readString8(); } @UnsupportedAppUsage @@ -553,7 +553,7 @@ public class VolumeInfo implements Parcelable { @Override public void writeToParcel(Parcel parcel, int flags) { - parcel.writeString(id); + parcel.writeString8(id); parcel.writeInt(type); if (disk != null) { parcel.writeInt(1); @@ -561,14 +561,14 @@ public class VolumeInfo implements Parcelable { } else { parcel.writeInt(0); } - parcel.writeString(partGuid); + parcel.writeString8(partGuid); parcel.writeInt(mountFlags); parcel.writeInt(mountUserId); parcel.writeInt(state); - parcel.writeString(fsType); - parcel.writeString(fsUuid); - parcel.writeString(fsLabel); - parcel.writeString(path); - parcel.writeString(internalPath); + parcel.writeString8(fsType); + parcel.writeString8(fsUuid); + parcel.writeString8(fsLabel); + parcel.writeString8(path); + parcel.writeString8(internalPath); } } diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index fbd6cbae47d92fb496c3cc042a811d9308534b93..b280c5d63cd7a234351d5d54269b67a5feaf0d1e 100755 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -2020,8 +2020,7 @@ public final class Settings { * In some cases, a matching Activity may not exist, so ensure you * safeguard against this. *

- * Input: The Intent's data URI specifies the application package name - * to be shown, with the "package" scheme. That is "package:com.my.app". + * Input: Nothing. *

* Output: Nothing. */ @@ -10738,13 +10737,33 @@ public final class Settings { * The associated value is a specially formatted string that describes the * size and density of simulated secondary display devices. *

- * Format: {width}x{height}/{dpi};... + * Format: + *

+         * [display1];[display2];...
+         * 
+ * with each display specified as: + *
+         * [mode1]|[mode2]|...,[flag1],[flag2],...
+         * 
+ * with each mode specified as: + *
+         * [width]x[height]/[densityDpi]
+         * 
+ * Supported flags: + *
    + *
  • secure
    : creates a secure display
  • + *
  • own_content_only
    : only shows this display's own content
  • + *
  • should_show_system_decorations
    : supports system decorations
  • + *
*

* Example: *

    *
  • 1280x720/213: make one overlay that is 1280x720 at 213dpi.
  • - *
  • 1920x1080/320;1280x720/213: make two overlays, the first - * at 1080p and the second at 720p.
  • + *
  • 1920x1080/320,secure;1280x720/213: make two overlays, the first at + * 1080p and secure; the second at 720p.
  • + *
  • 1920x1080/320|3840x2160/640: make one overlay that is 1920x1080 at + * 213dpi by default, but can also be upscaled to 3840x2160 at 640dpi by the system if the + * display device allows.
  • *
  • If the value is empty, then no overlay display devices are created.
  • *

* @@ -13829,16 +13848,6 @@ public final class Settings { public static final String SHOW_NOTIFICATION_CHANNEL_WARNINGS = "show_notification_channel_warnings"; - /** - * When enabled, requires all notifications in the conversation section to be backed - * by a long-lived sharing shortcut - * - * The value 1 - require a shortcut, 0 - do not require a shortcut - * @hide - */ - public static final String REQUIRE_SHORTCUTS_FOR_CONVERSATIONS = - "require_shortcuts_for_conversations"; - /** * Whether cell is enabled/disabled * @hide diff --git a/core/java/android/service/autofill/FillRequest.java b/core/java/android/service/autofill/FillRequest.java index 8f858d547b1f10eb543a53a0d22825300e32e488..d94160c2b40ca595ac9a9b6ccb9355c47b1735a5 100644 --- a/core/java/android/service/autofill/FillRequest.java +++ b/core/java/android/service/autofill/FillRequest.java @@ -127,10 +127,16 @@ public final class FillRequest implements Parcelable { private final @RequestFlags int mFlags; /** - * Gets the {@link android.view.inputmethod.InlineSuggestionsRequest} associated + * Gets the {@link InlineSuggestionsRequest} associated * with this request. * - * TODO(b/137800469): Add more doc describing how to handle the inline suggestions request. + *

Autofill Framework will send a {@code @non-null} {@link InlineSuggestionsRequest} if + * currently inline suggestions are supported and can be displayed. If the Autofill service + * wants to show inline suggestions, they may return {@link Dataset} with valid + * {@link InlinePresentation}.

+ * + *

The Autofill Service must set supportsInlineSuggestions in its XML to enable support + * for inline suggestions.

* * @return the suggestionspec */ @@ -142,7 +148,7 @@ public final class FillRequest implements Parcelable { - // Code below generated by codegen v1.0.14. + // Code below generated by codegen v1.0.15. // // DO NOT MODIFY! // CHECKSTYLE:OFF Generated code @@ -212,10 +218,16 @@ public final class FillRequest implements Parcelable { * @return any combination of {@link #FLAG_MANUAL_REQUEST} and * {@link #FLAG_COMPATIBILITY_MODE_REQUEST}. * @param inlineSuggestionsRequest - * Gets the {@link android.view.inputmethod.InlineSuggestionsRequest} associated + * Gets the {@link InlineSuggestionsRequest} associated * with this request. * - * TODO(b/137800469): Add more doc describing how to handle the inline suggestions request. + *

Autofill Framework will send a {@code @non-null} {@link InlineSuggestionsRequest} if + * currently inline suggestions are supported and can be displayed. If the Autofill service + * wants to show inline suggestions, they may return {@link Dataset} with valid + * {@link InlinePresentation}.

+ * + *

The Autofill Service must set supportsInlineSuggestions in its XML to enable support + * for inline suggestions.

* @hide */ @DataClass.Generated.Member @@ -292,10 +304,16 @@ public final class FillRequest implements Parcelable { } /** - * Gets the {@link android.view.inputmethod.InlineSuggestionsRequest} associated + * Gets the {@link InlineSuggestionsRequest} associated * with this request. * - * TODO(b/137800469): Add more doc describing how to handle the inline suggestions request. + *

Autofill Framework will send a {@code @non-null} {@link InlineSuggestionsRequest} if + * currently inline suggestions are supported and can be displayed. If the Autofill service + * wants to show inline suggestions, they may return {@link Dataset} with valid + * {@link InlinePresentation}.

+ * + *

The Autofill Service must set supportsInlineSuggestions in its XML to enable support + * for inline suggestions.

* * @return the suggestionspec */ @@ -387,8 +405,8 @@ public final class FillRequest implements Parcelable { }; @DataClass.Generated( - time = 1583196707026L, - codegenVersion = "1.0.14", + time = 1588119440090L, + codegenVersion = "1.0.15", sourceFile = "frameworks/base/core/java/android/service/autofill/FillRequest.java", inputSignatures = "public static final @android.service.autofill.FillRequest.RequestFlags int FLAG_MANUAL_REQUEST\npublic static final @android.service.autofill.FillRequest.RequestFlags int FLAG_COMPATIBILITY_MODE_REQUEST\npublic static final @android.service.autofill.FillRequest.RequestFlags int FLAG_PASSWORD_INPUT_TYPE\npublic static final int INVALID_REQUEST_ID\nprivate final int mId\nprivate final @android.annotation.NonNull java.util.List mFillContexts\nprivate final @android.annotation.Nullable android.os.Bundle mClientState\nprivate final @android.service.autofill.FillRequest.RequestFlags int mFlags\nprivate final @android.annotation.Nullable android.view.inputmethod.InlineSuggestionsRequest mInlineSuggestionsRequest\nprivate void onConstructed()\nclass FillRequest extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genToString=true, genHiddenConstructor=true, genHiddenConstDefs=true)") @Deprecated diff --git a/core/java/android/service/quickaccesswallet/QuickAccessWalletClientImpl.java b/core/java/android/service/quickaccesswallet/QuickAccessWalletClientImpl.java index 31a085d15a343fd9227cb7b5bf31579db5846da2..9d0b582dddc4743ec55ffef450413c4f370d095c 100644 --- a/core/java/android/service/quickaccesswallet/QuickAccessWalletClientImpl.java +++ b/core/java/android/service/quickaccesswallet/QuickAccessWalletClientImpl.java @@ -16,6 +16,8 @@ package android.service.quickaccesswallet; +import static android.service.quickaccesswallet.QuickAccessWalletService.ACTION_VIEW_WALLET; +import static android.service.quickaccesswallet.QuickAccessWalletService.ACTION_VIEW_WALLET_SETTINGS; import static android.service.quickaccesswallet.QuickAccessWalletService.SERVICE_INTERFACE; import android.annotation.CallbackExecutor; @@ -26,6 +28,9 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; +import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; +import android.content.pm.ResolveInfo; import android.graphics.drawable.Drawable; import android.os.Handler; import android.os.IBinder; @@ -97,8 +102,7 @@ public class QuickAccessWalletClientImpl implements QuickAccessWalletClient, Ser @Override public boolean isWalletFeatureAvailableWhenDeviceLocked() { - return checkSecureSetting(Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS) - && checkSecureSetting(Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS); + return checkSecureSetting(Settings.Secure.POWER_MENU_LOCKED_SHOW_CONTENT); } @Override @@ -234,27 +238,67 @@ public class QuickAccessWalletClientImpl implements QuickAccessWalletClient, Ser @Override @Nullable public Intent createWalletIntent() { - if (mServiceInfo == null || TextUtils.isEmpty(mServiceInfo.getWalletActivity())) { + if (mServiceInfo == null) { return null; } - return new Intent(QuickAccessWalletService.ACTION_VIEW_WALLET) - .setComponent( - new ComponentName( - mServiceInfo.getComponentName().getPackageName(), - mServiceInfo.getWalletActivity())); + String packageName = mServiceInfo.getComponentName().getPackageName(); + String walletActivity = mServiceInfo.getWalletActivity(); + return createIntent(walletActivity, packageName, ACTION_VIEW_WALLET); } @Override @Nullable public Intent createWalletSettingsIntent() { - if (mServiceInfo == null || TextUtils.isEmpty(mServiceInfo.getSettingsActivity())) { + if (mServiceInfo == null) { return null; } - return new Intent(QuickAccessWalletService.ACTION_VIEW_WALLET_SETTINGS) - .setComponent( - new ComponentName( - mServiceInfo.getComponentName().getPackageName(), - mServiceInfo.getSettingsActivity())); + String packageName = mServiceInfo.getComponentName().getPackageName(); + String settingsActivity = mServiceInfo.getSettingsActivity(); + return createIntent(settingsActivity, packageName, ACTION_VIEW_WALLET_SETTINGS); + } + + @Nullable + private Intent createIntent(@Nullable String activityName, String packageName, String action) { + PackageManager pm = mContext.getPackageManager(); + if (TextUtils.isEmpty(activityName)) { + activityName = queryActivityForAction(pm, packageName, action); + } + if (TextUtils.isEmpty(activityName)) { + return null; + } + ComponentName component = new ComponentName(packageName, activityName); + if (!isActivityEnabled(pm, component)) { + return null; + } + return new Intent(action).setComponent(component); + } + + @Nullable + private static String queryActivityForAction(PackageManager pm, String packageName, + String action) { + Intent intent = new Intent(action).setPackage(packageName); + ResolveInfo resolveInfo = pm.resolveActivity(intent, 0); + if (resolveInfo == null + || resolveInfo.activityInfo == null + || !resolveInfo.activityInfo.exported) { + return null; + } + return resolveInfo.activityInfo.name; + } + + private static boolean isActivityEnabled(PackageManager pm, ComponentName component) { + int setting = pm.getComponentEnabledSetting(component); + if (setting == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) { + return true; + } + if (setting != PackageManager.COMPONENT_ENABLED_STATE_DEFAULT) { + return false; + } + try { + return pm.getActivityInfo(component, 0).isEnabled(); + } catch (NameNotFoundException e) { + return false; + } } @Override diff --git a/core/java/android/view/DisplayInfo.java b/core/java/android/view/DisplayInfo.java index c0d61d47397128cb0d04d8bd38777d7ac51d1c6c..d369883f3ac3ffbc0de1b3e0b51d726dbfd9d492 100644 --- a/core/java/android/view/DisplayInfo.java +++ b/core/java/android/view/DisplayInfo.java @@ -385,7 +385,7 @@ public final class DisplayInfo implements Parcelable { displayId = source.readInt(); address = source.readParcelable(null); deviceProductInfo = source.readParcelable(null); - name = source.readString(); + name = source.readString8(); appWidth = source.readInt(); appHeight = source.readInt(); smallestNominalAppWidth = source.readInt(); @@ -418,8 +418,8 @@ public final class DisplayInfo implements Parcelable { presentationDeadlineNanos = source.readLong(); state = source.readInt(); ownerUid = source.readInt(); - ownerPackageName = source.readString(); - uniqueId = source.readString(); + ownerPackageName = source.readString8(); + uniqueId = source.readString8(); removeMode = source.readInt(); } @@ -431,7 +431,7 @@ public final class DisplayInfo implements Parcelable { dest.writeInt(displayId); dest.writeParcelable(address, flags); dest.writeParcelable(deviceProductInfo, flags); - dest.writeString(name); + dest.writeString8(name); dest.writeInt(appWidth); dest.writeInt(appHeight); dest.writeInt(smallestNominalAppWidth); @@ -462,8 +462,8 @@ public final class DisplayInfo implements Parcelable { dest.writeLong(presentationDeadlineNanos); dest.writeInt(state); dest.writeInt(ownerUid); - dest.writeString(ownerPackageName); - dest.writeString(uniqueId); + dest.writeString8(ownerPackageName); + dest.writeString8(uniqueId); dest.writeInt(removeMode); } diff --git a/core/java/android/view/IWindowSession.aidl b/core/java/android/view/IWindowSession.aidl index 25e81114d86f233fda75549e5fcdcaf9dd69e68d..926d8fc5a368c10a3f9da20a9c96cbcfa48fa7f7 100644 --- a/core/java/android/view/IWindowSession.aidl +++ b/core/java/android/view/IWindowSession.aidl @@ -342,5 +342,5 @@ interface IWindowSession { * Update the flags on an input channel associated with a particular surface. */ void updateInputChannel(in IBinder channelToken, int displayId, in SurfaceControl surface, - int flags); + int flags, in Region region); } diff --git a/core/java/android/view/ImeInsetsSourceConsumer.java b/core/java/android/view/ImeInsetsSourceConsumer.java index df891303bb1d192c992cc7523ad8decd1e61fa48..38b6c03a02f9472c5ff64b70835d18aa941f013d 100644 --- a/core/java/android/view/ImeInsetsSourceConsumer.java +++ b/core/java/android/view/ImeInsetsSourceConsumer.java @@ -217,6 +217,6 @@ public final class ImeInsetsSourceConsumer extends InsetsSourceConsumer { } private InputMethodManager getImm() { - return mController.getViewRoot().mContext.getSystemService(InputMethodManager.class); + return mController.getHost().getInputMethodManager(); } } diff --git a/core/java/android/view/InsetsController.java b/core/java/android/view/InsetsController.java index f135328c44fee6a344413507c67a14ded35d14b2..a135b0ca148b754319ec77b0dd4e26c92c2b02a5 100644 --- a/core/java/android/view/InsetsController.java +++ b/core/java/android/view/InsetsController.java @@ -22,8 +22,6 @@ import static android.view.InsetsState.toInternalType; import static android.view.InsetsState.toPublicType; import static android.view.WindowInsets.Type.all; import static android.view.WindowInsets.Type.ime; -import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_APPEARANCE_CONTROLLED; -import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_BEHAVIOR_CONTROLLED; import android.animation.AnimationHandler; import android.animation.Animator; @@ -37,15 +35,12 @@ import android.graphics.Insets; import android.graphics.Rect; import android.os.CancellationSignal; import android.os.Handler; -import android.os.RemoteException; import android.util.ArraySet; -import android.util.Log; import android.util.Pair; import android.util.SparseArray; import android.view.InsetsSourceConsumer.ShowResult; import android.view.InsetsState.InternalInsetsType; import android.view.SurfaceControl.Transaction; -import android.view.ViewTreeObserver.OnPreDrawListener; import android.view.WindowInsets.Type; import android.view.WindowInsets.Type.InsetsType; import android.view.WindowInsetsAnimation.Bounds; @@ -53,6 +48,7 @@ import android.view.WindowManager.LayoutParams.SoftInputModeFlags; import android.view.animation.Interpolator; import android.view.animation.LinearInterpolator; import android.view.animation.PathInterpolator; +import android.view.inputmethod.InputMethodManager; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.graphics.SfVsyncFrameCallbackProvider; @@ -72,6 +68,91 @@ import java.util.function.BiFunction; */ public class InsetsController implements WindowInsetsController, InsetsAnimationControlCallbacks { + public interface Host { + + Handler getHandler(); + + /** + * Notifies host that {@link InsetsController#getState()} has changed. + */ + void notifyInsetsChanged(); + + void dispatchWindowInsetsAnimationPrepare(@NonNull WindowInsetsAnimation animation); + Bounds dispatchWindowInsetsAnimationStart( + @NonNull WindowInsetsAnimation animation, @NonNull Bounds bounds); + WindowInsets dispatchWindowInsetsAnimationProgress(@NonNull WindowInsets insets, + @NonNull List runningAnimations); + void dispatchWindowInsetsAnimationEnd(@NonNull WindowInsetsAnimation animation); + + /** + * Requests host to apply surface params in synchronized manner. + */ + void applySurfaceParams(final SyncRtSurfaceTransactionApplier.SurfaceParams... params); + + /** + * @see ViewRootImpl#updateCompatSysUiVisibility(int, boolean, boolean) + */ + void updateCompatSysUiVisibility(@InternalInsetsType int type, boolean visible, + boolean hasControl); + + /** + * Called when insets have been modified by the client and should be reported back to WM. + */ + void onInsetsModified(InsetsState insetsState); + + /** + * @return Whether the host has any callbacks it wants to synchronize the animations with. + * If there are no callbacks, the animation will be off-loaded to another thread and + * slightly different animation curves are picked. + */ + boolean hasAnimationCallbacks(); + + /** + * @see WindowInsetsController#setSystemBarsAppearance + */ + void setSystemBarsAppearance(@Appearance int appearance, @Appearance int mask); + + /** + * @see WindowInsetsController#getSystemBarsAppearance() + */ + @Appearance int getSystemBarsAppearance(); + + /** + * @see WindowInsetsController#setSystemBarsBehavior + */ + void setSystemBarsBehavior(@Behavior int behavior); + + /** + * @see WindowInsetsController#getSystemBarsBehavior + */ + @Behavior int getSystemBarsBehavior(); + + /** + * Releases a surface and ensure that this is done after {@link #applySurfaceParams} has + * finished applying params. + */ + void releaseSurfaceControlFromRt(SurfaceControl surfaceControl); + + /** + * If this host is a view hierarchy, adds a pre-draw runnable to ensure proper ordering as + * described in {@link WindowInsetsAnimation.Callback#onPrepare}. + * + * If this host isn't a view hierarchy, the runnable can be executed immediately. + */ + void addOnPreDrawRunnable(Runnable r); + + /** + * Adds a runnbale to be executed during {@link Choreographer#CALLBACK_INSETS_ANIMATION} + * phase. + */ + void postInsetsAnimationCallback(Runnable r); + + /** + * Obtains {@link InputMethodManager} instance from host. + */ + InputMethodManager getInputMethodManager(); + } + private static final int ANIMATION_DURATION_SHOW_MS = 275; private static final int ANIMATION_DURATION_HIDE_MS = 340; @@ -340,13 +421,19 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation private final String TAG = "InsetsControllerImpl"; + /** The local state */ private final InsetsState mState = new InsetsState(); - private final InsetsState mLastDispachedState = new InsetsState(); + + /** The state dispatched from server */ + private final InsetsState mLastDispatchedState = new InsetsState(); + + /** The state sent to server */ + private final InsetsState mRequestedState = new InsetsState(); private final Rect mFrame = new Rect(); private final BiFunction mConsumerCreator; private final SparseArray mSourceConsumers = new SparseArray<>(); - private final ViewRootImpl mViewRoot; + private final Host mHost; private final Handler mHandler; private final SparseArray mTmpControlArray = new SparseArray<>(); @@ -370,8 +457,6 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation private boolean mStartingAnimation; private int mCaptionInsetsHeight = 0; - private SyncRtSurfaceTransactionApplier mApplier; - private Runnable mPendingControlTimeout = this::abortPendingImeControlRequest; private final ArrayList mControllableInsetsChangedListeners = new ArrayList<>(); @@ -379,22 +464,22 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation /** Set of inset types for which an animation was started since last resetting this field */ private @InsetsType int mLastStartedAnimTypes; - public InsetsController(ViewRootImpl viewRoot) { - this(viewRoot, (controller, type) -> { + public InsetsController(Host host) { + this(host, (controller, type) -> { if (type == ITYPE_IME) { return new ImeInsetsSourceConsumer(controller.mState, Transaction::new, controller); } else { return new InsetsSourceConsumer(type, controller.mState, Transaction::new, controller); } - }, viewRoot.mHandler); + }, host.getHandler()); } @VisibleForTesting - public InsetsController(ViewRootImpl viewRoot, + public InsetsController(Host host, BiFunction consumerCreator, Handler handler) { - mViewRoot = viewRoot; + mHost = host; mConsumerCreator = consumerCreator; mHandler = handler; mAnimCallback = () -> { @@ -402,10 +487,6 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation if (mRunningAnimations.isEmpty()) { return; } - if (mViewRoot.mView == null) { - // The view has already detached from window. - return; - } mTmpFinishedControls.clear(); mTmpRunningAnims.clear(); @@ -433,8 +514,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation mLastInsets.isRound(), mLastInsets.shouldAlwaysConsumeSystemBars(), mLastDisplayCutout, mLastLegacySoftInputMode, mLastLegacySystemUiFlags, null /* typeSideMap */); - mViewRoot.mView.dispatchWindowInsetsAnimationProgress(insets, - mUnmodifiableTmpRunningAnims); + mHost.dispatchWindowInsetsAnimationProgress(insets, mUnmodifiableTmpRunningAnims); for (int i = mTmpFinishedControls.size() - 1; i >= 0; i--) { dispatchAnimationEnd(mTmpFinishedControls.get(i).getAnimation()); @@ -447,7 +527,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation if (mFrame.equals(frame)) { return; } - mViewRoot.notifyInsetsChanged(); + mHost.notifyInsetsChanged(); mFrame.set(frame); } @@ -462,24 +542,24 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation } public InsetsState getLastDispatchedState() { - return mLastDispachedState; + return mLastDispatchedState; } @VisibleForTesting public boolean onStateChanged(InsetsState state) { boolean localStateChanged = !mState.equals(state, true /* excludingCaptionInsets */) || !captionInsetsUnchanged(); - if (!localStateChanged && mLastDispachedState.equals(state)) { + if (!localStateChanged && mLastDispatchedState.equals(state)) { return false; } updateState(state); - mLastDispachedState.set(state, true /* copySources */); + mLastDispatchedState.set(state, true /* copySources */); applyLocalVisibilityOverride(); if (localStateChanged) { - mViewRoot.notifyInsetsChanged(); + mHost.notifyInsetsChanged(); } - if (!mState.equals(mLastDispachedState, true /* excludingCaptionInsets */)) { - sendStateToWindowManager(); + if (!mState.equals(mLastDispatchedState, true /* excludingCaptionInsets */)) { + updateRequestedState(); } return true; } @@ -552,8 +632,9 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation } } - int[] showTypes = new int[1]; - int[] hideTypes = new int[1]; + final boolean hasControl = mTmpControlArray.size() > 0; + final int[] showTypes = new int[1]; + final int[] hideTypes = new int[1]; // Ensure to update all existing source consumers for (int i = mSourceConsumers.size() - 1; i >= 0; i--) { @@ -586,6 +667,12 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation if (hideTypes[0] != 0) { applyAnimation(hideTypes[0], false /* show */, false /* fromIme */); } + if (hasControl) { + // We might have changed our requested visibilities while we don't have the control, + // so we need to update our requested state once we have control. Otherwise, our + // requested state at the server side might be incorrect. + updateRequestedState(); + } } @Override @@ -733,7 +820,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation final InsetsAnimationControlRunner runner = useInsetsAnimationThread ? new InsetsAnimationThreadControlRunner(controls, frame, mState, listener, typesReady, this, durationMs, interpolator, - animationType, mViewRoot.mHandler) + animationType, mHost.getHandler()) : new InsetsAnimationControlImpl(controls, frame, mState, listener, typesReady, this, durationMs, interpolator, animationType); @@ -860,21 +947,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation @Override public void applySurfaceParams(final SyncRtSurfaceTransactionApplier.SurfaceParams... params) { - if (mApplier == null) { - if (mViewRoot.mView == null) { - throw new IllegalStateException("View of the ViewRootImpl is not initiated."); - } - mApplier = new SyncRtSurfaceTransactionApplier(mViewRoot.mView); - } - if (mViewRoot.mView.isHardwareAccelerated()) { - mApplier.scheduleApply(false /* earlyWakeup */, params); - } else { - // Window doesn't support hardware acceleration, no synchronization for now. - // TODO(b/149342281): use mViewRoot.mSurface.getNextFrameNumber() to sync on every - // frame instead. - mApplier.applyParams(new Transaction(), -1 /* frame */, false /* earlyWakeup */, - params); - } + mHost.applySurfaceParams(params); } void notifyControlRevoked(InsetsSourceConsumer consumer) { @@ -900,7 +973,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation ArraySet types = toInternalType(control.getTypes()); for (int j = types.size() - 1; j >= 0; j--) { if (getSourceConsumer(types.valueAt(j)).notifyAnimationFinished()) { - mViewRoot.notifyInsetsChanged(); + mHost.notifyInsetsChanged(); } } break; @@ -928,8 +1001,8 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation @VisibleForTesting public void notifyVisibilityChanged() { - mViewRoot.notifyInsetsChanged(); - sendStateToWindowManager(); + mHost.notifyInsetsChanged(); + updateRequestedState(); } /** @@ -937,7 +1010,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation */ public void updateCompatSysUiVisibility(@InternalInsetsType int type, boolean visible, boolean hasControl) { - mViewRoot.updateCompatSysUiVisibility(type, visible, hasControl); + mHost.updateCompatSysUiVisibility(type, visible, hasControl); } /** @@ -954,10 +1027,6 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation getSourceConsumer(ITYPE_IME).onWindowFocusLost(); } - ViewRootImpl getViewRoot() { - return mViewRoot; - } - /** * Used by {@link ImeInsetsSourceConsumer} when IME decides to be shown/hidden. * @hide @@ -983,23 +1052,28 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation } /** - * Sends the local visibility state back to window manager. + * Sends the local visibility state back to window manager if it is changed. */ - private void sendStateToWindowManager() { - InsetsState tmpState = new InsetsState(); + private void updateRequestedState() { + boolean changed = false; for (int i = mSourceConsumers.size() - 1; i >= 0; i--) { final InsetsSourceConsumer consumer = mSourceConsumers.valueAt(i); - if (consumer.getType() == ITYPE_CAPTION_BAR) continue; + final @InternalInsetsType int type = consumer.getType(); + if (type == ITYPE_CAPTION_BAR) { + continue; + } if (consumer.getControl() != null) { - tmpState.addSource(mState.getSource(consumer.getType())); + final InsetsSource localSource = mState.getSource(type); + if (!localSource.equals(mRequestedState.peekSource(type))) { + mRequestedState.addSource(new InsetsSource(localSource)); + changed = true; + } } } - - try { - mViewRoot.mWindowSession.insetsModified(mViewRoot.mWindow, tmpState); - } catch (RemoteException e) { - Log.e(TAG, "Failed to call insetsModified", e); + if (!changed) { + return; } + mHost.onInsetsModified(mRequestedState); } @VisibleForTesting @@ -1009,7 +1083,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation return; } - boolean hasAnimationCallbacks = hasAnimationCallbacks(); + boolean hasAnimationCallbacks = mHost.hasAnimationCallbacks(); final InternalAnimationControlListener listener = new InternalAnimationControlListener(show, hasAnimationCallbacks, types); @@ -1024,13 +1098,6 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation } - private boolean hasAnimationCallbacks() { - if (mViewRoot.mView == null) { - return false; - } - return mViewRoot.mView.hasWindowInsetsAnimationCallback(); - } - private void hideDirectly( @InsetsType int types, boolean animationFinished, @AnimationType int animationType) { final ArraySet internalTypes = InsetsState.toInternalType(types); @@ -1064,37 +1131,28 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation public void startAnimation(InsetsAnimationControlImpl controller, WindowInsetsAnimationControlListener listener, int types, WindowInsetsAnimation animation, Bounds bounds) { - if (mViewRoot.mView == null) { - return; - } - mViewRoot.mView.dispatchWindowInsetsAnimationPrepare(animation); - mViewRoot.mView.getViewTreeObserver().addOnPreDrawListener(new OnPreDrawListener() { - @Override - public boolean onPreDraw() { - mViewRoot.mView.getViewTreeObserver().removeOnPreDrawListener(this); - if (controller.isCancelled()) { - return true; - } - for (int i = mRunningAnimations.size() - 1; i >= 0; i--) { - RunningAnimation runningAnimation = mRunningAnimations.get(i); - if (runningAnimation.runner == controller) { - runningAnimation.startDispatched = true; - } + mHost.dispatchWindowInsetsAnimationPrepare(animation); + mHost.addOnPreDrawRunnable(() -> { + if (controller.isCancelled()) { + return; + } + for (int i = mRunningAnimations.size() - 1; i >= 0; i--) { + RunningAnimation runningAnimation = mRunningAnimations.get(i); + if (runningAnimation.runner == controller) { + runningAnimation.startDispatched = true; } - mViewRoot.mView.dispatchWindowInsetsAnimationStart(animation, bounds); - mStartingAnimation = true; - controller.mReadyDispatched = true; - listener.onReady(controller, types); - mStartingAnimation = false; - return true; } + mHost.dispatchWindowInsetsAnimationStart(animation, bounds); + mStartingAnimation = true; + controller.mReadyDispatched = true; + listener.onReady(controller, types); + mStartingAnimation = false; }); - mViewRoot.mView.invalidate(); } @VisibleForTesting public void dispatchAnimationEnd(WindowInsetsAnimation animation) { - mViewRoot.mView.dispatchWindowInsetsAnimationEnd(animation); + mHost.dispatchWindowInsetsAnimationEnd(animation); } @VisibleForTesting @@ -1106,30 +1164,19 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation return; } if (!mAnimCallbackScheduled) { - mViewRoot.mChoreographer.postCallback(Choreographer.CALLBACK_INSETS_ANIMATION, - mAnimCallback, null /* token*/); + mHost.postInsetsAnimationCallback(mAnimCallback); mAnimCallbackScheduled = true; } } @Override public void setSystemBarsAppearance(@Appearance int appearance, @Appearance int mask) { - mViewRoot.mWindowAttributes.privateFlags |= PRIVATE_FLAG_APPEARANCE_CONTROLLED; - final InsetsFlags insetsFlags = mViewRoot.mWindowAttributes.insetsFlags; - if (insetsFlags.appearance != appearance) { - insetsFlags.appearance = (insetsFlags.appearance & ~mask) | (appearance & mask); - mViewRoot.mWindowAttributesChanged = true; - mViewRoot.scheduleTraversals(); - } + mHost.setSystemBarsAppearance(appearance, mask); } @Override public @Appearance int getSystemBarsAppearance() { - if ((mViewRoot.mWindowAttributes.privateFlags & PRIVATE_FLAG_APPEARANCE_CONTROLLED) == 0) { - // We only return the requested appearance, not the implied one. - return 0; - } - return mViewRoot.mWindowAttributes.insetsFlags.appearance; + return mHost.getSystemBarsAppearance(); } @Override @@ -1139,21 +1186,12 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation @Override public void setSystemBarsBehavior(@Behavior int behavior) { - mViewRoot.mWindowAttributes.privateFlags |= PRIVATE_FLAG_BEHAVIOR_CONTROLLED; - if (mViewRoot.mWindowAttributes.insetsFlags.behavior != behavior) { - mViewRoot.mWindowAttributes.insetsFlags.behavior = behavior; - mViewRoot.mWindowAttributesChanged = true; - mViewRoot.scheduleTraversals(); - } + mHost.setSystemBarsBehavior(behavior); } @Override public @Appearance int getSystemBarsBehavior() { - if ((mViewRoot.mWindowAttributes.privateFlags & PRIVATE_FLAG_BEHAVIOR_CONTROLLED) == 0) { - // We only return the requested behavior, not the implied one. - return 0; - } - return mViewRoot.mWindowAttributes.insetsFlags.behavior; + return mHost.getSystemBarsBehavior(); } private @InsetsType int calculateControllableTypes() { @@ -1198,22 +1236,12 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation mControllableInsetsChangedListeners.remove(listener); } - /** - * At the time we receive new leashes (e.g. InsetsSourceConsumer is processing - * setControl) we need to release the old leash. But we may have already scheduled - * a SyncRtSurfaceTransaction applier to use it from the RenderThread. To avoid - * synchronization issues we also release from the RenderThread so this release - * happens after any existing items on the work queue. - */ + @Override public void releaseSurfaceControlFromRt(SurfaceControl sc) { - if (mViewRoot.mView != null && mViewRoot.mView.isHardwareAccelerated()) { - mViewRoot.registerRtFrameCallback(frame -> { - sc.release(); - }); - // Make sure a frame gets scheduled. - mViewRoot.mView.invalidate(); - } else { - sc.release(); - } + mHost.releaseSurfaceControlFromRt(sc); + } + + Host getHost() { + return mHost; } } diff --git a/core/java/android/view/InsetsSource.java b/core/java/android/view/InsetsSource.java index 033ccef3666db64579e814dc95a0f8a2b879462e..b0158467a17b399526ea32406bcea5d22b7dde89 100644 --- a/core/java/android/view/InsetsSource.java +++ b/core/java/android/view/InsetsSource.java @@ -116,15 +116,15 @@ public class InsetsSource implements Parcelable { if (!ignoreVisibility && !mVisible) { return Insets.NONE; } - if (!getIntersection(frame, relativeFrame, mTmpFrame)) { - return Insets.NONE; - } // During drag-move and drag-resizing, the caption insets position may not get updated // before the app frame get updated. To layout the app content correctly during drag events, // we always return the insets with the corresponding height covering the top. if (getType() == ITYPE_CAPTION_BAR) { return Insets.of(0, frame.height(), 0, 0); } + if (!getIntersection(frame, relativeFrame, mTmpFrame)) { + return Insets.NONE; + } // TODO: Currently, non-floating IME always intersects at bottom due to issues with cutout. // However, we should let the policy decide from the server. @@ -136,20 +136,25 @@ public class InsetsSource implements Parcelable { if (mTmpFrame.width() == relativeFrame.width()) { if (mTmpFrame.top == relativeFrame.top) { return Insets.of(0, mTmpFrame.height(), 0, 0); - } else { + } else if (mTmpFrame.bottom == relativeFrame.bottom) { return Insets.of(0, 0, 0, mTmpFrame.height()); } + // TODO: remove when insets are shell-customizable. + // This is a hack that says "if this is a top-inset (eg statusbar), always apply it + // to the top". It is used when adjusting primary split for IME. + if (mTmpFrame.top == 0) { + return Insets.of(0, mTmpFrame.height(), 0, 0); + } } // Intersecting at left/right else if (mTmpFrame.height() == relativeFrame.height()) { if (mTmpFrame.left == relativeFrame.left) { return Insets.of(mTmpFrame.width(), 0, 0, 0); - } else { + } else if (mTmpFrame.right == relativeFrame.right) { return Insets.of(0, 0, mTmpFrame.width(), 0); } - } else { - return Insets.NONE; } + return Insets.NONE; } /** @@ -208,8 +213,16 @@ public class InsetsSource implements Parcelable { public InsetsSource(Parcel in) { mType = in.readInt(); - mFrame = in.readParcelable(null /* loader */); - mVisibleFrame = in.readParcelable(null /* loader */); + if (in.readInt() != 0) { + mFrame = Rect.CREATOR.createFromParcel(in); + } else { + mFrame = null; + } + if (in.readInt() != 0) { + mVisibleFrame = Rect.CREATOR.createFromParcel(in); + } else { + mVisibleFrame = null; + } mVisible = in.readBoolean(); } @@ -221,8 +234,18 @@ public class InsetsSource implements Parcelable { @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(mType); - dest.writeParcelable(mFrame, 0 /* flags*/); - dest.writeParcelable(mVisibleFrame, 0 /* flags */); + if (mFrame != null) { + dest.writeInt(1); + mFrame.writeToParcel(dest, 0); + } else { + dest.writeInt(0); + } + if (mVisibleFrame != null) { + dest.writeInt(1); + mVisibleFrame.writeToParcel(dest, 0); + } else { + dest.writeInt(0); + } dest.writeBoolean(mVisible); } diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java index 76ed37c51bfe762ccd1253b9288aeea6e6b89a1e..0625806e40efb1023eb976500a74272ed78fcdbb 100644 --- a/core/java/android/view/SurfaceControl.java +++ b/core/java/android/view/SurfaceControl.java @@ -894,7 +894,7 @@ public final class SurfaceControl implements Parcelable { throw new IllegalArgumentException("source must not be null"); } - mName = in.readString(); + mName = in.readString8(); mWidth = in.readInt(); mHeight = in.readInt(); @@ -912,7 +912,7 @@ public final class SurfaceControl implements Parcelable { @Override public void writeToParcel(Parcel dest, int flags) { - dest.writeString(mName); + dest.writeString8(mName); dest.writeInt(mWidth); dest.writeInt(mHeight); if (mNativeObject == 0) { diff --git a/core/java/android/view/SurfaceControlViewHost.java b/core/java/android/view/SurfaceControlViewHost.java index 3d6da6f71b3ff73a4c3292d4f6185abbab83f746..7ec008c901bc10f52643aefe0b280dd405577b13 100644 --- a/core/java/android/view/SurfaceControlViewHost.java +++ b/core/java/android/view/SurfaceControlViewHost.java @@ -233,6 +233,14 @@ public class SurfaceControlViewHost { return mViewRoot.mWindow; } + /** + * @return the WindowlessWindowManager instance that this host is attached to. + * @hide + */ + public @NonNull WindowlessWindowManager getWindowlessWM() { + return mWm; + } + /** * @hide */ diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index f98c1f660cfa01db0c30607a71d27264deee8837..310299910e960f8b713cd944e2e7b639f965bdd1 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -11519,6 +11519,9 @@ public class View implements Drawable.Callback, KeyEvent.Callback, ViewParent parent = getParent(); if (parent instanceof View) { return ((View) parent).getWindowInsetsController(); + } else if (parent instanceof ViewRootImpl) { + // Between WindowManager.addView() and the first traversal AttachInfo isn't set yet. + return ((ViewRootImpl) parent).getInsetsController(); } return null; } diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 8b1e6cbdb6ff48705bd3f50187d49dff5ca2d6e2..b74c8f641a769b13ead6d6708046513982107bfd 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -757,7 +757,7 @@ public final class ViewRootImpl implements ViewParent, mChoreographer = useSfChoreographer ? Choreographer.getSfInstance() : Choreographer.getInstance(); mDisplayManager = (DisplayManager)context.getSystemService(Context.DISPLAY_SERVICE); - mInsetsController = new InsetsController(this); + mInsetsController = new InsetsController(new ViewRootInsetsControllerHost(this)); String processorOverrideName = context.getResources().getString( R.string.config_inputEventCompatProcessorOverrideClassName); @@ -1793,8 +1793,9 @@ public final class ViewRootImpl implements ViewParent, // We only return the Surface the first time, as otherwise // it hasn't changed and there is no need to update. ret = mBlastBufferQueue.getSurface(); + } else { + mBlastBufferQueue.update(mBlastSurfaceControl, width, height); } - mBlastBufferQueue.update(mBlastSurfaceControl, width, height); return ret; } diff --git a/core/java/android/view/ViewRootInsetsControllerHost.java b/core/java/android/view/ViewRootInsetsControllerHost.java new file mode 100644 index 0000000000000000000000000000000000000000..d8bf58f783390344c125c8c95982b9154dd34a7a --- /dev/null +++ b/core/java/android/view/ViewRootInsetsControllerHost.java @@ -0,0 +1,215 @@ +/* + * 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.view; + +import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_APPEARANCE_CONTROLLED; +import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_BEHAVIOR_CONTROLLED; + +import android.annotation.NonNull; +import android.os.Handler; +import android.os.RemoteException; +import android.util.Log; +import android.view.inputmethod.InputMethodManager; + +import java.util.List; + +/** + * Implements {@link InsetsController.Host} for {@link ViewRootImpl}s. + * @hide + */ +public class ViewRootInsetsControllerHost implements InsetsController.Host { + + private final String TAG = "VRInsetsControllerHost"; + + private final ViewRootImpl mViewRoot; + private SyncRtSurfaceTransactionApplier mApplier; + + public ViewRootInsetsControllerHost(ViewRootImpl viewRoot) { + mViewRoot = viewRoot; + } + + @Override + public Handler getHandler() { + return mViewRoot.mHandler; + } + + @Override + public void notifyInsetsChanged() { + mViewRoot.notifyInsetsChanged(); + } + + @Override + public void addOnPreDrawRunnable(Runnable r) { + if (mViewRoot.mView == null) { + return; + } + mViewRoot.mView.getViewTreeObserver().addOnPreDrawListener( + new ViewTreeObserver.OnPreDrawListener() { + @Override + public boolean onPreDraw() { + mViewRoot.mView.getViewTreeObserver().removeOnPreDrawListener(this); + r.run(); + return true; + } + }); + mViewRoot.mView.invalidate(); + } + + @Override + public void dispatchWindowInsetsAnimationPrepare(@NonNull WindowInsetsAnimation animation) { + if (mViewRoot.mView == null) { + return; + } + mViewRoot.mView.dispatchWindowInsetsAnimationPrepare(animation); + } + + @Override + public WindowInsetsAnimation.Bounds dispatchWindowInsetsAnimationStart( + @NonNull WindowInsetsAnimation animation, + @NonNull WindowInsetsAnimation.Bounds bounds) { + if (mViewRoot.mView == null) { + return null; + } + return mViewRoot.mView.dispatchWindowInsetsAnimationStart(animation, bounds); + } + + @Override + public WindowInsets dispatchWindowInsetsAnimationProgress(@NonNull WindowInsets insets, + @NonNull List runningAnimations) { + if (mViewRoot.mView == null) { + // The view has already detached from window. + return null; + } + return mViewRoot.mView.dispatchWindowInsetsAnimationProgress(insets, runningAnimations); + } + + @Override + public void dispatchWindowInsetsAnimationEnd(@NonNull WindowInsetsAnimation animation) { + mViewRoot.mView.dispatchWindowInsetsAnimationEnd(animation); + } + + @Override + public void applySurfaceParams(SyncRtSurfaceTransactionApplier.SurfaceParams... params) { + if (mApplier == null) { + if (mViewRoot.mView == null) { + throw new IllegalStateException("View of the ViewRootImpl is not initiated."); + } + mApplier = new SyncRtSurfaceTransactionApplier(mViewRoot.mView); + } + if (mViewRoot.mView.isHardwareAccelerated()) { + mApplier.scheduleApply(false /* earlyWakeup */, params); + } else { + // Window doesn't support hardware acceleration, no synchronization for now. + // TODO(b/149342281): use mViewRoot.mSurface.getNextFrameNumber() to sync on every + // frame instead. + mApplier.applyParams(new SurfaceControl.Transaction(), -1 /* frame */, + false /* earlyWakeup */, params); + } + } + + @Override + public void postInsetsAnimationCallback(Runnable r) { + mViewRoot.mChoreographer.postCallback(Choreographer.CALLBACK_INSETS_ANIMATION, r, + null /* token */); + } + + @Override + public void updateCompatSysUiVisibility(int type, boolean visible, boolean hasControl) { + mViewRoot.updateCompatSysUiVisibility(type, visible, hasControl); + } + + @Override + public void onInsetsModified(InsetsState insetsState) { + try { + mViewRoot.mWindowSession.insetsModified(mViewRoot.mWindow, insetsState); + } catch (RemoteException e) { + Log.e(TAG, "Failed to call insetsModified", e); + } + } + + @Override + public boolean hasAnimationCallbacks() { + if (mViewRoot.mView == null) { + return false; + } + return mViewRoot.mView.hasWindowInsetsAnimationCallback(); + } + + @Override + public void setSystemBarsAppearance(int appearance, int mask) { + mViewRoot.mWindowAttributes.privateFlags |= PRIVATE_FLAG_APPEARANCE_CONTROLLED; + final InsetsFlags insetsFlags = mViewRoot.mWindowAttributes.insetsFlags; + if (insetsFlags.appearance != appearance) { + insetsFlags.appearance = (insetsFlags.appearance & ~mask) | (appearance & mask); + mViewRoot.mWindowAttributesChanged = true; + mViewRoot.scheduleTraversals(); + } + } + + @Override + public int getSystemBarsAppearance() { + if ((mViewRoot.mWindowAttributes.privateFlags & PRIVATE_FLAG_APPEARANCE_CONTROLLED) == 0) { + // We only return the requested appearance, not the implied one. + return 0; + } + return mViewRoot.mWindowAttributes.insetsFlags.appearance; + } + + @Override + public void setSystemBarsBehavior(int behavior) { + mViewRoot.mWindowAttributes.privateFlags |= PRIVATE_FLAG_BEHAVIOR_CONTROLLED; + if (mViewRoot.mWindowAttributes.insetsFlags.behavior != behavior) { + mViewRoot.mWindowAttributes.insetsFlags.behavior = behavior; + mViewRoot.mWindowAttributesChanged = true; + mViewRoot.scheduleTraversals(); + } + } + + @Override + public int getSystemBarsBehavior() { + if ((mViewRoot.mWindowAttributes.privateFlags & PRIVATE_FLAG_BEHAVIOR_CONTROLLED) == 0) { + // We only return the requested behavior, not the implied one. + return 0; + } + return mViewRoot.mWindowAttributes.insetsFlags.behavior; + } + + @Override + public void releaseSurfaceControlFromRt(SurfaceControl surfaceControl) { + + // At the time we receive new leashes (e.g. InsetsSourceConsumer is processing + // setControl) we need to release the old leash. But we may have already scheduled + // a SyncRtSurfaceTransaction applier to use it from the RenderThread. To avoid + // synchronization issues we also release from the RenderThread so this release + // happens after any existing items on the work queue. + + if (mViewRoot.mView != null && mViewRoot.mView.isHardwareAccelerated()) { + mViewRoot.registerRtFrameCallback(frame -> { + surfaceControl.release(); + }); + // Make sure a frame gets scheduled. + mViewRoot.mView.invalidate(); + } else { + surfaceControl.release(); + } + } + + @Override + public InputMethodManager getInputMethodManager() { + return mViewRoot.mContext.getSystemService(InputMethodManager.class); + } +} diff --git a/core/java/android/view/WindowlessWindowManager.java b/core/java/android/view/WindowlessWindowManager.java index 397bce44b25e4da2980bbd99978f5e58824ff13b..95d6d651cc7929ac0fccaa00b12b9826ae0b5025 100644 --- a/core/java/android/view/WindowlessWindowManager.java +++ b/core/java/android/view/WindowlessWindowManager.java @@ -16,16 +16,19 @@ package android.view; +import android.annotation.Nullable; import android.content.res.Configuration; import android.graphics.PixelFormat; import android.graphics.Point; import android.graphics.Rect; +import android.graphics.Region; import android.os.IBinder; import android.os.RemoteException; import android.util.Log; import android.util.MergedConfiguration; import java.util.HashMap; +import java.util.Objects; /** * A simplistic implementation of IWindowSession. Rather than managing Surfaces @@ -42,6 +45,7 @@ public class WindowlessWindowManager implements IWindowSession { WindowManager.LayoutParams mParams = new WindowManager.LayoutParams(); int mDisplayId; IBinder mInputChannelToken; + Region mInputRegion; State(SurfaceControl sc, WindowManager.LayoutParams p, int displayId, IBinder inputChannelToken) { mSurfaceControl = sc; @@ -95,6 +99,30 @@ public class WindowlessWindowManager implements IWindowSession { mResizeCompletionForWindow.put(window, callback); } + protected void setTouchRegion(IBinder window, @Nullable Region region) { + State state; + synchronized (this) { + // Do everything while locked so that we synchronize with relayout. This should be a + // very infrequent operation. + state = mStateForWindow.get(window); + if (state == null) { + return; + } + if (Objects.equals(region, state.mInputRegion)) { + return; + } + state.mInputRegion = region != null ? new Region(region) : null; + if (state.mInputChannelToken != null) { + try { + mRealWm.updateInputChannel(state.mInputChannelToken, state.mDisplayId, + state.mSurfaceControl, state.mParams.flags, state.mInputRegion); + } catch (RemoteException e) { + Log.e(TAG, "Failed to update surface input channel: ", e); + } + } + } + } + /** * IWindowSession implementation. */ @@ -234,7 +262,7 @@ public class WindowlessWindowManager implements IWindowSession { && state.mInputChannelToken != null) { try { mRealWm.updateInputChannel(state.mInputChannelToken, state.mDisplayId, sc, - attrs.flags); + attrs.flags, state.mInputRegion); } catch (RemoteException e) { Log.e(TAG, "Failed to update surface input channel: ", e); } @@ -409,7 +437,7 @@ public class WindowlessWindowManager implements IWindowSession { @Override public void updateInputChannel(IBinder channelToken, int displayId, SurfaceControl surface, - int flags) { + int flags, Region region) { } @Override diff --git a/core/java/android/view/inputmethod/InlineSuggestionsRequest.java b/core/java/android/view/inputmethod/InlineSuggestionsRequest.java index 4d4faa4ba2a3367608200e35d141b4d738bd7c6f..cce109074d82e7922d52f55eb3ecba14e9ee2dd5 100644 --- a/core/java/android/view/inputmethod/InlineSuggestionsRequest.java +++ b/core/java/android/view/inputmethod/InlineSuggestionsRequest.java @@ -72,6 +72,9 @@ public final class InlineSuggestionsRequest implements Parcelable { /** * The extras state propagated from the IME to pass extra data. + * + *

Note: There should be no remote objects in the bundle, all included remote objects will + * be removed from the bundle before transmission.

*/ private @NonNull Bundle mExtras; @@ -261,6 +264,9 @@ public final class InlineSuggestionsRequest implements Parcelable { /** * The extras state propagated from the IME to pass extra data. + * + *

Note: There should be no remote objects in the bundle, all included remote objects will + * be removed from the bundle before transmission.

*/ @DataClass.Generated.Member public @NonNull Bundle getExtras() { @@ -513,6 +519,9 @@ public final class InlineSuggestionsRequest implements Parcelable { /** * The extras state propagated from the IME to pass extra data. + * + *

Note: There should be no remote objects in the bundle, all included remote objects will + * be removed from the bundle before transmission.

*/ @DataClass.Generated.Member public @NonNull Builder setExtras(@NonNull Bundle value) { @@ -595,7 +604,7 @@ public final class InlineSuggestionsRequest implements Parcelable { } @DataClass.Generated( - time = 1587537617922L, + time = 1588109685838L, codegenVersion = "1.0.15", sourceFile = "frameworks/base/core/java/android/view/inputmethod/InlineSuggestionsRequest.java", inputSignatures = "public static final int SUGGESTION_COUNT_UNLIMITED\nprivate final int mMaxSuggestionCount\nprivate final @android.annotation.NonNull java.util.List mInlinePresentationSpecs\nprivate @android.annotation.NonNull java.lang.String mHostPackageName\nprivate @android.annotation.NonNull android.os.LocaleList mSupportedLocales\nprivate @android.annotation.NonNull android.os.Bundle mExtras\nprivate @android.annotation.Nullable android.os.IBinder mHostInputToken\nprivate int mHostDisplayId\npublic void setHostInputToken(android.os.IBinder)\nprivate boolean extrasEquals(android.os.Bundle)\nprivate void parcelHostInputToken(android.os.Parcel,int)\nprivate @android.annotation.Nullable android.os.IBinder unparcelHostInputToken(android.os.Parcel)\npublic void setHostDisplayId(int)\nprivate void onConstructed()\npublic void filterContentTypes()\nprivate static int defaultMaxSuggestionCount()\nprivate static java.lang.String defaultHostPackageName()\nprivate static android.os.LocaleList defaultSupportedLocales()\nprivate static @android.annotation.Nullable android.os.IBinder defaultHostInputToken()\nprivate static @android.annotation.Nullable int defaultHostDisplayId()\nprivate static @android.annotation.NonNull android.os.Bundle defaultExtras()\nclass InlineSuggestionsRequest extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genEqualsHashCode=true, genToString=true, genBuilder=true)\nabstract android.view.inputmethod.InlineSuggestionsRequest.Builder setInlinePresentationSpecs(java.util.List)\nabstract android.view.inputmethod.InlineSuggestionsRequest.Builder setHostPackageName(java.lang.String)\nabstract android.view.inputmethod.InlineSuggestionsRequest.Builder setHostInputToken(android.os.IBinder)\nabstract android.view.inputmethod.InlineSuggestionsRequest.Builder setHostDisplayId(int)\nclass BaseBuilder extends java.lang.Object implements []") diff --git a/core/java/android/widget/ImeAwareEditText.java b/core/java/android/widget/ImeAwareEditText.java new file mode 100644 index 0000000000000000000000000000000000000000..9cd458558de3452424c9565a64e052b6bd6a677a --- /dev/null +++ b/core/java/android/widget/ImeAwareEditText.java @@ -0,0 +1,96 @@ +/* + * 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.widget; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.View; +import android.view.inputmethod.EditorInfo; +import android.view.inputmethod.InputConnection; +import android.view.inputmethod.InputMethodManager; + +/** + * EditText that keeps track of the IME state, specifically its input connection. This is useful + * for clients who request the IME before the system has established a connection. + * @hide + */ +public class ImeAwareEditText extends EditText { + private boolean mHasPendingShowSoftInputRequest; + final Runnable mRunShowSoftInputIfNecessary = () -> showSoftInputIfNecessary(); + + public ImeAwareEditText(Context context) { + super(context, null); + } + + public ImeAwareEditText(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public ImeAwareEditText(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + public ImeAwareEditText(Context context, AttributeSet attrs, int defStyleAttr, + int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + } + + /** + * This method is called back by the system when the system is about to establish a connection + * to the current input method. + * + *

This is a good and reliable signal to schedule a pending task to call + * {@link InputMethodManager#showSoftInput(View, int)}.

+ * + * @param editorInfo context about the text input field. + * @return {@link InputConnection} to be passed to the input method. + */ + @Override + public InputConnection onCreateInputConnection(EditorInfo editorInfo) { + final InputConnection ic = super.onCreateInputConnection(editorInfo); + if (mHasPendingShowSoftInputRequest) { + removeCallbacks(mRunShowSoftInputIfNecessary); + post(mRunShowSoftInputIfNecessary); + } + return ic; + } + + private void showSoftInputIfNecessary() { + if (mHasPendingShowSoftInputRequest) { + final InputMethodManager imm = + getContext().getSystemService(InputMethodManager.class); + imm.showSoftInput(this, 0); + mHasPendingShowSoftInputRequest = false; + } + } + + public void scheduleShowSoftInput() { + final InputMethodManager imm = getContext().getSystemService(InputMethodManager.class); + if (imm.isActive(this)) { + // This means that ImeAwareEditText is already connected to the IME. + // InputMethodManager#showSoftInput() is guaranteed to pass client-side focus check. + mHasPendingShowSoftInputRequest = false; + removeCallbacks(mRunShowSoftInputIfNecessary); + imm.showSoftInput(this, 0); + return; + } + + // Otherwise, InputMethodManager#showSoftInput() should be deferred after + // onCreateInputConnection(). + mHasPendingShowSoftInputRequest = true; + } +} diff --git a/core/java/android/widget/SelectionActionModeHelper.java b/core/java/android/widget/SelectionActionModeHelper.java index a069e643afcb057bb28a9d6525df703ef33390fc..e07181abe19c8044083b8f7007d719500cbbd37d 100644 --- a/core/java/android/widget/SelectionActionModeHelper.java +++ b/core/java/android/widget/SelectionActionModeHelper.java @@ -90,7 +90,7 @@ public final class SelectionActionModeHelper { mTextView = mEditor.getTextView(); mTextClassificationHelper = new TextClassificationHelper( mTextView.getContext(), - mTextView::getTextClassifier, + mTextView::getTextClassificationSession, getText(mTextView), 0, 1, mTextView.getTextLocales()); mSelectionTracker = new SelectionTracker(mTextView); @@ -500,7 +500,7 @@ public final class SelectionActionModeHelper { selectionEnd = sortedSelectionIndices[1]; } mTextClassificationHelper.init( - mTextView::getTextClassifier, + mTextView::getTextClassificationSession, getText(mTextView), selectionStart, selectionEnd, mTextView.getTextLocales()); diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index ec07574f141fa12622a40987a417064a43826823..29914aababe32db797a1f39064cfcd5a52362ef4 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -12626,7 +12626,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener return getTextClassifier() == TextClassifier.NO_OP; } - /** * Starts an ActionMode for the specified TextLinkSpan. * @@ -12670,7 +12669,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener .setDefaultLocales(getTextLocales()) .build(); final Supplier supplier = () -> - getTextClassifier().classifyText(request); + getTextClassificationSession().classifyText(request); final Consumer consumer = classification -> { if (classification != null) { if (!classification.getActions().isEmpty()) { diff --git a/core/java/android/widget/inline/InlinePresentationSpec.java b/core/java/android/widget/inline/InlinePresentationSpec.java index 9f966d84eb34780240c4f60b6ecc5e8aeb98c6c4..5f924c6ae194afc8daaa2c408905d2254cd1a33b 100644 --- a/core/java/android/widget/inline/InlinePresentationSpec.java +++ b/core/java/android/widget/inline/InlinePresentationSpec.java @@ -44,6 +44,9 @@ public final class InlinePresentationSpec implements Parcelable { /** * The extras encoding the UI style information. Defaults to {@code Bundle.Empty} in which case * the default system UI style will be used. + * + *

Note: There should be no remote objects in the bundle, all included remote objects will + * be removed from the bundle before transmission.

*/ @NonNull private final Bundle mStyle; @@ -122,6 +125,9 @@ public final class InlinePresentationSpec implements Parcelable { /** * The extras encoding the UI style information. Defaults to {@code Bundle.Empty} in which case * the default system UI style will be used. + * + *

Note: There should be no remote objects in the bundle, all included remote objects will + * be removed from the bundle before transmission.

*/ @DataClass.Generated.Member public @NonNull Bundle getStyle() { @@ -260,6 +266,9 @@ public final class InlinePresentationSpec implements Parcelable { /** * The extras encoding the UI style information. Defaults to {@code Bundle.Empty} in which case * the default system UI style will be used. + * + *

Note: There should be no remote objects in the bundle, all included remote objects will + * be removed from the bundle before transmission.

*/ @DataClass.Generated.Member public @NonNull Builder setStyle(@NonNull Bundle value) { @@ -293,7 +302,7 @@ public final class InlinePresentationSpec implements Parcelable { } @DataClass.Generated( - time = 1586935491105L, + time = 1588109681295L, codegenVersion = "1.0.15", sourceFile = "frameworks/base/core/java/android/widget/inline/InlinePresentationSpec.java", inputSignatures = "private final @android.annotation.NonNull android.util.Size mMinSize\nprivate final @android.annotation.NonNull android.util.Size mMaxSize\nprivate final @android.annotation.NonNull android.os.Bundle mStyle\nprivate static @android.annotation.NonNull android.os.Bundle defaultStyle()\nprivate boolean styleEquals(android.os.Bundle)\npublic void filterContentTypes()\nclass InlinePresentationSpec extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genEqualsHashCode=true, genToString=true, genBuilder=true)\nclass BaseBuilder extends java.lang.Object implements []") diff --git a/core/java/android/window/DisplayAreaInfo.java b/core/java/android/window/DisplayAreaInfo.java index 0d35bcafdf4538f1cd0f9704de1c4a8b4af9186c..358467ff599f4da3404869e02dbbc7f022b26a11 100644 --- a/core/java/android/window/DisplayAreaInfo.java +++ b/core/java/android/window/DisplayAreaInfo.java @@ -43,15 +43,19 @@ public final class DisplayAreaInfo implements Parcelable { */ public final int displayId; - public DisplayAreaInfo(@NonNull WindowContainerToken token, int displayId) { + public final int featureId; + + public DisplayAreaInfo(@NonNull WindowContainerToken token, int displayId, int featureId) { this.token = token; this.displayId = displayId; + this.featureId = featureId; } private DisplayAreaInfo(Parcel in) { token = WindowContainerToken.CREATOR.createFromParcel(in); configuration.readFromParcel(in); displayId = in.readInt(); + featureId = in.readInt(); } @Override @@ -59,6 +63,7 @@ public final class DisplayAreaInfo implements Parcelable { token.writeToParcel(dest, flags); configuration.writeToParcel(dest, flags); dest.writeInt(displayId); + dest.writeInt(featureId); } @NonNull diff --git a/core/java/android/window/DisplayAreaOrganizer.java b/core/java/android/window/DisplayAreaOrganizer.java index f3ef5a0c0aa26fc3366c38d04b84463204b907d8..a2fd128e22468c916ea44f64cc1a13fb3a1a4937 100644 --- a/core/java/android/window/DisplayAreaOrganizer.java +++ b/core/java/android/window/DisplayAreaOrganizer.java @@ -21,6 +21,7 @@ import android.annotation.RequiresPermission; import android.annotation.TestApi; import android.os.RemoteException; import android.util.Singleton; +import android.view.SurfaceControl; /** * Interface for WindowManager to delegate control of display areas. @@ -64,7 +65,8 @@ public class DisplayAreaOrganizer extends WindowOrganizer { } } - public void onDisplayAreaAppeared(@NonNull DisplayAreaInfo displayAreaInfo) {} + public void onDisplayAreaAppeared(@NonNull DisplayAreaInfo displayAreaInfo, + @NonNull SurfaceControl leash) {} public void onDisplayAreaVanished(@NonNull DisplayAreaInfo displayAreaInfo) {} @@ -76,8 +78,9 @@ public class DisplayAreaOrganizer extends WindowOrganizer { private final IDisplayAreaOrganizer mInterface = new IDisplayAreaOrganizer.Stub() { @Override - public void onDisplayAreaAppeared(@NonNull DisplayAreaInfo displayAreaInfo) { - DisplayAreaOrganizer.this.onDisplayAreaAppeared(displayAreaInfo); + public void onDisplayAreaAppeared(@NonNull DisplayAreaInfo displayAreaInfo, + @NonNull SurfaceControl leash) { + DisplayAreaOrganizer.this.onDisplayAreaAppeared(displayAreaInfo, leash); } @Override diff --git a/core/java/android/window/IDisplayAreaOrganizer.aidl b/core/java/android/window/IDisplayAreaOrganizer.aidl index 39a9235a42240d485fe1ae6c0bf973c88bd34a85..5e3e5e8e7d42e11a5d2ecb32e14664d1f5d74423 100644 --- a/core/java/android/window/IDisplayAreaOrganizer.aidl +++ b/core/java/android/window/IDisplayAreaOrganizer.aidl @@ -17,13 +17,14 @@ package android.window; import android.window.DisplayAreaInfo; +import android.view.SurfaceControl; /** * Interface for WindowManager to delegate control of display areas. * {@hide} */ oneway interface IDisplayAreaOrganizer { - void onDisplayAreaAppeared(in DisplayAreaInfo displayAreaInfo); + void onDisplayAreaAppeared(in DisplayAreaInfo displayAreaInfo, in SurfaceControl leash); void onDisplayAreaVanished(in DisplayAreaInfo displayAreaInfo); void onDisplayAreaInfoChanged(in DisplayAreaInfo displayAreaInfo); } diff --git a/core/java/android/window/ITaskOrganizer.aidl b/core/java/android/window/ITaskOrganizer.aidl index b4f0162b71af44e17029fcc1169d7012bca50638..67465252d38e3eb74a89c70cb295b8aafb684447 100644 --- a/core/java/android/window/ITaskOrganizer.aidl +++ b/core/java/android/window/ITaskOrganizer.aidl @@ -25,7 +25,14 @@ import android.window.WindowContainerToken; * {@hide} */ oneway interface ITaskOrganizer { - void onTaskAppeared(in ActivityManager.RunningTaskInfo taskInfo); + /** + * A callback when the Task is available for the registered organizer. The client is responsible + * for releasing the SurfaceControl in the callback. + * + * @param taskInfo The information about the Task that's available + * @param leash A persistent leash for this Task. + */ + void onTaskAppeared(in ActivityManager.RunningTaskInfo taskInfo, in SurfaceControl leash); void onTaskVanished(in ActivityManager.RunningTaskInfo taskInfo); /** diff --git a/core/java/android/window/IWindowContainerToken.aidl b/core/java/android/window/IWindowContainerToken.aidl index 57c7abf9c7e12fceef6459184726d2eb4ee1e2a4..81a04e9c10af4aed04333313aceb9e200b18a797 100644 --- a/core/java/android/window/IWindowContainerToken.aidl +++ b/core/java/android/window/IWindowContainerToken.aidl @@ -24,9 +24,4 @@ import android.view.SurfaceControl; * @hide */ interface IWindowContainerToken { - - /** - * Gets a persistent leash for this container or {@code null}. - */ - SurfaceControl getLeash(); } diff --git a/core/java/android/window/TaskOrganizer.java b/core/java/android/window/TaskOrganizer.java index f661d9af5999327939fdb1076c0ff8141f90ffd6..1f5e53369cd8ffc3f9e750fee617339eb3d8d29d 100644 --- a/core/java/android/window/TaskOrganizer.java +++ b/core/java/android/window/TaskOrganizer.java @@ -24,6 +24,7 @@ import android.annotation.TestApi; import android.app.ActivityManager; import android.os.RemoteException; import android.util.Singleton; +import android.view.SurfaceControl; import java.util.List; @@ -59,7 +60,8 @@ public class TaskOrganizer extends WindowOrganizer { } @BinderThread - public void onTaskAppeared(@NonNull ActivityManager.RunningTaskInfo taskInfo) {} + public void onTaskAppeared(@NonNull ActivityManager.RunningTaskInfo taskInfo, + @NonNull SurfaceControl leash) {} @BinderThread public void onTaskVanished(@NonNull ActivityManager.RunningTaskInfo taskInfo) {} @@ -155,8 +157,8 @@ public class TaskOrganizer extends WindowOrganizer { private final ITaskOrganizer mInterface = new ITaskOrganizer.Stub() { @Override - public void onTaskAppeared(ActivityManager.RunningTaskInfo taskInfo) { - TaskOrganizer.this.onTaskAppeared(taskInfo); + public void onTaskAppeared(ActivityManager.RunningTaskInfo taskInfo, SurfaceControl leash) { + TaskOrganizer.this.onTaskAppeared(taskInfo, leash); } @Override diff --git a/core/java/android/window/TaskOrganizerTaskEmbedder.java b/core/java/android/window/TaskOrganizerTaskEmbedder.java index b63741ec69c46745154230bf16f202e54ca7fc2e..2fb46509f337d43d10dc42f72e4bf0f4ef8733b9 100644 --- a/core/java/android/window/TaskOrganizerTaskEmbedder.java +++ b/core/java/android/window/TaskOrganizerTaskEmbedder.java @@ -21,7 +21,6 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW; import android.app.ActivityManager; import android.app.ActivityOptions; -import android.app.TaskStackListener; import android.content.Context; import android.graphics.Rect; import android.util.Log; @@ -215,14 +214,14 @@ public class TaskOrganizerTaskEmbedder extends TaskEmbedder { private class TaskOrganizerImpl extends TaskOrganizer { @Override - public void onTaskAppeared(ActivityManager.RunningTaskInfo taskInfo) { + public void onTaskAppeared(ActivityManager.RunningTaskInfo taskInfo, SurfaceControl leash) { if (DEBUG) { log("taskAppeared: " + taskInfo.taskId); } mTaskInfo = taskInfo; mTaskToken = taskInfo.token; - mTaskLeash = mTaskToken.getLeash(); + mTaskLeash = leash; mTransaction.reparent(mTaskLeash, mSurfaceControl) .show(mTaskLeash) .show(mSurfaceControl) diff --git a/core/java/android/window/WindowContainerToken.java b/core/java/android/window/WindowContainerToken.java index 3316d0e5b71f1528c1890ba7e0fa8e4400959c4a..c92ccae66ff8fd9698d6db373dc3be77495178f9 100644 --- a/core/java/android/window/WindowContainerToken.java +++ b/core/java/android/window/WindowContainerToken.java @@ -17,14 +17,10 @@ package android.window; import android.annotation.NonNull; -import android.annotation.Nullable; import android.annotation.TestApi; import android.os.IBinder; import android.os.Parcel; import android.os.Parcelable; -import android.os.RemoteException; -import android.view.SurfaceControl; -import android.window.IWindowContainerToken; /** * Interface for a window container to communicate with the window manager. This also acts as a @@ -45,15 +41,6 @@ public final class WindowContainerToken implements Parcelable { mRealToken = IWindowContainerToken.Stub.asInterface(in.readStrongBinder()); } - @Nullable - public SurfaceControl getLeash() { - try { - return mRealToken.getLeash(); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } - } - /** @hide */ public IBinder asBinder() { return mRealToken.asBinder(); diff --git a/core/java/com/android/internal/accessibility/dialog/AccessibilityTarget.java b/core/java/com/android/internal/accessibility/dialog/AccessibilityTarget.java index 72ebc58380b8b5d1e8d101463e94a8f983667af7..37871d0b5a104c7e12583a1cbf60726585a55cbb 100644 --- a/core/java/com/android/internal/accessibility/dialog/AccessibilityTarget.java +++ b/core/java/com/android/internal/accessibility/dialog/AccessibilityTarget.java @@ -74,7 +74,7 @@ abstract class AccessibilityTarget implements TargetOperations, OnTargetSelected holder.mCheckBoxView.setVisibility(isEditMenuMode ? View.VISIBLE : View.GONE); holder.mIconView.setImageDrawable(getIcon()); holder.mLabelView.setText(getLabel()); - holder.mSwitchItem.setVisibility(View.GONE); + holder.mStatusView.setVisibility(View.GONE); } @Override diff --git a/core/java/com/android/internal/accessibility/dialog/ShortcutTargetAdapter.java b/core/java/com/android/internal/accessibility/dialog/ShortcutTargetAdapter.java index b7605b7fc0119a44e89301ff9ae5382f0e87cbf8..88e18db8da0819bc7cb59c20050cff6c77d72bec 100644 --- a/core/java/com/android/internal/accessibility/dialog/ShortcutTargetAdapter.java +++ b/core/java/com/android/internal/accessibility/dialog/ShortcutTargetAdapter.java @@ -68,8 +68,8 @@ class ShortcutTargetAdapter extends TargetAdapter { holder.mIconView = convertView.findViewById(R.id.accessibility_shortcut_target_icon); holder.mLabelView = convertView.findViewById( R.id.accessibility_shortcut_target_label); - holder.mSwitchItem = convertView.findViewById( - R.id.accessibility_shortcut_target_switch_item); + holder.mStatusView = convertView.findViewById( + R.id.accessibility_shortcut_target_status); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); diff --git a/core/java/com/android/internal/accessibility/dialog/TargetAdapter.java b/core/java/com/android/internal/accessibility/dialog/TargetAdapter.java index 1efa17e520ae6bbe35fc316459d4610de0c01339..28ac9210ac0dde44e272e139d26402b40a090c7f 100644 --- a/core/java/com/android/internal/accessibility/dialog/TargetAdapter.java +++ b/core/java/com/android/internal/accessibility/dialog/TargetAdapter.java @@ -19,7 +19,6 @@ package com.android.internal.accessibility.dialog; import android.widget.BaseAdapter; import android.widget.CheckBox; import android.widget.ImageView; -import android.widget.Switch; import android.widget.TextView; /** @@ -30,6 +29,6 @@ abstract class TargetAdapter extends BaseAdapter { CheckBox mCheckBoxView; ImageView mIconView; TextView mLabelView; - Switch mSwitchItem; + TextView mStatusView; } } diff --git a/core/java/com/android/internal/accessibility/dialog/ToggleAccessibilityServiceTarget.java b/core/java/com/android/internal/accessibility/dialog/ToggleAccessibilityServiceTarget.java index 3a42f7e0edb89368eecb56a475cd163b9264d904..239e531dbfb8ff652905fda288ac70a50e793671 100644 --- a/core/java/com/android/internal/accessibility/dialog/ToggleAccessibilityServiceTarget.java +++ b/core/java/com/android/internal/accessibility/dialog/ToggleAccessibilityServiceTarget.java @@ -24,6 +24,7 @@ import android.content.Context; import android.view.View; import android.view.accessibility.AccessibilityManager.ShortcutType; +import com.android.internal.R; import com.android.internal.accessibility.common.ShortcutConstants.AccessibilityFragmentType; import com.android.internal.accessibility.common.ShortcutConstants.ShortcutMenuMode; import com.android.internal.accessibility.dialog.TargetAdapter.ViewHolder; @@ -49,7 +50,11 @@ class ToggleAccessibilityServiceTarget extends AccessibilityServiceTarget { final boolean isEditMenuMode = shortcutMenuMode == ShortcutMenuMode.EDIT; - holder.mSwitchItem.setVisibility(isEditMenuMode ? View.GONE : View.VISIBLE); - holder.mSwitchItem.setChecked(isAccessibilityServiceEnabled(getContext(), getId())); + holder.mStatusView.setVisibility(isEditMenuMode ? View.GONE : View.VISIBLE); + + final int statusResId = isAccessibilityServiceEnabled(getContext(), getId()) + ? R.string.accessibility_shortcut_menu_item_status_on + : R.string.accessibility_shortcut_menu_item_status_off; + holder.mStatusView.setText(getContext().getString(statusResId)); } } diff --git a/core/java/com/android/internal/accessibility/dialog/ToggleWhiteListingFeatureTarget.java b/core/java/com/android/internal/accessibility/dialog/ToggleWhiteListingFeatureTarget.java index fcbf5eccbd9ed8bd57804198b54aa69110b97f7e..5ab9eb84f0e46bc27bad138285271a3e27eb7b47 100644 --- a/core/java/com/android/internal/accessibility/dialog/ToggleWhiteListingFeatureTarget.java +++ b/core/java/com/android/internal/accessibility/dialog/ToggleWhiteListingFeatureTarget.java @@ -23,6 +23,7 @@ import android.provider.Settings; import android.view.View; import android.view.accessibility.AccessibilityManager.ShortcutType; +import com.android.internal.R; import com.android.internal.accessibility.common.ShortcutConstants.AccessibilityFragmentType; import com.android.internal.accessibility.common.ShortcutConstants.ShortcutMenuMode; import com.android.internal.accessibility.dialog.TargetAdapter.ViewHolder; @@ -46,8 +47,12 @@ class ToggleWhiteListingFeatureTarget extends AccessibilityTarget { final boolean isEditMenuMode = shortcutMenuMode == ShortcutMenuMode.EDIT; - holder.mSwitchItem.setVisibility(isEditMenuMode ? View.GONE : View.VISIBLE); - holder.mSwitchItem.setChecked(isFeatureEnabled()); + holder.mStatusView.setVisibility(isEditMenuMode ? View.GONE : View.VISIBLE); + + final int statusResId = isFeatureEnabled() + ? R.string.accessibility_shortcut_menu_item_status_on + : R.string.accessibility_shortcut_menu_item_status_off; + holder.mStatusView.setText(getContext().getString(statusResId)); } private boolean isFeatureEnabled() { diff --git a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java index 837cc466a895ccef2a6212a15928b4f2cb6e51d6..2b0fd663643decf978c2f5c9bf04a662062e9fc3 100644 --- a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java +++ b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java @@ -210,7 +210,7 @@ public final class SystemUiDeviceConfigFlags { * Allow touch passthrough above assist area during a session. */ public static final String ASSIST_TAP_PASSTHROUGH = "assist_tap_passthrough"; - + /** * (bool) Whether to show handles when taught. */ @@ -393,6 +393,21 @@ public final class SystemUiDeviceConfigFlags { */ public static final String PIP_USER_RESIZE = "pip_user_resize"; + /** + * (float) Bottom height in DP for Back Gesture. + */ + public static final String BACK_GESTURE_BOTTOM_HEIGHT = "back_gesture_bottom_height"; + + /** + * (float) Edge width in DP where touch down is allowed for Back Gesture. + */ + public static final String BACK_GESTURE_EDGE_WIDTH = "back_gesture_edge_width"; + + /** + * (float) Slop multiplier for Back Gesture. + */ + public static final String BACK_GESTURE_SLOP_MULTIPLIER = "back_gesture_slop_multiplier"; + private SystemUiDeviceConfigFlags() { } } diff --git a/core/java/com/android/internal/policy/DecorView.java b/core/java/com/android/internal/policy/DecorView.java index f5d38ca37bb7be8c0eeeadf0329275a21c00d795..863659d7c4eb317c4b8fae19e652b7c16580d025 100644 --- a/core/java/com/android/internal/policy/DecorView.java +++ b/core/java/com/android/internal/policy/DecorView.java @@ -2019,10 +2019,17 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind if (getForeground() != null) { drawableChanged(); } - getWindowInsetsController().setCaptionInsetsHeight(getCaptionInsetsHeight()); } } + /** + * An interface to be called when the caption visibility or height changed, to report the + * corresponding insets change to the InsetsController. + */ + public void notifyCaptionHeightChanged() { + getWindowInsetsController().setCaptionInsetsHeight(getCaptionInsetsHeight()); + } + void setWindow(PhoneWindow phoneWindow) { mWindow = phoneWindow; Context context = getContext(); @@ -2093,7 +2100,6 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind mDecorCaptionView.onConfigurationChanged(displayWindowDecor); enableCaption(displayWindowDecor); } - getWindowInsetsController().setCaptionInsetsHeight(getCaptionInsetsHeight()); } void onResourcesLoaded(LayoutInflater inflater, int layoutResource) { diff --git a/core/java/com/android/internal/policy/GestureNavigationSettingsObserver.java b/core/java/com/android/internal/policy/GestureNavigationSettingsObserver.java index 56a6db95badcc532c12e3a81673ad1545d9e8826..4786d41fef4b629a5310aa73ab1f7a599908c01f 100644 --- a/core/java/com/android/internal/policy/GestureNavigationSettingsObserver.java +++ b/core/java/com/android/internal/policy/GestureNavigationSettingsObserver.java @@ -16,13 +16,17 @@ package com.android.internal.policy; +import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BACK_GESTURE_EDGE_WIDTH; + import android.content.ContentResolver; import android.content.Context; import android.content.res.Resources; import android.database.ContentObserver; import android.os.Handler; import android.os.UserHandle; +import android.provider.DeviceConfig; import android.provider.Settings; +import android.util.TypedValue; /** * @hide @@ -30,14 +34,27 @@ import android.provider.Settings; public class GestureNavigationSettingsObserver extends ContentObserver { private Context mContext; private Runnable mOnChangeRunnable; + private Handler mMainHandler; public GestureNavigationSettingsObserver(Handler handler, Context context, Runnable onChangeRunnable) { super(handler); + mMainHandler = handler; mContext = context; mOnChangeRunnable = onChangeRunnable; } + private final DeviceConfig.OnPropertiesChangedListener mOnPropertiesChangedListener = + new DeviceConfig.OnPropertiesChangedListener() { + @Override + public void onPropertiesChanged(DeviceConfig.Properties properties) { + if (DeviceConfig.NAMESPACE_SYSTEMUI.equals(properties.getNamespace()) + && mOnChangeRunnable != null) { + mOnChangeRunnable.run(); + } + } + }; + public void register() { ContentResolver r = mContext.getContentResolver(); r.registerContentObserver( @@ -49,10 +66,15 @@ public class GestureNavigationSettingsObserver extends ContentObserver { r.registerContentObserver( Settings.Secure.getUriFor(Settings.Secure.USER_SETUP_COMPLETE), false, this, UserHandle.USER_ALL); + DeviceConfig.addOnPropertiesChangedListener( + DeviceConfig.NAMESPACE_SYSTEMUI, + runnable -> mMainHandler.post(runnable), + mOnPropertiesChangedListener); } public void unregister() { mContext.getContentResolver().unregisterContentObserver(this); + DeviceConfig.removeOnPropertiesChangedListener(mOnPropertiesChangedListener); } @Override @@ -77,8 +99,12 @@ public class GestureNavigationSettingsObserver extends ContentObserver { } private int getSensitivity(Resources userRes, String side) { - final int inset = userRes.getDimensionPixelSize( + final float defaultInset = userRes.getDimension( com.android.internal.R.dimen.config_backGestureInset); + final float backGestureInset = DeviceConfig.getFloat(DeviceConfig.NAMESPACE_SYSTEMUI, + BACK_GESTURE_EDGE_WIDTH, defaultInset); + final float inset = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, backGestureInset, + userRes.getDisplayMetrics()); final float scale = Settings.Secure.getFloatForUser( mContext.getContentResolver(), side, 1.0f, UserHandle.USER_CURRENT); return (int) (inset * scale); diff --git a/core/java/com/android/internal/widget/DecorCaptionView.java b/core/java/com/android/internal/widget/DecorCaptionView.java index 7a01024ffc36974276351d200d863a47fb717a9a..21021457377a4cdb04349384667a32eabd1576c3 100644 --- a/core/java/com/android/internal/widget/DecorCaptionView.java +++ b/core/java/com/android/internal/widget/DecorCaptionView.java @@ -30,6 +30,7 @@ import android.view.ViewOutlineProvider; import android.view.Window; import com.android.internal.R; +import com.android.internal.policy.DecorView; import com.android.internal.policy.PhoneWindow; import java.util.ArrayList; @@ -305,6 +306,8 @@ public class DecorCaptionView extends ViewGroup implements View.OnTouchListener, } } + ((DecorView) mOwner.getDecorView()).notifyCaptionHeightChanged(); + // This assumes that the caption bar is at the top. mOwner.notifyRestrictedCaptionAreaCallback(mMaximize.getLeft(), mMaximize.getTop(), mClose.getRight(), mClose.getBottom()); diff --git a/core/jni/android_hardware_camera2_CameraMetadata.cpp b/core/jni/android_hardware_camera2_CameraMetadata.cpp index c523e2dc67376e358419d144f6686e8424696258..9ad4cd9e9ae879c56fa9f3bb034c668b744b4e6c 100644 --- a/core/jni/android_hardware_camera2_CameraMetadata.cpp +++ b/core/jni/android_hardware_camera2_CameraMetadata.cpp @@ -162,20 +162,23 @@ struct Helpers { extern "C" { -static jobject CameraMetadata_getAllVendorKeys(JNIEnv* env, jobject thiz, jclass keyType); -static jint CameraMetadata_getTagFromKey(JNIEnv *env, jobject thiz, jstring keyName, jlong vendorId); -static jint CameraMetadata_getTagFromKeyLocal(JNIEnv *env, jobject thiz, jstring keyName); -static jint CameraMetadata_getTypeFromTag(JNIEnv *env, jobject thiz, jint tag, jlong vendorId); -static jint CameraMetadata_getTypeFromTagLocal(JNIEnv *env, jobject thiz, jint tag); -static jint CameraMetadata_setupGlobalVendorTagDescriptor(JNIEnv *env, jobject thiz); +static jobject CameraMetadata_getAllVendorKeys(JNIEnv* env, jclass thiz, jlong ptr, + jclass keyType); +static jint CameraMetadata_getTagFromKey(JNIEnv *env, jclass thiz, jstring keyName, + jlong vendorId); +static jint CameraMetadata_getTagFromKeyLocal(JNIEnv *env, jclass thiz, jlong ptr, + jstring keyName); +static jint CameraMetadata_getTypeFromTag(JNIEnv *env, jclass thiz, jint tag, jlong vendorId); +static jint CameraMetadata_getTypeFromTagLocal(JNIEnv *env, jclass thiz, jlong ptr, jint tag); +static jint CameraMetadata_setupGlobalVendorTagDescriptor(JNIEnv *env, jclass thiz); + +static std::shared_ptr* CameraMetadata_getSharedPtr(jlong metadataLongPtr) { + return reinterpret_cast* >(metadataLongPtr); +} // Less safe access to native pointer. Does NOT throw any Java exceptions if NULL. -static CameraMetadata* CameraMetadata_getPointerNoThrow(JNIEnv *env, jobject thiz) { - if (thiz == nullptr) { - return nullptr; - } - auto metadata = reinterpret_cast *>( - env->GetLongField(thiz, fields.metadata_ptr)); +static CameraMetadata* CameraMetadata_getPointerNoThrow(jlong ptr) { + auto metadata = CameraMetadata_getSharedPtr(ptr); if (metadata == nullptr) { return nullptr; } @@ -183,40 +186,31 @@ static CameraMetadata* CameraMetadata_getPointerNoThrow(JNIEnv *env, jobject thi } // Safe access to native pointer from object. Throws if not possible to access. -static CameraMetadata* CameraMetadata_getPointerThrow(JNIEnv *env, jobject thiz, +static CameraMetadata* CameraMetadata_getPointerThrow(JNIEnv *env, jlong ptr, const char* argName = "this") { - - if (thiz == NULL) { - ALOGV("%s: Throwing java.lang.NullPointerException for null reference", - __FUNCTION__); - jniThrowNullPointerException(env, argName); - return NULL; - } - - CameraMetadata* metadata = CameraMetadata_getPointerNoThrow(env, thiz); - if (metadata == NULL) { + CameraMetadata* metadata = CameraMetadata_getPointerNoThrow(ptr); + if (metadata == nullptr) { ALOGV("%s: Throwing java.lang.IllegalStateException for closed object", __FUNCTION__); jniThrowException(env, "java/lang/IllegalStateException", "Metadata object was already closed"); - return NULL; + return nullptr; } return metadata; } -static jlong CameraMetadata_allocate(JNIEnv *env, jobject thiz) { +static jlong CameraMetadata_allocate(JNIEnv *env, jclass thiz) { ALOGV("%s", __FUNCTION__); return reinterpret_cast(new std::shared_ptr(new CameraMetadata())); } -static jlong CameraMetadata_allocateCopy(JNIEnv *env, jobject thiz, - jobject other) { +static jlong CameraMetadata_allocateCopy(JNIEnv *env, jclass thiz, jlong other) { ALOGV("%s", __FUNCTION__); CameraMetadata* otherMetadata = - CameraMetadata_getPointerThrow(env, other, "other"); + CameraMetadata_getPointerThrow(env, other); // In case of exception, return if (otherMetadata == NULL) return NULL; @@ -226,10 +220,10 @@ static jlong CameraMetadata_allocateCopy(JNIEnv *env, jobject thiz, } -static jboolean CameraMetadata_isEmpty(JNIEnv *env, jobject thiz) { +static jboolean CameraMetadata_isEmpty(JNIEnv *env, jclass thiz, jlong ptr) { ALOGV("%s", __FUNCTION__); - CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, thiz); + CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, ptr); if (metadata == NULL) { ALOGW("%s: Returning early due to exception being thrown", @@ -245,10 +239,10 @@ static jboolean CameraMetadata_isEmpty(JNIEnv *env, jobject thiz) { return empty; } -static jint CameraMetadata_getEntryCount(JNIEnv *env, jobject thiz) { +static jint CameraMetadata_getEntryCount(JNIEnv *env, jclass thiz, jlong ptr) { ALOGV("%s", __FUNCTION__); - CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, thiz); + CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, ptr); if (metadata == NULL) return 0; // actually throws java exc. @@ -256,42 +250,33 @@ static jint CameraMetadata_getEntryCount(JNIEnv *env, jobject thiz) { } // idempotent. calling more than once has no effect. -static void CameraMetadata_close(JNIEnv *env, jobject thiz) { +static void CameraMetadata_close(JNIEnv *env, jclass thiz, jlong ptr) { ALOGV("%s", __FUNCTION__); - if (thiz != nullptr) { - auto metadata = reinterpret_cast *>( - env->GetLongField(thiz, fields.metadata_ptr)); - if (metadata != nullptr) { - delete metadata; - env->SetLongField(thiz, fields.metadata_ptr, 0); - } + auto metadata = CameraMetadata_getSharedPtr(ptr); + if (metadata != nullptr) { + delete metadata; } - - LOG_ALWAYS_FATAL_IF(CameraMetadata_getPointerNoThrow(env, thiz) != nullptr, - "Expected the native ptr to be 0 after #close"); } -static void CameraMetadata_swap(JNIEnv *env, jobject thiz, jobject other) { +static void CameraMetadata_swap(JNIEnv *env, jclass thiz, jlong ptr, jlong other) { ALOGV("%s", __FUNCTION__); - CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, thiz); + auto metadata = CameraMetadata_getSharedPtr(ptr); + auto otherMetadata = CameraMetadata_getSharedPtr(other); - // order is important: we can't call another JNI method - // if there is an exception pending if (metadata == NULL) return; - - CameraMetadata* otherMetadata = CameraMetadata_getPointerThrow(env, other, "other"); - if (otherMetadata == NULL) return; + // Need to swap shared pointers, not CameraMetadata, since the latter may be in use + // by an NDK client, and we don't want to swap their data out from under them. metadata->swap(*otherMetadata); } -static jbyteArray CameraMetadata_readValues(JNIEnv *env, jobject thiz, jint tag) { +static jbyteArray CameraMetadata_readValues(JNIEnv *env, jclass thiz, jint tag, jlong ptr) { ALOGV("%s (tag = %d)", __FUNCTION__, tag); - CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, thiz); + CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, ptr); if (metadata == NULL) return NULL; const camera_metadata_t *metaBuffer = metadata->getAndLock(); @@ -327,10 +312,11 @@ static jbyteArray CameraMetadata_readValues(JNIEnv *env, jobject thiz, jint tag) return byteArray; } -static void CameraMetadata_writeValues(JNIEnv *env, jobject thiz, jint tag, jbyteArray src) { +static void CameraMetadata_writeValues(JNIEnv *env, jclass thiz, jint tag, jbyteArray src, + jlong ptr) { ALOGV("%s (tag = %d)", __FUNCTION__, tag); - CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, thiz); + CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, ptr); if (metadata == NULL) return; const camera_metadata_t *metaBuffer = metadata->getAndLock(); @@ -400,9 +386,9 @@ static void* CameraMetadata_writeMetadataThread(void* arg) { return NULL; } -static void CameraMetadata_dump(JNIEnv *env, jobject thiz) { +static void CameraMetadata_dump(JNIEnv *env, jclass thiz, jlong ptr) { ALOGV("%s", __FUNCTION__); - CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, thiz); + CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, ptr); if (metadata == NULL) { return; } @@ -496,9 +482,9 @@ static void CameraMetadata_dump(JNIEnv *env, jobject thiz) { } } -static void CameraMetadata_readFromParcel(JNIEnv *env, jobject thiz, jobject parcel) { +static void CameraMetadata_readFromParcel(JNIEnv *env, jclass thiz, jobject parcel, jlong ptr) { ALOGV("%s", __FUNCTION__); - CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, thiz); + CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, ptr); if (metadata == NULL) { return; } @@ -517,9 +503,9 @@ static void CameraMetadata_readFromParcel(JNIEnv *env, jobject thiz, jobject par } } -static void CameraMetadata_writeToParcel(JNIEnv *env, jobject thiz, jobject parcel) { +static void CameraMetadata_writeToParcel(JNIEnv *env, jclass thiz, jobject parcel, jlong ptr) { ALOGV("%s", __FUNCTION__); - CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, thiz); + CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, ptr); if (metadata == NULL) { return; } @@ -558,44 +544,44 @@ static const JNINativeMethod gCameraMetadataMethods[] = { "()J", (void*)CameraMetadata_allocate }, { "nativeAllocateCopy", - "(L" CAMERA_METADATA_CLASS_NAME ";)J", + "(J)J", (void *)CameraMetadata_allocateCopy }, { "nativeIsEmpty", - "()Z", + "(J)Z", (void*)CameraMetadata_isEmpty }, { "nativeGetEntryCount", - "()I", + "(J)I", (void*)CameraMetadata_getEntryCount }, { "nativeClose", - "()V", + "(J)V", (void*)CameraMetadata_close }, { "nativeSwap", - "(L" CAMERA_METADATA_CLASS_NAME ";)V", + "(JJ)V", (void *)CameraMetadata_swap }, { "nativeGetTagFromKeyLocal", - "(Ljava/lang/String;)I", + "(JLjava/lang/String;)I", (void *)CameraMetadata_getTagFromKeyLocal }, { "nativeGetTypeFromTagLocal", - "(I)I", + "(JI)I", (void *)CameraMetadata_getTypeFromTagLocal }, { "nativeReadValues", - "(I)[B", + "(IJ)[B", (void *)CameraMetadata_readValues }, { "nativeWriteValues", - "(I[B)V", + "(I[BJ)V", (void *)CameraMetadata_writeValues }, { "nativeDump", - "()V", + "(J)V", (void *)CameraMetadata_dump }, { "nativeGetAllVendorKeys", - "(Ljava/lang/Class;)Ljava/util/ArrayList;", + "(JLjava/lang/Class;)Ljava/util/ArrayList;", (void *)CameraMetadata_getAllVendorKeys}, // Parcelable interface { "nativeReadFromParcel", - "(Landroid/os/Parcel;)V", + "(Landroid/os/Parcel;J)V", (void *)CameraMetadata_readFromParcel }, { "nativeWriteToParcel", - "(Landroid/os/Parcel;)V", + "(Landroid/os/Parcel;J)V", (void *)CameraMetadata_writeToParcel }, }; @@ -652,8 +638,8 @@ int register_android_hardware_camera2_CameraMetadata(JNIEnv *env) extern "C" { -static jint CameraMetadata_getTypeFromTagLocal(JNIEnv *env, jobject thiz, jint tag) { - CameraMetadata* metadata = CameraMetadata_getPointerNoThrow(env, thiz); +static jint CameraMetadata_getTypeFromTagLocal(JNIEnv *env, jclass thiz, jlong ptr, jint tag) { + CameraMetadata* metadata = CameraMetadata_getPointerNoThrow(ptr); metadata_vendor_id_t vendorId = CAMERA_METADATA_INVALID_VENDOR_ID; if (metadata) { const camera_metadata_t *metaBuffer = metadata->getAndLock(); @@ -671,7 +657,8 @@ static jint CameraMetadata_getTypeFromTagLocal(JNIEnv *env, jobject thiz, jint t return tagType; } -static jint CameraMetadata_getTagFromKeyLocal(JNIEnv *env, jobject thiz, jstring keyName) { +static jint CameraMetadata_getTagFromKeyLocal(JNIEnv *env, jclass thiz, jlong ptr, + jstring keyName) { ScopedUtfChars keyScoped(env, keyName); const char *key = keyScoped.c_str(); if (key == NULL) { @@ -682,7 +669,7 @@ static jint CameraMetadata_getTagFromKeyLocal(JNIEnv *env, jobject thiz, jstring uint32_t tag = 0; sp vTags; - CameraMetadata* metadata = CameraMetadata_getPointerNoThrow(env, thiz); + CameraMetadata* metadata = CameraMetadata_getPointerNoThrow(ptr); if (metadata) { sp cache = VendorTagDescriptorCache::getGlobalVendorTagCache(); if (cache.get()) { @@ -701,7 +688,8 @@ static jint CameraMetadata_getTagFromKeyLocal(JNIEnv *env, jobject thiz, jstring return tag; } -static jobject CameraMetadata_getAllVendorKeys(JNIEnv* env, jobject thiz, jclass keyType) { +static jobject CameraMetadata_getAllVendorKeys(JNIEnv* env, jclass thiz, jlong ptr, + jclass keyType) { metadata_vendor_id_t vendorId = CAMERA_METADATA_INVALID_VENDOR_ID; // Get all vendor tags sp vTags = VendorTagDescriptor::getGlobalVendorTagDescriptor(); @@ -712,7 +700,7 @@ static jobject CameraMetadata_getAllVendorKeys(JNIEnv* env, jobject thiz, jclass return nullptr; } - CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, thiz); + CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, ptr); if (metadata == NULL) return NULL; const camera_metadata_t *metaBuffer = metadata->getAndLock(); @@ -816,7 +804,7 @@ static jobject CameraMetadata_getAllVendorKeys(JNIEnv* env, jobject thiz, jclass return arrayList; } -static jint CameraMetadata_getTagFromKey(JNIEnv *env, jobject thiz, jstring keyName, +static jint CameraMetadata_getTagFromKey(JNIEnv *env, jclass thiz, jstring keyName, jlong vendorId) { ScopedUtfChars keyScoped(env, keyName); const char *key = keyScoped.c_str(); @@ -844,7 +832,7 @@ static jint CameraMetadata_getTagFromKey(JNIEnv *env, jobject thiz, jstring keyN return tag; } -static jint CameraMetadata_getTypeFromTag(JNIEnv *env, jobject thiz, jint tag, jlong vendorId) { +static jint CameraMetadata_getTypeFromTag(JNIEnv *env, jclass thiz, jint tag, jlong vendorId) { int tagType = get_local_camera_metadata_tag_type_vendor_id(tag, vendorId); if (tagType == -1) { jniThrowExceptionFmt(env, "java/lang/IllegalArgumentException", @@ -855,7 +843,7 @@ static jint CameraMetadata_getTypeFromTag(JNIEnv *env, jobject thiz, jint tag, j return tagType; } -static jint CameraMetadata_setupGlobalVendorTagDescriptor(JNIEnv *env, jobject thiz) { +static jint CameraMetadata_setupGlobalVendorTagDescriptor(JNIEnv *env, jclass thiz) { const String16 NAME("media.camera"); sp cameraService; status_t err = getService(NAME, /*out*/&cameraService); diff --git a/core/proto/android/app/settings_enums.proto b/core/proto/android/app/settings_enums.proto index 997829eacf96c66df8c3e36b1b4bd05fe76976ec..bfa5d70663abeef5664938987c42e3f8114b4a02 100644 --- a/core/proto/android/app/settings_enums.proto +++ b/core/proto/android/app/settings_enums.proto @@ -2678,4 +2678,15 @@ enum PageId { // CATEGORY: SETTINGS // OS: R DEVICE_CONTROLS_SETTINGS = 1844; + + // ACTION: Settings > Wi-Fi > Tap on Openroaming Wi-Fi + // CATEGORY: SETTINGS + // OS: R + OPENROAMING_TAP = 1845; + + // When device already using any Wi-Fi service, to track if user still want to use Openroaming + // ACTION: Settings > Wi-Fi > Tap on Openroaming Wi-Fi + // CATEGORY: SETTINGS + // OS: R + OPENROAMING_TAP_ON_WIFI_CONNECTION = 1846; } diff --git a/core/proto/android/stats/devicepolicy/device_policy_enums.proto b/core/proto/android/stats/devicepolicy/device_policy_enums.proto index 896ee4fa42a53d353d403fb1fe6bdeb1d67a51eb..7c1a04944d6887564b3658c2a89e80fecc39906e 100644 --- a/core/proto/android/stats/devicepolicy/device_policy_enums.proto +++ b/core/proto/android/stats/devicepolicy/device_policy_enums.proto @@ -197,4 +197,8 @@ enum EventId { CROSS_PROFILE_SETTINGS_PAGE_USER_CONSENTED = 170; CROSS_PROFILE_SETTINGS_PAGE_USER_DECLINED_CONSENT = 171; CROSS_PROFILE_SETTINGS_PAGE_PERMISSION_REVOKED = 172; + DOCSUI_EMPTY_STATE_NO_PERMISSION = 173; + DOCSUI_EMPTY_STATE_QUIET_MODE = 174; + DOCSUI_LAUNCH_OTHER_APP = 175; + DOCSUI_PICK_RESULT = 176; } diff --git a/core/res/res/layout/accessibility_shortcut_chooser_item.xml b/core/res/res/layout/accessibility_shortcut_chooser_item.xml index fff22d916b156847793cf3eb15d2d2b5732233b4..7cca1292af68a3dfe23ad3eb899759df5baed394 100644 --- a/core/res/res/layout/accessibility_shortcut_chooser_item.xml +++ b/core/res/res/layout/accessibility_shortcut_chooser_item.xml @@ -49,12 +49,13 @@ android:textColor="?attr/textColorPrimary" android:fontFamily="sans-serif-medium"/> - + android:textSize="20sp" + android:textColor="?attr/colorAccent" + android:fontFamily="sans-serif-medium"/> + diff --git a/core/res/res/layout/notification_template_material_conversation.xml b/core/res/res/layout/notification_template_material_conversation.xml index d861f16089f2c91cd01ee3b2c3b07c112fb1eb07..9a9d8b96c677d21bdd43f66fbc23813d7c17567e 100644 --- a/core/res/res/layout/notification_template_material_conversation.xml +++ b/core/res/res/layout/notification_template_material_conversation.xml @@ -157,12 +157,13 @@ + + + + diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index c388f751e6283338501ce7c78b14e0c8cc179468..33dd81dca33ea41e93b30923f62e81b874a0e1a6 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -4410,10 +4410,10 @@ shortcut enabled. [CHAR LIMIT=none] --> Don’t turn on - + ON - + OFF diff --git a/core/tests/coretests/AndroidManifest.xml b/core/tests/coretests/AndroidManifest.xml index cc9c91441e84c7eec3ab508708d72c08784b5d43..67a57aaaa101ab0a46d7914ba9d2c7c5dfb570dd 100644 --- a/core/tests/coretests/AndroidManifest.xml +++ b/core/tests/coretests/AndroidManifest.xml @@ -1470,7 +1470,7 @@ + android:value="MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsMpNthdOxud7roPDZMMomOqXgJJdRfIWpkKEqmC61Mv+Nf6QY3TorEwJeghjSmqj7IbBKrtvfQq4E2XJO1HuspmQO4Ng2gvn+r+6EwNfKc9k55d6s+27SR867jKurBbHNtZMG+tjL1yH4r+tNzcuJCsgyAFqLmxFdcxEwzNvREyRpoYc5RDR0mmTwkMCUhJ6CId1EYEKiCEdNzxv+fWPEb21u+/MWpleGCILs8kglRVb2q/WOzAAvGr4FY5plfaE6N+lr7+UschQ+aMi1+uqewo2o0qPFVmZP5hnwj55K4UMzu/NhhDqQQsX4cSGES1KgHo5MTqRqZjN/I7emw5pFQIDAQAB"/> diff --git a/core/tests/coretests/res/values/overlayable_icons_test.xml b/core/tests/coretests/res/values/overlayable_icons_test.xml new file mode 100644 index 0000000000000000000000000000000000000000..7ea1848a723e27de21b9afcab26fd79f2c708f8c --- /dev/null +++ b/core/tests/coretests/res/values/overlayable_icons_test.xml @@ -0,0 +1,86 @@ + + + + + @*android:drawable/ic_audio_alarm + @*android:drawable/ic_audio_alarm_mute + @*android:drawable/ic_battery_80_24dp + @*android:drawable/ic_bluetooth_share_icon + @*android:drawable/ic_bt_headphones_a2dp + @*android:drawable/ic_bt_headset_hfp + @*android:drawable/ic_bt_hearing_aid + @*android:drawable/ic_bt_laptop + @*android:drawable/ic_bt_misc_hid + @*android:drawable/ic_bt_network_pan + @*android:drawable/ic_bt_pointing_hid + @*android:drawable/ic_corp_badge + @*android:drawable/ic_expand_more + @*android:drawable/ic_faster_emergency + @*android:drawable/ic_file_copy + @*android:drawable/ic_lock + @*android:drawable/ic_lock_bugreport + @*android:drawable/ic_lock_open + @*android:drawable/ic_lock_power_off + @*android:drawable/ic_lockscreen_ime + @*android:drawable/ic_mode_edit + @*android:drawable/ic_notifications_alerted + @*android:drawable/ic_phone + @*android:drawable/ic_qs_airplane + @*android:drawable/ic_qs_auto_rotate + @*android:drawable/ic_qs_battery_saver + @*android:drawable/ic_qs_bluetooth + @*android:drawable/ic_qs_dnd + @*android:drawable/ic_qs_flashlight + @*android:drawable/ic_qs_night_display_on + @*android:drawable/ic_qs_ui_mode_night + @*android:drawable/ic_restart + @*android:drawable/ic_screenshot + @*android:drawable/ic_settings_bluetooth + @*android:drawable/ic_signal_cellular_0_4_bar + @*android:drawable/ic_signal_cellular_0_5_bar + @*android:drawable/ic_signal_cellular_1_4_bar + @*android:drawable/ic_signal_cellular_1_5_bar + @*android:drawable/ic_signal_cellular_2_4_bar + @*android:drawable/ic_signal_cellular_2_5_bar + @*android:drawable/ic_signal_cellular_3_4_bar + @*android:drawable/ic_signal_cellular_3_5_bar + @*android:drawable/ic_signal_cellular_4_4_bar + @*android:drawable/ic_signal_cellular_4_5_bar + @*android:drawable/ic_signal_cellular_5_5_bar + @*android:drawable/ic_signal_location + @*android:drawable/ic_wifi_signal_0 + @*android:drawable/ic_wifi_signal_1 + @*android:drawable/ic_wifi_signal_2 + @*android:drawable/ic_wifi_signal_3 + @*android:drawable/ic_wifi_signal_4 + @*android:drawable/perm_group_activity_recognition + @*android:drawable/perm_group_aural + @*android:drawable/perm_group_calendar + @*android:drawable/perm_group_call_log + @*android:drawable/perm_group_camera + @*android:drawable/perm_group_contacts + @*android:drawable/perm_group_location + @*android:drawable/perm_group_microphone + @*android:drawable/perm_group_phone_calls + @*android:drawable/perm_group_sensors + @*android:drawable/perm_group_sms + @*android:drawable/perm_group_storage + @*android:drawable/perm_group_visual + + diff --git a/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java b/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java index c328d720426d119f9e5bfa075b522dee31802b93..34417e68f11c9888ea5547bd65fe2abd7d598f27 100644 --- a/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java +++ b/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java @@ -18,6 +18,8 @@ package android.app.activity; import static android.content.Intent.ACTION_EDIT; import static android.content.Intent.ACTION_VIEW; +import static android.content.res.Configuration.ORIENTATION_LANDSCAPE; +import static android.content.res.Configuration.ORIENTATION_PORTRAIT; import static com.google.common.truth.Truth.assertThat; @@ -31,6 +33,7 @@ import android.app.Activity; import android.app.ActivityThread; import android.app.IApplicationThread; import android.app.PictureInPictureParams; +import android.app.ResourcesManager; import android.app.servertransaction.ActivityConfigurationChangeItem; import android.app.servertransaction.ActivityRelaunchItem; import android.app.servertransaction.ClientTransaction; @@ -38,8 +41,10 @@ import android.app.servertransaction.ClientTransactionItem; import android.app.servertransaction.NewIntentItem; import android.app.servertransaction.ResumeActivityItem; import android.app.servertransaction.StopActivityItem; +import android.content.Context; import android.content.Intent; import android.content.res.Configuration; +import android.hardware.display.DisplayManager; import android.os.IBinder; import android.util.MergedConfiguration; import android.view.Display; @@ -230,9 +235,9 @@ public class ActivityThreadTest { final ActivityThread activityThread = activity.getActivityThread(); final Configuration pendingConfig = new Configuration(); - pendingConfig.orientation = orientation == Configuration.ORIENTATION_LANDSCAPE - ? Configuration.ORIENTATION_PORTRAIT - : Configuration.ORIENTATION_LANDSCAPE; + pendingConfig.orientation = orientation == ORIENTATION_LANDSCAPE + ? ORIENTATION_PORTRAIT + : ORIENTATION_LANDSCAPE; pendingConfig.seq = seq + 2; activityThread.updatePendingActivityConfiguration(activity.getActivityToken(), pendingConfig); @@ -257,7 +262,7 @@ public class ActivityThreadTest { InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> { final Configuration config = new Configuration(); config.seq = BASE_SEQ; - config.orientation = Configuration.ORIENTATION_PORTRAIT; + config.orientation = ORIENTATION_PORTRAIT; activityThread.handleActivityConfigurationChanged(activity.getActivityToken(), config, Display.INVALID_DISPLAY); @@ -306,6 +311,61 @@ public class ActivityThreadTest { assertEquals(400, activity.mConfig.smallestScreenWidthDp); } + @Test + public void testOrientationChanged_DoesntOverrideVirtualDisplayOrientation() { + final TestActivity activity = mActivityTestRule.launchActivity(new Intent()); + final ActivityThread activityThread = activity.getActivityThread(); + + InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> { + Context appContext = activity.getApplication(); + Configuration originalAppConfig = + new Configuration(appContext.getResources().getConfiguration()); + DisplayManager dm = appContext.getSystemService(DisplayManager.class); + + int virtualDisplayWidth; + int virtualDisplayHeight; + if (originalAppConfig.orientation == ORIENTATION_PORTRAIT) { + virtualDisplayWidth = 100; + virtualDisplayHeight = 200; + } else { + virtualDisplayWidth = 200; + virtualDisplayHeight = 100; + } + Display virtualDisplay = dm.createVirtualDisplay("virtual-display", + virtualDisplayWidth, virtualDisplayHeight, 200, null, 0).getDisplay(); + Context virtualDisplayContext = appContext.createDisplayContext(virtualDisplay); + int originalVirtualDisplayOrientation = virtualDisplayContext.getResources() + .getConfiguration().orientation; + + Configuration newAppConfig = new Configuration(originalAppConfig); + newAppConfig.seq++; + newAppConfig.orientation = newAppConfig.orientation == ORIENTATION_PORTRAIT + ? ORIENTATION_LANDSCAPE : ORIENTATION_PORTRAIT; + + activityThread.updatePendingConfiguration(newAppConfig); + activityThread.handleConfigurationChanged(newAppConfig); + + try { + assertEquals("Virtual display orientation should not change when process" + + " configuration orientation changes.", + originalVirtualDisplayOrientation, + virtualDisplayContext.getResources().getConfiguration().orientation); + } finally { + // Make sure to reset the process config to prevent side effects to other + // tests. + Configuration activityThreadConfig = activityThread.getConfiguration(); + activityThreadConfig.seq = originalAppConfig.seq - 1; + + Configuration resourceManagerConfig = ResourcesManager.getInstance() + .getConfiguration(); + resourceManagerConfig.seq = originalAppConfig.seq - 1; + + activityThread.updatePendingConfiguration(originalAppConfig); + activityThread.handleConfigurationChanged(originalAppConfig); + } + }); + } + @Test public void testResumeAfterNewIntent() { final Activity activity = mActivityTestRule.launchActivity(new Intent()); @@ -386,7 +446,7 @@ public class ActivityThreadTest { final int numOfConfig = activity.mNumOfConfigChanges; Configuration config = new Configuration(); - config.orientation = Configuration.ORIENTATION_PORTRAIT; + config.orientation = ORIENTATION_PORTRAIT; config.seq = seq; activityThread.handleActivityConfigurationChanged(activity.getActivityToken(), config, Display.INVALID_DISPLAY); @@ -396,7 +456,7 @@ public class ActivityThreadTest { } config = new Configuration(); - config.orientation = Configuration.ORIENTATION_LANDSCAPE; + config.orientation = ORIENTATION_LANDSCAPE; config.seq = seq + 1; activityThread.handleActivityConfigurationChanged(activity.getActivityToken(), config, Display.INVALID_DISPLAY); diff --git a/core/tests/coretests/src/android/app/servertransaction/ObjectPoolTests.java b/core/tests/coretests/src/android/app/servertransaction/ObjectPoolTests.java index 4b29d59de332dec999799b6d6ccfe11461e5a247..107fe3f3ced56f2bb010dea301af656215083bbd 100644 --- a/core/tests/coretests/src/android/app/servertransaction/ObjectPoolTests.java +++ b/core/tests/coretests/src/android/app/servertransaction/ObjectPoolTests.java @@ -197,21 +197,6 @@ public class ObjectPoolTests { assertFalse(item2.equals(emptyItem)); } - @Test - public void testRecycleMultiWindowModeChangeItem() { - MultiWindowModeChangeItem emptyItem = MultiWindowModeChangeItem.obtain(false, null); - MultiWindowModeChangeItem item = MultiWindowModeChangeItem.obtain(true, config()); - assertNotSame(item, emptyItem); - assertFalse(item.equals(emptyItem)); - - item.recycle(); - assertEquals(item, emptyItem); - - MultiWindowModeChangeItem item2 = MultiWindowModeChangeItem.obtain(true, config()); - assertSame(item, item2); - assertFalse(item2.equals(emptyItem)); - } - @Test public void testRecycleNewIntentItem() { NewIntentItem emptyItem = NewIntentItem.obtain(null, false); @@ -242,21 +227,6 @@ public class ObjectPoolTests { assertFalse(item2.equals(emptyItem)); } - @Test - public void testRecyclePipModeChangeItem() { - PipModeChangeItem emptyItem = PipModeChangeItem.obtain(false, null); - PipModeChangeItem item = PipModeChangeItem.obtain(true, config()); - assertNotSame(item, emptyItem); - assertFalse(item.equals(emptyItem)); - - item.recycle(); - assertEquals(item, emptyItem); - - PipModeChangeItem item2 = PipModeChangeItem.obtain(true, config()); - assertSame(item, item2); - assertFalse(item2.equals(emptyItem)); - } - @Test public void testRecycleResumeActivityItem() { ResumeActivityItem emptyItem = ResumeActivityItem.obtain(false); diff --git a/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java b/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java index 3766cf72d99eeb0976e9f1a6f6d89e86426e6ebe..47f9323a95f9d54a6d040b26c889a663008f9c8f 100644 --- a/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java +++ b/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java @@ -152,34 +152,6 @@ public class TransactionParcelTests { assertTrue(item.equals(result)); } - @Test - public void testPipModeChange() { - // Write to parcel - PipModeChangeItem item = PipModeChangeItem.obtain(true /* isInPipMode */, config()); - writeAndPrepareForReading(item); - - // Read from parcel and assert - PipModeChangeItem result = PipModeChangeItem.CREATOR.createFromParcel(mParcel); - - assertEquals(item.hashCode(), result.hashCode()); - assertTrue(item.equals(result)); - } - - @Test - public void testMultiWindowModeChange() { - // Write to parcel - MultiWindowModeChangeItem item = MultiWindowModeChangeItem.obtain( - true /* isInMultiWindowMode */, config()); - writeAndPrepareForReading(item); - - // Read from parcel and assert - MultiWindowModeChangeItem result = - MultiWindowModeChangeItem.CREATOR.createFromParcel(mParcel); - - assertEquals(item.hashCode(), result.hashCode()); - assertTrue(item.equals(result)); - } - @Test public void testDestroy() { DestroyActivityItem item = DestroyActivityItem.obtain(true /* finished */, diff --git a/core/tests/coretests/src/android/content/pm/PackageManagerTests.java b/core/tests/coretests/src/android/content/pm/PackageManagerTests.java index 79cb1f9f85f9da2ebd7b8434c34cc0008629f929..567552f66b35f9a5ce23dc84df1037aa5a090d31 100644 --- a/core/tests/coretests/src/android/content/pm/PackageManagerTests.java +++ b/core/tests/coretests/src/android/content/pm/PackageManagerTests.java @@ -971,8 +971,6 @@ public class PackageManagerTests extends AndroidTestCase { if (retainData) { assertNotNull(info); assertEquals(info.packageName, ip.pkg.packageName); - File file = new File(info.dataDir); - assertTrue(file.exists()); } else { assertNull(info); } @@ -990,7 +988,6 @@ public class PackageManagerTests extends AndroidTestCase { @LargeTest - @Suppress // TODO(b/152007236): un-suppress when we root cause this public void testDeleteNormalInternalRetainData() throws Exception { deleteFromRawResource(0, PackageManager.DELETE_KEEP_DATA); } @@ -2306,7 +2303,6 @@ public class PackageManagerTests extends AndroidTestCase { } } - @Suppress // TODO(b/152007236): un-suppress when we root cause this public void testIsSignedBy() throws Exception { PackageManager pm = getPm(); String mPkgName = mContext.getPackageName(); diff --git a/core/tests/coretests/src/android/content/pm/SigningDetailsTest.java b/core/tests/coretests/src/android/content/pm/SigningDetailsTest.java new file mode 100644 index 0000000000000000000000000000000000000000..51af048bcae8831fe3985b59c259513d4d1351eb --- /dev/null +++ b/core/tests/coretests/src/android/content/pm/SigningDetailsTest.java @@ -0,0 +1,147 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package android.content.pm; + +import static android.content.pm.PackageParser.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V3; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import android.content.pm.PackageParser.SigningDetails; +import android.util.ArraySet; + +import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.filters.SmallTest; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.security.PublicKey; + +@RunWith(AndroidJUnit4.class) +@SmallTest +public class SigningDetailsTest { + private static final String FIRST_SIGNATURE = "1234"; + private static final String SECOND_SIGNATURE = "5678"; + private static final String THIRD_SIGNATURE = "9abc"; + + @Test + public void hasAncestor_multipleSignersInLineageWithAncestor_returnsTrue() throws Exception { + SigningDetails twoSignersInLineageDetails = createSigningDetailsWithLineage(FIRST_SIGNATURE, + SECOND_SIGNATURE, THIRD_SIGNATURE); + SigningDetails oneSignerInLineageDetails = createSigningDetailsWithLineage(FIRST_SIGNATURE, + SECOND_SIGNATURE); + + boolean result = twoSignersInLineageDetails.hasAncestor(oneSignerInLineageDetails); + + assertTrue(result); + } + + @Test + public void hasAncestor_oneSignerInLineageAgainstMultipleSignersInLineage_returnsFalse() + throws Exception { + SigningDetails twoSignersInLineageDetails = createSigningDetailsWithLineage(FIRST_SIGNATURE, + SECOND_SIGNATURE, THIRD_SIGNATURE); + SigningDetails oneSignerInLineageDetails = createSigningDetailsWithLineage(FIRST_SIGNATURE, + SECOND_SIGNATURE); + + boolean result = oneSignerInLineageDetails.hasAncestor(twoSignersInLineageDetails); + + assertFalse(result); + } + + @Test + public void hasAncestor_multipleSignersInLineageAgainstSelf_returnsFalse() throws Exception { + SigningDetails twoSignersInLineageDetails = createSigningDetailsWithLineage(FIRST_SIGNATURE, + SECOND_SIGNATURE, THIRD_SIGNATURE); + + boolean result = twoSignersInLineageDetails.hasAncestor(twoSignersInLineageDetails); + + assertFalse(result); + } + + @Test + public void hasAncestor_oneSignerInLineageWithAncestor_returnsTrue() throws Exception { + SigningDetails twoSignersInLineageDetails = createSigningDetailsWithLineage(FIRST_SIGNATURE, + SECOND_SIGNATURE, THIRD_SIGNATURE); + SigningDetails oneSignerDetails = createSigningDetails(FIRST_SIGNATURE); + + boolean result = twoSignersInLineageDetails.hasAncestor(oneSignerDetails); + + assertTrue(result); + } + + @Test + public void hasAncestor_singleSignerAgainstLineage_returnsFalse() throws Exception { + SigningDetails oneSignerDetails = createSigningDetails(FIRST_SIGNATURE); + SigningDetails twoSignersInLineageDetails = createSigningDetailsWithLineage(FIRST_SIGNATURE, + SECOND_SIGNATURE, THIRD_SIGNATURE); + + boolean result = oneSignerDetails.hasAncestor(twoSignersInLineageDetails); + + assertFalse(result); + } + + @Test + public void hasAncestor_multipleSigners_returnsFalse() throws Exception { + SigningDetails twoSignersDetails = createSigningDetails(FIRST_SIGNATURE, SECOND_SIGNATURE); + SigningDetails twoSignersInLineageDetails = createSigningDetailsWithLineage(FIRST_SIGNATURE, + SECOND_SIGNATURE, THIRD_SIGNATURE); + + boolean result1 = twoSignersInLineageDetails.hasAncestor(twoSignersDetails); + boolean result2 = twoSignersDetails.hasAncestor(twoSignersInLineageDetails); + + assertFalse(result1); + assertFalse(result2); + } + + @Test + public void hasAncestor_unknownDetails_returnsFalse() throws Exception { + SigningDetails unknownDetails = SigningDetails.UNKNOWN; + SigningDetails twoSignersInLineageDetails = createSigningDetailsWithLineage(FIRST_SIGNATURE, + SECOND_SIGNATURE, THIRD_SIGNATURE); + + boolean result1 = twoSignersInLineageDetails.hasAncestor(unknownDetails); + boolean result2 = unknownDetails.hasAncestor(twoSignersInLineageDetails); + + assertFalse(result1); + assertFalse(result2); + } + + private SigningDetails createSigningDetailsWithLineage(String... signers) { + Signature[] signingHistory = new Signature[signers.length]; + for (int i = 0; i < signers.length; i++) { + signingHistory[i] = new Signature(signers[i]); + } + Signature[] currentSignature = new Signature[]{signingHistory[signers.length - 1]}; + // TODO: Since the PublicKey ArraySet is not used by any of the tests a generic empty Set + // works for now, but if this is needed in the future consider creating mock PublicKeys that + // can respond as required for the method under test. + ArraySet publicKeys = new ArraySet<>(); + return new SigningDetails(currentSignature, SIGNING_BLOCK_V3, publicKeys, signingHistory); + } + + private SigningDetails createSigningDetails(String... signers) { + Signature[] currentSignatures = new Signature[signers.length]; + for (int i = 0; i < signers.length; i++) { + currentSignatures[i] = new Signature(signers[i]); + } + // TODO: Similar to above when tests are added that require this it should be updated to use + // mocked PublicKeys. + ArraySet publicKeys = new ArraySet<>(); + return new SigningDetails(currentSignatures, SIGNING_BLOCK_V3, publicKeys, null); + } +} diff --git a/core/tests/coretests/src/android/view/ImeInsetsSourceConsumerTest.java b/core/tests/coretests/src/android/view/ImeInsetsSourceConsumerTest.java index 5c9e3397c6a5f93c8e73e832299507df6bcbdb7b..164c372768c08b125d36261bad9add38d116b1d0 100644 --- a/core/tests/coretests/src/android/view/ImeInsetsSourceConsumerTest.java +++ b/core/tests/coretests/src/android/view/ImeInsetsSourceConsumerTest.java @@ -78,7 +78,8 @@ public class ImeInsetsSourceConsumerTest { } catch (BadTokenException e) { // activity isn't running, we will ignore BadTokenException. } - mController = Mockito.spy(new InsetsController(viewRootImpl)); + mController = Mockito.spy(new InsetsController( + new ViewRootInsetsControllerHost(viewRootImpl))); final Rect rect = new Rect(5, 5, 5, 5); mController.calculateInsets( false, diff --git a/core/tests/coretests/src/android/view/InsetsControllerTest.java b/core/tests/coretests/src/android/view/InsetsControllerTest.java index ade31d8e41730ac9782ef870411c038a819a82d4..cc85332590baecc412eafc0b4724187077cb28a9 100644 --- a/core/tests/coretests/src/android/view/InsetsControllerTest.java +++ b/core/tests/coretests/src/android/view/InsetsControllerTest.java @@ -93,6 +93,7 @@ public class InsetsControllerTest { private SurfaceSession mSession = new SurfaceSession(); private SurfaceControl mLeash; private ViewRootImpl mViewRoot; + private TestHost mTestHost; private TestHandler mTestHandler; private OffsettableClock mTestClock; private static InsetsModeSession sInsetsModeSession; @@ -123,7 +124,8 @@ public class InsetsControllerTest { } mTestClock = new OffsettableClock(); mTestHandler = new TestHandler(null, mTestClock); - mController = new InsetsController(mViewRoot, (controller, type) -> { + mTestHost = new TestHost(mViewRoot); + mController = new InsetsController(mTestHost, (controller, type) -> { if (type == ITYPE_IME) { return new InsetsSourceConsumer(type, controller.getState(), Transaction::new, controller) { @@ -685,6 +687,24 @@ public class InsetsControllerTest { }); } + @Test + public void testRequestedState() { + InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> { + mController.onControlsChanged(createSingletonControl(ITYPE_STATUS_BAR)); + mController.hide(statusBars()); + assertFalse(mTestHost.getModifiedState().peekSource(ITYPE_STATUS_BAR).isVisible()); + mController.onControlsChanged(new InsetsSourceControl[0]); + assertFalse(mTestHost.getModifiedState().peekSource(ITYPE_STATUS_BAR).isVisible()); + InsetsState newState = new InsetsState(mController.getState(), true /* copySource */); + mController.onStateChanged(newState); + assertFalse(mTestHost.getModifiedState().peekSource(ITYPE_STATUS_BAR).isVisible()); + mController.show(statusBars()); + assertFalse(mTestHost.getModifiedState().peekSource(ITYPE_STATUS_BAR).isVisible()); + mController.onControlsChanged(createSingletonControl(ITYPE_STATUS_BAR)); + assertTrue(mTestHost.getModifiedState().peekSource(ITYPE_STATUS_BAR).isVisible()); + }); + } + private void waitUntilNextFrame() throws Exception { final CountDownLatch latch = new CountDownLatch(1); Choreographer.getMainThreadInstance().postCallback(Choreographer.CALLBACK_COMMIT, @@ -716,4 +736,23 @@ public class InsetsControllerTest { mController.onControlsChanged(controls); return controls; } + + private static class TestHost extends ViewRootInsetsControllerHost { + + private InsetsState mModifiedState = new InsetsState(); + + TestHost(ViewRootImpl viewRoot) { + super(viewRoot); + } + + @Override + public void onInsetsModified(InsetsState insetsState) { + mModifiedState = new InsetsState(insetsState, true /* copySource */); + super.onInsetsModified(insetsState); + } + + public InsetsState getModifiedState() { + return mModifiedState; + } + } } diff --git a/core/tests/coretests/src/android/view/InsetsSourceConsumerTest.java b/core/tests/coretests/src/android/view/InsetsSourceConsumerTest.java index cc93f9a5b59cf8b2fcf2b9af747bfc27a28ef2ba..25f94131f8200c267ef7f96251fed833ab72da83 100644 --- a/core/tests/coretests/src/android/view/InsetsSourceConsumerTest.java +++ b/core/tests/coretests/src/android/view/InsetsSourceConsumerTest.java @@ -89,7 +89,8 @@ public class InsetsSourceConsumerTest { state.addSource(mSpyInsetsSource); mConsumer = new InsetsSourceConsumer(ITYPE_STATUS_BAR, state, - () -> mMockTransaction, new InsetsController(viewRootImpl)); + () -> mMockTransaction, + new InsetsController(new ViewRootInsetsControllerHost(viewRootImpl))); }); instrumentation.waitForIdleSync(); diff --git a/core/tests/coretests/src/android/view/InsetsSourceTest.java b/core/tests/coretests/src/android/view/InsetsSourceTest.java index b3f6fe9e88b9ca36f05e5b6850ff4d070c14a62c..c61f33e15b1839cdb205503635ef8f2012a349a9 100644 --- a/core/tests/coretests/src/android/view/InsetsSourceTest.java +++ b/core/tests/coretests/src/android/view/InsetsSourceTest.java @@ -16,6 +16,7 @@ package android.view; +import static android.view.InsetsState.ITYPE_CAPTION_BAR; import static android.view.InsetsState.ITYPE_IME; import static android.view.InsetsState.ITYPE_NAVIGATION_BAR; @@ -46,11 +47,13 @@ public class InsetsSourceTest { private InsetsSource mSource = new InsetsSource(ITYPE_NAVIGATION_BAR); private InsetsSource mImeSource = new InsetsSource(ITYPE_IME); + private InsetsSource mCaptionSource = new InsetsSource(ITYPE_CAPTION_BAR); @Before public void setUp() { mSource.setVisible(true); mImeSource.setVisible(true); + mCaptionSource.setVisible(true); } @Test @@ -101,6 +104,17 @@ public class InsetsSourceTest { assertEquals(Insets.of(0, 0, 0, 100), insets); } + @Test + public void testCalculateInsets_caption_resizing() { + mCaptionSource.setFrame(new Rect(0, 0, 100, 100)); + Insets insets = mCaptionSource.calculateInsets(new Rect(0, 0, 200, 200), false); + assertEquals(Insets.of(0, 100, 0, 0), insets); + insets = mCaptionSource.calculateInsets(new Rect(0, 0, 50, 200), false); + assertEquals(Insets.of(0, 100, 0, 0), insets); + insets = mCaptionSource.calculateInsets(new Rect(100, 100, 200, 500), false); + assertEquals(Insets.of(0, 100, 0, 0), insets); + } + @Test public void testCalculateInsets_invisible() { mSource.setFrame(new Rect(0, 0, 500, 100)); diff --git a/core/tests/coretests/src/android/widget/TextViewActivityTest.java b/core/tests/coretests/src/android/widget/TextViewActivityTest.java index 45d4b38d82aa564300d3475f1141683fa2d50298..7cde19c30dd4b786d5e82e25c65c2d0938c14603 100644 --- a/core/tests/coretests/src/android/widget/TextViewActivityTest.java +++ b/core/tests/coretests/src/android/widget/TextViewActivityTest.java @@ -120,8 +120,10 @@ public class TextViewActivityTest { public void setUp() { mActivity = mActivityRule.getActivity(); mInstrumentation = InstrumentationRegistry.getInstrumentation(); - mActivity.getSystemService(TextClassificationManager.class) - .setTextClassifier(TextClassifier.NO_OP); + TextClassificationManager tcm = mActivity.getSystemService( + TextClassificationManager.class); + tcm.setTextClassifier(TextClassifier.NO_OP); + tcm.setTextClassificationSessionFactory(null); } @Test @@ -1173,6 +1175,53 @@ public class TextViewActivityTest { assertEquals(TextClassifier.TYPE_PHONE, lastEvent.getEntityType()); } + @Test + public void testTextClassifierSession() throws Throwable { + useSystemDefaultTextClassifier(); + TextClassificationManager tcm = + mActivity.getSystemService(TextClassificationManager.class); + List testableTextClassifiers = new ArrayList<>(); + tcm.setTextClassificationSessionFactory(classificationContext -> { + TestableTextClassifier textClassifier = new TestableTextClassifier(); + testableTextClassifiers.add(textClassifier); + return new TextClassifier() { + private boolean mIsDestroyed = false; + + @Override + public TextSelection suggestSelection(TextSelection.Request request) { + return textClassifier.suggestSelection(request); + } + + @Override + public void destroy() { + mIsDestroyed = true; + } + + @Override + public boolean isDestroyed() { + return mIsDestroyed; + } + }; + }); + + // Long press to trigger selection + onView(withId(R.id.textview)).perform(replaceText("android.com")); + onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(0)); + sleepForFloatingToolbarPopup(); + // Click "Copy" to dismiss the selection. + clickFloatingToolbarItem(mActivity.getString(com.android.internal.R.string.copy)); + + // Long press to trigger another selection + onView(withId(R.id.textview)).perform(replaceText("android@android.com")); + onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(0)); + sleepForFloatingToolbarPopup(); + + // suggestSelection should be called in two different TextClassifier sessions. + assertEquals(2, testableTextClassifiers.size()); + assertEquals(1, testableTextClassifiers.get(0).getTextSelectionRequests().size()); + assertEquals(1, testableTextClassifiers.get(1).getTextSelectionRequests().size()); + } + @Test public void testPastePlainText_menuAction() { initializeClipboardWithText(TextStyle.STYLED); @@ -1227,6 +1276,7 @@ public class TextViewActivityTest { private final class TestableTextClassifier implements TextClassifier { final List mSelectionEvents = new ArrayList<>(); + final List mTextSelectionRequests = new ArrayList<>(); @Override public void onSelectionEvent(SelectionEvent event) { @@ -1235,6 +1285,7 @@ public class TextViewActivityTest { @Override public TextSelection suggestSelection(TextSelection.Request request) { + mTextSelectionRequests.add(request); return new TextSelection.Builder(request.getStartIndex(), request.getEndIndex()) .setEntityType(TextClassifier.TYPE_PHONE, 1) .build(); @@ -1243,5 +1294,9 @@ public class TextViewActivityTest { List getSelectionEvents() { return mSelectionEvents; } + + List getTextSelectionRequests() { + return mTextSelectionRequests; + } } } diff --git a/core/tests/utiltests/src/com/android/internal/util/InlinePresentationStyleUtilsTest.java b/core/tests/utiltests/src/com/android/internal/util/InlinePresentationStyleUtilsTest.java index 8e4f38ef15d3401ddccee63b33f75ec29e943da4..35c56818a108899ff7c9d68415a5d661a72ec9d4 100644 --- a/core/tests/utiltests/src/com/android/internal/util/InlinePresentationStyleUtilsTest.java +++ b/core/tests/utiltests/src/com/android/internal/util/InlinePresentationStyleUtilsTest.java @@ -16,9 +16,13 @@ package com.android.internal.util; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; +import android.os.Binder; import android.os.Bundle; import androidx.test.filters.SmallTest; @@ -110,4 +114,54 @@ public class InlinePresentationStyleUtilsTest { bundle2.putInt("KEY", 22); assertFalse(InlinePresentationStyleUtils.bundleEquals(bundle1, bundle2)); } + + @Test + public void testFilterContentTypes_nullOrEmpty() { + InlinePresentationStyleUtils.filterContentTypes(null); + InlinePresentationStyleUtils.filterContentTypes(new Bundle()); + } + + @Test + public void testFilterContentTypes_basic() { + Bundle bundle = new Bundle(); + bundle.putInt("int", 11); + bundle.putString("str", "test"); + bundle.putString("null", null); + + InlinePresentationStyleUtils.filterContentTypes(bundle); + + assertEquals(11, bundle.getInt("int")); + assertEquals("test", bundle.getString("str")); + assertTrue(bundle.keySet().contains("null")); + } + + @Test + public void testFilterContentTypes_binder_removedBinder() { + Bundle bundle = new Bundle(); + bundle.putInt("int", 11); + bundle.putString("str", "test"); + bundle.putString("null", null); + bundle.putBinder("binder", new Binder()); + + InlinePresentationStyleUtils.filterContentTypes(bundle); + + assertEquals(11, bundle.getInt("int")); + assertEquals("test", bundle.getString("str")); + assertTrue(bundle.keySet().contains("null")); + assertNull(bundle.getBinder("binder")); + } + + @Test + public void testFilterContentTypes_binderInChild_removedBinder() { + Bundle child = new Bundle(); + child.putBinder("binder", new Binder()); + Bundle bundle = new Bundle(); + bundle.putBundle("child", child); + + InlinePresentationStyleUtils.filterContentTypes(bundle); + + Bundle child2 = bundle.getBundle("child"); + assertNotNull(child2); + assertNull(child2.getBinder("binder")); + } } diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java index 2d00010f51ee35ca48e28ff97a5dc32d20cfd734..da52cfef6bc6e749468834545addb4ce8a8a8da1 100644 --- a/media/java/android/media/AudioSystem.java +++ b/media/java/android/media/AudioSystem.java @@ -686,6 +686,23 @@ public class AudioSystem String effectName = effects.length == 0 ? "None" : effects[0].name; if (cb != null) { + ArrayList audioPatches = new ArrayList<>(); + if (AudioManager.listAudioPatches(audioPatches) == AudioManager.SUCCESS) { + boolean patchFound = false; + int patchHandle = recordingFormat[6]; + for (AudioPatch patch : audioPatches) { + if (patch.id() == patchHandle) { + patchFound = true; + break; + } + } + if (!patchFound) { + // The cached audio patches in AudioManager is not up-to-date. + // Reset audio port generation to ensure callback side can + // get up-to-date audio port information. + AudioManager.resetAudioPortGeneration(); + } + } // TODO receive package name from native cb.onRecordingConfigurationChanged(event, riid, uid, session, source, portId, silenced, recordingFormat, clientEffects, effects, activeSource, ""); diff --git a/media/java/android/media/tv/tuner/filter/MediaEvent.java b/media/java/android/media/tv/tuner/filter/MediaEvent.java index 247c1c47560a9f1d1908670dfe4e74b0762c8653..af63070027a25083e8cfc1e36162a48d18d15d6a 100644 --- a/media/java/android/media/tv/tuner/filter/MediaEvent.java +++ b/media/java/android/media/tv/tuner/filter/MediaEvent.java @@ -28,14 +28,19 @@ import android.media.MediaCodec.LinearBlock; */ @SystemApi public class MediaEvent extends FilterEvent { - private native int nativeGetAudioHandle(); + private long mNativeContext; + private final Object mLock = new Object(); + + private native Long nativeGetAudioHandle(); + private native LinearBlock nativeGetLinearBlock(); + private native void nativeFinalize(); private final int mStreamId; private final boolean mIsPtsPresent; private final long mPts; private final long mDataLength; private final long mOffset; - private final LinearBlock mLinearBlock; + private LinearBlock mLinearBlock; private final boolean mIsSecureMemory; private final long mDataId; private final int mMpuSequenceNumber; @@ -103,7 +108,12 @@ public class MediaEvent extends FilterEvent { */ @Nullable public LinearBlock getLinearBlock() { - return mLinearBlock; + synchronized (mLock) { + if (mLinearBlock == null) { + mLinearBlock = nativeGetLinearBlock(); + } + return mLinearBlock; + } } /** @@ -163,4 +173,15 @@ public class MediaEvent extends FilterEvent { public AudioDescriptor getExtraMetaData() { return mExtraMetaData; } + + + /** + * Finalize the MediaEvent object. + * @hide + */ + @Override + protected void finalize() { + nativeFinalize(); + mNativeContext = 0; + } } diff --git a/media/jni/android_media_MediaCodec.cpp b/media/jni/android_media_MediaCodec.cpp index b2b707b008295ac2110da0c734541a31f59f1254..98e68b8b53f268f32376a13526d2e1f8825054bb 100644 --- a/media/jni/android_media_MediaCodec.cpp +++ b/media/jni/android_media_MediaCodec.cpp @@ -232,6 +232,13 @@ void JMediaCodec::release() { }); } +void JMediaCodec::releaseAsync() { + if (mCodec != NULL) { + mCodec->releaseAsync(); + } + mInitStatus = NO_INIT; +} + JMediaCodec::~JMediaCodec() { if (mLooper != NULL) { /* MediaCodec and looper should have been released explicitly already @@ -1114,7 +1121,10 @@ static sp getMediaCodec(JNIEnv *env, jobject thiz) { } static void android_media_MediaCodec_release(JNIEnv *env, jobject thiz) { - setMediaCodec(env, thiz, NULL); + sp codec = getMediaCodec(env, thiz); + if (codec != NULL) { + codec->releaseAsync(); + } } static void throwCodecException(JNIEnv *env, status_t err, int32_t actionCode, const char *msg) { @@ -2889,7 +2899,7 @@ static void android_media_MediaCodec_native_setup( static void android_media_MediaCodec_native_finalize( JNIEnv *env, jobject thiz) { - android_media_MediaCodec_release(env, thiz); + setMediaCodec(env, thiz, NULL); } // MediaCodec.LinearBlock diff --git a/media/jni/android_media_MediaCodec.h b/media/jni/android_media_MediaCodec.h index 8899fee7a73d25a43f15f1685279b7cf23505b29..400ce1bc98e76169e4da93f3332b05e80113f9a8 100644 --- a/media/jni/android_media_MediaCodec.h +++ b/media/jni/android_media_MediaCodec.h @@ -61,6 +61,7 @@ struct JMediaCodec : public AHandler { void registerSelf(); void release(); + void releaseAsync(); status_t enableOnFrameRenderedListener(jboolean enable); diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp index ab311c0e245ac4143ec987a7cdc4c1eda0a90b76..805831442756995ae07d847df275350a834cdec5 100644 --- a/media/jni/android_media_tv_Tuner.cpp +++ b/media/jni/android_media_tv_Tuner.cpp @@ -21,8 +21,7 @@ #include "android_media_tv_Tuner.h" #include "android_runtime/AndroidRuntime.h" -#include -#include +#include #include #include #include @@ -145,6 +144,7 @@ struct fields_t { jfieldID descramblerContext; jfieldID dvrRecorderContext; jfieldID dvrPlaybackContext; + jfieldID mediaEventContext; jmethodID frontendInitID; jmethodID filterInitID; jmethodID timeFilterInitID; @@ -169,6 +169,12 @@ static fields_t gFields; static int IP_V4_LENGTH = 4; static int IP_V6_LENGTH = 16; +void DestroyCallback(const C2Buffer * /* buf */, void *arg) { + android::sp event = (android::MediaEvent *)arg; + event->mAvHandleRefCnt--; + event->finalize(); +} + namespace android { /////////////// LnbCallback /////////////////////// LnbCallback::LnbCallback(jobject lnbObj, LnbId id) : mId(id) { @@ -280,17 +286,69 @@ MQ& Dvr::getDvrMQ() { return *mDvrMQ; } -/////////////// FilterCallback /////////////////////// -//TODO: implement filter callback -jobject FilterCallback::handleToLinearBlock(const native_handle_t* handle, uint32_t size) { - ALOGD("FilterCallback::handleToLinearBlock"); - C2HandleIon* ion = new C2HandleIon(handle->data[0], size); - std::shared_ptr block = _C2BlockFactory::CreateLinearBlock(ion); +/////////////// C2DataIdInfo /////////////////////// + +C2DataIdInfo::C2DataIdInfo(uint32_t index, uint64_t value) : C2Param(kParamSize, index) { + CHECK(isGlobal()); + CHECK_EQ(C2Param::INFO, kind()); + DummyInfo info{value}; + memcpy(this + 1, static_cast(&info) + 1, kParamSize - sizeof(C2Param)); +} + +/////////////// MediaEvent /////////////////////// + +MediaEvent::MediaEvent(sp iFilter, hidl_handle avHandle, + uint64_t dataId, uint64_t dataLength, jobject obj) : mIFilter(iFilter), + mDataId(dataId), mDataLength(dataLength), mBuffer(nullptr), + mDataIdRefCnt(0), mAvHandleRefCnt(0), mIonHandle(nullptr) { + JNIEnv *env = AndroidRuntime::getJNIEnv(); + mMediaEventObj = env->NewWeakGlobalRef(obj); + mAvHandle = native_handle_clone(avHandle.getNativeHandle()); +} + +MediaEvent::~MediaEvent() { + JNIEnv *env = AndroidRuntime::getJNIEnv(); + env->DeleteWeakGlobalRef(mMediaEventObj); + mMediaEventObj = NULL; + native_handle_delete(mAvHandle); + if (mIonHandle != NULL) { + delete mIonHandle; + } + if (mC2Buffer != NULL) { + mC2Buffer->unregisterOnDestroyNotify(&DestroyCallback, this); + } +} + +void MediaEvent::finalize() { + if (mAvHandleRefCnt == 0) { + mIFilter->releaseAvHandle(hidl_handle(mAvHandle), mDataIdRefCnt == 0 ? mDataId : 0); + native_handle_close(mAvHandle); + } +} + +jobject MediaEvent::getLinearBlock() { + ALOGD("MediaEvent::getLinearBlock"); + if (mAvHandle == NULL) { + return NULL; + } + if (mLinearBlockObj != NULL) { + return mLinearBlockObj; + } + mIonHandle = new C2HandleIon(mAvHandle->data[0], mDataLength); + std::shared_ptr block = _C2BlockFactory::CreateLinearBlock(mIonHandle); JNIEnv *env = AndroidRuntime::getJNIEnv(); std::unique_ptr context{new JMediaCodecLinearBlock}; context->mBlock = block; - + mC2Buffer = context->toC2Buffer(0, mDataLength); + if (mAvHandle->numInts > 0) { + // use first int in the native_handle as the index + int index = mAvHandle->data[mAvHandle->numFds]; + std::shared_ptr c2param = std::make_shared(index, mDataId); + std::shared_ptr info(std::static_pointer_cast(c2param)); + mC2Buffer->setInfo(info); + } + mC2Buffer->registerOnDestroyNotify(&DestroyCallback, this); jobject linearBlock = env->NewObject( env->FindClass("android/media/MediaCodec$LinearBlock"), @@ -300,9 +358,18 @@ jobject FilterCallback::handleToLinearBlock(const native_handle_t* handle, uint3 gFields.linearBlockSetInternalStateID, (jlong)context.release(), true); - return linearBlock; + mLinearBlockObj = env->NewWeakGlobalRef(linearBlock); + mAvHandleRefCnt++; + return mLinearBlockObj; } +uint64_t MediaEvent::getAudioHandle() { + mDataIdRefCnt++; + return mDataId; +} + +/////////////// FilterCallback /////////////////////// + jobjectArray FilterCallback::getSectionEvent( jobjectArray& arr, const std::vector& events) { JNIEnv *env = AndroidRuntime::getJNIEnv(); @@ -333,6 +400,7 @@ jobjectArray FilterCallback::getMediaEvent( "", "(IZJJJLandroid/media/MediaCodec$LinearBlock;" "ZJIZLandroid/media/tv/tuner/filter/AudioDescriptor;)V"); + jfieldID eventContext = env->GetFieldID(eventClazz, "mNativeContext", "J"); for (int i = 0; i < events.size(); i++) { auto event = events[i]; @@ -358,12 +426,6 @@ jobjectArray FilterCallback::getMediaEvent( } jlong dataLength = static_cast(mediaEvent.dataLength); - const native_handle_t* h = NULL; - jobject block = NULL; - if (mediaEvent.avMemory != NULL) { - h = mediaEvent.avMemory.getNativeHandle(); - block = handleToLinearBlock(h, dataLength); - } jint streamId = static_cast(mediaEvent.streamId); jboolean isPtsPresent = static_cast(mediaEvent.isPtsPresent); @@ -376,8 +438,18 @@ jobjectArray FilterCallback::getMediaEvent( jobject obj = env->NewObject(eventClazz, eventInit, streamId, isPtsPresent, pts, dataLength, - offset, block, isSecureMemory, avDataId, mpuSequenceNumber, isPesPrivateData, + offset, NULL, isSecureMemory, avDataId, mpuSequenceNumber, isPesPrivateData, audioDescriptor); + + if (mediaEvent.avMemory.getNativeHandle() != NULL || mediaEvent.avDataId != 0) { + sp mediaEventSp = + new MediaEvent(mIFilter, mediaEvent.avMemory, + mediaEvent.avDataId, dataLength, obj); + mediaEventSp->mAvHandleRefCnt++; + env->SetLongField(obj, eventContext, (jlong) mediaEventSp.get()); + mediaEventSp->incStrong(obj); + } + env->SetObjectArrayElement(arr, i, obj); } return arr; @@ -594,10 +666,10 @@ Return FilterCallback::onFilterStatus(const DemuxFilterStatus status) { return Void(); } -void FilterCallback::setFilter(const jobject filter) { +void FilterCallback::setFilter(const sp filter) { ALOGD("FilterCallback::setFilter"); - JNIEnv *env = AndroidRuntime::getJNIEnv(); - mFilter = env->NewWeakGlobalRef(filter); + mFilter = filter->mFilterObj; + mIFilter = filter->mFilterSp; } FilterCallback::~FilterCallback() { @@ -1431,7 +1503,7 @@ jobject JTuner::openFilter(DemuxFilterType type, int bufferSize) { filterSp->incStrong(filterObj); env->SetLongField(filterObj, gFields.filterContext, (jlong)filterSp.get()); - callback->setFilter(filterObj); + callback->setFilter(filterSp); return filterObj; } @@ -2390,6 +2462,9 @@ static void android_media_tv_Tuner_native_init(JNIEnv *env) { gFields.onDvrPlaybackStatusID = env->GetMethodID(dvrPlaybackClazz, "onPlaybackStatusChanged", "(I)V"); + jclass mediaEventClazz = env->FindClass("android/media/tv/tuner/filter/MediaEvent"); + gFields.mediaEventContext = env->GetFieldID(mediaEventClazz, "mNativeContext", "J"); + jclass linearBlockClazz = env->FindClass("android/media/MediaCodec$LinearBlock"); gFields.linearBlockInitID = env->GetMethodID(linearBlockClazz, "", "()V"); gFields.linearBlockSetInternalStateID = @@ -3507,6 +3582,52 @@ static jlong android_media_tv_Tuner_write_dvr_to_array( return copyData(env, dvrSp->mDvrMQ, dvrSp->mDvrMQEventFlag, buffer, offset, size); } +static sp getMediaEventSp(JNIEnv *env, jobject mediaEventObj) { + return (MediaEvent *)env->GetLongField(mediaEventObj, gFields.mediaEventContext); +} + +static jobject android_media_tv_Tuner_media_event_get_linear_block( + JNIEnv* env, jobject mediaEventObj) { + sp mediaEventSp = getMediaEventSp(env, mediaEventObj); + if (mediaEventSp == NULL) { + ALOGD("Failed get MediaEvent"); + return NULL; + } + + return mediaEventSp->getLinearBlock(); +} + +static jobject android_media_tv_Tuner_media_event_get_audio_handle( + JNIEnv* env, jobject mediaEventObj) { + sp mediaEventSp = getMediaEventSp(env, mediaEventObj); + if (mediaEventSp == NULL) { + ALOGD("Failed get MediaEvent"); + return NULL; + } + + android::Mutex::Autolock autoLock(mediaEventSp->mLock); + uint64_t audioHandle = mediaEventSp->getAudioHandle(); + jclass longClazz = env->FindClass("java/lang/Long"); + jmethodID longInit = env->GetMethodID(longClazz, "", "(J)V"); + + jobject longObj = env->NewObject(longClazz, longInit, static_cast(audioHandle)); + return longObj; +} + +static void android_media_tv_Tuner_media_event_finalize(JNIEnv* env, jobject mediaEventObj) { + sp mediaEventSp = getMediaEventSp(env, mediaEventObj); + if (mediaEventSp == NULL) { + ALOGD("Failed get MediaEvent"); + return; + } + + android::Mutex::Autolock autoLock(mediaEventSp->mLock); + mediaEventSp->mAvHandleRefCnt--; + mediaEventSp->finalize(); + + mediaEventSp->decStrong(mediaEventObj); +} + static const JNINativeMethod gTunerMethods[] = { { "nativeInit", "()V", (void *)android_media_tv_Tuner_native_init }, { "nativeSetup", "()V", (void *)android_media_tv_Tuner_native_setup }, @@ -3629,6 +3750,15 @@ static const JNINativeMethod gLnbMethods[] = { { "nativeClose", "()I", (void *)android_media_tv_Tuner_close_lnb }, }; +static const JNINativeMethod gMediaEventMethods[] = { + { "nativeGetLinearBlock", "()Landroid/media/MediaCodec$LinearBlock;", + (void *)android_media_tv_Tuner_media_event_get_linear_block }, + { "nativeGetAudioHandle", "()Ljava/lang/Long;", + (void *)android_media_tv_Tuner_media_event_get_audio_handle }, + { "nativeFinalize", "()V", + (void *)android_media_tv_Tuner_media_event_finalize }, +}; + static bool register_android_media_tv_Tuner(JNIEnv *env) { if (AndroidRuntime::registerNativeMethods( env, "android/media/tv/tuner/Tuner", gTunerMethods, NELEM(gTunerMethods)) != JNI_OK) { @@ -3677,6 +3807,13 @@ static bool register_android_media_tv_Tuner(JNIEnv *env) { ALOGE("Failed to register lnb native methods"); return false; } + if (AndroidRuntime::registerNativeMethods( + env, "android/media/tv/tuner/filter/MediaEvent", + gMediaEventMethods, + NELEM(gMediaEventMethods)) != JNI_OK) { + ALOGE("Failed to register MediaEvent native methods"); + return false; + } return true; } diff --git a/media/jni/android_media_tv_Tuner.h b/media/jni/android_media_tv_Tuner.h index 3da78acb2f90e3f4bbf373ec71ffc449e58126bb..c469a3ad8b76e6ca8046e9f40d004b5f38822cd9 100644 --- a/media/jni/android_media_tv_Tuner.h +++ b/media/jni/android_media_tv_Tuner.h @@ -18,10 +18,14 @@ #define _ANDROID_MEDIA_TV_TUNER_H_ #include +#include +#include +#include #include #include #include #include +#include #include #include "jni.h" @@ -30,6 +34,7 @@ using ::android::hardware::EventFlag; using ::android::hardware::MQDescriptorSync; using ::android::hardware::MessageQueue; using ::android::hardware::Return; +using ::android::hardware::hidl_handle; using ::android::hardware::hidl_vec; using ::android::hardware::kSynchronizedReadWrite; using ::android::hardware::tv::tuner::V1_0::DemuxFilterEvent; @@ -106,15 +111,48 @@ struct Dvr : public RefBase { int mFd; }; +struct MediaEvent : public RefBase { + MediaEvent(sp iFilter, hidl_handle avHandle, uint64_t dataId, + uint64_t dataLength, jobject obj); + ~MediaEvent(); + jobject getLinearBlock(); + uint64_t getAudioHandle(); + void finalize(); + + sp mIFilter; + native_handle_t* mAvHandle; + uint64_t mDataId; + uint64_t mDataLength; + uint8_t* mBuffer; + android::Mutex mLock; + int mDataIdRefCnt; + int mAvHandleRefCnt; + jweak mMediaEventObj; + jweak mLinearBlockObj; + C2HandleIon* mIonHandle; + std::shared_ptr mC2Buffer; +}; + +struct Filter : public RefBase { + Filter(sp sp, jobject obj); + ~Filter(); + int close(); + sp getIFilter(); + sp mFilterSp; + std::unique_ptr mFilterMQ; + EventFlag* mFilterMQEventFlag; + jweak mFilterObj; +}; + struct FilterCallback : public IFilterCallback { ~FilterCallback(); virtual Return onFilterEvent(const DemuxFilterEvent& filterEvent); virtual Return onFilterStatus(const DemuxFilterStatus status); - void setFilter(const jobject filter); - jobject handleToLinearBlock(const native_handle_t* handle, uint32_t size); + void setFilter(const sp filter); private: jweak mFilter; + sp mIFilter; jobjectArray getSectionEvent( jobjectArray& arr, const std::vector& events); jobjectArray getMediaEvent( @@ -144,17 +182,6 @@ struct FrontendCallback : public IFrontendCallback { FrontendId mId; }; -struct Filter : public RefBase { - Filter(sp sp, jobject obj); - ~Filter(); - int close(); - sp getIFilter(); - sp mFilterSp; - std::unique_ptr mFilterMQ; - EventFlag* mFilterMQEventFlag; - jweak mFilterObj; -}; - struct TimeFilter : public RefBase { TimeFilter(sp sp, jweak obj); ~TimeFilter(); @@ -219,6 +246,14 @@ private: static jobject getIsdbtFrontendCaps(JNIEnv *env, FrontendInfo::FrontendCapabilities& caps); }; +class C2DataIdInfo : public C2Param { +public: + C2DataIdInfo(uint32_t index, uint64_t value); +private: + typedef C2GlobalParam DummyInfo; + static const size_t kParamSize = sizeof(DummyInfo); +}; + } // namespace android #endif // _ANDROID_MEDIA_TV_TUNER_H_ diff --git a/media/packages/BluetoothMidiService/Android.bp b/media/packages/BluetoothMidiService/Android.bp index 77e6a14e1f00ea72c300939c246c66929bd7d1e5..48fc329276bd496cb03d55ad150c6fcffd5624cd 100644 --- a/media/packages/BluetoothMidiService/Android.bp +++ b/media/packages/BluetoothMidiService/Android.bp @@ -20,7 +20,6 @@ android_library { "src/**/*.java", ], platform_apis: true, - plugins: ["java_api_finder"], manifest: "AndroidManifestBase.xml", } diff --git a/packages/CarSystemUI/res/layout/super_notification_shade.xml b/packages/CarSystemUI/res/layout/super_notification_shade.xml index e36d8caa67f3a1853ae35e57e9e19c15b287b96a..db71c91ca69590438841fb97912586de6e6fad71 100644 --- a/packages/CarSystemUI/res/layout/super_notification_shade.xml +++ b/packages/CarSystemUI/res/layout/super_notification_shade.xml @@ -43,14 +43,6 @@ android:visibility="invisible"/> - - - + Min - + Max Voice recognition now handled by connected Bluetooth device - + Guest - + Guest Add User diff --git a/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java index 6d659f1925939fb09d070bb3cd04f358a0c8ab36..baa6ac945a8a163ec3d407834b3004a274d054b5 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java @@ -151,7 +151,9 @@ public class CarKeyguardViewController extends OverlayViewController implements @Override public void notifyKeyguardAuthenticated(boolean strongAuth) { - mBouncer.notifyKeyguardAuthenticated(strongAuth); + if (mBouncer != null) { + mBouncer.notifyKeyguardAuthenticated(strongAuth); + } } @Override @@ -204,11 +206,15 @@ public class CarKeyguardViewController extends OverlayViewController implements @Override public void onFinishedGoingToSleep() { - mBouncer.onScreenTurnedOff(); + if (mBouncer != null) { + mBouncer.onScreenTurnedOff(); + } } @Override public void onCancelClicked() { + if (!mShowing) return; + getOverlayViewGlobalStateController().setWindowFocusable(/* focusable= */ false); getOverlayViewGlobalStateController().setWindowNeedsInput(/* needsInput= */ false); @@ -228,6 +234,8 @@ public class CarKeyguardViewController extends OverlayViewController implements @Override public void startPreHideAnimation(Runnable finishRunnable) { + if (!mShowing) return; + mBouncer.startPreHideAnimation(finishRunnable); } @@ -260,12 +268,12 @@ public class CarKeyguardViewController extends OverlayViewController implements @Override public boolean isBouncerShowing() { - return mBouncer.isShowing(); + return mBouncer != null && mBouncer.isShowing(); } @Override public boolean bouncerIsOrWillBeShowing() { - return mBouncer.isShowing() || mBouncer.inTransit(); + return mBouncer != null && (mBouncer.isShowing() || mBouncer.inTransit()); } @Override diff --git a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationBar.java b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationBar.java index 3b643697022d49e07dee15eaba11162fb5734349..fcc8c8cddeb16cf892183356fe0be95f87995793 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationBar.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationBar.java @@ -78,8 +78,8 @@ public class CarNavigationBar extends SystemUI implements CommandQueue.Callbacks private final IStatusBarService mBarService; private final Lazy mKeyguardStateControllerLazy; private final ButtonSelectionStateController mButtonSelectionStateController; - private final PhoneStatusBarPolicy mIconPolicy; - private final StatusBarIconController mIconController; + private final Lazy mIconPolicyLazy; + private final Lazy mIconControllerLazy; private final int mDisplayId; @@ -124,8 +124,8 @@ public class CarNavigationBar extends SystemUI implements CommandQueue.Callbacks IStatusBarService barService, Lazy keyguardStateControllerLazy, ButtonSelectionStateController buttonSelectionStateController, - PhoneStatusBarPolicy iconPolicy, - StatusBarIconController iconController + Lazy iconPolicyLazy, + Lazy iconControllerLazy ) { super(context); mResources = resources; @@ -140,8 +140,8 @@ public class CarNavigationBar extends SystemUI implements CommandQueue.Callbacks mBarService = barService; mKeyguardStateControllerLazy = keyguardStateControllerLazy; mButtonSelectionStateController = buttonSelectionStateController; - mIconPolicy = iconPolicy; - mIconController = iconController; + mIconPolicyLazy = iconPolicyLazy; + mIconControllerLazy = iconControllerLazy; mDisplayId = context.getDisplayId(); } @@ -238,8 +238,8 @@ public class CarNavigationBar extends SystemUI implements CommandQueue.Callbacks // Must be called on the main thread due to the use of observeForever() in // mIconPolicy.init(). mMainHandler.post(() -> { - mIconPolicy.init(); - mSignalPolicy = new StatusBarSignalPolicy(mContext, mIconController); + mIconPolicyLazy.get().init(); + mSignalPolicy = new StatusBarSignalPolicy(mContext, mIconControllerLazy.get()); }); } diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/navigationbar/CarNavigationBarTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/navigationbar/CarNavigationBarTest.java index adf435972e5ba91e3d5dfeac6be619e4432057cf..c555f64825d864c56522ee3e0d24da1257b54101 100644 --- a/packages/CarSystemUI/tests/src/com/android/systemui/car/navigationbar/CarNavigationBarTest.java +++ b/packages/CarSystemUI/tests/src/com/android/systemui/car/navigationbar/CarNavigationBarTest.java @@ -91,7 +91,7 @@ public class CarNavigationBarTest extends SysuiTestCase { mCarNavigationBarController, mWindowManager, mDeviceProvisionedController, new CommandQueue(mContext), mAutoHideController, mButtonSelectionStateListener, mHandler, mBackgroundHandler, mBarService, () -> mKeyguardStateController, - mButtonSelectionStateController, mIconPolicy, mIconController); + mButtonSelectionStateController, () -> mIconPolicy, () -> mIconController); } @Test diff --git a/packages/DynamicSystemInstallationService/res/values-af/strings.xml b/packages/DynamicSystemInstallationService/res/values-af/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..1829d342e9c518093af28c939b2bee96f02e5b54 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-af/strings.xml @@ -0,0 +1,16 @@ + + + "Voer asseblief jou wagwoord in en gaan voort na Dinamiese Steselopdaterings" + "Dinamiese stelsel is gereed. Herbegin jou toestel om dit te begin gebruik." + "Installeer tans" + "Kon nie installeer nie" + "Kon nie prent bekragtig nie. Staak installering." + "Laat loop tans \'n dinamiese stelsel. Herbegin om die oorspronklike Android-weergawe te gebruik." + "Kanselleer" + "Gooi weg" + "Herbegin" + "Herbegin" + "Het dinamiese stelsel weggegooi" + "Kan nie dinamiese stelsel herbegin of laai nie" + diff --git a/packages/DynamicSystemInstallationService/res/values-am/strings.xml b/packages/DynamicSystemInstallationService/res/values-am/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..7fcc40de38d2b44623ae203ac7f966dc8b60b9e8 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-am/strings.xml @@ -0,0 +1,16 @@ + + + "እባክዎ የእርስዎን የይለፍ ቃል ያስገቡ እና ወደ የተለዋዋጭ ሥርዓት ዝማኔዎች ይቀጥሉ" + "የተለዋዋጭ ሥርዓት ዝግጁ ነው። እሱን መጠቀም ለመጀመር የእርስዎን መሣሪያ ዳግም ያስጀምሩ።" + "ጭነት በሂደት ላይ ነው" + "መጫን አልተሳካም" + "የምስል ማረጋገጫ አልተሳካም። ጭነትን አጨናግፍ።" + "የተለዋዋጭ ሥርዓትን አሁን ላይ በማስሄድ ላይ ኦርጂናሉን የAndroid ስሪት በመጠቀም ዳግም ያስጀምሩ።" + "ይቅር" + "አስወግድ" + "ዳግም ጀምር" + "ዳግም ጀምር" + "የተጣለ ተለዋዋጭ ሥርዓት" + "ዳግም ማስጀመር አይቻልም ወይም ተለዋዋጭ ሥርዓትን ይስቀሉ" + diff --git a/packages/DynamicSystemInstallationService/res/values-ar/strings.xml b/packages/DynamicSystemInstallationService/res/values-ar/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..be705c37ef1df971f64bee23ae4ddfc02cd17cf4 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-ar/strings.xml @@ -0,0 +1,16 @@ + + + "يُرجى إدخال كلمة مرور والمتابعة إلى \"تحديثات النظام الديناميكية\"" + "النظام الديناميكي جاهز. لبدء استخدامه، يجب إعادة تشغيل الجهاز." + "التثبيت قيد التقدّم." + "تعذّر التثبيت." + "تعذّر التحقّق من الصورة. يجب إلغاء التثبيت." + "‏يتم الآن تشغيل نظام ديناميكي. يجب إعادة التشغيل لاستخدام الإصدار الأصلي لنظام Android." + "إلغاء" + "تجاهل" + "إعادة التشغيل" + "إعادة التشغيل" + "تم تجاهل النظام الديناميكي." + "لا يمكن إعادة التشغيل أو تحميل النظام الديناميكي." + diff --git a/packages/DynamicSystemInstallationService/res/values-as/strings.xml b/packages/DynamicSystemInstallationService/res/values-as/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..14eead9f9753886df855fd51d82a7cae50277b88 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-as/strings.xml @@ -0,0 +1,16 @@ + + + "অনুগ্ৰহ কৰি আপোনাৰ পাছৱৰ্ডটো দিয়ক আৰু ডায়নামিক ছিষ্টেম আপডে\'টসমূহলৈ অব্যাহত ৰাখক" + "ডায়নামিক ছিষ্টেমটো সাজু। এইটো ব্যৱহাৰ কৰা আৰম্ভ কৰিবলৈ আপোনাৰ ডিভাইচটো ৰিষ্টাৰ্ট কৰক।" + "ইনষ্টল চলি আছে" + "ইনষ্টল কৰিব পৰা নগ’ল" + "প্ৰতিচ্ছবিখন সত্যাপন কৰিব পৰা নগ’ল। ইনষ্টলেশ্বন বাতিল কৰক।" + "বৰ্তমান এটা ডায়নামিক ছিষ্টেম চলি আছে। মূল Android সংস্কৰণটো ব্যৱহাৰ কৰিবলৈ ৰিষ্টাৰ্ট কৰক।" + "বাতিল কৰক" + "বাতিল কৰক" + "ৰিষ্টাৰ্ট কৰক" + "ৰিষ্টাৰ্ট কৰক" + "বাতিল কৰা ডায়নামিক ছিষ্টেম" + "ডায়নামিক ছিষ্টেম ৰিষ্টার্ট অথবা ল\'ড কৰিব নোৱাৰি" + diff --git a/packages/DynamicSystemInstallationService/res/values-az/strings.xml b/packages/DynamicSystemInstallationService/res/values-az/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..d1f0a4b78ebbbce53a33dcf8ce5fc225bb8f9e25 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-az/strings.xml @@ -0,0 +1,16 @@ + + + "Parolunuzu daxil edin və Dinamik Sistem Güncəlləməsinə keçin" + "Dinamik sistem hazırdır. İstifadəyə başlamaq üçün cihazınızı yenidən başladın." + "Quraşdırılır" + "Quraşdırılmadı" + "Şəkil təsdiqlənmədi. Quraşdırmanı dayandırın." + "Hazırda dinamik sistem icra olunur. Orijinal Android versiyasından istifadə etmək üçün yenidən başladın." + "Ləğv edin" + "İmtina edin" + "Yenidən başladın" + "Yenidən başladın" + "Dinamik sistemdən imtina edildi" + "Dinamik sistemi yenidən başlatmaq və ya yükləmək mümkün deyil" + diff --git a/packages/DynamicSystemInstallationService/res/values-b+sr+Latn/strings.xml b/packages/DynamicSystemInstallationService/res/values-b+sr+Latn/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..ea23a28bc9e5d094abcb04ef76d1e682dd2c9ca7 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-b+sr+Latn/strings.xml @@ -0,0 +1,16 @@ + + + "Unesite lozinku i nastavite do dinamičnih ažuriranja sistema" + "Dinamični sistem je spreman. Da biste počeli da ga koristite, restartujte uređaj." + "Instalira se" + "Instaliranje nije uspelo" + "Validacija slike nije uspela. Otkažite instalaciju." + "Trenutno je pokrenut dinamični sistem. Restartujte da biste koristili originalnu verziju Android-a." + "Otkaži" + "Odbaci" + "Restartuj" + "Restartuj" + "Dinamični sistem je odbačen" + "Restartovanje ili učitavanje dinamičnog sistema nije uspelo" + diff --git a/packages/DynamicSystemInstallationService/res/values-be/strings.xml b/packages/DynamicSystemInstallationService/res/values-be/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..7eef297be2923bab08a363f9ed5dd78edc08da7a --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-be/strings.xml @@ -0,0 +1,16 @@ + + + "Увядзіце пароль і перайдзіце ў Дынамічныя абнаўленні сістэмы" + "Дынамічная сістэма гатовая. Каб пачаць выкарыстоўваць яе, перазапусціце прыладу." + "Ідзе ўсталёўка" + "Збой усталёўкі" + "Збой пры праверцы відарыса. Усталёўка спынена." + "Цяпер запушчана дынамічная сістэма. Перазапусціце, каб скарыстаць арыгінальную версію Android." + "Скасаваць" + "Адхіліць" + "Перазапусціць" + "Перазапусціць" + "Дынамічная сістэма адхілена" + "Не ўдалося перазапусціць або загрузіць дынамічную сістэму" + diff --git a/packages/DynamicSystemInstallationService/res/values-bg/strings.xml b/packages/DynamicSystemInstallationService/res/values-bg/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..9176676c0618cc1a1aaf8c65751615eb68349512 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-bg/strings.xml @@ -0,0 +1,16 @@ + + + "Моля, въведете паролата си и продължете към функцията за динамични актуализации на системата" + "Динамичната система е готова. Рестартирайте устройството си, за да я използвате." + "Инсталиране – в ход" + "Инсталирането не бе успешно" + "Проверката на изображението не бе успешна. Прекратяване на инсталирането." + "Понастоящем се изпълнява динамична система. Рестартирайте, за да използвате оригиналната версия на Android." + "Отказ" + "Отхвърляне" + "Рестартиране" + "Рестартиране" + "Динамичната система е отхвърлена" + "Динамичната система не може да се рестартира или зареди" + diff --git a/packages/DynamicSystemInstallationService/res/values-bn/strings.xml b/packages/DynamicSystemInstallationService/res/values-bn/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..38ef64935fb49526eb05574ded7551f0f8f6758d --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-bn/strings.xml @@ -0,0 +1,16 @@ + + + "আপনার পাসওয়ার্ড লিখে ডায়নামিক সিস্টেম আপডেট করা চালিয়ে যান" + "ডায়নামিক সিস্টেম রেডি হয়ে গেছে। সেটি ব্যবহার করা শুরু করতে আপনার ডিভাইস রিস্টার্ট করুন।" + "ইনস্টল করা হচ্ছে" + "ইনস্টল করা যায়নি" + "ছবি যাচাই করা যায়নি। ইনস্টলেশন বন্ধ করুন।" + "বর্তমানে ডায়নামিক সিস্টেম চালানো হচ্ছে। আসল Android ভার্সন ব্যবহার করার জন্য রিস্টার্ট করুন।" + "বাতিল করুন" + "বাতিল করুন" + "রিস্টার্ট করুন" + "রিস্টার্ট করুন" + "ডায়নামিক সিস্টেম বাতিল করা হয়েছে" + "ডায়নামিক সিস্টেম রিস্টার্ট বা লোড করা যাচ্ছে না" + diff --git a/packages/DynamicSystemInstallationService/res/values-bs/strings.xml b/packages/DynamicSystemInstallationService/res/values-bs/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..84ba540bb8221bfe1ebde5d60037edbd99b363e0 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-bs/strings.xml @@ -0,0 +1,16 @@ + + + "Unesite lozinku i nastavite na dinamična ažuriranja sistema" + "Dinamični sistem je spreman. Da ga počnete koristiti, ponovo pokrenite uređaj." + "Instaliranje je u toku" + "Instaliranje nije uspjelo" + "Potvrda slike sistema nije uspjela. Prekini instalaciju." + "Dinamični sistem je sada aktivan. Ponovo pokrenite da koristite originalnu verziju Androida." + "Otkaži" + "Odbaci" + "Ponovo pokreni" + "Ponovo pokreni" + "Dinamični sistem je odbačen" + "Nije moguće ponovo pokrenuti ili učitati dinamični sistem" + diff --git a/packages/DynamicSystemInstallationService/res/values-ca/strings.xml b/packages/DynamicSystemInstallationService/res/values-ca/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..787e4960513b8cd070cde0fda93638b6e5f48205 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-ca/strings.xml @@ -0,0 +1,16 @@ + + + "Introdueix la contrasenya i continua cap a Actualització dinàmica del sistema" + "El sistema dinàmic ja està a punt. Per començar a utilitzar-lo, reinicia el teu dispositiu." + "Instal·lació en curs" + "Ha fallat la instal·lació" + "No s\'ha pogut validar la imatge. Anul·la la instal·lació." + "S\'està executant un sistema dinàmic. Reinicia per utilitzar la versió original d\'Android." + "Cancel·la" + "Descarta" + "Reinicia" + "Reinicia" + "S\'ha descartat el sistema dinàmic" + "No es pot reiniciar ni carregar el sistema dinàmic" + diff --git a/packages/DynamicSystemInstallationService/res/values-cs/strings.xml b/packages/DynamicSystemInstallationService/res/values-cs/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..3dfb23f7d2ff8177bd6c6d6e82ce32517c1fe1b8 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-cs/strings.xml @@ -0,0 +1,16 @@ + + + "Zadejte heslo a pokračujte k dynamickým aktualizacím systému" + "Dynamický systém je připraven. Chcete-li ho začít používat, restartujte zařízení." + "Probíhá instalace" + "Instalace se nezdařila" + "Obraz se nepodařilo ověřit. Zrušte instalaci." + "Je spuštěn dynamický systém. Chcete-li použít původní verzi systému Android, restartujte zařízení." + "Zrušit" + "Zahodit" + "Restartovat" + "Restartovat" + "Zahodit dynamický systém" + "Dynamický systém nelze znovu spustit nebo načíst" + diff --git a/packages/DynamicSystemInstallationService/res/values-da/strings.xml b/packages/DynamicSystemInstallationService/res/values-da/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..20005e739205e9112230a1759d15b47235e9931a --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-da/strings.xml @@ -0,0 +1,16 @@ + + + "Angiv din adgangskode, og fortsæt til Dynamiske systemopdateringer" + "Det dynamiske system er klar. Hvis du vil begynde at bruge det, skal du genstarte din enhed." + "Installation i gang" + "Installationen mislykkedes" + "Billedet kunne ikke valideres. Afbryd installationen." + "Der køres i øjeblikket et dynamisk system. Genstart for at bruge den oprindelige Android-version." + "Annuller" + "Afbryd" + "Genstart" + "Genstart" + "Det dynamiske system blev slettet" + "Det dynamiske system kan ikke genstartes eller indlæses" + diff --git a/packages/DynamicSystemInstallationService/res/values-de/strings.xml b/packages/DynamicSystemInstallationService/res/values-de/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..3f000eaea2516ac53effe6823b17e980e4481ae1 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-de/strings.xml @@ -0,0 +1,16 @@ + + + "Gib dein Passwort ein und fahre mit Dynamic System Updates fort" + "Das dynamische System kann verwendet werden. Starte dazu dein Gerät neu." + "Installation läuft" + "Fehler bei der Installation" + "Fehler bei der Imagevalidierung. Die Installation wird abgebrochen." + "Momentan wird ein dynamisches System ausgeführt. Durch einen Neustart kannst du zur ursprünglichen Android-Version zurückkehren." + "Abbrechen" + "Verwerfen" + "Neu starten" + "Neu starten" + "Dynamisches System verworfen" + "Neustart und Laden des dynamischen Systems nicht möglich" + diff --git a/packages/DynamicSystemInstallationService/res/values-el/strings.xml b/packages/DynamicSystemInstallationService/res/values-el/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..4d830dde12e5f1eaa0dff39da93f297782d160cd --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-el/strings.xml @@ -0,0 +1,16 @@ + + + "Πληκτρολογήστε τον κωδικό σας και συνεχίστε στις Δυναμικές ενημερώσεις συστήματος." + "Οι δυναμικές συστήματος είναι έτοιμες. Για να ξεκινήσετε να τις χρησιμοποιείτε, επανεκκινήστε τη συσκευή σας." + "Εγκατάσταση σε εξέλιξη" + "Η εγκατάσταση απέτυχε." + "Η επαλήθευση εικόνας απέτυχε. Ακύρωση εγκατάστασης." + "Αυτήν τη στιγμή εκτελούνται δυναμικές συστήματος. Επανεκκινήστε για να χρησιμοποιήσετε την αρχική έκδοση Android." + "Ακύρωση" + "Απόρριψη" + "Επανεκκίνηση" + "Επανεκκίνηση" + "Οι δυναμικές συστήματος απορρίφθηκαν." + "Δεν είναι δυνατή η επανεκκίνηση ή η φόρτωση δυναμικών συστήματος" + diff --git a/packages/DynamicSystemInstallationService/res/values-en-rAU/strings.xml b/packages/DynamicSystemInstallationService/res/values-en-rAU/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..d728631282575b1a854f41baff0e036fbf9ae4fe --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-en-rAU/strings.xml @@ -0,0 +1,16 @@ + + + "Please enter your password and continue to Dynamic System Updates" + "Dynamic system is ready. To start using it, restart your device." + "Installation in progress" + "Installation failed" + "Image validation failed. Abort installation." + "Currently running a dynamic system. Restart to use the original Android version." + "Cancel" + "Discard" + "Restart" + "Restart" + "Discarded dynamic system" + "Can’t restart or load dynamic system" + diff --git a/packages/DynamicSystemInstallationService/res/values-en-rCA/strings.xml b/packages/DynamicSystemInstallationService/res/values-en-rCA/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..d728631282575b1a854f41baff0e036fbf9ae4fe --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-en-rCA/strings.xml @@ -0,0 +1,16 @@ + + + "Please enter your password and continue to Dynamic System Updates" + "Dynamic system is ready. To start using it, restart your device." + "Installation in progress" + "Installation failed" + "Image validation failed. Abort installation." + "Currently running a dynamic system. Restart to use the original Android version." + "Cancel" + "Discard" + "Restart" + "Restart" + "Discarded dynamic system" + "Can’t restart or load dynamic system" + diff --git a/packages/DynamicSystemInstallationService/res/values-en-rGB/strings.xml b/packages/DynamicSystemInstallationService/res/values-en-rGB/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..d728631282575b1a854f41baff0e036fbf9ae4fe --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-en-rGB/strings.xml @@ -0,0 +1,16 @@ + + + "Please enter your password and continue to Dynamic System Updates" + "Dynamic system is ready. To start using it, restart your device." + "Installation in progress" + "Installation failed" + "Image validation failed. Abort installation." + "Currently running a dynamic system. Restart to use the original Android version." + "Cancel" + "Discard" + "Restart" + "Restart" + "Discarded dynamic system" + "Can’t restart or load dynamic system" + diff --git a/packages/DynamicSystemInstallationService/res/values-en-rIN/strings.xml b/packages/DynamicSystemInstallationService/res/values-en-rIN/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..d728631282575b1a854f41baff0e036fbf9ae4fe --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-en-rIN/strings.xml @@ -0,0 +1,16 @@ + + + "Please enter your password and continue to Dynamic System Updates" + "Dynamic system is ready. To start using it, restart your device." + "Installation in progress" + "Installation failed" + "Image validation failed. Abort installation." + "Currently running a dynamic system. Restart to use the original Android version." + "Cancel" + "Discard" + "Restart" + "Restart" + "Discarded dynamic system" + "Can’t restart or load dynamic system" + diff --git a/packages/DynamicSystemInstallationService/res/values-en-rXC/strings.xml b/packages/DynamicSystemInstallationService/res/values-en-rXC/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..6ac376322ceb0740d5302b9ad4a1c638f3373ef7 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-en-rXC/strings.xml @@ -0,0 +1,16 @@ + + + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‏‎‎‎‏‏‎‏‏‏‎‎‎‏‎‏‎‏‎‎‎‎‎‎‎‎‏‏‏‎‎‎‎‎‏‎‏‏‎‎‏‎‎‏‏‏‎‎‎‏‏‏‏‏‏‎‎‎Please enter your password and continue to Dynamic System Updates‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‏‎‎‎‎‏‏‏‎‏‏‏‏‎‎‎‏‏‎‏‎‎‏‎‏‎‏‏‎‏‏‏‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‎‎‏‎‎‎‏‏‎Dynamic system is ready. To start using it, restart your device.‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‎‎‏‏‏‎‏‏‎‏‏‎‏‏‏‏‏‎‏‏‏‎‏‎‎‎‏‏‎‎‎‎‏‎‏‏‏‏‎‎‏‏‎‎‏‎‏‎‎‎‎‏‏‏‎‎‏‎Install in progress‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‎‎‏‏‎‏‏‎‏‎‏‏‏‏‎‎‏‎‎‎‏‏‏‏‎‎‏‏‏‎‏‎‏‏‏‎‎‏‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‎‎‎Install failed‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‏‎‎‏‏‏‎‎‎‎‎‏‏‏‏‎‏‏‎‎‎‎‏‏‎‎‎‎‏‎‎‏‎‏‏‏‎‎‏‏‎‏‏‎‎‎‎Image validation failed. Abort installation.‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‎‏‎‎‏‏‏‎‏‏‎‏‏‎‎‏‎‏‏‏‎‎‏‏‏‏‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‎‏‏‏‏‏‎‎‎‏‏‎‏‏‎‎‎Currently running a dynamic system. Restart to use the original Android version.‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‎‎‏‎‎‏‎‎‏‎‎‎‏‏‎‏‎‎‏‏‎‎‏‎‏‏‎‏‏‎‏‎‏‎‏‎‏‎‎‎‎‏‏‎‏‎‏‎‎‎‏‏‏‎‏‎‏‎Cancel‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‏‎‎‏‏‏‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‎‏‏‏‏‏‎‎‏‎‎‏‏‏‏‎‎‎‎‏‎‎‎‏‎‎‎‎‏‎‏‎‎‏‎‏‎Discard‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‏‏‎‏‏‏‎‏‏‎‎‎‎‏‏‎‎‎‏‏‎‏‏‎‏‏‏‏‏‎‏‎‎‎‎‎‎‎‏‎‏‏‎‏‏‎‏‎‏‎‎‎‏‏‏‏‏‎Restart‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‏‏‎‏‏‎‏‎‎‎‎‏‏‏‏‎‏‏‏‏‎‏‎‏‎‎‎‎‎‏‎‎‎‏‎‏‏‏‎‎‎‎‏‎‎‎‎‏‏‏‏‏‎‏‎‎‏‎Restart‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‎‎‎‎‎‏‏‎‏‏‎‏‏‏‏‎‏‏‎‎‏‎‎‎‎‏‎‎‏‎‏‎‎‏‎‏‏‏‏‏‏‎‏‎‏‎‏‏‏‏‎‎‏‏‎‏‎‎Discarded dynamic system‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‏‏‏‏‏‎‎‎‎‏‎‎‏‏‏‎‎‏‏‏‏‏‎‏‎‎‏‎‏‎‎‎‏‎‎‎‎‎‏‏‎‏‏‏‎‏‎‎‎‎‎‏‎‎‎‏‏‎Can’t restart or load dynamic system‎‏‎‎‏‎" + diff --git a/packages/DynamicSystemInstallationService/res/values-es-rUS/strings.xml b/packages/DynamicSystemInstallationService/res/values-es-rUS/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..9ec8196564956bc1e220788a6eccce8806567e22 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-es-rUS/strings.xml @@ -0,0 +1,16 @@ + + + "Ingresa la contraseña y continúa en Actualizaciones dinámicas del sistema" + "El sistema dinámico está listo. Para comenzar a usarlo, reinicia el dispositivo." + "Instalación en curso" + "Error de instalación" + "Se produjo un error con la validación de la imagen. Anula la instalación." + "Se está ejecutando el sistema dinámico. Reinicia para usar la versión original de Android." + "Cancelar" + "Descartar" + "Reiniciar" + "Reiniciar" + "Se descartó el sistema dinámico" + "No se puede reiniciar o cargar el sistema dinámico" + diff --git a/packages/DynamicSystemInstallationService/res/values-es/strings.xml b/packages/DynamicSystemInstallationService/res/values-es/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..cd9db07168a228ffd02dcccbfd75c645acb6474d --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-es/strings.xml @@ -0,0 +1,16 @@ + + + "Introduce la contraseña y entra en Actualización Dinámica del Sistema" + "El sistema dinámico está listo. Para comenzar a usarlo, reinicia el dispositivo." + "Instalación en curso" + "No se ha podido instalar" + "No se ha podido validar la imagen. Anula la instalación." + "Se está ejecutando el sistema dinámico. Reinícialo para usar la versión original de Android." + "Cancelar" + "Descartar" + "Reiniciar" + "Reiniciar" + "Se ha descartado el sistema dinámico" + "No se ha podido reiniciar o cargar el sistema dinámico" + diff --git a/packages/DynamicSystemInstallationService/res/values-et/strings.xml b/packages/DynamicSystemInstallationService/res/values-et/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..64968b60ac6fa0ca79930011055ce5e4e0845338 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-et/strings.xml @@ -0,0 +1,16 @@ + + + "Sisestage oma parool ja minge edasi rakendusse Dünaamiline süsteemivärskendus" + "Dünaamiline süsteem on valmis. Selle kasutamise alustamiseks taaskäivitage seade." + "Installimine on pooleli" + "Installimine ebaõnnestus" + "Kujutise kinnitamine ebaõnnestus. Katkestage installimine." + "Praegu kasutatakse dünaamilist süsteemi. Algse Androidi versiooni kasutamiseks taaskäivitage." + "Tühista" + "Loobu" + "Taaskäivita" + "Taaskäivita" + "Dünaamilisest süsteemist loobuti" + "Dünaamilist süsteemi ei saa taaskäivitada ega laadida" + diff --git a/packages/DynamicSystemInstallationService/res/values-eu/strings.xml b/packages/DynamicSystemInstallationService/res/values-eu/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..7c4a67d4e6c216b39dde471082ed8d00b78506c5 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-eu/strings.xml @@ -0,0 +1,16 @@ + + + "Idatzi pasahitza eta joan Sistemaren eguneratze dinamikoa eginbidera" + "Prest dago sistema dinamikoa. Erabiltzen hasteko, berrabiarazi gailua." + "Instalatzen" + "Ezin izan da instalatu" + "Ezin izan da balidatu irudia. Utzi bertan behera instalazioa." + "Sistema dinamiko bat abian da. Berrabiarazi Android-en jatorrizko bertsioa erabiltzeko." + "Utzi" + "Baztertu" + "Berrabiarazi" + "Berrabiarazi" + "Baztertu da sistema dinamikoa" + "Ezin da berrabiarazi edo kargatu sistema dinamikoa" + diff --git a/packages/DynamicSystemInstallationService/res/values-fa/strings.xml b/packages/DynamicSystemInstallationService/res/values-fa/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..7533e71cb26ca16461f3f30ac1b70380acf5d0ce --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-fa/strings.xml @@ -0,0 +1,16 @@ + + + "لطفاً گذرواژه را وارد کنید و «به‌روزرسانی‌های سیستم پویا» را ادامه دهید" + "سیستم پویا آماده است. برای استفاده از آن، دستگاه را بازراه‌اندازی کنید." + "درحال نصب" + "نصب نشد" + "راستی‌آزمایی تصویر انجام نشد. نصب را لغو کنید." + "‏درحال‌حاضر سیستم پویا اجرا می‌شود. برای استفاده از نسخه اصلی Android، بازراه‌اندازی کنید." + "لغو کردن" + "صرف‌نظر کردن" + "بازراه‌اندازی" + "بازراه‌اندازی" + "از سیستم پویا صرف‌نظر شد" + "نمی‌توان سیستم پویا را بازراه‌اندازی یا بار کرد" + diff --git a/packages/DynamicSystemInstallationService/res/values-fi/strings.xml b/packages/DynamicSystemInstallationService/res/values-fi/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..948c3336cea8a09378e4afe478d62f54d4e58cbe --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-fi/strings.xml @@ -0,0 +1,16 @@ + + + "Lisää salasanasi ja jatka dynaamisiin järjestelmäpäivityksiin" + "Dynaaminen järjestelmä on valmis. Aloita sen käyttö käynnistämällä laite uudelleen." + "Asennus käynnissä" + "Asennus epäonnistui" + "Kuvavahvistus epäonnistui. Keskeytä asennus." + "Käyttää tällä hetkellä dynaamista järjestelmää. Käynnistä uudelleen käyttääksesi alkuperäistä Android-versiota." + "Peruuta" + "Hylkää" + "Käynn. uudelleen" + "Käynn. uudelleen" + "Dynaaminen järjestelmä hylätty" + "Dynaamista järjestelmää ei voi käynnistää uudelleen tai ladata" + diff --git a/packages/DynamicSystemInstallationService/res/values-fr-rCA/strings.xml b/packages/DynamicSystemInstallationService/res/values-fr-rCA/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..6e2f235bcb7670cad849bc9df60400770ecd0ed7 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-fr-rCA/strings.xml @@ -0,0 +1,16 @@ + + + "Veuillez entrer votre mot de passe et continuer vers les mises à jour système dynamiques" + "Le système dynamique est prêt. Pour commencer à l\'utiliser, redémarrez votre appareil." + "Installation en cours…" + "Échec de l\'installation" + "Impossible de valider l\'image. Annulation de l\'installation." + "Un système dynamique est en cours d\'exécution. Pour utiliser la version originale d\'Android, redémarrez l\'appareil." + "Annuler" + "Annuler" + "Redémarrer" + "Redémarrer" + "Système dynamique supprimé" + "Impossible de redémarrer ou de charger le système dynamique" + diff --git a/packages/DynamicSystemInstallationService/res/values-fr/strings.xml b/packages/DynamicSystemInstallationService/res/values-fr/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..67f799731c6d264dc46a46a695a835932aed0c33 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-fr/strings.xml @@ -0,0 +1,16 @@ + + + "Veuillez saisir votre mot de passe pour accéder aux Mises à jour système dynamiques" + "Le système dynamique est prêt. Pour commencer à l\'utiliser, redémarrez votre appareil." + "Installation…" + "Échec de l\'installation" + "Échec de la validation de l\'image. Annulez l\'installation." + "Un système dynamique est en cours d\'exécution. Redémarrez pour utiliser la version Android d\'origine." + "Annuler" + "Supprimer" + "Redémarrer" + "Redémarrer" + "Système dynamique supprimé" + "Impossible de redémarrer ou de charger le système dynamique" + diff --git a/packages/DynamicSystemInstallationService/res/values-gl/strings.xml b/packages/DynamicSystemInstallationService/res/values-gl/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..8ea6d1c6c3b6e0f5e77b37b3d6017ed9d3031730 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-gl/strings.xml @@ -0,0 +1,16 @@ + + + "Pon o teu contrasinal e vai a Dynamic System Updates" + "O sistema dinámico está listo. Para utilizalo, reinicia o dispositivo." + "Instalación en curso" + "Produciuse un erro durante a instalación" + "Produciuse un erro ao validar a imaxe. Aborta a instalación." + "Estase executando un sistema dinámico. Reinicia o dispositivo para utilizar a versión de Android orixinal." + "Cancelar" + "Descartar" + "Reiniciar" + "Reiniciar" + "Descartouse o sistema dinámico" + "Non se puido reiniciar nin cargar o sistema dinámico" + diff --git a/packages/DynamicSystemInstallationService/res/values-gu/strings.xml b/packages/DynamicSystemInstallationService/res/values-gu/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..aec18049fdb0eb99fda5b2594ab1779f3851df1e --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-gu/strings.xml @@ -0,0 +1,16 @@ + + + "કૃપા કરીને તમારો પાસવર્ડ દાખલ કરો અને ડાઇનૅમિક સિસ્ટમ અપડેટ પર ચાલુ રાખો" + "ડાઇનૅમિક સિસ્ટમ તૈયાર છે. તેનો ઉપયોગ કરવા માટે, તમારા ડિવાઇસને ફરી શરૂ કરો." + "ઇન્સ્ટૉલ થઈ રહ્યું છે" + "ઇન્સ્ટૉલ કરવામાં નિષ્ફળ રહ્યાં" + "છબીની ચકાસણી નિષ્ફળ રહી. ઇન્સ્ટૉલેશન રદ કરો." + "હાલમાં ડાઇનૅમિક સિસ્ટમ ચાલી રહી છે. ઑરિજિનલ Android વર્ઝનનો ઉપયોગ કરવા માટે ફરી શરૂ કરો." + "રદ કરો" + "કાઢી નાખો" + "ફરી શરૂ કરો" + "ફરી શરૂ કરો" + "ડાઇનૅમિક સિસ્ટમ કાઢી નાખવામાં આવી" + "ડાઇનૅમિક સિસ્ટમને ફરી શરૂ અથવા લોડ કરી શકાતી નથી" + diff --git a/packages/DynamicSystemInstallationService/res/values-hi/strings.xml b/packages/DynamicSystemInstallationService/res/values-hi/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..efedbe8e7ee62b1c04020cf07523f1391f1afc1a --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-hi/strings.xml @@ -0,0 +1,16 @@ + + + "डाइनैमिक सिस्टम अपडेट की सुविधा जारी रखने के लिए कृपया अपना पासवर्ड डालें" + "डाइनैमिक सिस्टम तैयार है. इसका इस्तेमाल करने के लिए, अपना डिवाइस रीस्टार्ट करें." + "इंस्टॉल हो रहा है" + "इंस्टॉल नहीं हो सका" + "इमेज की पुष्टि नहीं हो सकी. इंस्टॉल करने की प्रक्रिया रद्द करें." + "फ़िलहाल, हम एक डाइनैमिक सिस्टम चला रहे हैं. Android का मूल वर्शन इस्तेमाल करने के लिए रीस्टार्ट करें." + "रद्द करें" + "खारिज करें" + "रीस्टार्ट करें" + "रीस्टार्ट करें" + "डाइनैमिक सिस्टम खारिज किया गया" + "डाइनैमिक सिस्टम रीस्टार्ट या लोड नहीं हो सका" + diff --git a/packages/DynamicSystemInstallationService/res/values-hr/strings.xml b/packages/DynamicSystemInstallationService/res/values-hr/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..50ceaa16f7642be7568cff165a0708dd52fd1db5 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-hr/strings.xml @@ -0,0 +1,16 @@ + + + "Unesite zaporku i nastavite do dinamičnih ažuriranja sustava" + "Dinamični sustav je spreman. Da biste ga počeli upotrebljavati, ponovno pokrenite svoj uređaj." + "Instalacija u tijeku" + "Instaliranje nije uspjelo" + "Provjera slike nije uspjela. Prekini instalaciju." + "Trenutačno je pokrenut dinamični sustav. Ponovno pokrenite kako biste upotrebljavali izvornu verziju Androida." + "Otkaži" + "Odbaci" + "Pokreni" + "Pokreni" + "Odbačeni dinamični sustav" + "Nije moguće ponovno pokretanje ili učitavanje dinamičnog sustava" + diff --git a/packages/DynamicSystemInstallationService/res/values-hu/strings.xml b/packages/DynamicSystemInstallationService/res/values-hu/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..94afa3b927b3776fd61c6b56999d7a97390d137e --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-hu/strings.xml @@ -0,0 +1,16 @@ + + + "Adja meg jelszavát, hogy használhassa a Dinamikus rendszerfrissítések funkciót" + "A dinamikus rendszer készen áll. A használatához indítsa újra az eszközt." + "Telepítés…" + "Sikertelen telepítés" + "A kép ellenőrzése nem sikerült. A telepítés megszakad." + "Jelenleg dinamikus rendszert futtat. Az eredeti Android-verzió használatához indítsa újra az eszközt." + "Mégse" + "Elvetés" + "Újraindítás" + "Újraindítás" + "Elvetett dinamikus rendszer" + "Nem lehet újraindítani vagy betölteni a dinamikus rendszert" + diff --git a/packages/DynamicSystemInstallationService/res/values-hy/strings.xml b/packages/DynamicSystemInstallationService/res/values-hy/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..b0cd740d3e8d7f321f0f5854b853d542552f0184 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-hy/strings.xml @@ -0,0 +1,16 @@ + + + "Մուտքագրեք ձեր գաղտնաբառը և անցեք համակարգի դինամիկ թարմացումների էջ" + "Դինամիկ համակարգը պատրաստ է։ Այն օգտագործելու համար վերագործարկեք ձեր սարքը։" + "Տեղադրում" + "Չհաջողվեց տեղադրել" + "Չհաջողվեց հաստատել պատկերը։ Չեղարկել տեղադրումը։" + "Աշխատեցվում է դինամիկ համակարգը։ Վերագործարկեք՝ Android-ի նախկին տարբերակին անցնելու համար։" + "Չեղարկել" + "Հրաժարվել" + "վերականգնել" + "Վերագործարկել" + "Դինամիկ համակարգի գործարկումը չեղարկվեց" + "Չհաջողվեց վերագործարկել կամ բեռնել դինամիկ համակարգը" + diff --git a/packages/DynamicSystemInstallationService/res/values-in/strings.xml b/packages/DynamicSystemInstallationService/res/values-in/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..44b4aeec8b78a9e7c5c9e982dcbaf47ae8eac0ee --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-in/strings.xml @@ -0,0 +1,16 @@ + + + "Masukkan sandi Anda dan lanjutkan ke Dynamic System Updates" + "Dynamic System sudah siap. Mulai ulang perangkat untuk mulai menggunakannya." + "Sedang diinstal" + "Penginstalan gagal" + "Validasi image gagal. Batalkan penginstalan." + "Saat ini sedang menjalankan Dynamic System. Mulai ulang untuk menggunakan Android versi asli." + "Batal" + "Hapus" + "Mulai ulang" + "Mulai ulang" + "Dynamic System dihapus" + "Tidak dapat memulai ulang atau memuat Dynamic System" + diff --git a/packages/DynamicSystemInstallationService/res/values-is/strings.xml b/packages/DynamicSystemInstallationService/res/values-is/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..048d1bca551804480ad9ca8d0ee9315bb751a01a --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-is/strings.xml @@ -0,0 +1,16 @@ + + + "Sláðu inn aðgangsorð og haltu áfram í „Breytilegar kerfisuppfærslur“" + "Breytilegt kerfi er tilbúið. Endurræstu tækið til að byrja að nota það." + "Uppsetning stendur yfir" + "Uppsetning mistókst" + "Ekki tókst að staðfesta mynd. Hættu við uppsetninguna." + "Tækið keyrir á breytilegu kerfi. Endurræstu til að nota upprunalega Android útgáfu." + "Hætta við" + "Fleygja" + "Endurræsa" + "Endurræsa" + "Breytilegu kerfi fleygt" + "Ekki tókst að endurræsa eða hlaða breytilegu kerfi" + diff --git a/packages/DynamicSystemInstallationService/res/values-it/strings.xml b/packages/DynamicSystemInstallationService/res/values-it/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..f70b381780219c7c5cc83f134d418b099418999d --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-it/strings.xml @@ -0,0 +1,16 @@ + + + "Inserisci la password e continua su Aggiornamenti di sistema dinamici" + "Sistema dinamico pronto. Per iniziare a usarlo, riavvia il dispositivo." + "Installazione in corso" + "Installazione non riuscita" + "Impossibile convalidare l\'immagine. Interrompi l\'installazione." + "Sistema dinamico in uso. Riavvia per usare la versione di Android originale." + "Annulla" + "Annulla" + "Riavvia" + "Riavvia" + "Sistema dinamico annullato" + "Impossibile riavviare o caricare il sistema dinamico" + diff --git a/packages/DynamicSystemInstallationService/res/values-iw/strings.xml b/packages/DynamicSystemInstallationService/res/values-iw/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..aff7c824ba1d73aaf4ef6687fca36c7600062cf6 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-iw/strings.xml @@ -0,0 +1,16 @@ + + + "יש להזין את הסיסמה ולהמשיך אל עדכוני המערכת הדינמיים" + "המערכת הדינמית מוכנה. כדי להתחיל להשתמש בה, יש להפעיל מחדש את המכשיר." + "ההתקנה מתבצעת" + "ההתקנה נכשלה" + "אימות התמונה נכשל. יש לבטל את ההתקנה." + "‏בשלב זה פועלת מערכת דינמית. כדי להשתמש בגרסת Android המקורית, יש לבצע הפעלה מחדש." + "ביטול" + "סגירה" + "הפעלה מחדש" + "הפעלה מחדש" + "המערכת הדינמית נסגרה" + "לא ניתן להפעיל מחדש או לטעון את המערכת הדינמית" + diff --git a/packages/DynamicSystemInstallationService/res/values-ja/strings.xml b/packages/DynamicSystemInstallationService/res/values-ja/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..46c093057a4940c3b00a7fa60aa0749a12097187 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-ja/strings.xml @@ -0,0 +1,16 @@ + + + "パスワードを入力し、Dynamic System Updates に移動してください" + "動的システムの準備ができました。使い始めるには、デバイスを再起動してください。" + "インストールしています" + "インストールに失敗しました" + "イメージの検証に失敗しました。インストールを中止してください。" + "現在、動的システムを実行しています。元の Android バージョンを使用するには再起動してください。" + "キャンセル" + "破棄" + "再起動" + "再起動" + "動的システムを破棄しました" + "動的システムの再起動や読み込みを行えません" + diff --git a/packages/DynamicSystemInstallationService/res/values-ka/strings.xml b/packages/DynamicSystemInstallationService/res/values-ka/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..f841a59801e436a8137cd496032e2ebb4bd4d1c6 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-ka/strings.xml @@ -0,0 +1,16 @@ + + + "გთხოვთ, შეიყვანოთ პაროლი სისტემის დინამიურ განახლებებზე გადასასვლელად" + "დინამიური სისტემა მზადაა. გადატვირთეთ მოწყობილობა მის გამოსაყენებლად." + "ინსტალირდება" + "ინსტალაცია ვერ მოხერხდა" + "სურათის ვალიდაცია ვერ მოხერხდა. ინსტალაციის შეწყვეტა." + "ამჟამად გამოიყენება დინამიური სისტემა. გადატვირთეთ Android-ის ორიგინალი ვერსიის გამოსაყენებლად." + "გაუქმება" + "გაუქმება" + "გადატვირთვა" + "გადატვირთვა" + "გაუქმებული დინამიური სისტემა" + "დინამიური სისტემის გადატვირთვა ან ჩატვირთვა ვერ ხერხდება" + diff --git a/packages/DynamicSystemInstallationService/res/values-kk/strings.xml b/packages/DynamicSystemInstallationService/res/values-kk/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..d367b614e5288bd6fd2fd208ad6dda31e0349187 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-kk/strings.xml @@ -0,0 +1,16 @@ + + + "Құпия сөзіңізді енгізіңіз және Dynamic System Updates функциясына өтіңіз." + "Динамикалық жүйе дайын. Оны пайдалану үшін құрылғыңызды қайта қосыңыз." + "Орнатылып жатыр." + "Орнатылмады." + "Кескін тексерілмеді. Орнатуды доғарыңыз." + "Әзірге динамикалық жүйе пайдаланылуда. Бастапқы Android нұсқасын пайдалану үшін қайта қосыңыз." + "Бас тарту" + "Жабу" + "Қайта қосу" + "Қайта қосу" + "Динамикалық жүйе өшірілді." + "Динамикалық жүйені қайта қосу не жүктеу мүмкін емес." + diff --git a/packages/DynamicSystemInstallationService/res/values-km/strings.xml b/packages/DynamicSystemInstallationService/res/values-km/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..56a37164fa6e80ff3848a2892198cdd820c6aca6 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-km/strings.xml @@ -0,0 +1,16 @@ + + + "សូមបញ្ចូល​ពាក្យសម្ងាត់​របស់អ្នក រួចបន្តទៅ​ការដំឡើងកំណែប្រព័ន្ធឌីណាមិច" + "ប្រព័ន្ធឌីណាមិច​អាចប្រើ​បានហើយ។ ដើម្បីចាប់ផ្ដើមប្រើ​ប្រព័ន្ធឌីណាមិច សូមចាប់ផ្ដើម​ឧបករណ៍របស់អ្នក​ឡើងវិញ។" + "ការដំឡើងកំពុង​ដំណើរការ" + "ការដំឡើង​មិនបានសម្រេច" + "បញ្ជាក់​ភាពត្រឹមត្រូវ​នៃរូបភាព​មិនបានសម្រេច។ បោះបង់​ការដំឡើង។" + "បច្ចុប្បន្ន​កំពុងដំណើរការ​ប្រព័ន្ធឌីណាមិច។ ចាប់ផ្ដើម​ឡើងវិញ ដើម្បីប្រើ​កំណែ Android ដើម។" + "បោះបង់" + "លុបចោល" + "ចាប់ផ្ដើមឡើងវិញ" + "ចាប់ផ្ដើមឡើងវិញ" + "បានលុបចោល​ប្រព័ន្ធឌីណាមិច" + "មិនអាច​ចាប់ផ្ដើមឡើងវិញ ឬផ្ទុក​ប្រព័ន្ធឌីណាមិច​បានទេ" + diff --git a/packages/DynamicSystemInstallationService/res/values-kn/strings.xml b/packages/DynamicSystemInstallationService/res/values-kn/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..b4063df9c10d0dca4cfee13cff7fcabee128a5d6 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-kn/strings.xml @@ -0,0 +1,16 @@ + + + "ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್ ನಮೂದಿಸಿ ನಂತರ ಡೈನಾಮಿಕ್ ಸಿಸ್ಟಂ ಅಪ್‌ಡೇಟ್‌ಗಳಿಗೆ ಮುಂದುವರಿಯಿರಿ" + "ಡೈನಾಮಿಕ್ ಸಿಸ್ಟಂ ಸಿದ್ದವಾಗಿದೆ. ಇದನ್ನು ಬಳಸಲು, ನಿಮ್ಮ ಸಾಧನವನ್ನು ಮರುಪ್ರಾರಂಭಿಸಿ." + "ಇನ್‌ಸ್ಟಾಲ್ ಆಗುತ್ತಿದೆ" + "ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಲು ವಿಫಲವಾಗಿದೆ" + "ಚಿತ್ರದ ಮೌಲ್ಯೀಕರಣ ವಿಫಲವಾಗಿದೆ. ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡುವಿಕೆಯನ್ನು ರದ್ದುಗೊಳಿಸಿ." + "ಪ್ರಸ್ತುತವಾಗಿ ಡೈನಾಮಿಕ್ ಸಿಸ್ಟಂ ರನ್ ಆಗುತ್ತಿದೆ ಮೂಲ Android ಆವೃತ್ತಿ ಬಳಸಲು, ಮರುಪ್ರಾರಂಭಿಸಿ." + "ರದ್ದುಗೊಳಿಸಿ" + "ತ್ಯಜಿಸಿ" + "ಮರುಪ್ರಾರಂಭಿಸಿ" + "ಮರುಪ್ರಾರಂಭಿಸಿ" + "ಡೈನಮಿಕ್ ಸಿಸ್ಟಂ ಅನ್ನು ತ್ಯಜಿಸಲಾಗಿದೆ" + "ಡೈನಾಮಿಕ್ ಸಿಸ್ಟಂ ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಲು ಅಥವಾ ಲೋಡ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ" + diff --git a/packages/DynamicSystemInstallationService/res/values-ko/strings.xml b/packages/DynamicSystemInstallationService/res/values-ko/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..24ac9245e22c1d935613579aede31bfe4c61defc --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-ko/strings.xml @@ -0,0 +1,16 @@ + + + "비밀번호를 입력하고 동적 시스템 업데이트를 계속 진행하세요." + "동적 시스템이 준비되었습니다. 사용을 시작하려면 기기를 다시 시작하세요." + "설치 진행 중" + "설치할 수 없음" + "이미지를 확인할 수 없습니다. 설치를 취소합니다." + "현재 동적 시스템을 실행 중입니다. 기존의 Android 버전을 사용하려면 다시 시작하세요." + "취소" + "삭제" + "다시 시작" + "다시 시작" + "동적 시스템 삭제됨" + "동적 시스템을 다시 시작하거나 로드할 수 없음" + diff --git a/packages/DynamicSystemInstallationService/res/values-ky/strings.xml b/packages/DynamicSystemInstallationService/res/values-ky/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..a4387e7bf4a14a714941d61e14790c04eb8a9c81 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-ky/strings.xml @@ -0,0 +1,16 @@ + + + "Сырсөзүңүздү киргизип, системаны динамикалык жаңыртууга өтүңүз" + "Динамикалык система даяр. Аны колдонуу үчүн, түзмөктү өчүрүп күйгүзүңүз." + "Орнотулууда" + "Орнотулбай койду" + "Сүрөт текшерилбей калды. Орнотууну токтотуңуз." + "Учурда динамикалык система колдонулууда. Android\'дин түпнуска версиясын колдонуу үчүн, өчүрүп күйгүзүңүз." + "Жок" + "Жоюу" + "Өчүрүп күйгүзүү" + "Өчүрүп күйгүзүү" + "Динамикалык система жоюлду" + "Динамикалык система өчүрүлүп күйгүзүлбөй же жүктөлбөй жатат" + diff --git a/packages/DynamicSystemInstallationService/res/values-lo/strings.xml b/packages/DynamicSystemInstallationService/res/values-lo/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..f17ca16bf777ea5baa6113a69d64e8c8c64afda6 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-lo/strings.xml @@ -0,0 +1,16 @@ + + + "ກະລຸນາໃສ່ລະຫັດຜ່ານຂອງທ່ານ ແລະ ດຳເນີນການຕໍ່ຫາອັບເດດລະບົບແບບໄດນາມິກ" + "ລະບົບໄດນາມິກພ້ອມແລ້ວ. ກະລຸນາຣີສະຕາດອຸປະກອນຂອງທ່ານເພື່ອເລີ່ມນຳໃຊ້ມັນ." + "ກຳລັງຕິດຕັ້ງຢູ່" + "ຕິດຕັ້ງບໍ່ສຳເລັດ" + "ການກວດສອບໄຟລ໌ຮູບບໍ່ສຳເລັດ. ຍົກເລີກການຕິດຕັ້ງ." + "ຕອນນີ້ກຳລັງໃຊ້ລະບົບໄດນາມິກ. ກະລຸນາຣີສະຕາດເພື່ອໃຊ້ເວີຊັນ Android ຕົ້ນສະບັບ." + "ຍົກເລີກ" + "ປິດໄວ້" + "ຣີສະຕາດ" + "ຣີສະຕາດ" + "ລະບົບໄດນາມິກທີ່ຍົກເລີກແລ້ວ" + "ບໍ່ສາມາດຣີສະຕາດ ຫຼື ໂຫຼດລະບົບໄດນາມິກໄດ້" + diff --git a/packages/DynamicSystemInstallationService/res/values-lt/strings.xml b/packages/DynamicSystemInstallationService/res/values-lt/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..8128eb7b0a72c02fa71f264c7a1e675ecd1f97ac --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-lt/strings.xml @@ -0,0 +1,16 @@ + + + "Įveskite slaptažodį ir eikite į Dinaminių sistemos atnaujinimų funkciją" + "Dinaminė sistema paruošta. Jei norite pradėti ją naudoti, paleiskite įrenginį iš naujo." + "Diegiama" + "Įdiegti nepavyko" + "Nepavyko patvirtinti vaizdo. Nutraukti diegimą." + "Šiuo metu paleista dinaminė sistema. Paleiskite iš naujo, jei norite naudoti pradinę „Android“ versiją." + "Atšaukti" + "Atmesti" + "Pal. iš naujo" + "Pal. iš naujo" + "Dinaminė sistema atmesta" + "Nepavyko paleisti iš naujo ar įkelti dinaminės sistemos" + diff --git a/packages/DynamicSystemInstallationService/res/values-lv/strings.xml b/packages/DynamicSystemInstallationService/res/values-lv/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..cfe7a087e148aea2ae7e524fa28dab2f67ff313d --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-lv/strings.xml @@ -0,0 +1,16 @@ + + + "Ievadiet paroli un pārejiet uz funkciju Dinamiskie sistēmas atjauninājumi" + "Dinamiskā sistēma ir gatava. Lai sāktu to izmantot, restartējiet ierīci." + "Notiek instalēšana" + "Instalēšana neizdevās" + "Attēla validācija neizdevās. Instalācija tiek priekšlaikus pārtraukta." + "Pašlaik darbojas dinamiska sistēma. Lai izmantotu sākotnējo Android versiju, restartējiet ierīci." + "Atcelt" + "Atmest" + "Restartēt" + "Restartēt" + "Dinamiskā sistēma tika atmesta" + "Nevar restartēt vai ielādēt dinamisko sistēmu" + diff --git a/packages/DynamicSystemInstallationService/res/values-mk/strings.xml b/packages/DynamicSystemInstallationService/res/values-mk/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..21215aa776313dd151ad7e52db130700cefefcd3 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-mk/strings.xml @@ -0,0 +1,16 @@ + + + "Внесете ја вашата лозинка и продолжете на „Динамични системски ажурирања“" + "Динамичниот систем е подготвен. За да започнете со користење, рестартирајте го уредот." + "Инсталирањето е во тек" + "Неуспешно инсталирање" + "Проверката на сликата не успеа. Прекини ја инсталацијата." + "Во моментов се извршува динамичен систем. Рестартирајте за да ја користите оригиналната верзија на Android." + "Откажи" + "Отфрли" + "Рестартирај" + "Рестартирај" + "Отфрлен динамичен систем" + "Не може да го рестартира или вчита динамичниот систем" + diff --git a/packages/DynamicSystemInstallationService/res/values-ml/strings.xml b/packages/DynamicSystemInstallationService/res/values-ml/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..951a0b95f7e43e78bb048faabe9027f6da3d2dd6 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-ml/strings.xml @@ -0,0 +1,16 @@ + + + "നിങ്ങളുടെ പാസ്‌വേഡ് നൽകി ഡൈനാമിക് സിസ്റ്റം അപ്ഡേറ്റുകളിലേക്ക് പോകുക" + "ഡെെനാമിക് സിസ്റ്റം തയ്യാറാണ്. അത് ഉപയോഗിച്ച് തുടങ്ങാൻ നിങ്ങളുടെ ഉപകരണം റീസ്റ്റാർട്ട് ചെയ്യുക." + "ഇൻസ്‌റ്റാൾ ചെയ്യൽ പുരോഗതിയിലാണ്" + "ഇൻസ്‌റ്റാൾ ചെയ്യാനായില്ല" + "ചിത്രത്തിന്റെ മൂല്യനിർണ്ണയം നടത്താനായില്ല. ഇൻസ്‌റ്റലേഷൻ റദ്ദാക്കുക." + "നിലവിൽ ഒരു ഡെെനാമിക് സിസ്റ്റം റൺ ചെയ്യുന്നുണ്ട്. ഒറിജിനൽ Android പതിപ്പ് ഉപയോഗിക്കാൻ റീസ്റ്റാർട്ട് ചെയ്യുക." + "റദ്ദാക്കുക" + "നിരസിക്കുക" + "റീസ്റ്റാർട്ട് ചെയ്യൂ" + "റീസ്റ്റാർട്ട് ചെയ്യൂ" + "ഡെെനാമിക് സിസ്റ്റം നിരസിച്ചു" + "റീസ്റ്റാർട്ട് ചെയ്യാനോ ഡെെനാമിക് സിസ്റ്റം ലോഡ് ചെയ്യാനോ ആവില്ല" + diff --git a/packages/DynamicSystemInstallationService/res/values-mn/strings.xml b/packages/DynamicSystemInstallationService/res/values-mn/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..d0965d021c6546eb19d964815856987956c6b201 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-mn/strings.xml @@ -0,0 +1,16 @@ + + + "Нууц үгээ оруулаад Динамик системийн шинэчлэлтийг үргэлжлүүлнэ үү" + "Динамик систем бэлэн боллоо. Түүнийг ашиглаж эхлэхийн тулд төхөөрөмжөө дахин эхлүүлнэ үү." + "Суулгаж байна" + "Суулгаж чадсангүй" + "Системийн хуулбарын баталгаажуулалт амжилтгүй боллоо. Суулгах үйлдлийг зогсооно уу." + "Одоогоор динамик системийг ажиллуулж байна. Android-н эх хувилбарыг ашиглахын тулд дахин эхлүүлнэ үү." + "Болих" + "Болих" + "Дахин эхлүүлэх" + "Дахин эхлүүлэх" + "Динамик системийг устгасан" + "Динамик системийг дахин эхлүүлэх эсвэл ачаалах боломжгүй байна" + diff --git a/packages/DynamicSystemInstallationService/res/values-mr/strings.xml b/packages/DynamicSystemInstallationService/res/values-mr/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..268e1d344620ea875034adbeccccf0c2048e3bc3 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-mr/strings.xml @@ -0,0 +1,16 @@ + + + "कृपया तुमचा पासवर्ड एंटर करा आणि डायनॅमिक सिस्टम अपडेट वर जा" + "डायनॅमिक सिस्टम तयार आहे. ती वापरणे सुरू करण्यासाठी, तुमचे डिव्हाइस रीस्टार्ट करा." + "इंस्टॉल प्रगतीपथावर आहे" + "इंस्टॉल करता आली नाही" + "इमेज प्रमाणीकरण करता आले नाही. इंस्टॉलेशन रद्द करा." + "सध्या डायनॅमिक सिस्टम रन करत आहे. मूळ Android आवृत्ती वापरण्यासाठी रीस्टार्ट करा." + "रद्द करा" + "काढून टाका" + "रीस्टार्ट करा" + "रीस्टार्ट करा" + "डायनॅमिक सिस्टम काढून टाकली" + "डायनॅमिक सिस्टम रीस्टार्ट किंवा लोड करू शकत नाही" + diff --git a/packages/DynamicSystemInstallationService/res/values-ms/strings.xml b/packages/DynamicSystemInstallationService/res/values-ms/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..bba8b9724f0d1ecf1d31e12591cf3bda01d80350 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-ms/strings.xml @@ -0,0 +1,16 @@ + + + "Sila masukkan kata laluan dan teruskan ke Kemas Kini Sistem Dinamik" + "Sistem dinamik sudah sedia. Untuk mula menggunakan sistem ini, mulakan semula peranti anda" + "Pemasangan sedang dijalankan" + "Pemasangan gagal" + "Gagal mengesahkan imej. Henti paksa pemasangan." + "Sedang menjalankan sistem dinamik. Mulakan semula peranti untuk menggunakan versi asal Android." + "Batal" + "Buang" + "Mulakan semula" + "Mulakan semula" + "Sistem dinamik dibuang" + "Tidak dapat memulakan semula atau memuatkan sistem dinamik" + diff --git a/packages/DynamicSystemInstallationService/res/values-my/strings.xml b/packages/DynamicSystemInstallationService/res/values-my/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..b2488ece9ce3b00b3f2d88cd79ad71ee7acf75e3 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-my/strings.xml @@ -0,0 +1,16 @@ + + + "သင့်စကားဝှက်ထည့်ပြီး ပြောင်းလဲနိုင်သော စနစ်အပ်ဒိတ်များသို့ ရှေ့ဆက်ပါ" + "ပြောင်းလဲနိုင်သောစနစ် အသင့်ဖြစ်ပါပြီ။ ၎င်းကို စတင်အသုံးပြုရန် သင့်စက်ကို ပြန်စပါ။" + "ထည့်သွင်းနေဆဲဖြစ်သည်" + "ထည့်သွင်း၍မရပါ" + "ပုံအတည်ပြု၍ မရပါ။ ထည့်သွင်းမှုကို ရပ်ပါ။" + "လက်ရှိတွင် ပြောင်းလဲနိုင်သောစနစ်ကို အသုံးပြုနေသည်။ မူလ Android ဗားရှင်း အသုံးပြုရန် ပြန်စတင်ပါ။" + "မလုပ်တော့" + "ဖယ်ပစ်ရန်" + "ပြန်စရန်" + "ပြန်စရန်" + "ပြောင်းလဲနိုင်သောစနစ်ကို ဖယ်လိုက်သည်" + "ပြန်စ၍ မရပါ (သို့) ပြောင်းလဲနိုင်သောစနစ် ဖွင့်၍မရပါ" + diff --git a/packages/DynamicSystemInstallationService/res/values-nb/strings.xml b/packages/DynamicSystemInstallationService/res/values-nb/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..36e3d6912e230174b44b52751a0a19a7ad9a44a6 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-nb/strings.xml @@ -0,0 +1,16 @@ + + + "Skriv inn passordet ditt, og fortsett til dynamiske systemoppdateringer" + "Det dynamiske systemet er klart. Start enheten din på nytt for å begynne å bruke det." + "Installeringen pågår" + "Installeringen mislyktes" + "Bildebekreftelsen mislyktes. Avbryt installeringen." + "Kjører et dynamisk system nå. Start på nytt for å bruke den opprinnelige Android-versjonen." + "Avbryt" + "Forkast" + "Start på nytt" + "Start på nytt" + "Det dynamiske systemet er forkastet" + "Det dynamiske systemet kan ikke startes på nytt eller lastes inn" + diff --git a/packages/DynamicSystemInstallationService/res/values-ne/strings.xml b/packages/DynamicSystemInstallationService/res/values-ne/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..ee9267852250e4b61f82262e5341d45ade146105 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-ne/strings.xml @@ -0,0 +1,16 @@ + + + "कृपया आफ्नो पासवर्ड प्रविष्टि गर्नुहोस् र Dynamic System Updates को प्रक्रियालाई निरन्तरता दिनुहोस्" + "Dynamic System तयार छ। यसको प्रयोग सुरु गर्न आफ्नो यन्त्र रिस्टार्ट गर्नुहोस्।" + "इन्स्टल हुँदै छ" + "स्थापना गर्न सकिएन" + "छवि पुष्टि गर्न सकिएन। स्थापना गर्ने प्रक्रिया रद्द गर्नुहोस्।" + "हाल Dynamic System चलिरहेको छ। Android को मूल संस्करण प्रयोग गर्न यन्त्र रिस्टार्ट गर्नुहोस्।" + "रद्द गर्नुहोस्" + "खारेज गर्नुहोस्" + "रिस्टार्ट गर्नु…" + "रिस्टार्ट गर्नु…" + "Dynamic System खारेज गरियो" + "रिस्टार्ट गर्न वा Dynamic System लोड गर्न सकिएन" + diff --git a/packages/DynamicSystemInstallationService/res/values-nl/strings.xml b/packages/DynamicSystemInstallationService/res/values-nl/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..47eeb839c6dccdec97bfe496de9d4877171163ff --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-nl/strings.xml @@ -0,0 +1,16 @@ + + + "Geef je wachtwoord op en ga door naar \'Dynamische systeemupdates\'" + "Dynamisch systeem is gereed. Start je apparaat opnieuw op om het te gebruiken." + "Installatie wordt uitgevoerd" + "Installatie mislukt" + "Valideren van afbeelding mislukt. Installatie afbreken." + "Er is momenteel een dynamisch systeem actief. Start je apparaat opnieuw op om de oorspronkelijke Android-versie te gebruiken." + "Annuleren" + "Niet opslaan" + "Herstarten" + "Herstarten" + "Dynamisch systeem niet opgeslagen" + "Kan dynamisch systeem niet opnieuw opstarten of laden" + diff --git a/packages/DynamicSystemInstallationService/res/values-or/strings.xml b/packages/DynamicSystemInstallationService/res/values-or/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..e0c847094844b21c4a7f1ace18dc8edd291657d6 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-or/strings.xml @@ -0,0 +1,16 @@ + + + "ଦୟାକରି ଆପଣଙ୍କ ପାସୱାର୍ଡ ଲେଖନ୍ତୁ ଏବଂ ଡାଇନାମିକ୍ ସିଷ୍ଟମ୍ ଅପଡେଟ୍ ଜାରି ରଖନ୍ତୁ" + "ଡାଇନାମିକ୍ ସିଷ୍ଟମ୍ ପ୍ରସ୍ତୁତ ଅଛି। ଏହାକୁ ବ୍ୟବହାର କରିବା ଆରମ୍ଭ କରିବାକୁ, ଆପଣଙ୍କ ଡିଭାଇସକୁ ରିଷ୍ଟାର୍ଟ କରନ୍ତୁ।" + "ଇନଷ୍ଟଲ୍ ହେଉଛି" + "ଇନଷ୍ଟଲ୍ କରିବା ବିଫଳ ହୋଇଛି" + "ଛବି ବୈଧକରଣ ବିଫଳ ହୋଇଛି। ଇନଷ୍ଟଲେସନ୍ ରଦ୍ଦ କରନ୍ତୁ।" + "ବର୍ତ୍ତମାନ ଏକ ଡାଇନାମିକ୍ ସିଷ୍ଟମ୍ ଚାଲୁଛି। ମୂଳ Android ସଂସ୍କରଣ ବ୍ୟବହାର କରିବାକୁ ରିଷ୍ଟାର୍ଟ କରନ୍ତୁ।" + "ବାତିଲ୍ କରନ୍ତୁ" + "ଖାରଜ କରନ୍ତୁ" + "ରିଷ୍ଟାର୍ଟ କରନ୍ତୁ" + "ରିଷ୍ଟାର୍ଟ କରନ୍ତୁ" + "ଡାଇନାମିକ୍ ସିଷ୍ଟମ୍ ଖାରଜ କରାଯାଇଛି" + "ଡାଇନାମିକ୍ ସିଷ୍ଟମ୍ ରିଷ୍ଟାର୍ଟ କିମ୍ବା ଲୋଡ୍ କରାଯାଇପାରିବ ନାହିଁ" + diff --git a/packages/DynamicSystemInstallationService/res/values-pa/strings.xml b/packages/DynamicSystemInstallationService/res/values-pa/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..c5f7a3d38cdcae727907253448cadffef463be6f --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-pa/strings.xml @@ -0,0 +1,16 @@ + + + "ਕਿਰਪਾ ਕਰਕੇ ਆਪਣਾ ਪਾਸਵਰਡ ਦਾਖਲ ਕਰੋ ਅਤੇ ਪਰਿਵਰਤਨਸ਼ੀਲ ਸਿਸਟਮ ਅੱਪਡੇਟ \'ਤੇ ਜਾਰੀ ਰੱਖੋ" + "ਪਰਿਵਰਤਨਸ਼ੀਲ ਸਿਸਟਮ ਤਿਆਰ ਹੈ। ਇਸ ਦੀ ਵਰਤੋਂ ਸ਼ੁਰੂ ਕਰਨ ਲਈ, ਆਪਣਾ ਡੀਵਾਈਸ ਮੁੜ-ਸ਼ੁਰੂ ਕਰੋ।" + "ਸਥਾਪਨਾ ਜਾਰੀ ਹੈ" + "ਸਥਾਪਤ ਕਰਨਾ ਅਸਫਲ ਰਿਹਾ" + "ਚਿੱਤਰ ਪ੍ਰਮਾਣਿਕਤਾ ਅਸਫਲ ਰਹੀ। ਸਥਾਪਨਾ ਨੂੰ ਰੱਦ ਕਰੋ।" + "ਫ਼ਿਲਹਾਲ ਪਰਿਵਰਤਨਸ਼ੀਲ ਸਿਸਟਮ ਚੱਲ ਰਿਹਾ ਹੈ। ਮੂਲ Android ਵਰਜਨ ਵਰਤਣ ਲਈ ਮੁੜ-ਸ਼ੁਰੂ ਕਰੋ।" + "ਰੱਦ ਕਰੋ" + "ਖਾਰਜ ਕਰੋ" + "ਮੁੜ-ਸ਼ੁਰੂ ਕਰੋ" + "ਮੁੜ-ਸ਼ੁਰੂ ਕਰੋ" + "ਪਰਿਵਰਤਨਸ਼ੀਲ ਸਿਸਟਮ ਰੱਦ ਕੀਤਾ ਗਿਆ" + "ਪਰਿਵਰਤਨਸ਼ੀਲ ਸਿਸਟਮ ਮੁੜ-ਸ਼ੁਰੂ ਜਾਂ ਲੋਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ" + diff --git a/packages/DynamicSystemInstallationService/res/values-pl/strings.xml b/packages/DynamicSystemInstallationService/res/values-pl/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..bc7d5fe5b2220e5fcacea14c1d4a089546985d8b --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-pl/strings.xml @@ -0,0 +1,16 @@ + + + "Wpisz hasło i przejdź do dynamicznych aktualizacji systemu" + "System dynamiczny jest gotowy. Aby zacząć go używać, uruchom urządzenie ponownie." + "Instaluję" + "Nie udało się zainstalować" + "Nie udało się zweryfikować obrazu. Przerwij instalację." + "Obecnie urządzenie korzysta z systemu dynamicznego. Aby powrócić do oryginalnej wersji Androida, uruchom urządzenie ponownie." + "Anuluj" + "Odrzuć" + "Uruchom ponownie" + "Uruchom ponownie" + "Usunięto system dynamiczny" + "Nie można ponownie uruchomić lub wczytać systemu dynamicznego" + diff --git a/packages/DynamicSystemInstallationService/res/values-pt-rBR/strings.xml b/packages/DynamicSystemInstallationService/res/values-pt-rBR/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..31a9bb439235405c5117d50d6f224d597182dfb6 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-pt-rBR/strings.xml @@ -0,0 +1,16 @@ + + + "Digite sua senha e prossiga para Atualizações dinâmicas do sistema" + "O sistema dinâmico está pronto. Para começar a usá-lo, reinicie o dispositivo." + "Instalação em andamento" + "Falha na instalação" + "Falha ao validar imagem. Cancele a instalação." + "Um sistema dinâmico está sendo executado no momento. Reinicie para usar a versão original do Android." + "Cancelar" + "Descartar" + "Reiniciar" + "Reiniciar" + "Sistema dinâmico descartado" + "Não é possível reiniciar ou carregar o sistema dinâmico" + diff --git a/packages/DynamicSystemInstallationService/res/values-pt-rPT/strings.xml b/packages/DynamicSystemInstallationService/res/values-pt-rPT/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..d917c6afec6e3e68d5a9432d6b93f717051a2d69 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-pt-rPT/strings.xml @@ -0,0 +1,16 @@ + + + "Introduza a sua palavra-passe e continue para a Atualização Dinâmica do Sistema." + "O sistema dinâmico está pronto. Para o começar a utilizar, reinicie o dispositivo." + "Instalação em curso" + "Falha na instalação" + "Falha ao validar a imagem. A instalação foi interrompida." + "Está atualmente em execução um sistema dinâmico. Reinicie para utilizar a versão original do Android." + "Cancelar" + "Rejeitar" + "Reiniciar" + "Reiniciar" + "Sistema dinâmico rejeitado" + "Não é possível reiniciar ou carregar o sistema dinâmico." + diff --git a/packages/DynamicSystemInstallationService/res/values-pt/strings.xml b/packages/DynamicSystemInstallationService/res/values-pt/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..31a9bb439235405c5117d50d6f224d597182dfb6 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-pt/strings.xml @@ -0,0 +1,16 @@ + + + "Digite sua senha e prossiga para Atualizações dinâmicas do sistema" + "O sistema dinâmico está pronto. Para começar a usá-lo, reinicie o dispositivo." + "Instalação em andamento" + "Falha na instalação" + "Falha ao validar imagem. Cancele a instalação." + "Um sistema dinâmico está sendo executado no momento. Reinicie para usar a versão original do Android." + "Cancelar" + "Descartar" + "Reiniciar" + "Reiniciar" + "Sistema dinâmico descartado" + "Não é possível reiniciar ou carregar o sistema dinâmico" + diff --git a/packages/DynamicSystemInstallationService/res/values-ro/strings.xml b/packages/DynamicSystemInstallationService/res/values-ro/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..c211318578301d59a0b0c2a32e4a175e5ba36b01 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-ro/strings.xml @@ -0,0 +1,16 @@ + + + "Introduceți parola și accesați Actualizările de sistem dinamice" + "Sistemul dinamic este pregătit. Ca să începeți să-l folosiți, reporniți dispozitivul." + "Se instalează" + "Instalarea nu a reușit" + "Nu s-a validat imaginea. Abandonați instalarea." + "Rulăm un sistem dinamic. Reporniți pentru a folosi versiunea Android inițială." + "Anulați" + "Renunțați" + "Reporniți" + "Reporniți" + "S-a renunțat la sistemul dinamic" + "Nu se poate reporni sau încărca sistemul dinamic" + diff --git a/packages/DynamicSystemInstallationService/res/values-ru/strings.xml b/packages/DynamicSystemInstallationService/res/values-ru/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..bf94c99b8fb58a954d98097db570e82ce154cded --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-ru/strings.xml @@ -0,0 +1,16 @@ + + + "Введите пароль и перейдите к динамическим обновлениям системы." + "Динамическая система готова. Чтобы использовать ее, перезапустите устройство." + "Идет установка…" + "Ошибка установки." + "Не удалось проверить образ. Отмените установку." + "Используется динамическая система. Чтобы вернуться к исходной версии Android, перезапустите устройство." + "Отмена" + "Отменить" + "Перезапустить" + "Перезапустить" + "Динамическая система удалена." + "Не удается запустить или загрузить динамическую систему." + diff --git a/packages/DynamicSystemInstallationService/res/values-si/strings.xml b/packages/DynamicSystemInstallationService/res/values-si/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..e6a6ea2fe35129351d166e5f03732c6898ef2136 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-si/strings.xml @@ -0,0 +1,16 @@ + + + "කරුණාකර ඔබගේ මුරපදය ඇතුළත් කර ගතික පද්ධති යාවත්කාලීන කිරීම් වෙත යන්න" + "ගතික පද්ධතිය සූදානම්ය. එය භාවිතා කිරීම ආරම්භ කිරීමට, ඔබගේ උපාංගය නැවත ආරම්භ කරන්න." + "ස්ථාපනය කෙරෙමින් පවතී" + "ස්ථාපනය අසාර්ථක විය" + "රූප වලංගු කිරීම අසාර්ථක විය. ස්ථාපනය අවලංගු කරන්න" + "දැනට ගතික පද්ධතියක් ක්‍රියාත්මක කරයි. මුල් Android අනුවාදය භාවිතා කිරීමට නැවත ආරම්භ කරන්න." + "අවලංගු කරන්න" + "ඉවත ලන්න" + "යළි අරඹන්න" + "යළි අරඹන්න" + "ගතික පද්ධතිය ඉවත දමන ලදි" + "ගතික පද්ධතිය නැවත ආරම්භ කිරීමට හෝ පූරණය කිරීමට නොහැක" + diff --git a/packages/DynamicSystemInstallationService/res/values-sk/strings.xml b/packages/DynamicSystemInstallationService/res/values-sk/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..99390cf07c74157182562c637253b86ae3d410ce --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-sk/strings.xml @@ -0,0 +1,16 @@ + + + "Zadajte svoje heslo a pokračujte na dynamické aktualizácie systému" + "Dynamický systém je k dispozícii. Ak ho chcete začať používať, reštartujte zariadenie." + "Prebieha inštalácia" + "Nepodarilo sa nainštalovať" + "Obrázok sa nepodarilo overiť. Prerušte inštaláciu." + "Momentálne je spustený dynamický systém. Ak chcete používať pôvodnú verziu Androidu, reštartujte." + "Zrušiť" + "Zahodiť" + "Reštartovať" + "Reštartovať" + "Zahodený dynamický systém" + "Nie je možné reštartovať alebo načítať dynamický systém" + diff --git a/packages/DynamicSystemInstallationService/res/values-sl/strings.xml b/packages/DynamicSystemInstallationService/res/values-sl/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..3ffd741ea4f6197cd88e91085b6560a262452638 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-sl/strings.xml @@ -0,0 +1,16 @@ + + + "Vnesite geslo in nadaljujte na dinamične posodobitve sistema" + "Dinamični sistem je pripravljen. Znova zaženite napravo, da ga boste lahko začeli uporabljati." + "Namestitev poteka" + "Namestitev ni uspela" + "Preverjanje slike ni uspelo. Prekinite namestitev." + "Trenutno se izvaja dinamični sistem. Znova zaženite, če želite uporabljati prvotno različico Androida." + "Prekliči" + "Zavrzi" + "Znova zaženi" + "Znova zaženi" + "Dinamični sistem je bil zavržen" + "Dinamičnega sistema ni mogoče znova zagnati ali naložiti" + diff --git a/packages/DynamicSystemInstallationService/res/values-sq/strings.xml b/packages/DynamicSystemInstallationService/res/values-sq/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..704b512ad9ab30e6fca3bfa5c65e7c1e9de56dc2 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-sq/strings.xml @@ -0,0 +1,16 @@ + + + "Fut fjalëkalimin tënd dhe vazhdo te përditësimet e sistemit dinamik" + "Sistemi dinamik është gati. Për të nisur përdorimin e tij, rinise pajisjen." + "Instalimi në vazhdim" + "Instalimi dështoi" + "Verifikimi i imazhit dështoi. Ndërprit instalimin." + "Aktualisht po ekzekutohet në një sistem dinamik. Rinise për të përdorur versionin origjinal të Android." + "Anulo" + "Hiq" + "Rinis" + "Rinis" + "Sistemi dinamik u hoq" + "Sistemi dinamik nuk mund të rinisej ose të ngarkohej" + diff --git a/packages/DynamicSystemInstallationService/res/values-sr/strings.xml b/packages/DynamicSystemInstallationService/res/values-sr/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..5e4540a5eff040f86a8c03a3cf0e36826c3aafc3 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-sr/strings.xml @@ -0,0 +1,16 @@ + + + "Унесите лозинку и наставите до динамичних ажурирања система" + "Динамични систем је спреман. Да бисте почели да га користите, рестартујте уређај." + "Инсталира се" + "Инсталирање није успело" + "Валидација слике није успела. Откажите инсталацију." + "Тренутно је покренут динамични систем. Рестартујте да бисте користили оригиналну верзију Android-а." + "Откажи" + "Одбаци" + "Рестартуј" + "Рестартуј" + "Динамични систем је одбачен" + "Рестартовање или учитавање динамичног система није успело" + diff --git a/packages/DynamicSystemInstallationService/res/values-sv/strings.xml b/packages/DynamicSystemInstallationService/res/values-sv/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..546ffddde639b5ca4f5503cfce2fb38858c5012e --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-sv/strings.xml @@ -0,0 +1,16 @@ + + + "Ange lösenordet och fortsätt till Dynamiska systemuppdateringar" + "Det dynamiska systemet är klart. Om du vill använda det startar du om enheten." + "Installation pågår" + "Installationen misslyckades" + "Bildvalideringen misslyckades. Avbryt installationen." + "Ett dynamiskt system körs. Om du vill använda den ursprungliga Android-versionen startar du om." + "Avbryt" + "Ignorera" + "Starta om" + "Starta om" + "Det dynamiska systemet ignorerades" + "Det gick inte att starta om eller läsa in det dynamiska systemet" + diff --git a/packages/DynamicSystemInstallationService/res/values-sw/strings.xml b/packages/DynamicSystemInstallationService/res/values-sw/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..53414d5f6b0a3ab8811cce1bf9c5428ea2fd1824 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-sw/strings.xml @@ -0,0 +1,16 @@ + + + "Tafadhali weka nenosiri lako na uende kwenye Dynamic System Updates" + "Dynamic system iko tayari. Ili uanze kuitumia, zima kisha uwashe kifaa chako." + "Inasakinisha" + "Imeshindwa kusakinisha" + "Imeshindwa kuthibitisha picha. Ghairi usakinishaji." + "Inatumia Dynamic System kwa sasa. Zima kisha uwashe ili utumie toleo halisi la Android." + "Ghairi" + "Ondoa" + "Zima kisha uwashe" + "Zima kisha uwashe" + "Umeondoa Dynamic System" + "Imeshindwa kuzima na kuwasha au kupakia Dynamic System" + diff --git a/packages/DynamicSystemInstallationService/res/values-ta/strings.xml b/packages/DynamicSystemInstallationService/res/values-ta/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..e0aaaf7458fc96fe8781d83222134a25be5d51dd --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-ta/strings.xml @@ -0,0 +1,16 @@ + + + "Dynamic System Updatesஸுக்குத் தொடர உங்கள் கடவுச்சொல்லை உள்ளிடவும்" + "Dynamic system தயாராக உள்ளது. இதைப் பயன்படுத்தத் தொடங்க உங்கள் சாதனத்தை மீண்டும் தொடங்கவும்." + "நிறுவப்படுகிறது" + "நிறுவ முடியவில்லை" + "படத்தைச் சரிபார்க்க முடியவில்லை. நிறுவலை ரத்துசெய்யவும்." + "Dynamic system தற்போது இயக்கத்தில் உள்ளது. அசல் Android பதிப்பைப் பயன்படுத்த மீண்டும் தொடங்கவும்." + "ரத்துசெய்" + "நிராகரி" + "மீண்டும் தொடங்கு" + "மீண்டும் தொடங்கு" + "Dynamic system நிராகரிக்கப்பட்டது" + "Dynamic systemமை மீண்டும் தொடங்கவோ ஏற்றவோ முடியவில்லை" + diff --git a/packages/DynamicSystemInstallationService/res/values-te/strings.xml b/packages/DynamicSystemInstallationService/res/values-te/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..d497630660e301583b5365e084dbe307d3214752 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-te/strings.xml @@ -0,0 +1,16 @@ + + + "దయచేసి మీ పాస్‌వర్డ్‌ను ఎంటర్ చేసి, డైనమిక్ సిస్టమ్ అప్‌డేట్స్‌ను కొనసాగించండి" + "డైనమిక్ సిస్టమ్ సిద్ధంగా ఉంది. దీనిని ఉపయోగించడానికి, మీ పరికరాన్ని రీస్టార్ట్ చేయండి." + "ఇన్‌స్టాల్ అవుతోంది" + "ఇన్‌స్టాల్ చేయడం విఫలమైంది" + "ఇమేజ్ నిర్ధారణ విఫలమైంది. ఇన్‌స్టాలేషన్‌ను రద్దు చేయండి." + "ప్రస్తుతం డైనమిక్ సిస్టమ్ రన్నవుతోంది. ఒరిజినల్ Android వెర్షన్‌ను ఉపయోగించడానికి రీస్టార్ట్ చేయండి." + "రద్దు చేయండి" + "విస్మరించండి" + "రీస్టార్ట్ చేయి" + "రీస్టార్ట్ చేయి" + "డైనమిక్ సిస్టమ్ విస్మరించబడింది" + "డైనమిక్ సిస్టమ్‌ను రీస్టార్ట్ చేయడం లేదా లోడ్ చేయడం సాధ్యపడలేదు" + diff --git a/packages/DynamicSystemInstallationService/res/values-th/strings.xml b/packages/DynamicSystemInstallationService/res/values-th/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..786324f574883f467239ff4714b1c06d8a0bab4c --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-th/strings.xml @@ -0,0 +1,16 @@ + + + "โปรดป้อนรหัสผ่านแล้วไปที่ \"อัปเดตระบบแบบไดนามิก\"" + "ระบบแบบไดนามิกพร้อมแล้ว โปรดรีสตาร์ทอุปกรณ์เพื่อเริ่มใช้" + "กำลังติดตั้ง" + "ติดตั้งไม่สำเร็จ" + "ตรวจสอบรูปภาพไม่สำเร็จ ล้มเลิกการติดตั้ง" + "ปัจจุบันใช้ระบบแบบไดนามิกอยู่ รีสตาร์ทเพื่อใช้ Android เวอร์ชันดั้งเดิม" + "ยกเลิก" + "ยกเลิก" + "รีสตาร์ท" + "รีสตาร์ท" + "ยกเลิกระบบแบบไดนามิกแล้ว" + "รีสตาร์ทหรือโหลดระบบแบบไดนามิกไม่ได้" + diff --git a/packages/DynamicSystemInstallationService/res/values-tl/strings.xml b/packages/DynamicSystemInstallationService/res/values-tl/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..df39f7b1886a796194ca17ec8169fd2d816acf64 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-tl/strings.xml @@ -0,0 +1,16 @@ + + + "Pakilagay ang iyong password at ipagpatuloy ang Dynamic System Updates" + "Handa na ang dynamic system. Para simulang gamitin ito, i-restart ang iyong device." + "Ini-install" + "Hindi na-install" + "Hindi na-validate ang image. I-abort ang pag-install." + "Kasalukuyang pinapatakbo ang dynamic system. Mag-restart para gamitin ang orihinal na Android na bersyon." + "Kanselahin" + "I-discard" + "I-restart" + "I-restart" + "Na-discard ang dynamic system" + "Hindi ma-restart o ma-load ang dynamic system" + diff --git a/packages/DynamicSystemInstallationService/res/values-tr/strings.xml b/packages/DynamicSystemInstallationService/res/values-tr/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..1446f963245676d9c9db8640a34ce62dc25f3dd9 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-tr/strings.xml @@ -0,0 +1,16 @@ + + + "Lütfen şifrenizi girip Dinamik Sistem Güncellemesi\'ne gidin" + "Dinamik sistem hazır. Kullanmaya başlamak için cihazınızı yeniden başlatın." + "Yükleme devam ediyor" + "Yükleme başarısız oldu" + "Resim doğrulanamadı. Yüklemeyi iptal edin." + "Şu anda dinamik sistem çalıştırılıyor. Orijinal Android sürümünü kullanmak için cihazı yeniden başlatın." + "İptal" + "Sil" + "Yeniden başlat" + "Yeniden başlat" + "Dinamik sistem silindi" + "Dinamik sistem yeniden başlatılamıyor veya yüklenemiyor" + diff --git a/packages/DynamicSystemInstallationService/res/values-uk/strings.xml b/packages/DynamicSystemInstallationService/res/values-uk/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..9a44d97640148fcdd1222379147c1b3eff0b4d39 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-uk/strings.xml @@ -0,0 +1,16 @@ + + + "Введіть пароль і перейдіть до Динамічних оновлень системи" + "Динамічна система готова. Щоб перейти до неї, перезапустіть пристрій." + "Триває встановлення" + "Не вдалося встановити" + "Не вдалося перевірити образ. Встановлення скасовано." + "Запущено динамічну систему. Перезапустіть пристрій, щоб повернутися до попередньої версії Android." + "Скасувати" + "Видалити" + "Перезапустити" + "Перезапустити" + "Динамічну систему видалено" + "Не вдається перезапустити пристрій або завантажити динамічну систему" + diff --git a/packages/DynamicSystemInstallationService/res/values-ur/strings.xml b/packages/DynamicSystemInstallationService/res/values-ur/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..48dddbea328181f9b8eca5f30e7c8cc42843b331 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-ur/strings.xml @@ -0,0 +1,16 @@ + + + "براہ کرم اپنا پاس ورڈ درج کریں اور ڈائنیمک سسٹم اپ ڈیٹس پر جائیں" + "ڈائنیمک سسٹم تیار ہے۔ اس کا استعمال شروع کرنے کے لیے، اپنا آلہ ری سٹارٹ کریں۔" + "انسٹال جاری ہے" + "انسٹال ناکام ہو گیا" + "تصویر کی توثیق ناکام ہو گئی۔ انسٹالیشن منسوخ کریں-" + "‏فی الحال ہم ایک ڈائنیمک سسٹم چلا رہے ہیں۔ Android کا اصل ورژن استعمال کرنے کے لیے ری سٹارٹ کریں۔" + "منسوخ کریں" + "مسترد کریں" + "ری سٹارٹ کریں" + "ری سٹارٹ کریں" + "مسترد کردہ ڈائنیمک سسٹم" + "ڈائنیمک سسٹم کو ری سٹارٹ یا لوڈ نہیں کر سکتے" + diff --git a/packages/DynamicSystemInstallationService/res/values-uz/strings.xml b/packages/DynamicSystemInstallationService/res/values-uz/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..3f0227c1c383869e5afb2756a5185a8f2b49bf4d --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-uz/strings.xml @@ -0,0 +1,16 @@ + + + "Parolni kiriting va dinamik tizim yangilanishlarini davom ettiring" + "Dinamik tizim tayyor. Foydalanishni boshlash uchun qurilmani qayta ishga tushiring." + "Oʻrnatilmoqda" + "Oʻrnatilmadi" + "Rasm tekshiruvi amalga oshmadi Oʻrnatishni bekor qilish." + "Hozirda dinamik tizim ishga tushirilgan. Asl Android versiyasidan foydlanish uchun qayta ishga tushiring." + "Bekor qilish" + "Bekor qilish" + "Boshidan" + "Boshidan" + "Dinamik tizim bekor qilindi" + "Dinamik tizim qayta ishga tushmadi yoki yuklanmadi" + diff --git a/packages/DynamicSystemInstallationService/res/values-vi/strings.xml b/packages/DynamicSystemInstallationService/res/values-vi/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..18c051c893f8e7b486211add0387e20849da96fe --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-vi/strings.xml @@ -0,0 +1,16 @@ + + + "Vui lòng nhập mật khẩu và tiếp tục dùng Bản cập nhật hệ thống động" + "Hệ thống động đã sẵn sàng. Để bắt đầu sử dụng hệ thống này, hãy khởi động lại thiết bị của bạn." + "Đang cài đặt" + "Không cài đặt được" + "Không xác thực được hình ảnh. Hủy cài đặt." + "Thiết bị đang chạy một hệ thống động. Hãy khởi động lại để sử dụng Android phiên bản gốc." + "Hủy" + "Hủy" + "Khởi động lại" + "Khởi động lại" + "Đã hủy hệ thống động" + "Không thể khởi động lại hoặc tải hệ thống động" + diff --git a/packages/DynamicSystemInstallationService/res/values-zh-rCN/strings.xml b/packages/DynamicSystemInstallationService/res/values-zh-rCN/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..b41d4e2bf9124d0c29753c448c0f369fa03adce6 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-zh-rCN/strings.xml @@ -0,0 +1,16 @@ + + + "请输入您的密码,以便继续使用动态系统更新" + "动态系统已准备就绪。重启您的设备即可开始使用动态系统。" + "正在安装" + "安装失败" + "图片验证失败。安装将中止。" + "目前正在运行动态系统。需重启才能使用原 Android 版本。" + "取消" + "舍弃" + "重启" + "重启" + "已舍弃动态系统" + "无法重启或加载动态系统" + diff --git a/packages/DynamicSystemInstallationService/res/values-zh-rHK/strings.xml b/packages/DynamicSystemInstallationService/res/values-zh-rHK/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..c830dae24e9715a7974c55132d1b0c15b02ad791 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-zh-rHK/strings.xml @@ -0,0 +1,16 @@ + + + "請輸入密碼,以使用「動態系統更新」" + "動態系統已可供使用。如要開始使用,請重新啟動裝置。" + "安裝中" + "無法安裝" + "圖片驗證失敗,系統將取消安裝。" + "系統目前正在執行動態系統。如要使用原本的 Android 版本,請重新啟動裝置。" + "取消" + "捨棄" + "重新啟動" + "重新啟動" + "已捨棄動態系統" + "無法重新啟動或載入動態系統" + diff --git a/packages/DynamicSystemInstallationService/res/values-zh-rTW/strings.xml b/packages/DynamicSystemInstallationService/res/values-zh-rTW/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..e43c0f2b08bb4383d8b44426579cec29852f4788 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-zh-rTW/strings.xml @@ -0,0 +1,16 @@ + + + "請輸入密碼,以便繼續使用動態系統更新" + "動態系統已可供使用。如要開始使用,請重新啟動裝置。" + "安裝中" + "無法安裝" + "圖片驗證失敗,系統將取消安裝作業。" + "系統目前正在執行動態系統。如要使用原本的 Android 版本,請重新啟動裝置。" + "取消" + "捨棄" + "重新啟動" + "重新啟動" + "已捨棄動態系統" + "無法重新啟動或載入動態系統" + diff --git a/packages/DynamicSystemInstallationService/res/values-zu/strings.xml b/packages/DynamicSystemInstallationService/res/values-zu/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..4a48444cb9a016d5fec0421ee2d55495514c06ab --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-zu/strings.xml @@ -0,0 +1,16 @@ + + + "Sicela ufake iphasiwedi yakho uphinde uqhubekele Ekubuyekezweni Kohlole Okunhlobonhlobo" + "Uhlole Okunhlobonhlobo kulungile. Ukuze uqale ukuyisebenzisa, qalisa kabusha idivayisi yakho." + "Ukufaka kuyaqhubeka" + "Ukufaka kwehlulekile" + "Ukuqinisekiswa kwesithombe kuhlulekile. Yekisa ukufakwa." + "Manje iqalisa uhlole olunhlobonhlobo. Qalisa kabusha ukuze usebenzise inguqulo yangempela ye-Android." + "Khansela" + "Lahla" + "Qala kabusha" + "Qala kabusha" + "Kulahlwe uhlole olunhlobonhlobo" + "Ayikwazi ukuqalisa kabusha noma ukulayisha uhlole olunhlobonhlobo" + diff --git a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java index f1ec606243c444bfe6749758150d7a21bf3cc277..83319cf788c2fef3a469c3ff09e9b6366d0696de 100644 --- a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java +++ b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java @@ -577,8 +577,11 @@ public class ExternalStorageProvider extends FileSystemProvider { public Cursor querySearchDocuments(String rootId, String[] projection, Bundle queryArgs) throws FileNotFoundException { final File parent; + synchronized (mRootsLock) { - parent = mRoots.get(rootId).path; + RootInfo root = mRoots.get(rootId); + parent = root.visiblePath != null ? root.visiblePath + : root.path; } return querySearchDocuments(parent, projection, Collections.emptySet(), queryArgs); diff --git a/packages/SettingsLib/LayoutPreference/res/drawable/ic_swap_horiz_blue.xml b/packages/SettingsLib/LayoutPreference/res/drawable/ic_swap_horiz_blue.xml index 04de1747436849483d91aa769c327f6124a1a1f9..afebeba2d5ff382388d7215101bff414a81b650b 100644 --- a/packages/SettingsLib/LayoutPreference/res/drawable/ic_swap_horiz_blue.xml +++ b/packages/SettingsLib/LayoutPreference/res/drawable/ic_swap_horiz_blue.xml @@ -18,8 +18,9 @@ android:width="24dp" android:height="24dp" android:viewportWidth="24" - android:viewportHeight="24"> + android:viewportHeight="24" + android:tint="?android:attr/colorAccent"> + android:fillColor="@android:color/white"/>
diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml index 7baaf494771b09d76111f918df627a4a406cd183..7ca0e809143a15310e3f3c381144854c78358240 100644 --- a/packages/SettingsLib/res/values/strings.xml +++ b/packages/SettingsLib/res/values/strings.xml @@ -719,7 +719,7 @@ Reduces battery drain & improves network performance - This toggle affects MAC randomization behavior for client mode only.\nWhen this mode is activated, any networks that have MAC randomization enabled may have their MAC addresses re\u2011randomized during association, depending on when the client last disconnected from the network. Re\u2011randomization does not occur if the device reconnects in 4 hours or less. + When this mode is enabled, this device\u2019s MAC address may change each time it connects to a network that has MAC randomization enabled. Metered @@ -937,11 +937,6 @@ Displays on-screen warning when an app posts a notification without a valid channel - - Enforce shortcuts for conversation notifications - - Require notifications to be backed by a long-lived sharing shortcut in order to appear in the conversation section - Force allow apps on external diff --git a/packages/SettingsLib/src/com/android/settingslib/applications/ServiceListing.java b/packages/SettingsLib/src/com/android/settingslib/applications/ServiceListing.java index 454d1dce0b2fb2aba2f9e993324933327cc3d914..bd9e760acfda44bc0a1b76cda445acefb4c3aefe 100644 --- a/packages/SettingsLib/src/com/android/settingslib/applications/ServiceListing.java +++ b/packages/SettingsLib/src/com/android/settingslib/applications/ServiceListing.java @@ -47,6 +47,7 @@ public class ServiceListing { private final String mIntentAction; private final String mPermission; private final String mNoun; + private final boolean mAddDeviceLockedFlags; private final HashSet mEnabledServices = new HashSet<>(); private final List mServices = new ArrayList<>(); private final List mCallbacks = new ArrayList<>(); @@ -54,7 +55,8 @@ public class ServiceListing { private boolean mListening; private ServiceListing(Context context, String tag, - String setting, String intentAction, String permission, String noun) { + String setting, String intentAction, String permission, String noun, + boolean addDeviceLockedFlags) { mContentResolver = context.getContentResolver(); mContext = context; mTag = tag; @@ -62,6 +64,7 @@ public class ServiceListing { mIntentAction = intentAction; mPermission = permission; mNoun = noun; + mAddDeviceLockedFlags = addDeviceLockedFlags; } public void addCallback(Callback callback) { @@ -125,11 +128,15 @@ public class ServiceListing { mServices.clear(); final int user = ActivityManager.getCurrentUser(); + int flags = PackageManager.GET_SERVICES | PackageManager.GET_META_DATA; + if (mAddDeviceLockedFlags) { + flags |= PackageManager.MATCH_DIRECT_BOOT_AWARE + | PackageManager.MATCH_DIRECT_BOOT_UNAWARE; + } + final PackageManager pmWrapper = mContext.getPackageManager(); List installedServices = pmWrapper.queryIntentServicesAsUser( - new Intent(mIntentAction), - PackageManager.GET_SERVICES | PackageManager.GET_META_DATA, - user); + new Intent(mIntentAction), flags, user); for (ResolveInfo resolveInfo : installedServices) { ServiceInfo info = resolveInfo.serviceInfo; @@ -186,6 +193,7 @@ public class ServiceListing { private String mIntentAction; private String mPermission; private String mNoun; + private boolean mAddDeviceLockedFlags = false; public Builder(Context context) { mContext = context; @@ -216,8 +224,19 @@ public class ServiceListing { return this; } + /** + * Set to true to add support for both MATCH_DIRECT_BOOT_AWARE and + * MATCH_DIRECT_BOOT_UNAWARE flags when querying PackageManager. Required to get results + * prior to the user unlocking the device for the first time. + */ + public Builder setAddDeviceLockedFlags(boolean addDeviceLockedFlags) { + mAddDeviceLockedFlags = addDeviceLockedFlags; + return this; + } + public ServiceListing build() { - return new ServiceListing(mContext, mTag, mSetting, mIntentAction, mPermission, mNoun); + return new ServiceListing(mContext, mTag, mSetting, mIntentAction, mPermission, mNoun, + mAddDeviceLockedFlags); } } } diff --git a/packages/SettingsLib/src/com/android/settingslib/core/instrumentation/MetricsFeatureProvider.java b/packages/SettingsLib/src/com/android/settingslib/core/instrumentation/MetricsFeatureProvider.java index 7ef080178a2fe5b8be90f6331b9e786a3df961b2..bd0b9e93b09dadaaebfe815982f2812acf6afb74 100644 --- a/packages/SettingsLib/src/com/android/settingslib/core/instrumentation/MetricsFeatureProvider.java +++ b/packages/SettingsLib/src/com/android/settingslib/core/instrumentation/MetricsFeatureProvider.java @@ -185,7 +185,12 @@ public class MetricsFeatureProvider { sourceMetricsCategory); } - private boolean logSettingsTileClick(String logKey, int sourceMetricsCategory) { + /** + * Logs an event when the setting key is clicked. + * + * @return true if the key is loggable, otherwise false + */ + public boolean logSettingsTileClick(String logKey, int sourceMetricsCategory) { if (TextUtils.isEmpty(logKey)) { // Not loggable return false; diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/instrumentation/MetricsFeatureProviderTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/instrumentation/MetricsFeatureProviderTest.java index 204a93333d812e226f8731536d0f1b0346ae1b5c..0e2a3cbbbd755317a49e77b51b81af6191b1008d 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/instrumentation/MetricsFeatureProviderTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/instrumentation/MetricsFeatureProviderTest.java @@ -218,4 +218,29 @@ public class MetricsFeatureProviderTest { assertThat(mProvider.getAttribution(activity)).isEqualTo(100); } + + @Test + public void logSettingsTileClick_hasKey_shouldLog() { + final String key = "abc"; + final boolean loggable = mProvider.logSettingsTileClick(key, + MetricsEvent.SETTINGS_GESTURES); + + assertThat(loggable).isTrue(); + verify(mLogWriter).action( + MetricsEvent.SETTINGS_GESTURES, + MetricsEvent.ACTION_SETTINGS_TILE_CLICK, + SettingsEnums.PAGE_UNKNOWN, + key, + 0); + } + + @Test + public void logSettingsTileClick_keyEmpty_shouldNotLog() { + final String key = ""; + boolean loggable = mProvider.logSettingsTileClick(key, + MetricsEvent.SETTINGS_GESTURES); + + assertThat(loggable).isFalse(); + verifyNoMoreInteractions(mLogWriter); + } } diff --git a/packages/SettingsProvider/Android.bp b/packages/SettingsProvider/Android.bp index d67bd8da844fd8d70d4e0f6597236e4e690cd8ff..9d042a4e15f66b7e837bd72959a367231160ed16 100644 --- a/packages/SettingsProvider/Android.bp +++ b/packages/SettingsProvider/Android.bp @@ -34,6 +34,7 @@ android_test { ], static_libs: [ "androidx.test.rules", + "mockito-target-minus-junit4", "SettingsLibDisplayDensityUtils", "platform-test-annotations", "truth-prebuilt", diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java index b6e31d26a0880c3a6acaf88bf65ac585d343fcb7..d023d98f2b73466818606afb61b6b7b8c384bdf7 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java @@ -48,6 +48,8 @@ import java.util.Locale; public class SettingsHelper { private static final String TAG = "SettingsHelper"; private static final String SILENT_RINGTONE = "_silent"; + private static final String SETTINGS_REPLACED_KEY = "backup_skip_user_facing_data"; + private static final String SETTING_ORIGINAL_KEY_SUFFIX = "_original"; private static final float FLOAT_TOLERANCE = 0.01f; private Context mContext; @@ -121,6 +123,10 @@ public class SettingsHelper { */ public void restoreValue(Context context, ContentResolver cr, ContentValues contentValues, Uri destination, String name, String value, int restoredFromSdkInt) { + if (isReplacedSystemSetting(name)) { + return; + } + // Will we need a post-restore broadcast for this element? String oldValue = null; boolean sendBroadcast = false; @@ -203,7 +209,32 @@ public class SettingsHelper { } } // Return the original value - return value; + return isReplacedSystemSetting(name) ? getRealValueForSystemSetting(name) : value; + } + + /** + * The setting value might have been replaced temporarily. If that's the case, return the real + * value instead of the temporary one. + */ + @VisibleForTesting + public String getRealValueForSystemSetting(String setting) { + return Settings.System.getString(mContext.getContentResolver(), + setting + SETTING_ORIGINAL_KEY_SUFFIX); + } + + @VisibleForTesting + public boolean isReplacedSystemSetting(String setting) { + // This list should not be modified. + if (!Settings.System.MASTER_MONO.equals(setting) + && !Settings.System.SCREEN_OFF_TIMEOUT.equals(setting)) { + return false; + } + // If this flag is set, values for the system settings from the list above have been + // temporarily replaced. We don't want to back up the temporary value or run restore for + // such settings. + // TODO(154822946): Remove this logic in the next release. + return Settings.Secure.getInt(mContext.getContentResolver(), SETTINGS_REPLACED_KEY, + /* def */ 0) != 0; } /** diff --git a/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java b/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java index 0dd7fb80379d0684a8992b787e8ce68943b14cb2..f5589d713bf729f5018af3d1ff2e659cf7fbd4a4 100644 --- a/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java +++ b/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java @@ -420,7 +420,6 @@ public class SettingsBackupTest { Settings.Global.RECOMMENDED_NETWORK_EVALUATOR_CACHE_EXPIRY_MS, Settings.Global.READ_EXTERNAL_STORAGE_ENFORCED_DEFAULT, Settings.Global.REQUIRE_PASSWORD_TO_DECRYPT, - Settings.Global.REQUIRE_SHORTCUTS_FOR_CONVERSATIONS, Settings.Global.SAFE_BOOT_DISALLOWED, Settings.Global.SELINUX_STATUS, Settings.Global.SELINUX_UPDATE_CONTENT_URL, diff --git a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsHelperTest.java b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsHelperTest.java index d112facc2b0ed6ad35657061d6c6134eb8279967..7baa2266756f6b9e6a980de9abdab627687647d0 100644 --- a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsHelperTest.java +++ b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsHelperTest.java @@ -18,18 +18,79 @@ package com.android.providers.settings; import static junit.framework.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.when; + +import android.content.ContentResolver; +import android.content.ContentValues; +import android.content.Context; +import android.media.AudioManager; +import android.net.Uri; import android.os.LocaleList; +import android.telephony.TelephonyManager; import androidx.test.runner.AndroidJUnit4; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; /** * Tests for the SettingsHelperTest */ @RunWith(AndroidJUnit4.class) public class SettingsHelperTest { + private static final String SETTING_KEY = "setting_key"; + private static final String SETTING_VALUE = "setting_value"; + private static final String SETTING_REAL_VALUE = "setting_real_value"; + + private SettingsHelper mSettingsHelper; + + @Mock private Context mContext; + @Mock private ContentResolver mContentResolver; + @Mock private AudioManager mAudioManager; + @Mock private TelephonyManager mTelephonyManager; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + when(mContext.getSystemService(eq(Context.AUDIO_SERVICE))).thenReturn(mAudioManager); + when(mContext.getSystemService(eq(Context.TELEPHONY_SERVICE))).thenReturn( + mTelephonyManager); + + mSettingsHelper = spy(new SettingsHelper(mContext)); + } + + @Test + public void testOnBackupValue_settingReplaced_returnsRealValue() { + when(mSettingsHelper.isReplacedSystemSetting(eq(SETTING_KEY))).thenReturn(true); + doReturn(SETTING_REAL_VALUE).when(mSettingsHelper).getRealValueForSystemSetting( + eq(SETTING_KEY)); + + assertEquals(SETTING_REAL_VALUE, mSettingsHelper.onBackupValue(SETTING_KEY, SETTING_VALUE)); + } + + @Test + public void testGetRealValue_settingNotReplaced_returnsSameValue() { + when(mSettingsHelper.isReplacedSystemSetting(eq(SETTING_KEY))).thenReturn(false); + + assertEquals(SETTING_VALUE, mSettingsHelper.onBackupValue(SETTING_KEY, SETTING_VALUE)); + } + + @Test + public void testRestoreValue_settingReplaced_doesNotRestore() { + when(mSettingsHelper.isReplacedSystemSetting(eq(SETTING_KEY))).thenReturn(true); + mSettingsHelper.restoreValue(mContext, mContentResolver, new ContentValues(), Uri.EMPTY, + SETTING_KEY, SETTING_VALUE, /* restoredFromSdkInt */ 0); + + verifyZeroInteractions(mContentResolver); + } + @Test public void testResolveLocales() throws Exception { // Empty string from backup server diff --git a/packages/SystemUI/Android.bp b/packages/SystemUI/Android.bp index f63365bcd369050c8411ed5df2bc4861423b6562..b55d246de65c6e02b8a559064488d4f2fd70565e 100644 --- a/packages/SystemUI/Android.bp +++ b/packages/SystemUI/Android.bp @@ -63,6 +63,8 @@ android_library { "androidx.lifecycle_lifecycle-extensions", "androidx.dynamicanimation_dynamicanimation", "androidx-constraintlayout_constraintlayout", + "kotlinx-coroutines-android", + "kotlinx-coroutines-core", "iconloader_base", "SystemUI-tags", "SystemUI-proto", diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/DetailAdapter.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/DetailAdapter.java index f6f8f53c07f2d5272b867fbb71d5c0e1703cfcae..d43aaf07c6be996b12ab313258dbe49d1d010461 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/DetailAdapter.java +++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/DetailAdapter.java @@ -19,6 +19,7 @@ import android.content.Intent; import android.view.View; import android.view.ViewGroup; +import com.android.internal.logging.UiEventLogger; import com.android.systemui.plugins.annotations.ProvidesInterface; @ProvidesInterface(version = DetailAdapter.VERSION) @@ -44,4 +45,18 @@ public interface DetailAdapter { default boolean hasHeader() { return true; } + + default UiEventLogger.UiEventEnum openDetailEvent() { + return INVALID; + } + + default UiEventLogger.UiEventEnum closeDetailEvent() { + return INVALID; + } + + default UiEventLogger.UiEventEnum moreSettingsEvent() { + return INVALID; + } + + UiEventLogger.UiEventEnum INVALID = () -> 0; } diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java index e586c38a286aef4d19bfea2d834580a00e66df8a..aeedc16ffbd4ed614c07b434dfe1d7e9e740312a 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java +++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java @@ -20,6 +20,7 @@ import android.graphics.drawable.Drawable; import android.metrics.LogMaker; import android.service.quicksettings.Tile; +import com.android.internal.logging.InstanceId; import com.android.systemui.plugins.annotations.DependsOn; import com.android.systemui.plugins.annotations.ProvidesInterface; import com.android.systemui.plugins.qs.QSTile.Callback; @@ -81,6 +82,18 @@ public interface QSTile { return logMaker; } + /** + * Return a string to be used to identify the tile in UiEvents. + */ + default String getMetricsSpec() { + return getClass().getSimpleName(); + } + + /** + * Return an {@link InstanceId} to be used to identify the tile in UiEvents. + */ + InstanceId getInstanceId(); + @ProvidesInterface(version = Callback.VERSION) public interface Callback { public static final int VERSION = 1; diff --git a/packages/SystemUI/res/drawable/control_spinner_background.xml b/packages/SystemUI/res/drawable/control_spinner_background.xml index 999a77c71bb2008ce9103d5af4ed1e0b805bcf46..7a8728d2983cfe8c9f9cc02aaf853f1585ddb804 100644 --- a/packages/SystemUI/res/drawable/control_spinner_background.xml +++ b/packages/SystemUI/res/drawable/control_spinner_background.xml @@ -16,7 +16,7 @@ diff --git a/packages/SystemUI/res/drawable/controls_list_divider_inset.xml b/packages/SystemUI/res/drawable/controls_list_divider_inset.xml new file mode 100644 index 0000000000000000000000000000000000000000..ddfa18c53db95f484336242c7da1ee877e3ed249 --- /dev/null +++ b/packages/SystemUI/res/drawable/controls_list_divider_inset.xml @@ -0,0 +1,20 @@ + + + diff --git a/packages/SystemUI/res/layout-land/auth_credential_password_view.xml b/packages/SystemUI/res/layout-land/auth_credential_password_view.xml new file mode 100644 index 0000000000000000000000000000000000000000..d89f329039c66e9b62b47347a8d3b99a7326f65c --- /dev/null +++ b/packages/SystemUI/res/layout-land/auth_credential_password_view.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/SystemUI/res/layout/auth_credential_password_view.xml b/packages/SystemUI/res/layout/auth_credential_password_view.xml index 45638ce5e74473dc17ef4f56cfe6ba337efadda2..1e0ce0026d8ee43b8fa7515d225cd0584a8756fa 100644 --- a/packages/SystemUI/res/layout/auth_credential_password_view.xml +++ b/packages/SystemUI/res/layout/auth_credential_password_view.xml @@ -55,7 +55,7 @@ android:layout_height="0dp" android:layout_weight="1"/> - + android:layout_marginBottom="4dp"> diff --git a/packages/SystemUI/res/layout/controls_more_item.xml b/packages/SystemUI/res/layout/controls_more_item.xml index 549874a31acdb1efc96110210598f3b4c79d6276..f24850e11e467a5675c4ea2bc6044c03d0a7bfde 100644 --- a/packages/SystemUI/res/layout/controls_more_item.xml +++ b/packages/SystemUI/res/layout/controls_more_item.xml @@ -18,6 +18,5 @@ style="@style/Control.MenuItem" android:layout_width="match_parent" android:layout_height="wrap_content" - android:padding="24dp" android:layout_gravity="start" /> diff --git a/packages/SystemUI/res/layout/controls_spinner_item.xml b/packages/SystemUI/res/layout/controls_spinner_item.xml index 45540f102de1db0eb53f49ec9f012ede82013ee3..574aed62ea8676349ec511a4ec0c9bc942a9347b 100644 --- a/packages/SystemUI/res/layout/controls_spinner_item.xml +++ b/packages/SystemUI/res/layout/controls_spinner_item.xml @@ -17,7 +17,8 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" - android:padding="8dp"> + android:paddingVertical="@dimen/control_spinner_padding_vertical" + android:paddingHorizontal="@dimen/control_spinner_padding_horizontal"> + android:layout_marginBottom="@dimen/controls_header_bottom_margin"> - + - - - - diff --git a/packages/SystemUI/res/layout/global_actions_grid_v2.xml b/packages/SystemUI/res/layout/global_actions_grid_v2.xml index fb57b47f63a083a7ed27e0b484e42f18d434aa3f..e4e9d2975220bec83e9679c46c616cd15cdfa36d 100644 --- a/packages/SystemUI/res/layout/global_actions_grid_v2.xml +++ b/packages/SystemUI/res/layout/global_actions_grid_v2.xml @@ -20,8 +20,6 @@ android:id="@android:id/list" android:layout_width="match_parent" android:layout_height="wrap_content" - android:paddingLeft="@dimen/global_actions_grid_horizontal_padding" - android:paddingRight="@dimen/global_actions_grid_horizontal_padding" android:paddingTop="@dimen/global_actions_grid_vertical_padding" android:paddingBottom="@dimen/global_actions_grid_vertical_padding" android:orientation="horizontal" diff --git a/packages/SystemUI/res/layout/global_screenshot.xml b/packages/SystemUI/res/layout/global_screenshot.xml index 94a6bc566e73ee82694aa72356302e2d7008d6aa..de19303b4948dc79a5d95d382f52ea92628c7923 100644 --- a/packages/SystemUI/res/layout/global_screenshot.xml +++ b/packages/SystemUI/res/layout/global_screenshot.xml @@ -14,60 +14,89 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - - + + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toEndOf="parent"/> + + app:layout_constraintHorizontal_bias="0" + app:layout_constraintWidth_percent="1.0" + app:layout_constraintWidth_max="wrap" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toEndOf="@+id/global_screenshot_preview" + app:layout_constraintEnd_toEndOf="parent"> + + android:contentDescription="@string/screenshot_preview_description" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toStartOf="parent"/> + android:contentDescription="@string/screenshot_dismiss_ui_description" + app:layout_constraintStart_toEndOf="@+id/global_screenshot_preview" + app:layout_constraintEnd_toEndOf="@+id/global_screenshot_preview" + app:layout_constraintTop_toTopOf="@+id/global_screenshot_preview" + app:layout_constraintBottom_toTopOf="@+id/global_screenshot_preview"> + android:src="@android:color/white"/> - - + diff --git a/packages/SystemUI/res/layout/global_screenshot_action_chip.xml b/packages/SystemUI/res/layout/global_screenshot_action_chip.xml index bd91ddb5f406ac37ff1162f721b9816ab335ecf1..e4ae7c1f58272ca0267843d6eb6d21f7fe3434a1 100644 --- a/packages/SystemUI/res/layout/global_screenshot_action_chip.xml +++ b/packages/SystemUI/res/layout/global_screenshot_action_chip.xml @@ -19,11 +19,11 @@ android:id="@+id/global_screenshot_action_chip" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginRight="@dimen/screenshot_action_chip_margin_right" + android:layout_marginEnd="@dimen/screenshot_action_chip_margin_right" android:layout_gravity="center" android:paddingVertical="@dimen/screenshot_action_chip_padding_vertical" android:background="@drawable/action_chip_background" - android:alpha="0" + android:alpha="0.0" android:gravity="center"> @@ -75,7 +77,10 @@ android:id="@+id/show_avatar_tip" android:layout_width="match_parent" android:layout_height="wrap_content" - android:padding="4dp" + android:paddingTop="8dp" + android:paddingBottom="8dp" + android:paddingStart="4dp" + android:paddingEnd="4dp" android:orientation="horizontal" > @@ -108,7 +113,10 @@ android:id="@+id/floating_bubble_tip" android:layout_width="match_parent" android:layout_height="wrap_content" - android:padding="4dp" + android:paddingTop="8dp" + android:paddingBottom="8dp" + android:paddingStart="4dp" + android:paddingEnd="4dp" android:orientation="horizontal" > @@ -123,13 +131,13 @@ @@ -140,7 +148,10 @@ android:id="@+id/ignore_dnd_tip" android:layout_width="match_parent" android:layout_height="wrap_content" - android:padding="4dp" + android:paddingTop="8dp" + android:paddingBottom="8dp" + android:paddingStart="4dp" + android:paddingEnd="4dp" android:orientation="horizontal" > @@ -155,13 +166,13 @@ @@ -173,7 +184,8 @@ android:id="@+id/button_container" android:layout_width="match_parent" android:layout_height="wrap_content" - android:padding="4dp" + android:paddingStart="4dp" + android:paddingEnd="4dp" android:orientation="horizontal" > - - "Skermopname" "Begin" "Stop" + + "Swiep op om programme te wissel" "Sleep regs om programme vinnig te wissel" "Wissel oorsig" @@ -712,6 +714,8 @@ "Verskyn boaan die gespreksafdeling en lyk soos \'n borrel." "Instellings" "Prioriteit" + + "Geen onlangse borrels nie" "Onlangse borrels en borrels wat toegemaak is, sal hier verskyn" "Hierdie kennisgewings kan nie gewysig word nie." @@ -1024,6 +1028,8 @@ "Kies kontroles om toegang vanaf die aan/af-kieslys te kry" "Hou en sleep om kontroles te herrangskik" "Alle kontroles is verwyder" + + "Die lys met alle kontroles kon nie gelaai word nie." "Ander" "Voeg by toestelkontroles" @@ -1032,6 +1038,7 @@ "Kontroles opgedateer" "PIN bevat letters of simbole" "Verifieer %s" + "Verkeerde PIN" "Verifieer tans …" "Voer PIN in" "Probeer \'n ander PIN" @@ -1041,6 +1048,9 @@ "Laai tans aanbevelings" "Maak hierdie mediasessie toe" "Onaktief, gaan program na" + "Fout, probeer tans weer …" + "Toestel is verwyder" + "Kan nie status laai nie" "Fout, probeer weer" "Besig" "Hou aan/af-skakelaar in om nuwe kontroles te sien" diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index d3dd22b2c8d8cd44249b41278fd26294a093d872..bc271198332da32071a7097d1702730e92b19585 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -430,6 +430,7 @@ "የማያ ገጽ ቀረጻ" "ጀምር" "አቁም" + "መሣሪያ" "መተግበሪያዎችን ለመቀየር ወደ ላይ ያንሸራትቱ" "መተግበሪያዎችን በፍጥነት ለመቀየር ወደ ቀኝ ይጎትቱ" "አጠቃላይ እይታን ቀያይር" @@ -712,6 +713,7 @@ "በውይይት ክፍል አናት ላይ ይታያል እና እንደ አረፋ ብቅ ይላል" "ቅንብሮች" "ቅድሚያ" + "%1$s ውይይት-ተኮር ቅንብሮችን አይደግፍም" "ምንም የቅርብ ጊዜ አረፋዎች የሉም" "የቅርብ ጊዜ አረፋዎች እና የተሰናበቱ አረፋዎች እዚህ ብቅ ይላሉ" "እነዚህ ማሳወቂያዎች ሊሻሻሉ አይችሉም።" @@ -1024,6 +1026,8 @@ "ከኃይል ምናሌ ላይ ለመድረስ መቆጣጠሪያዎችን ይምረጡ" "መቆጣጠሪያዎችን ዳግም ለማስተካከል ይያዙ እና ይጎትቱ" "ሁሉም መቆጣጠሪያዎች ተወግደዋል" + + "የሁሉም መቆጣጠሪያዎች ዝርዝር ሊጫን አልተቻለም።" "ሌላ" "ወደ የመሣሪያ መቆጣጠሪያዎች ያክሉ" @@ -1032,6 +1036,7 @@ "መቆጣጠሪያዎች ተዘምነዋል" "ፒን ፊደሎችን ወይም ምልክቶችን ይይዛል" "%s አረጋግጥ" + "የተሳሳተ ፒን" "በማረጋገጥ ላይ…" "ፒን ያስገቡ" "ሌላ ፒን ይሞክሩ" @@ -1041,6 +1046,9 @@ "ምክሮችን በመጫን ላይ" "ይህን የሚዲያ ክፍለ-ጊዜ ዝጋ" "ንቁ ያልኾነ፣ መተግበሪያን ይፈትሹ" + "ስህተት፣ እንደገና በመሞከር ላይ…" + "መሣሪያ ተወግዷል" + "ሁኔታን መጫን አልተቻልም" "ስህተት፣ እንደገና ይሞክሩ" "በሂደት ላይ" "አዲስ መቆጣጠሪያዎችን ለማየት የኃይል አዝራር ይያዙ" diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index dd108d0497fc5b8b999243dffe02b3ee796e007d..564ba0d7b86c059aae5754255872ffead9124a0a 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -438,6 +438,8 @@ "تسجيل الشاشة" "بدء" "إيقاف" + + "مرّر سريعًا لأعلى لتبديل التطبيقات" "اسحب لليسار للتبديل السريع بين التطبيقات" "تبديل \"النظرة العامة\"" @@ -724,6 +726,8 @@ "تظهر كفقاعة محادثة في أعلى قسم المحادثات" "الإعدادات" "الأولوية" + + "ليس هناك فقاعات محادثات" "ستظهر هنا أحدث فقاعات المحادثات وفقاعات المحادثات التي تم إغلاقها." "يتعذّر تعديل هذه الإشعارات." @@ -1048,6 +1052,8 @@ "اختيار عناصر التحكّم التي تريد الوصول إليها من قائمة التشغيل" "اضغط مع الاستمرار واسحب لإعادة ترتيب عناصر التحكّم." "تمت إزالة كل عناصر التحكّم." + + "تعذّر تحميل قائمة كل عناصر التحكّم." "غير ذلك" "إضافة إلى أدوات التحكم بالجهاز" @@ -1056,6 +1062,7 @@ "تم تعديل عناصر التحكّم." "يشتمل رقم التعريف الشخصي على أحرف أو رموز." "إثبات ملكية %s" + "رقم تعريف شخصي خاطئ" "جارٍ التحقّق…" "إدخال رقم التعريف الشخصي" "حاوِل إدخال رقم تعريف شخصي آخر" @@ -1065,6 +1072,9 @@ "جارٍ تحميل الاقتراحات" "إغلاق جلسة تشغيل الوسائط هذه" "غير نشط، تحقّق من التطبيق." + "حدث خطأ، جارٍ إعادة المحاولة…" + "تمت إزالة الجهاز." + "يتعذّر تحميل الحالة." "حدث خطأ، يُرجى إعادة المحاولة." "قيد التقدم" "اضغط مع الاستمرار على زر التشغيل لعرض عناصر التحكّم الجديدة." diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index 5e0f65c4b3b4e51cb049fedbd8f15eba34d54379..d9f8b7747d7cc038b099d65d88053e2148aa4e72 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -430,6 +430,8 @@ "স্ক্ৰীন ৰেকর্ড" "আৰম্ভ কৰক" "বন্ধ কৰক" + + "আনটো এপ্ ব্য়ৱহাৰ কৰিবলৈ ওপৰলৈ ছোৱাইপ কৰক" "খৰতকীয়াকৈ আনটো এপ্ ব্য়ৱহাৰ কৰিবলৈ সোঁফালে টানক" "অৱলোকন ট’গল কৰক" @@ -712,6 +714,8 @@ "বাৰ্তালাপ শাখাটোৰ শীৰ্ষত দেখুৱায় আৰু এটা বাবল হিচাপে প্ৰদর্শন হয়।" "ছেটিংসমূহ" "অগ্ৰাধিকাৰ" + + "কোনো শেহতীয়া bubbles নাই" "শেহতীয়া bubbles আৰু অগ্ৰাহ্য কৰা bubbles ইয়াত প্ৰদর্শিত হ\'ব" "এই জাননীসমূহ সংশোধন কৰিব নোৱাৰি।" @@ -999,8 +1003,7 @@ "যিকোনো সময়তে bubbles নিয়ন্ত্ৰণ কৰক" "এই এপ্‌টোৰ পৰা bubbles অফ কৰিবলৈ পৰিচালনা কৰকত টিপক" "বুজি পালোঁ" - - + "%1$s ছেটিংসমূহ" "ছিষ্টেম নেভিগেশ্বন আপডে’ট কৰা হ’ল। সলনি কৰিবলৈ ছেটিংসমূহ-লৈ যাওক।" "ছিষ্টেম নেভিগেশ্বন আপডে’ট কৰিবলৈ ছেটিংসমূহ-লৈ যাওক" "ষ্টেণ্ডবাই" @@ -1025,6 +1028,8 @@ "পাৱাৰ মেনুখনৰ পৰা এক্সেছ পাবলৈ নিয়ন্ত্ৰণসমূহ বাছনি কৰক" "নিয়ন্ত্ৰণসমূহ পুনৰ সজাবলৈ ধৰি ৰাখক আৰু টানি আনি এৰক" "সকলো নিয়ন্ত্ৰণ আঁতৰোৱা হৈছে" + + "নিয়ন্ত্ৰণসমূহৰ সম্পূর্ণ সূচীখন ল’ড কৰিব পৰা নগ’ল।" "অন্য" "ডিভাইচৰ নিয়ন্ত্ৰণসমূহত যোগ দিয়ক" @@ -1033,6 +1038,7 @@ "নিয়ন্ত্ৰণসমূহ আপডে\'ট কৰা হৈছে" "পিনত বৰ্ণ অথবা প্ৰতীকসমূহ থাকে" "%s সত্যাপন কৰক" + "ভুল পিন" "সত্যাপন কৰি থকা হৈছে…" "পিন দিয়ক" "অন্য এটা পিন ব্যৱহাৰ কৰি চাওক" @@ -1042,6 +1048,9 @@ "চুপাৰিছসমূহ ল’ড কৰি থকা হৈছে" "এই মিডিয়া ছেশ্বনটো বন্ধ কৰক" "সক্ৰিয় নহয়, এপ্‌টো পৰীক্ষা কৰক" + "আসোঁৱাহ, পুনৰ চেষ্টা কৰি আছে…" + "ডিভাইচটো আঁতৰোৱা হৈছে" + "স্থিতি ল’ড কৰিব নোৱাৰি" "আসোঁৱাহ হৈছে, আকৌ চেষ্টা কৰক" "চলি আছে" "নতুন নিয়ন্ত্ৰণসমূহ চাবলৈ পাৱাৰৰ বুটামটো ধৰি ৰাখক" diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index 708d79b6aed01fee4c91b05f5e94115cc1b54e19..50d4953959157b442279884d7d9d5ffab927e62f 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -430,6 +430,8 @@ "Ekran yazması" "Başlayın" "Dayandırın" + + "Tətbiqi dəyişmək üçün yuxarı sürüşdürün" "Tətbiqləri cəld dəyişmək üçün sağa çəkin" "İcmala Keçin" @@ -712,6 +714,8 @@ "Söhbət bölməsinin yuxarısında göstərilir və yumrucuq kimi görünür." "Ayarlar" "Prioritet" + + "Yumrucuqlar yoxdur" "Son yumrucuqlar və buraxılmış yumrucuqlar burada görünəcək" "Bu bildirişlər dəyişdirilə bilməz." @@ -1024,6 +1028,8 @@ "Enerji menyusundan daxil olacağınız nizamlayıcıları seçin" "Nizamlayıcıları yenidən tənzimləmək üçün tutub sürüşdürün" "Bütün nizamlayıcılar silindi" + + "Bütün nizamlayıcıların siyahısı yüklənmədi." "Digər" "Cihaz idarəetmələrinə əlavə edin" @@ -1032,6 +1038,7 @@ "Nizamlayıcılar güncəlləndi" "PIN hərflər və ya simvollar ehtiva edir" "%s cihazını doğrulayın" + "Yanlış PIN" "Doğrulanır…" "PIN daxil edin" "Başqa PIN\'i yoxlayın" @@ -1041,6 +1048,9 @@ "Tövsiyələr yüklənir" "Bu media sessiyasını bağlayın" "Aktiv deyil, tətbiqi yoxlayın" + "Xəta, yenidən cəhd edilir…" + "Cihaz silindi" + "Statusu yükləmək alınmadı" "Xəta, yenidən cəhd edin" "Davam edir" "Yeni nizamlayıcıları görmək üçün yandırıb-söndürmə düyməsinə basıb saxlayın" diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index 76e30cadad66d56f60a8b0dc3cc932c7816ab2da..d290521ec12316ad534ebe151816a02cbf2d45c2 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -432,6 +432,7 @@ "Snimak ekrana" "Počnite" "Zaustavite" + "Uređaj" "Prevucite nagore da biste menjali aplikacije" "Prevucite udesno da biste brzo promenili aplikacije" "Uključi/isključi pregled" @@ -715,6 +716,7 @@ "Prikazuje se u vrhu odeljka konverzacije i kao oblačić." "Podešavanja" "Prioritet" + "%1$s ne podržava podešavanja za konverzacije" "Nema nedavnih oblačića" "Ovde se prikazuju nedavni i odbačeni oblačići" "Ova obaveštenja ne mogu da se menjaju." @@ -1030,6 +1032,7 @@ "Odaberite kontrole kojima ćete pristupati iz menija napajanja" "Zadržite i prevucite da biste promenili raspored kontrola" "Sve kontrole su uklonjene" + "Promene nisu sačuvane" "Učitavanje liste svih kontrola nije uspelo." "Drugo" "Dodajte u kontrole uređaja" @@ -1038,6 +1041,7 @@ "Kontrole su ažurirane" "PIN sadrži slova ili simbole" "Verifikujte: %s" + "Pogrešan PIN" "Verifikuje se…" "Unesite PIN" "Probajte pomoću drugog PIN-a" @@ -1047,6 +1051,9 @@ "Učitavaju se preporuke" "Zatvorite ovu sesiju medija" "Neaktivno. Vidite aplikaciju" + "Greška, pokušava se ponovo…" + "Uređaj je uklonjen" + "Učitavanje statusa nije uspelo" "Greška. Probajte ponovo" "U toku" "Zadržite dugme za uključivanje da biste videli nove kontrole" diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index 40c083e98936eff7e697cf9331f34e33792de7f8..ca3f2dbd741212cc401eae2c7aac2df381803d86 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -434,6 +434,8 @@ "Запіс экрана" "Пачаць" "Спыніць" + + "Правядзіце ўверх, каб пераключыць праграмы" "Каб хутка пераключыцца паміж праграмамі, перацягніце ўправа" "Уключыць/выключыць агляд" @@ -718,6 +720,8 @@ "Паказваецца ўверсе раздзела размоў у выглядзе ўсплывальнага апавяшчэння." "Налады" "Прыярытэт" + + "Няма нядаўніх усплывальных апавяшчэнняў" "Нядаўнія і адхіленыя ўсплывальныя апавяшчэнні будуць паказаны тут" "Гэтыя апавяшчэнні нельга змяніць." @@ -1036,6 +1040,8 @@ "Выберыце элементы кіравання, да якіх вы хочаце мець доступ з меню сілкавання" "Каб змяніць парадак элементаў кіравання, утрымлівайце і перацягвайце іх" "Усе элементы кіравання выдалены" + + "Не ўдалося загрузіць спіс усіх сродкаў кіравання." "Іншае" "Дадаць у элементы кіравання прыладай" @@ -1044,6 +1050,7 @@ "Элементы кіравання абноўлены" "PIN-код складаецца з літар або знакаў" "Спраўдзіце прыладу \"%s\"" + "Няправільны PIN-код" "Ідзе спраўджванне…" "Увядзіце PIN-код" "Паспрабуйце іншы PIN-код" @@ -1053,6 +1060,9 @@ "Загружаюцца рэкамендацыі" "Закрыць гэты сеанс мультымедыя" "Неактыўна, праверце праграму" + "Памылка, паўторная спроба…" + "Прылада выдалена" + "Не ўдалося загрузіць стан" "Памылка, паўтарыце спробу" "Выконваецца" "Каб убачыць новыя элементы кіравання, утрымлівайце кнопку сілкавання націснутай" diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index 4393f95242727233ad52ef6ac50db80708ca193d..7108f792163e6f8270a2f83287c0b4b6f112ea41 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -430,6 +430,7 @@ "Записване на екрана" "Старт" "Стоп" + "Устройство" "Прекарайте пръст нагоре, за да превключите между приложенията" "Плъзнете надясно за бързо превключване между приложенията" "Превключване на общия преглед" @@ -712,6 +713,7 @@ "Показва се като балонче в горната част на секцията с разговори." "Настройки" "Приоритет" + "%1$s не поддържа свързаните с разговорите настройки" "Няма скорошни балончета" "Скорошните и отхвърлените балончета ще се показват тук" "Тези известия не могат да бъдат променяни." @@ -1024,6 +1026,8 @@ "Избиране на контроли, които да са достъпни в менюто за захранване" "Задръжте и плъзнете, за да пренаредите контролите" "Всички контроли са премахнати" + + "Списъкът с всички контроли не бе зареден." "Друго" "Добавяне към контролите за устройството" @@ -1032,6 +1036,7 @@ "Контролите са актуализирани" "ПИН кодът съдържа букви или символи" "Потвърждаване на %s" + "Грешен ПИН код" "Потвърждава се…" "Въведете ПИН кода" "Опитайте с друг ПИН код" @@ -1041,6 +1046,9 @@ "Препоръките се зареждат" "Затваряне на тази сесия за мултимедия" "Неактивно, проверете прилож." + "Грешка. Извършва се нов опит…" + "Устройството бе премахнато" + "Състоян. не може да се зареди" "Грешка. Опитайте отново" "В ход" "Задръжте бутона за захранване, за да видите новите контроли" diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index 452a4aead149e9e28084adc78b8ccb577742875e..a2a8689179e37a54149e827bbe8bfa8fc4f1b8fb 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -430,6 +430,8 @@ "স্ক্রিন রেকর্ড" "শুরু করুন" "বন্ধ করুন" + + "অন্য অ্যাপে যেতে উপরের দিকে সোয়াইপ করুন" "একটি অ্যাপ ছেড়ে দ্রুত অন্য অ্যাপে যেতে ডান দিকে টেনে আনুন" "\'এক নজরে\' বৈশিষ্ট্যটি চালু বা বন্ধ করুন" @@ -712,6 +714,8 @@ "কথোপকথন বিভাগের উপরে বাবল হিসেবে দেখা যায়।" "সেটিংস" "অগ্রাধিকার" + + "কোনও সাম্প্রতিক বাবল নেই" "সাম্প্রতিক ও বাতিল করা বাবল এখানে দেখা যাবে" "এই বিজ্ঞপ্তিগুলি পরিবর্তন করা যাবে না।" @@ -999,8 +1003,7 @@ "যেকোনও সময় বাবল নিয়ন্ত্রণ করুন" "এই অ্যাপ থেকে বাবল বন্ধ করতে ম্যানেজ করুন বিকল্প ট্যাপ করুন" "বুঝেছি" - - + "%1$s সেটিংস" "সিস্টেম নেভিগেশন আপডেট হয়েছে। পরিবর্তন করার জন্য সেটিংসে যান।" "সিস্টেম নেভিগেশন আপডেট করতে সেটিংসে যান" "স্ট্যান্ডবাই" @@ -1025,6 +1028,8 @@ "যেসব কন্ট্রোল অ্যাক্সেস করতে চান সেগুলি পাওয়ার মেনু থেকে বেছে নিন" "কন্ট্রোলগুলিকে আবার সাজানোর জন্য ধরে রেখে টেনে আনুন" "সমস্ত কন্ট্রোল সরানো হয়েছে" + + "সব কন্ট্রোলের তালিকা লোড করা যায়নি।" "অন্য" "ডিভাইস কন্ট্রোলে যোগ করুন" @@ -1033,6 +1038,7 @@ "কন্ট্রোল আপডেট করা হয়েছে" "পিন-এ অক্ষর বা চিহ্ন রয়েছে" "%s যাচাই করুন" + "ভুল পিন" "যাচাই করা হচ্ছে…" "পিন লিখুন" "আরেকটি পিন লিখে চেষ্টা করুন" @@ -1042,6 +1048,9 @@ "সাজেশন লোড করা হচ্ছে" "এই মিডিয়া সেশন বেছে নিন" "বন্ধ আছে, অ্যাপ চেক করুন" + "সমস্যা, আবার চেষ্টা করা হচ্ছে…" + "ডিভাইস সরিয়ে দেওয়া হয়েছে" + "স্ট্যাটাস লোড করা যাচ্ছে না" "সমস্যা হয়েছে, আবার চেষ্টা করুন" "চলছে" "নতুন কন্ট্রোল দেখতে পাওয়ার বোতাম টিপে ধরে থাকুন" diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index 28dda35c178e03b371a85047e75c397ad2e88315..91b19d72e61507707712f3e124756dbdde860d37 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -432,6 +432,7 @@ "Snimanje ekrana" "Započnite" "Zaustavite" + "Uređaj" "Prevucite prema gore za promjenu aplikacije" "Prevucite udesno za brzu promjenu aplikacija" "Pregled uključivanja/isključivanja" @@ -717,6 +718,7 @@ "Prikazuje se na vrhu odjeljka za razgovor u vidu oblačića." "Postavke" "Prioritet" + "Aplikacija %1$s ne podržava postavke karakteristične za razgovor" "Nema nedavnih oblačića" "Nedavni i odbačeni oblačići će se pojaviti ovdje" "Ta obavještenja se ne mogu izmijeniti." @@ -1032,6 +1034,8 @@ "Izaberite kontrole za pristup iz menija napajanja" "Držite i prevucite da preuredite kontrole" "Sve kontrole su uklonjene" + + "Učitavanje liste svih kontrola nije uspjelo." "Drugo" "Dodajte u kontrole uređaja" @@ -1040,6 +1044,7 @@ "Kontrole su ažurirane" "PIN sadrži slova ili simbole" "Potvrdite %s" + "Pogrešan PIN" "Potvrđivanje…" "Unesite PIN" "Pokušajte s drugim PIN-om" @@ -1049,6 +1054,9 @@ "Učitavanje preporuka" "Zatvori ovu medijsku sesiju" "Neaktivno, vidite aplikaciju" + "Greška, ponovni pokušaj…" + "Uređaj je uklonjen" + "Nije moguće učitati status" "Greška, pokušajte ponovo" "U toku" "Zadržite dugme za uključivanje da vidite nove kontrole" diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index 1d08662b3e0a551a155def635217328c8acdde31..cb4d21574e67537301062a9417ab80355aee7181 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -430,6 +430,8 @@ "Gravació de pantalla" "Inicia" "Atura" + + "Llisca cap amunt per canviar d\'aplicació" "Arrossega el dit cap a la dreta per canviar ràpidament d\'aplicació" "Activa o desactiva Aplicacions recents" @@ -712,6 +714,8 @@ "Es mostra com a bombolla a la part superior de la secció de converses." "Configuració" "Prioritat" + + "No hi ha bombolles recents" "Les bombolles recents i les ignorades es mostraran aquí" "Aquestes notificacions no es poden modificar." @@ -1024,6 +1028,8 @@ "Selecciona els controls per accedir-hi des del menú d\'engegada" "Mantén premut i arrossega per reorganitzar els controls" "S\'han suprimit tots els controls" + + "No s\'ha pogut carregar la llista completa de controls." "Altres" "Afegeix als controls de dispositius" @@ -1032,6 +1038,7 @@ "S\'han actualitzat els controls" "El PIN conté lletres o símbols" "Verifica %s" + "PIN incorrecte" "S\'està verificant…" "Introdueix el PIN" "Prova un altre PIN" @@ -1041,6 +1048,9 @@ "Carregant les recomanacions" "Tanca aquesta sessió multimèdia" "Inactiu; comprova l\'aplicació" + "Error. S\'està tornant a provar…" + "El dispositiu s\'ha suprimit" + "No es pot carregar l\'estat" "Error; torna-ho a provar" "En curs" "Mantén premut el botó d\'engegada per veure controls nous" diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index 15fff738979159e3f83bb31c76d934f9d4185c35..3b0f340b9718d45c25ce25bd865a1f45e2eb4340 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -434,6 +434,7 @@ "Záznam obrazovky" "Spustit" "Ukončit" + "Zařízení" "Přejetím nahoru přepnete aplikace" "Přetažením doprava rychle přepnete aplikace" "Přepnout přehled" @@ -718,6 +719,7 @@ "Zobrazuje se v horní části sekce konverzace a má podobu bubliny." "Nastavení" "Priorita" + "Aplikace %1$s nepodporuje specifická nastavení pro konverzaci" "Žádné nedávné bubliny" "Zde se budou zobrazovat nedávné bubliny a zavřené bubliny" "Tato oznámení nelze upravit." @@ -1036,6 +1038,8 @@ "Vyberte ovládací prvky, které budou zobrazeny v nabídce vypínače" "Ovládací prvky můžete uspořádat podržením a přetažením" "Všechny ovládací prvky byly odstraněny" + + "Načtení seznamu všech ovládacích prvků se nezdařilo." "Jiné" "Přidání ovládání zařízení" @@ -1044,6 +1048,7 @@ "Ovládací prvky aktualizovány" "Kód PIN obsahuje písmena nebo symboly" "Ověření zařízení %s" + "Chybný PIN" "Ověřování…" "Zadejte PIN" "Zkuste jiný PIN" @@ -1053,6 +1058,9 @@ "Načítání doporučení" "Zavřít tuto mediální relaci" "Neaktivní, zkontrolujte aplikaci" + "Chyba. Nový pokus…" + "Zařízení bylo odebráno" + "Stav nelze načíst" "Chyba, zkuste to znovu" "Probíhá" "Nové ovládací prvky zobrazíte podržením vypínače" diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index f228e802437b6fdf07a45cfb21e6229c17a0d002..2bc0e25f521066a6eab19f21f375078dbef042a5 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -33,7 +33,7 @@ "Enheden kan ikke oplades via USB" "Brug den oplader, der fulgte med din enhed" "Indstillinger" - "Vil du slå Batterisparefunktion til?" + "Vil du aktivere Batterisparefunktion?" "Om Batterisparefunktion" "Aktivér" "Aktivér batterisparefunktion" @@ -430,6 +430,7 @@ "Optag skærm" "Start" "Stop" + "Enhed" "Stryg opad for at skifte apps" "Træk til højre for hurtigt at skifte app" "Slå Oversigt til/fra" @@ -712,6 +713,7 @@ "Vises som en boble øverst i samtalesektionen." "Indstillinger" "Prioritet" + "%1$s understøtter ikke samtalespecifikke indstillinger" "Ingen seneste bobler" "Nye bobler og afviste bobler vises her" "Disse notifikationer kan ikke redigeres." @@ -961,7 +963,7 @@ "Erstat" "Apps, der kører i baggrunden" "Tryk for at se info om batteri- og dataforbrug" - "Vil du slå mobildata fra?" + "Vil du deaktivere mobildata?" "Du vil ikke have data- eller internetadgang via %s. Der vil kun være adgang til internettet via Wi-Fi." "dit mobilselskab" "Indstillinger kan ikke bekræfte dit svar, da en app dækker for en anmodning om tilladelse." @@ -1024,6 +1026,8 @@ "Vælg, hvilke indstillinger der skal være i menuen for afbryderknappen" "Flyt rundt på styringselementer ved at holde dem nede og trække" "Alle styringselementerne blev fjernet" + + "Listen over styringselementer kunne ikke indlæses." "Andre" "Føj til enhedsstyring" @@ -1032,6 +1036,7 @@ "Betjeningselementerne er opdateret" "Pinkoden indeholder bogstaver eller symboler" "Bekræft %s" + "Forkert pinkode" "Bekræfter…" "Angiv pinkode" "Prøv en anden pinkode" @@ -1041,6 +1046,9 @@ "Indlæser anbefalinger" "Luk denne mediesession" "Inaktiv. Tjek appen" + "Fejl. Prøver igen…" + "Enheden er fjernet" + "Statussen kan ikke indlæses" "Der opstod en fejl. Prøv igen" "I gang" "Hold afbryderknappen nede for at se nye betjeningselementer" diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index 31837eded54a59f479812214b8451df9968dcd9b..3efafecd55850525372ae693e177877391caac68 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -430,6 +430,8 @@ "Bildschirmaufnahme" "Starten" "Beenden" + + "Nach oben wischen, um Apps zu wechseln" "Zum schnellen Wechseln der Apps nach rechts ziehen" "Übersicht ein-/ausblenden" @@ -712,6 +714,8 @@ "Wird oben im Bereich für Unterhaltungen als Bubble angezeigt." "Einstellungen" "Priorität" + + "Keine kürzlich geschlossenen Bubbles" "Hier werden aktuelle und geschlossene Bubbles angezeigt" "Diese Benachrichtigungen können nicht geändert werden." @@ -999,8 +1003,7 @@ "Bubble-Einstellungen festlegen" "Tippe auf \"Verwalten\", um Bubbles für diese App zu deaktivieren" "OK" - - + "Einstellungen für %1$s" "Systemsteuerungseinstellungen wurden angepasst. Änderungen kannst du in den Einstellungen vornehmen." "Gehe zu den Einstellungen, um die Systemsteuerung anzupassen" "Standby" @@ -1025,6 +1028,8 @@ "Karten auswählen, auf die man über das Ein-/Aus-Menü zugreifen kann" "Zum Verschieben von Steuerelementen halten und ziehen" "Alle Steuerelemente entfernt" + + "Fehler beim Laden der Liste mit Steuerelementen." "Andere" "Zur Gerätesteuerung hinzufügen" @@ -1033,6 +1038,7 @@ "Gerätekarten aktualisiert" "Die PIN enthält Buchstaben oder Symbole" "%s bestätigen" + "Falsche PIN" "Wird geprüft…" "PIN eingeben" "Andere PIN ausprobieren" @@ -1042,6 +1048,9 @@ "Empfehlungen werden geladen" "Diese Mediensitzung schließen" "Inaktiv – sieh in der App nach" + "Fehler. Neuer Versuch…" + "Gerät entfernt" + "Status kann nicht geladen werden" "Fehler – versuch es noch mal" "Läuft" "Zum Anzeigen der Karten für neue Geräte Ein-/Aus-Taste gedrückt halten" diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index c1df6d54e2f638020f0cc9d64acdecd0f3155e4b..f9ac3f21dd8c93b2d9d8b72bc6ed3b821a9391b0 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -430,6 +430,7 @@ "Εγγραφή οθόνης" "Έναρξη" "Διακοπή" + "Συσκευή" "Σύρετε προς τα επάνω για εναλλαγή των εφαρμογών" "Σύρετε προς τα δεξιά για γρήγορη εναλλαγή εφαρμογών" "Εναλλαγή επισκόπησης" @@ -712,6 +713,7 @@ "Εμφανίζεται στο επάνω μέρος της ενότητας συζήτησης ως συννεφάκι." "Ρυθμίσεις" "Προτεραιότητα" + "Η εφαρμογή %1$s δεν υποστηρίζει ρυθμίσεις για συγκεκριμένη συνομιλία" "Δεν υπάρχουν πρόσφατα συννεφάκια" "Τα πρόσφατα συννεφάκια και τα συννεφάκια που παραβλέψατε θα εμφανίζονται εδώ." "Δεν είναι δυνατή η τροποποίηση αυτών των ειδοποιήσεων" @@ -1024,6 +1026,8 @@ "Επιλέξτε τα στοιχεία ελέγχου στα οποία θα έχετε πρόσβαση από το μενού λειτουργίας." "Κρατήστε και σύρετε για αναδιάταξη των στοιχείων ελέγχου" "Όλα τα στοιχεία ελέγχου καταργήθηκαν" + + "Ανεπιτυχής φόρτωση λίστας όλων των στοιχ. ελέγχου." "Άλλο" "Προσθήκη στα στοιχεία ελέγχου συσκευής" @@ -1032,6 +1036,7 @@ "Ενημέρωση στοιχείων ελέγχου" "Το PIN περιέχει γράμματα ή σύμβολα" "Επαλήθευση %s" + "Λάθος PIN" "Επαλήθευση…" "Εισαγωγή PIN" "Δοκιμάστε άλλο PIN." @@ -1041,6 +1046,9 @@ "Φόρτωση προτάσεων" "Κλείσιμο αυτής της περιόδου λειτουργίας μέσων." "Ανενεργό, έλεγχος εφαρμογής" + "Προέκυψε σφάλμα. Επανάληψη…" + "Η συσκευή καταργήθηκε" + "Αδυναμία φόρτωσης κατάστασης" "Σφάλμα, προσπαθήστε ξανά." "Σε εξέλιξη" "Πατήστε το κουμπί λειτουργίας για να δείτε νέα στοιχεία ελέγχου." diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index b4c380b4794a602b289b38bd861971ad3fc8f8dc..bf276a97ce1dbb1afedd790de150512288182029 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -430,6 +430,7 @@ "Screen record" "Start" "Stop" + "Device" "Swipe up to switch apps" "Drag right to quickly switch apps" "Toggle Overview" @@ -712,6 +713,7 @@ "Shows at top of conversation section and appears as a bubble." "Settings" "Priority" + "%1$s does not support conversation-specific settings" "No recent bubbles" "Recent bubbles and dismissed bubbles will appear here" "These notifications can\'t be modified." @@ -1024,6 +1026,8 @@ "Choose controls to access from the power menu" "Hold and drag to rearrange controls" "All controls removed" + + "The list of all controls could not be loaded." "Other" "Add to device controls" @@ -1032,6 +1036,7 @@ "Controls updated" "PIN contains letters or symbols" "Verify %s" + "Wrong PIN" "Verifying…" "Enter PIN" "Try another PIN" @@ -1041,6 +1046,9 @@ "Loading recommendations" "Close this media session" "Inactive, check app" + "Error, retrying…" + "Device removed" + "Can’t load status" "Error, try again" "In progress" "Hold Power button to see new controls" diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml index c719ea022478126d54c89e2bbff7b468e3148672..fccdffef9134d329a6f5b52260b90c1553afec11 100644 --- a/packages/SystemUI/res/values-en-rCA/strings.xml +++ b/packages/SystemUI/res/values-en-rCA/strings.xml @@ -430,6 +430,7 @@ "Screen record" "Start" "Stop" + "Device" "Swipe up to switch apps" "Drag right to quickly switch apps" "Toggle Overview" @@ -712,6 +713,7 @@ "Shows at top of conversation section and appears as a bubble." "Settings" "Priority" + "%1$s does not support conversation-specific settings" "No recent bubbles" "Recent bubbles and dismissed bubbles will appear here" "These notifications can\'t be modified." @@ -1024,6 +1026,8 @@ "Choose controls to access from the power menu" "Hold and drag to rearrange controls" "All controls removed" + + "The list of all controls could not be loaded." "Other" "Add to device controls" @@ -1032,6 +1036,7 @@ "Controls updated" "PIN contains letters or symbols" "Verify %s" + "Wrong PIN" "Verifying…" "Enter PIN" "Try another PIN" @@ -1041,6 +1046,9 @@ "Loading recommendations" "Close this media session" "Inactive, check app" + "Error, retrying…" + "Device removed" + "Can’t load status" "Error, try again" "In progress" "Hold Power button to see new controls" diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index b4c380b4794a602b289b38bd861971ad3fc8f8dc..bf276a97ce1dbb1afedd790de150512288182029 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -430,6 +430,7 @@ "Screen record" "Start" "Stop" + "Device" "Swipe up to switch apps" "Drag right to quickly switch apps" "Toggle Overview" @@ -712,6 +713,7 @@ "Shows at top of conversation section and appears as a bubble." "Settings" "Priority" + "%1$s does not support conversation-specific settings" "No recent bubbles" "Recent bubbles and dismissed bubbles will appear here" "These notifications can\'t be modified." @@ -1024,6 +1026,8 @@ "Choose controls to access from the power menu" "Hold and drag to rearrange controls" "All controls removed" + + "The list of all controls could not be loaded." "Other" "Add to device controls" @@ -1032,6 +1036,7 @@ "Controls updated" "PIN contains letters or symbols" "Verify %s" + "Wrong PIN" "Verifying…" "Enter PIN" "Try another PIN" @@ -1041,6 +1046,9 @@ "Loading recommendations" "Close this media session" "Inactive, check app" + "Error, retrying…" + "Device removed" + "Can’t load status" "Error, try again" "In progress" "Hold Power button to see new controls" diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index b4c380b4794a602b289b38bd861971ad3fc8f8dc..bf276a97ce1dbb1afedd790de150512288182029 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -430,6 +430,7 @@ "Screen record" "Start" "Stop" + "Device" "Swipe up to switch apps" "Drag right to quickly switch apps" "Toggle Overview" @@ -712,6 +713,7 @@ "Shows at top of conversation section and appears as a bubble." "Settings" "Priority" + "%1$s does not support conversation-specific settings" "No recent bubbles" "Recent bubbles and dismissed bubbles will appear here" "These notifications can\'t be modified." @@ -1024,6 +1026,8 @@ "Choose controls to access from the power menu" "Hold and drag to rearrange controls" "All controls removed" + + "The list of all controls could not be loaded." "Other" "Add to device controls" @@ -1032,6 +1036,7 @@ "Controls updated" "PIN contains letters or symbols" "Verify %s" + "Wrong PIN" "Verifying…" "Enter PIN" "Try another PIN" @@ -1041,6 +1046,9 @@ "Loading recommendations" "Close this media session" "Inactive, check app" + "Error, retrying…" + "Device removed" + "Can’t load status" "Error, try again" "In progress" "Hold Power button to see new controls" diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml index 2e5f1e726879a155a738e59d615317d41857fc68..74dfa34d4b8524f02970f041e8737fa61985f618 100644 --- a/packages/SystemUI/res/values-en-rXC/strings.xml +++ b/packages/SystemUI/res/values-en-rXC/strings.xml @@ -430,6 +430,7 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‎‎‎‏‏‎‎‏‏‏‏‏‎‏‎‎‏‎‏‏‏‎‎‎‎‏‎‎‎‏‏‎‏‎‏‎‎‏‎‎‏‎‎‎Screen Record‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‏‏‏‎‏‏‎‏‎‏‎‎‎‏‏‎‎‎‏‏‎‎‎‎‏‎‏‎‏‎‎‎‏‏‏‎‎‏‏‏‎‏‏‏‎‎‎‏‎‏‏‎‎‏‎‎‏‎Start‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‎‎‎‏‏‏‏‎‎‎‎‎‎‏‎‎‎‏‎‏‎‎‎‏‎‎‎‎‎‏‏‏‎‏‏‎‎‏‎‏‎‎‎‎‎‎‎‎‏‏‏‎‏‎‏‏‏‎Stop‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‎‎‏‏‏‎‏‎‎‏‏‏‏‎‎‏‏‎‎‎‎‎‎‎‎‎‎‏‎‎‏‎‏‏‎‏‏‏‏‎‎‎‎‎‎‎‏‎‎‏‎‎‏‎‎‎‎‎Device‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‏‎‎‏‎‎‎‏‏‏‎‎‏‏‎‎‎‏‏‏‎‎‎‎‏‏‎‎‏‏‏‎‎‎‏‎‎‎‏‏‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‎Swipe up to switch apps‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‎‏‎‏‎‎‎‎‏‎‎‏‎‎‏‎‏‎‎‏‏‎‎‎‎‎‎‏‎‎‎‎‏‏‎‏‎‏‏‏‏‏‎‏‏‎‎‎‎‎‎‏‎‎‎‎‎‎Drag right to quickly switch apps‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‏‏‏‎‎‎‎‏‎‎‎‏‏‏‏‎‎‎‎‎‏‏‎‎‏‏‎‏‏‎‏‎‏‎‎‏‎‏‏‏‎‎‏‏‎‎‏‏‏‎‎‏‎‎‎‏‏‎Toggle Overview‎‏‎‎‏‎" @@ -712,6 +713,7 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‏‎‏‎‏‎‎‎‎‏‏‎‏‏‏‎‎‏‎‎‎‎‏‎‏‎‏‎‎‏‏‎‎‏‎‏‎‎‎‏‏‏‏‏‎‏‏‏‏‎‏‏‏‎‎Shows at top of conversation section and appears as a bubble.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‏‎‏‏‏‎‎‎‏‏‏‏‏‎‏‎‏‏‏‏‏‎‎‎‎‎‏‏‎‎‎‏‏‏‎‎‎‎‏‎‏‏‏‏‏‏‎‎‏‏‏‏‏‎‎‏‏‎Settings‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‎‏‏‎‏‏‏‎‎‏‎‎‏‏‏‎‎‎‎‏‏‎‎‎‏‏‏‏‏‎‏‏‎‎‎‎‎‏‎‏‎‎‏‏‏‎‎‏‏‎‏‎‎‎‏‎‏‎Priority‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‏‏‎‎‏‎‏‏‏‏‎‎‏‏‎‏‏‎‎‏‎‎‏‏‏‏‏‏‎‏‎‎‏‎‏‏‏‏‎‎‎‏‏‎‎‏‏‎‎‎‏‏‎‎‎‏‎‎‎‏‎‎‏‏‎%1$s‎‏‎‎‏‏‏‎ does not support conversation specific settings‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‏‎‏‎‎‏‏‎‎‏‎‎‏‎‎‏‎‎‎‏‏‏‎‏‎‏‎‎‎‏‎‏‎‏‎‎‏‎‎‏‎‎‏‎‎‎‎‏‏‎‎‏‏‏‎‏‎‎No recent bubbles‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‎‎‎‏‎‏‏‏‏‎‎‎‏‏‏‎‏‏‎‎‏‎‎‎‏‏‏‏‎‏‎‏‎‏‎‎‏‎‏‎‏‎‏‎‎‎‏‎‎‎‏‏‏‎‏‎‏‎Recent bubbles and dismissed bubbles will appear here‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‎‏‏‎‎‎‏‎‎‏‏‏‎‎‎‏‎‏‎‎‏‏‎‏‏‏‎‎‎‎‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‏‎‏‎‏‎‎‎These notifications can\'t be modified.‎‏‎‎‏‎" @@ -1024,6 +1026,7 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‏‎‏‎‎‏‏‏‏‎‎‎‏‏‎‎‏‏‎‏‎‏‏‎‏‎‏‏‎‎‎‏‏‏‏‏‎‎‏‎‎‎‎‏‎‏‎‎‏‎‏‏‎‏‎‎‎Choose controls to access from the power menu‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‏‏‏‎‎‏‏‎‏‏‎‏‏‎‎‎‏‏‏‎‎‏‎‎‎‏‏‎‏‎‏‏‎‏‎‎‎‏‎‏‎‏‎‎‏‎‎‏‏‎‏‏‏‏‏‎Hold & drag to rearrange controls‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‏‎‎‏‏‏‎‏‏‏‎‎‏‎‏‏‏‏‏‏‎‎‏‏‏‎‏‏‎‎‏‏‏‏‏‎‎‏‎‏‎‎‏‎‎‎‏‏‎‏‏‏‏‏‎‎‎‎All controls removed‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‎‎‏‏‏‎‏‎‎‏‎‏‏‎‏‎‎‏‏‏‎‎‏‎‏‏‎‎‎‎‎‏‎‎‎‏‏‏‏‎‎‎‏‎‏‏‎‏‏‎‏‏‎‏‎‏‏‎Changes not saved‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‏‎‎‏‎‎‏‏‏‏‏‎‎‏‎‎‏‏‏‎‎‎‎‏‏‎‎‏‏‏‏‎‏‎‏‎‏‏‏‎‎‎‏‎‎‎‎‎‏‏‎‏‏‎‏‎‎‎The list of all controls could not be loaded.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‎‎‏‎‎‏‏‎‎‏‎‏‏‎‎‎‏‏‎‏‏‎‏‏‎‏‎‏‏‏‏‏‎‏‎‎‏‏‎‎‎‎‏‎‏‏‎‎‎‎‏‎‎‎Other‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‎‏‎‎‎‎‏‏‎‎‎‎‎‎‏‎‎‎‎‏‏‎‎‎‏‏‎‏‎‏‎‎‎‏‏‎‎‎‏‏‎‎‏‏‎‏‎‏‎‏‎‏‏‏‎‏‎‎Add to device controls‎‏‎‎‏‎" @@ -1032,6 +1035,7 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‎‎‏‎‎‎‏‏‏‎‏‏‏‎‏‎‎‏‏‎‎‎‎‏‎‎‎‏‏‏‎‎‎‎‏‏‎‏‏‏‎‎‎‏‏‎‎‏‎‎‎‏‎‏‏‏‎Controls updated‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‎‏‎‎‏‎‎‏‏‏‎‏‎‎‏‎‎‏‎‎‏‏‎‎‎‏‎‎‏‏‏‏‏‎‎‏‎‎‏‎‎‎‎‏‎‏‏‎‏‏‏‏‎‎PIN contains letters or symbols‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‏‏‏‏‎‏‎‏‎‏‎‏‏‏‎‏‏‏‎‎‏‎‎‎‎‎‏‎‏‎‏‎‏‏‎‎‏‏‎‏‏‏‏‏‏‏‏‎‏‏‏‎‏‏‏‏‎‎Verify ‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‎‎‎‎‏‏‎‎‏‎‎‏‎‎‏‏‎‎‏‎‏‏‏‏‎‏‏‎‏‎‏‏‏‎‎‏‏‎‏‏‏‏‎‏‏‏‏‏‏‏‏‎‎‏‏‎Wrong PIN‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‎‎‎‎‏‏‏‎‎‏‎‎‏‏‎‏‎‎‏‏‎‏‏‏‎‏‎‏‎‏‎‎‎‏‏‏‏‏‎‎‏‎‎‏‎‎‏‏‎‏‎‏‎‎‎‏‎‎Verifying…‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‎‎‏‎‎‏‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‎‎‏‎‏‏‏‏‎‎‏‎‎‎‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‎Enter PIN‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‏‏‎‏‏‏‏‎‏‏‏‏‎‏‎‏‏‏‏‎‏‏‏‎‏‎‏‎‎‎‏‏‏‎‏‎‏‏‎‎‏‎‎‏‏‏‏‎‎‏‏‏‎‎‏‏‎‎Try another PIN‎‏‎‎‏‎" @@ -1041,6 +1045,9 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‎‎‎‎‏‏‎‏‎‎‏‏‎‏‎‏‏‎‏‎‏‏‎‏‏‏‏‏‎‎‏‎‎‏‎‏‎‏‏‏‎‎‎‏‎‎‏‎‎‎‏‎‏‎‏‎‎‎Loading recommendations‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‎‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‎‎‏‏‏‎‏‎‏‎‎‏‏‏‏‏‏‏‎‏‎‎‎‎‏‎‎‏‏‏‏‎‎‏‎Close this media session‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‎‎‎‎‎‏‎‏‏‎‎‎‏‏‏‎‎‎‏‏‏‎‏‎‎‎‏‎‏‎‏‎‎‏‏‏‏‎‏‏‎‏‎‎‎‎‏‎‎‏‏‏‏‏‏‎‎Inactive, check app‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‏‏‏‏‏‏‎‏‏‎‏‎‎‎‏‎‏‏‏‏‎‏‏‎‎‏‏‏‎‎‎‏‏‎‏‏‎‏‎‏‏‎‎‎‎‎‎‏‏‏‏‎‎‏‏‎‎Error, retrying…‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‏‎‏‏‎‏‎‏‏‎‏‎‎‏‏‎‏‎‏‏‎‎‎‏‎‏‏‏‏‎‏‎‏‏‏‎‏‏‎‏‏‏‎‏‏‏‏‏‏‏‏‎‏‏‏‎‏‎Device removed‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‎‏‏‏‎‎‏‎‎‎‏‎‏‎‏‎‏‎‏‎‎‏‏‎‎‎‏‎‎‎‏‎‏‏‏‎‎‏‎‎‎‎‎‏‎‏‎‏‏‎‎‎‏‏‎‎‏‎Can’t load status‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‏‎‏‎‏‎‎‏‏‎‏‏‎‏‎‏‎‏‏‎‏‏‏‎‎‎‎‎‏‏‏‏‎‏‎‎‏‎‏‏‎‎‎‏‏‏‎‎‏‎‎‏‏‏‏‎‏‎Error, try again‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‏‎‏‎‏‏‎‏‎‏‏‎‏‎‏‎‏‎‏‎‎‏‎‏‎‏‎‎‎‎‏‎‎‎‎‎‏‏‎‏‎‏‏‏‎‏‎‏‏‎‎‎‎‎‎‏‏‎In progress‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‎‎‏‏‎‏‎‏‎‎‏‎‎‎‎‎‏‎‏‏‎‎‎‏‏‎‏‎‏‎‎‎‏‎‏‏‏‏‎‏‏‏‏‎‎‎‎‏‏‎‏‏‏‏‎‏‎Hold Power button to see new controls‎‏‎‎‏‎" diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index 53dda2fe729f4ac9d1773fa0333aacef3916781a..97ead2c95982a9496e89b27bfbab3bd33d79ea4a 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -430,6 +430,8 @@ "Grabar pantalla" "Iniciar" "Detener" + + "Desliza el dedo hacia arriba para cambiar de app" "Arrastra a la derecha para cambiar aplicaciones rápidamente" "Ocultar o mostrar Recientes" @@ -712,6 +714,8 @@ "Aparece como una burbuja en la parte superior de la sección de la conversación." "Configuración" "Prioridad" + + "No hay burbujas recientes" "Las burbujas recientes y las que se descartaron aparecerán aquí" "No se pueden modificar estas notificaciones." @@ -1024,6 +1028,8 @@ "Elige los controles a los que quieres acceder desde el menú de encendido" "Mantén presionado y arrastra para reorganizar los controles" "Se quitaron todos los controles" + + "No se cargó la lista completa de controles." "Otros" "Agregar a controles de dispositivos" @@ -1032,6 +1038,7 @@ "Controles actualizados" "El PIN contiene letras o símbolos" "Verificar %s" + "PIN incorrecto" "Verificando…" "Ingresa el PIN" "Probar con otro PIN" @@ -1041,6 +1048,9 @@ "Cargando recomendaciones" "Cerrar esta sesión multimedia" "Inactivo. Verifica la app" + "Hubo un error. Reintentando…" + "Se quitó el dispositivo" + "No se pudo cargar el estado" "Error. Vuelve a intentarlo." "En curso" "Mantén presionado el botón de encendido para ver los nuevos controles" diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 01fdb37efde983a955e95cacb0dfc6ae2ab19883..f1b2b37692f41d9df2278ce69b3f5db056353890 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -430,6 +430,8 @@ "Grabación de la pantalla" "Inicio" "Detener" + + "Desliza el dedo hacia arriba para cambiar de aplicación" "Arrastra hacia la derecha para cambiar rápidamente de aplicación" "Mostrar u ocultar aplicaciones recientes" @@ -712,6 +714,8 @@ "Aparece en la parte superior de la sección de una conversación en forma de burbuja." "Ajustes" "Prioridad" + + "No hay burbujas recientes" "Las burbujas recientes y las cerradas aparecerán aquí" "Estas notificaciones no se pueden modificar." @@ -1024,6 +1028,8 @@ "Elige los controles a los que acceder desde el menú de encendido" "Mantén pulsado y arrastra un control para reubicarlo" "Todos los controles quitados" + + "No se ha podido cargar la lista de los controles." "Otros" "Añadir a control de dispositivos" @@ -1032,6 +1038,7 @@ "Controles actualizados" "El PIN contiene letras o símbolos" "Verificar %s" + "PIN incorrecto" "Verificando…" "Introduce el PIN" "Prueba con otro PIN" @@ -1041,6 +1048,9 @@ "Cargando recomendaciones" "Cerrar esta sesión multimedia" "Inactivo, comprobar aplicación" + "Error; reintentando…" + "Dispositivo quitado" + "No se ha podido cargar el estado" "Se ha producido un error. Vuelve a intentarlo." "En curso" "Mantén pulsado el botón de encendido para ver los controles nuevos" diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml index 5966e0d7930c70f1e0b40351bfce3aca01de09d7..6fe4bf28ea1a01ee5fd2ab1bab79dd6fef9fe178 100644 --- a/packages/SystemUI/res/values-et/strings.xml +++ b/packages/SystemUI/res/values-et/strings.xml @@ -430,6 +430,7 @@ "Ekraanisalvestus" "Alustage" "Peatage" + "Seade" "Rakenduste vahetamiseks pühkige üles" "Lohistage paremale, et rakendusi kiiresti vahetada" "Lehe Ülevaade sisse- ja väljalülitamine" @@ -712,6 +713,7 @@ "Kuvatakse vestluste jaotise ülaosas mullina." "Seaded" "Prioriteet" + "%1$s ei toeta vestluspõhiseid seadeid" "Hiljutisi mulle pole" "Siin kuvatakse hiljutised ja suletud mullid." "Neid märguandeid ei saa muuta." @@ -1024,6 +1026,8 @@ "Valige toitemenüüs saadaolevad juhtelemendid" "Juhtnuppude ümberpaigutamiseks hoidke neid all ja lohistage" "Kõik juhtnupud eemaldati" + + "Kõikide juhtelementide loendit ei saanud laadida." "Muu" "Seadmete juhtimisvidinate hulka lisamine" @@ -1032,6 +1036,7 @@ "Juhtelemente värskendati" "PIN-kood sisaldab tähti või sümboleid" "Kinnitage %s" + "Vale PIN-kood" "Kinnitamine …" "Sisestage PIN-kood" "Proovige muud PIN-koodi" @@ -1041,6 +1046,9 @@ "Soovituste laadimine" "Sulge see meediaseanss" "Passiivne, vaadake rakendust" + "Viga, proovitakse uuesti …" + "Seade on eemaldatud" + "Olekut ei saa laadida" "Ilmnes viga, proovige uuesti" "Pooleli" "Uute juhtelementide vaatamiseks hoidke all toitenuppu" diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index 1d90e929fbae3399010a6b64b383e2cccefbafd9..30e4eec50abf2e2f5055a075eecef35026018aa9 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -430,6 +430,8 @@ "Pantaila-grabaketa" "Hasi" "Gelditu" + + "Egin gora aplikazioa aldatzeko" "Arrastatu eskuinera aplikazioa azkar aldatzeko" "Aldatu ikuspegi orokorra" @@ -709,9 +711,11 @@ "Arreta erakartzen du soinua eta dardara eginda." "Arreta erakartzen du soinua eta dardara eginda. Modu lehenetsian, %1$s aplikazioko elkarrizketak burbuila gisa agertzen dira." "Eduki honetarako lasterbide gainerakor bat eskaintzen dizu, arretarik gal ez dezazun." - "Elkarrizketa-atalaren goialdean agertzen da, burbuila gisa." + "Elkarrizketen atalaren goialdean agertzen da, burbuila gisa." "Ezarpenak" "Lehentasuna" + + "Ez dago azkenaldiko burbuilarik" "Azken burbuilak eta baztertutakoak agertuko dira hemen" "Jakinarazpen horiek ezin dira aldatu." @@ -1024,6 +1028,8 @@ "Aukeratu itzaltzeko menutik atzitu nahi dituzun kontrolatzeko aukerak" "Kontrolatzeko aukerak antolatzeko, eduki itzazu sakatuta, eta arrastatu" "Kontrolatzeko aukera guztiak kendu dira" + + "Ezin izan da kargatu kontrol guztien zerrenda." "Beste bat" "Gehitu gailuak kontrolatzeko widgetetan" @@ -1032,6 +1038,7 @@ "Eguneratu dira kontrolatzeko aukerak" "PIN kodeak hizkiak edo ikurrak ditu" "Egiaztatu %s" + "PIN okerra" "Egiaztatzen…" "Idatzi PIN kodea" "Saiatu beste PIN kode batekin" @@ -1041,6 +1048,9 @@ "Gomendioak kargatzen" "Itxi multimedia-saio hau" "Inaktibo; egiaztatu aplikazioa" + "Errorea. Berriro saiatzen…" + "Gailua kendu da" + "Ezin da kargatu egoera" "Errorea. Saiatu berriro." "Abian" "Eduki sakatuta etengailua kontrolatzeko aukera berriak ikusteko" diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index 2b2959e22825c59c3f8509b5fa29c484735f2fbc..a65cc3700c4f18dea323075f0de1204f25db845c 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -430,6 +430,7 @@ "ضبط کردن صفحه‌نمایش" "شروع" "توقف" + "دستگاه" "برای تغییر برنامه‌ها،‌ تند به بالا بکشید" "برای جابه‌جایی سریع میان برنامه‌ها، به چپ بکشید" "تغییر وضعیت نمای کلی" @@ -712,6 +713,7 @@ "در بالای بخش مکالمه نمایش داده می‌شود و به‌صورت ابزارک اعلان نمایان می‌شود." "تنظیمات" "اولویت" + "%1$s از تنظیمات خاص مکالمه پشتیبانی نمی‌کند" "هیچ ابزارک اعلان جدیدی وجود ندارد" "ابزارک اعلان اخیر و ابزارک اعلان ردشده اینجا ظاهر خواهند شد" "این اعلان‌ها قابل اصلاح نیستند." @@ -1024,6 +1026,8 @@ "برای دسترسی از منوی روشن/خاموش، کنترل‌ها را انتخاب کنید" "برای تغییر دادن ترتیب کنترل‌ها، آن‌ها را نگه دارید و بکشید" "همه کنترل‌ها برداشته شده‌اند" + + "فهرست همه کنترل‌ها را نمی‌توان بارگیری کرد." "موارد دیگر" "افزودن به کنترل‌های دستگاه" @@ -1032,6 +1036,7 @@ "کنترل‌ها به‌روزرسانی شد" "پین شامل حروف یا نماد است" "تأیید %s" + "پین اشتباه است" "درحال به تأیید رساندن…" "پین را وارد کنید" "پین دیگری را امتحان کنید" @@ -1041,6 +1046,9 @@ "درحال بار کردن توصیه‌ها" "بستن این جلسه رسانه" "غیرفعال، برنامه را بررسی کنید" + "خطا، درحال تلاش مجدد…" + "دستگاه برداشته شد" + "وضعیت بارگیری نشد" "خطا، دوباره امتحان کنید" "درحال انجام" "برای دیدن کنترل‌های جدید، دکمه روشن/خاموش را پایین نگه دارید" diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 4bab845eaf3820680232515ef9e449c5c50bd370..56a43cffea732f1d5ef07fac3dc848f7d96c6385 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -430,6 +430,8 @@ "Näytön tallentaminen" "Aloita" "Lopeta" + + "Vaihda sovellusta pyyhkäisemällä ylös" "Vaihda sovellusta nopeasti vetämällä oikealle" "Näytä/piilota viimeisimmät" @@ -712,6 +714,8 @@ "Näkyy keskusteluosion yläosassa kuplana" "Asetukset" "Tärkeä" + + "Ei viimeaikaisia kuplia" "Viimeaikaiset ja äskettäin ohitetut kuplat näkyvät täällä" "Näitä ilmoituksia ei voi muokata" @@ -1024,6 +1028,8 @@ "Valitse säätimet, joita käytetään virtavalikosta" "Järjestele säätimiä koskettamalla pitkään ja vetämällä" "Kaikki säätimet poistettu" + + "Kaikkien säätimien luetteloa ei voitu ladata." "Muu" "Lisää laitteiden hallintaan" @@ -1032,6 +1038,7 @@ "Säätimet päivitetty" "PIN-koodi sisältää kirjaimia tai symboleja" "Vahvista %s" + "Väärä PIN-koodi" "Vahvistetaan…" "Lisää PIN-koodi" "Kokeile toista PIN-koodia" @@ -1041,6 +1048,9 @@ "Ladataan suosituksia" "Sulje tämä median käyttökerta" "Epäaktiivinen, tarkista sovellus" + "Virhe, yritetään uudelleen…" + "Laite poistettu" + "Tilaa ei voi ladata" "Virhe, yritä uudelleen" "Käynnissä" "Paina virtapainiketta pitkään nähdäksesi uudet säätimet" diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index 6917db510491d03e21b14f9cf6a5006867d44957..9376fea4fd18c2eab3e992b6dea0e83f088ab949 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -430,6 +430,8 @@ "Enregistrement d\'écran" "Démarrer" "Arrêter" + + "Balayez vers le haut pour changer d\'application" "Balayez l\'écran vers la droite pour changer rapidement d\'application" "Basculer l\'aperçu" @@ -712,6 +714,8 @@ "S\'affiche en haut de la section des conversations sous forme de bulle." "Paramètres" "Priorité" + + "Aucune bulle récente" "Les bulles récentes et les bulles ignorées s\'afficheront ici" "Ces notifications ne peuvent pas être modifiées" @@ -1024,6 +1028,8 @@ "Sélectionnez les commandes auxquelles vous souhaitez accéder à partir du menu de l\'interrupteur" "Maintenez le doigt sur l\'écran, puis glissez-le pour réorganiser les commandes" "Toutes les commandes ont été supprimées" + + "Impossible de charger la liste des commandes." "Autre" "Ajouter aux commandes de contrôle des appareils" @@ -1032,6 +1038,7 @@ "Commandes mises à jour" "Le NIP contient des lettres ou des symboles" "Vérifier %s" + "NIP incorrect" "Vérification en cours…" "Entrez le NIP" "Essayez un autre NIP" @@ -1041,6 +1048,9 @@ "Chargement des recommandations…" "Fermer cette session multimédia" "Délai expiré, vérifiez l\'appli" + "Erreur, nouvelle tentative…" + "Appareil supprimé" + "Impossible de charger l\'état" "Erreur. Veuillez réessayer." "En cours" "Maintenez enfoncé l\'interrupteur pour afficher les nouvelles commandes" diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index 8ef8334acdbcc53ec134257749acb28692026ae0..e6bc8093606cb122b4df77eb0271a65612d6c2f1 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -430,6 +430,8 @@ "Enregistrement de l\'écran" "Démarrer" "Arrêter" + + "Balayer l\'écran vers le haut pour changer d\'application" "Déplacer vers la droite pour changer rapidement d\'application" "Activer/Désactiver l\'aperçu" @@ -712,6 +714,8 @@ "S\'affiche en haut de la section des conversations et apparaît sous forme de bulle." "Paramètres" "Prioritaire" + + "Aucune bulle récente" "Les bulles récentes et ignorées s\'afficheront ici" "Impossible de modifier ces notifications." @@ -1024,6 +1028,8 @@ "Sélectionnez les commandes auxquelles vous souhaitez accéder depuis le menu de démarrage" "Appuyer et faire glisser pour réorganiser les commandes" "Toutes les commandes ont été supprimées" + + "Impossible de charger toutes les commandes." "Autre" "Ajouter aux commandes de contrôle des appareils" @@ -1032,6 +1038,7 @@ "Commandes mises à jour" "Le code contient des lettres ou des symboles" "Valider %s" + "Code incorrect" "Validation…" "Saisissez le code" "Essayez un autre code PIN" @@ -1041,6 +1048,9 @@ "Chargement des recommandations" "Fermer cette session multimédia" "Délai expiré, vérifier l\'appli" + "Erreur. Nouvelle tentative…" + "Appareil supprimé" + "Impossible de charger l\'état" "Erreur. Veuillez réessayer." "En cours" "Appuyez de manière prolongée sur le bouton Marche/Arrêt pour afficher les nouvelles commandes" diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index bb5ee8e78593541cb90bfa5c1af1437e9d13b9ed..f9e65e3702d9ff5b0cdf5ca93d421753dea292c8 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -430,6 +430,8 @@ "Gravación da pantalla" "Iniciar" "Deter" + + "Pasar o dedo cara arriba para cambiar de aplicación" "Arrastra cara á dereita para cambiar de aplicacións rapidamente" "Activar/desactivar Visión xeral" @@ -712,6 +714,8 @@ "Móstrase na parte superior da sección da conversa en forma de burbulla." "Configuración" "Prioridade" + + "Non hai burbullas recentes" "As burbullas recentes e ignoradas aparecerán aquí." "Estas notificacións non se poden modificar." @@ -1024,6 +1028,8 @@ "Escolle os controis para acceder desde o menú de acendido" "Para reorganizar os controis, mantenos premidos e arrástraos" "Quitáronse todos os controis" + + "Non se puido cargar a lista de todos os controis." "Outra" "Engadir ao control de dispositivos" @@ -1032,6 +1038,7 @@ "Actualizáronse os controis" "O PIN contén letras ou símbolos" "Verificar %s" + "O PIN é incorrecto" "Verificando…" "Escribe o PIN" "Proba con outro PIN" @@ -1041,6 +1048,9 @@ "Cargando recomendacións" "Pechar esta sesión multimedia" "Inactivo. Comproba a app" + "Erro. Tentando de novo…" + "Quitouse o dispositivo" + "Non se puido cargar o estado" "Erro. Téntao de novo" "En curso" "Mantén premido o botón de acendido para ver os novos controis" diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index fb539003ae40d465caa0882049bfab022ec0261a..b9b237213bb80d5414af29da5dd90fa50efca391 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -430,6 +430,8 @@ "સ્ક્રીન રેકૉર્ડ કરો" "શરૂ કરો" "રોકો" + + "ઍપ સ્વિચ કરવા માટે ઉપરની તરફ સ્વાઇપ કરો" "ઍપને ઝડપથી સ્વિચ કરવા માટે જમણે ખેંચો" "ઝલકને ટૉગલ કરો" @@ -712,6 +714,8 @@ "વાતચીત વિભાગની ટોચ પર બતાવે છે અને બબલ તરીકે દેખાય છે." "સેટિંગ" "પ્રાધાન્યતા" + + "તાજેતરના કોઈ બબલ નથી" "એકદમ નવા બબલ અને છોડી દીધેલા બબલ અહીં દેખાશે" "આ નોટિફિકેશનમાં કોઈ ફેરફાર થઈ શકશે નહીં." @@ -1024,6 +1028,8 @@ "પાવર મેનૂમાંથી ઍક્સેસ કરવા માટેના નિયંત્રણોને પસંદ કરો" "નિયંત્રણોને ફરીથી ગોઠવવા માટે તેમને હોલ્ડ કરીને ખેંચો" "બધા નિયંત્રણો કાઢી નાખ્યા" + + "બધા નિયંત્રણોની સૂચિ લોડ કરી શકાઈ નથી." "અન્ય" "ડિવાઇસનાં નિયંત્રણોમાં ઉમેરો" @@ -1032,6 +1038,7 @@ "નિયંત્રણ અપડેટ કર્યા" "પિનમાં અક્ષરો અથવા પ્રતીકોનો સમાવેશ થાય છે" "%sને ચકાસો" + "ખોટો પિન" "ચકાસી રહ્યાં છીએ…" "પિન દાખલ કરો" "બીજા પિનને અજમાવી જુઓ" @@ -1041,6 +1048,9 @@ "સુઝાવ લોડ કરી રહ્યાં છીએ" "આ મીડિયા સત્રને બંધ કરો" "નિષ્ક્રિય, ઍપને ચેક કરો" + "ભૂલ, ફરી પ્રયાસ કરી રહ્યા છીએ…" + "ડિવાઇસ કાઢી નાખ્યું" + "સ્ટેટસ લોડ કરી શકાતું નથી" "ભૂલ, ફરીથી પ્રયાસ કરો" "પ્રક્રિયા ચાલુ છે" "નવા નિયંત્રણ જોવા માટે પાવર બટનને દબાવી રાખો" diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index 19799839e7a9a389612b89b5f3407b1773446a90..ac89c0cefdd4082bd87229018c9df23eb266a70c 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -432,6 +432,8 @@ "स्क्रीन रिकॉर्ड" "शुरू करें" "रोकें" + + "ऐप्लिकेशन बदलने के लिए ऊपर स्वाइप करें" "ऐप्लिकेशन को झटपट स्विच करने के लिए उसे दाईं ओर खींचें और छोड़ें" "खास जानकारी टॉगल करें" @@ -714,6 +716,8 @@ "यह बातचीत सेक्शन में सबसे ऊपर और एक बबल के तौर पर दिखती है." "सेटिंग" "प्राथमिकता" + + "हाल ही के बबल्स मौजूद नहीं हैं" "हाल ही के बबल्स और हटाए गए बबल्स यहां दिखेंगे" "ये सूचनाएं नहीं बदली जा सकती हैं." @@ -1026,6 +1030,8 @@ "पावर मेन्यू से ऐक्सेस करने के लिए कंट्रोल चुनें" "कंट्रोल का क्रम फिर से बदलने के लिए उन्हें दबाकर रखें और खींचें" "सभी कंट्रोल हटा दिए गए" + + "सभी कंट्रोल की सूची लोड नहीं हो सकी." "अन्य" "डिवाइस कंट्रोल में जोड़ें" @@ -1034,6 +1040,7 @@ "कंट्रोल अपडेट किए गए" "पिन में अक्षर या चिह्न शामिल होते हैं" "%s की पुष्टि करें" + "गलत पिन" "पुष्टि की जा रही है…" "पिन डालें" "कोई और पिन आज़माएं" @@ -1043,6 +1050,9 @@ "सुझाव लोड हो रहे हैं" "इस मीडिया सेशन को बंद करें" "काम नहीं कर रहा, ऐप जांचें" + "कोई गड़बड़ी हुई, फिर से कोशिश की जा रही है…" + "डिवाइस हटाया गया" + "स्थिति लोड नहीं की जा सकती" "गड़बड़ी हुई, फिर से कोशिश करें" "जारी है" "नए कंट्रोल देखने के लिए पावर बटन दबाकर रखें" diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index 7bcb22eceae8e88154e3804e2012791984c20118..6e77cd107b07d82a120f5cf4e5e1c8d39d35e426 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -432,6 +432,7 @@ "Snimač zaslona" "Početak" "Zaustavi" + "Uređaj" "Prijeđite prstom prema gore da biste promijenili aplikaciju" "Povucite udesno da biste brzo promijenili aplikaciju" "Uključivanje/isključivanje pregleda" @@ -715,6 +716,7 @@ "Prikazuje se pri vrhu odjeljka razgovora kao oblačić." "Postavke" "Prioritet" + "%1$s ne podržava postavke koje se odnose na razgovor" "Nema nedavnih oblačića" "Ovdje će se prikazivati nedavni i odbačeni oblačići" "Te se obavijesti ne mogu izmijeniti." @@ -1030,6 +1032,8 @@ "Odaberite kontrole kojima želite pristupati iz izbornika napajanja" "Zadržite i povucite da biste promijenili raspored kontrola" "Sve su kontrole uklonjene" + + "Popis svih kontrola nije se učitao." "Drugo" "Dodavanje kontrolama uređaja" @@ -1038,6 +1042,7 @@ "Kontrole su ažurirane" "PIN sadrži slova ili simbole" "Potvrdite uređaj %s" + "Pogrešan PIN" "Potvrđivanje…" "Unesite PIN" "Pokušajte s drugim PIN-om" @@ -1047,6 +1052,9 @@ "Učitavanje preporuka" "Zatvorite ovu medijsku sesiju" "Neaktivno, provjerite aplik." + "Pogreška, pokušavamo ponovo…" + "Uređaj je uklonjen" + "Status se ne može učitati" "Pogreška, pokušajte ponovo" "U tijeku" "Zadržite tipku za uključivanje/isključivanje za prikaz novih kontrola" diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index 521ca575525e203d24c0045316bd9cdc14634ede..34cc36beec9211b53014c42479712efc14a4be6b 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -430,6 +430,8 @@ "Képernyő rögzítése" "Kezdés" "Leállítás" + + "Váltás az alkalmazások között felfelé csúsztatással" "Húzza jobbra az ujját az alkalmazások közötti gyors váltáshoz" "Áttekintés be- és kikapcsolása" @@ -712,6 +714,8 @@ "A beszélgetések szakaszának tetején, buborékként jelenik meg." "Beállítások" "Prioritás" + + "Nincsenek buborékok a közelmúltból" "A legutóbbi és az elvetett buborékok itt jelennek majd meg" "Ezeket az értesítéseket nem lehet módosítani." @@ -1024,6 +1028,8 @@ "A bekapcsológomb menüjéből hozzáférhető vezérlők kiválasztása" "Tartsa lenyomva, és húzza a vezérlők átrendezéséhez" "Minden vezérlő eltávolítva" + + "Nem sikerült betölteni az összes vezérlő listáját." "Más" "Hozzáadás az eszközvezérlőkhöz" @@ -1032,6 +1038,7 @@ "Vezérlők frissítve" "A PIN-kód betűket vagy szimbólumokat tartalmaz" "%s ellenőrzése" + "Helytelen PIN-kód" "Ellenőrzés…" "PIN-kód megadása" "Próbálkozzon másik PIN-kóddal" @@ -1041,6 +1048,9 @@ "Javaslatok betöltése…" "Médiamunkamenet bezárása" "Inaktív, ellenőrizze az appot" + "Hiba, újrapróbálkozás…" + "Eszköz eltávolítva" + "Állapot betöltése sikertelen" "Hiba történt. Próbálja újra." "Folyamatban" "Az új vezérlők megtekintéséhez tartsa nyomva a bekapcsológombot" diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index 93f0001f625c6fc098937cc0b7aceffe14051f38..a87761ae5b55c41b4a09f2f218fde6b7b298d5de 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -430,6 +430,8 @@ "Էկրանի ձայնագրում" "Սկսել" "Կանգնեցնել" + + "Սահեցրեք վերև՝ մյուս հավելվածին անցնելու համար" "Քաշեք աջ՝ հավելվածների միջև անցնելու համար" "Միացնել/անջատել համատեսքը" @@ -712,6 +714,8 @@ "Ցուցադրվում է «Խոսակցություններ» բաժնում և հայտնվում է ամպիկի տեսքով։" "Կարգավորումներ" "Կարևոր" + + "Վերջին ամպիկներ չկան" "Այստեղ կցուցադրվեն վերջերս օգտագործված և փակված ամպիկները, որոնք կկարողանաք հեշտությամբ վերաբացել" "Այս ծանուցումները չեն կարող փոփոխվել:" @@ -1024,6 +1028,8 @@ "Ընտրեք կառավարման տարրերը՝ դրանք սնուցման ընտրացանկից բացելու համար" "Պահեք և քաշեք՝ կառավարման տարրերը վերադասավորելու համար" "Կառավարման բոլոր տարրերը հեռացվեցին" + + "Չհաջողվեց բեռնել բոլոր կառավարների ցանկը։" "Այլ" "Ավելացրեք սարքերի կառավարման տարրերում" @@ -1032,6 +1038,7 @@ "Կառավարման տարրերը թարմացվեցին" "PIN կոդը տառեր և նշաններ է պարունակում" "Ստուգել %s սարքը" + "PIN կոդը սխալ է" "Ստուգում…" "Մուտքագրեք PIN կոդը" "Փորձեք մեկ այլ PIN կոդ" @@ -1041,6 +1048,9 @@ "Բեռնման խորհուրդներ" "Փակել աշխատաշրջանը" "Ակտիվ չէ, ստուգեք հավելվածը" + "Սխալ. նորից ենք փորձում…" + "Սարքը հեռացված է" + "Չհաջողվեց բեռնել կարգավիճակը" "Սխալ առաջացավ։ Նորից փորձեք։" "Ընթացքի մեջ է" "Սեղմած պահեք սնուցման կոճակը՝ կառավարման նոր տարրերը տեսնելու համար։" diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index ac011a3dfc8f68db1524480d4f3d566407fc979b..82dd783c26954ea42a462b041d9d29856cc14de2 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -430,6 +430,7 @@ "Rekaman Layar" "Mulai" "Berhenti" + "Perangkat" "Geser ke atas untuk beralih aplikasi" "Tarik ke kanan untuk beralih aplikasi dengan cepat" "Aktifkan Ringkasan" @@ -712,6 +713,7 @@ "Muncul di atas bagian percakapan dan ditampilkan sebagai balon." "Setelan" "Prioritas" + "%1$s tidak mendukung setelan khusus percakapan" "Tidak ada balon baru-baru ini" "Balon yang baru dipakai dan balon yang telah ditutup akan muncul di sini" "Notifikasi ini tidak dapat diubah." @@ -1024,6 +1026,8 @@ "Pilih kontrol yang akan diakses dari menu daya" "Tahan & tarik untuk mengatur ulang kontrol" "Semua kontrol dihapus" + + "Daftar semua kontrol tidak dapat dimuat." "Lainnya" "Tambahkan ke kontrol perangkat" @@ -1032,6 +1036,7 @@ "Kontrol diperbarui" "PIN berisi huruf atau simbol" "Verifikasi %s" + "PIN salah" "Memverifikasi …" "Masukkan PIN" "Coba PIN lain" @@ -1041,6 +1046,9 @@ "Memuat rekomendasi" "Tutup sesi media ini" "Nonaktif, periksa aplikasi" + "Error, mencoba lagi..." + "Perangkat dihapus" + "Tidak dapat memuat status" "Error, coba lagi" "Dalam proses" "Tahan Tombol daya untuk melihat kontrol baru" diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml index 0a5c8faee1cd94d3262d6527a02d25ffb5532560..3762faca11e542fc332d92c55fa1d8267c21503b 100644 --- a/packages/SystemUI/res/values-is/strings.xml +++ b/packages/SystemUI/res/values-is/strings.xml @@ -430,6 +430,8 @@ "Skjáupptaka" "Hefja" "Stöðva" + + "Strjúktu upp til að skipta á milli forrita" "Dragðu til hægri til að skipta hratt á milli forrita" "Kveikja/slökkva á yfirliti" @@ -712,6 +714,8 @@ "Sýnt sem blaðra efst í samtali." "Áfram" "Forgangur" + + "Engar nýlegar blöðrur" "Nýlegar blöðrur og blöðrur sem þú hefur lokað birtast hér" "Ekki er hægt að breyta þessum tilkynningum." @@ -1024,6 +1028,8 @@ "Veldu hvaða stýringar birtast í aflrofavalmyndinni" "Haltu og dragðu til að endurraða stýringum" "Allar stýringar fjarlægðar" + + "Ekki tókst að hlaða lista yfir allar stýringar." "Annað" "Bæta við tækjastjórnun" @@ -1032,6 +1038,7 @@ "Stýringar uppfærðar" "PIN inniheldur bókstafi eða tákn" "Staðfesta %s" + "Rangt PIN-númer" "Staðfestir…" "Sláðu inn PIN-númer" "Prófaðu annað PIN-númer" @@ -1041,6 +1048,9 @@ "Hleður tillögum" "Loka þessari efnislotu" "Óvirkt, athugaðu forrit" + "Villa, reynir aftur…" + "Tæki fjarlægt" + "Ekki er hægt að hlaða stöðu" "Villa, reyndu aftur" "Í gangi" "Haltu aflrofanum inni til að sjá nýjar stýringar" diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index fab1eab2a9e2eaed494f11a1c1ae2b436a23734a..3e34544eaa99d21767a89e5c3b2d85f21b99d535 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -430,6 +430,7 @@ "Registrazione schermo" "Inizia" "Interrompi" + "Dispositivo" "Scorri verso l\'alto per passare ad altre app" "Trascina verso destra per cambiare velocemente app" "Attiva/disattiva la panoramica" @@ -712,6 +713,7 @@ "Appare in cima alla sezione delle conversazioni sotto forma di bolla." "Impostazioni" "Priorità" + "%1$s non supporta impostazioni specifiche per le conversazioni" "Nessuna bolla recente" "Le bolle recenti e ignorate verranno visualizzate qui" "Impossibile modificare queste notifiche." @@ -1024,6 +1026,8 @@ "Seleziona i controlli a cui accedere dal menu di accensione" "Tieni premuto e trascina per riordinare i controlli" "Tutti i controlli sono stati rimossi" + + "Impossibile caricare l\'elenco di tutti i controlli." "Altro" "Aggiungi al controllo dei dispositivi" @@ -1032,6 +1036,7 @@ "Controlli aggiornati" "Il PIN contiene lettere o simboli" "Verifica %s" + "PIN errato" "Verifica…" "Inserisci PIN" "Prova con un altro PIN" @@ -1041,6 +1046,9 @@ "Caricamento dei consigli" "Chiudi questa sessione multimediale" "Inattivo, controlla l\'app" + "Errore. Nuovo tentativo…" + "Dispositivo rimosso" + "Impossibile caricare lo stato" "Errore. Riprova" "In corso" "Tieni premuto il tasto di accensione per visualizzare i nuovi controlli" diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index 09b53b51f574b7ba13d1cb54cac4a3124cb9cf60..07e1c1c951f3102ac5885bc4598019dd57eeee21 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -434,6 +434,8 @@ "הקלטת המסך" "התחלה" "עצירה" + + "יש להחליק מעלה כדי להחליף אפליקציות" "יש לגרור ימינה כדי לעבור במהירות בין אפליקציות" "החלפת מצב של מסכים אחרונים" @@ -718,6 +720,8 @@ "מוצגת בחלק העליון של קטע השיחה ומופיעה כבועה." "הגדרות" "עדיפות" + + "אין בועות מהזמן האחרון" "בועות אחרונות ובועות שנסגרו יופיעו כאן" "לא ניתן לשנות את ההתראות האלה." @@ -1036,6 +1040,8 @@ "יש לבחור פקדים לגישה מתפריט ההפעלה" "יש ללחוץ לחיצה ארוכה ולגרור כדי לארגן מחדש את הפקדים" "כל הפקדים הוסרו" + + "לא ניתן היה לטעון את הרשימה של כל הפקדים." "אחר" "הוספה לפקדי המכשירים" @@ -1044,6 +1050,7 @@ "הפקדים עודכנו" "קוד האימות מכיל אותיות או סמלים" "אימות %s" + "קוד גישה שגוי" "בתהליך אימות…" "יש להזין קוד אימות" "יש לנסות קוד אימות אחר" @@ -1053,6 +1060,9 @@ "בטעינת המלצות" "סגירת הסשן הזה של המדיה" "לא פעיל, יש לבדוק את האפליקציה" + "שגיאה, מתבצע ניסיון חוזר…" + "המכשיר הוסר" + "לא ניתן לטעון את הסטטוס" "שגיאה, יש לנסות שוב" "בתהליך" "ניתן ללחוץ על לחצן ההפעלה כדי להציג פקדים חדשים" diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index 74e996b1fd7d7494d37317dbf50b61c3d0db4987..7ced5fd3cc2043e60900ad2c0573be01c9e949d4 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -430,6 +430,7 @@ "スクリーン レコード" "開始" "停止" + "デバイス" "アプリを切り替えるには上にスワイプ" "右にドラッグするとアプリを素早く切り替えることができます" "概要を切り替え" @@ -712,6 +713,7 @@ "会話セクションの一番上にバブルとして表示されます。" "設定" "優先度" + "%1$s は会話専用の設定をサポートしていません" "最近閉じたバブルはありません" "最近表示されたバブルや閉じたバブルが、ここに表示されます" "これらの通知は変更できません。" @@ -1024,6 +1026,8 @@ "電源メニューからアクセスするコントロールを選択する" "コントロールを並べ替えるには長押ししてドラッグします" "すべてのコントロールを削除しました" + + "全コントロールの一覧を読み込めませんでした。" "その他" "デバイス コントロールに追加" @@ -1032,6 +1036,7 @@ "コントロールを更新しました" "PIN に英字や記号を含める" "%sの確認" + "PIN が間違っています" "確認しています…" "PIN の入力" "別の PIN をお試しください" @@ -1041,6 +1046,9 @@ "候補を読み込んでいます" "このメディア セッションを閉じる" "無効: アプリをご確認ください" + "エラー。再試行しています…" + "デバイスを削除しました" + "ステータスを読み込めません" "エラー: もう一度お試しください" "処理中" "電源ボタンを長押しすると、新しいコントロールが表示されます" diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml index d1b3334ab88b1f64cd25f647f558f5778eebaa95..31983033bbeea8d9e328b914e7ddf224f60e6f46 100644 --- a/packages/SystemUI/res/values-ka/strings.xml +++ b/packages/SystemUI/res/values-ka/strings.xml @@ -430,6 +430,7 @@ "ეკრანის ჩანაწერი" "დაწყება" "შეწყვეტა" + "მოწყობილობა" "გადაფურცლეთ ზემოთ აპების გადასართავად" "აპების სწრაფად გადასართავად ჩავლებით გადაიტანეთ მარჯვნივ" "მიმოხილვის გადართვა" @@ -712,6 +713,7 @@ "გამოჩნდება საუბრის სექციის ზედა ნაწილში ბუშტის სახით." "პარამეტრები" "პრიორიტეტი" + "%1$s-ს არ აქვს სპეციალურად მიმოწერისთვის განკუთვნილი პარამეტრების მხარდაჭერა" "ბოლო დროს გამოყენებული ბუშტები არ არის" "აქ გამოჩნდება ბოლოდროინდელი ბუშტები და უარყოფილი ბუშტები" "ამ შეტყობინებების შეცვლა შეუძლებელია." @@ -1024,6 +1026,8 @@ "აირჩიეთ მართვის საშუალებები ელკვების მენიუდან" "მართვის საშუალებების გადაწყობა შეგიძლიათ მათი ჩავლებით გადატანით" "მართვის ყველა საშუალება ამოიშალა" + + "მართვის ყველა საშუალების სია ვერ ჩაიტვირთა." "სხვა" "მოწყობილ. მართვის საშუალებებში დამატება" @@ -1032,6 +1036,7 @@ "მართვის საშუალებები განახლდა" "PIN-კოდი შეიცავს ასოებს ან სიმბოლოებს" "დაადასტურეთ %s" + "PIN-კოდი არასწორია" "მიმდინარეობს დადასტურება…" "შეიყვანეთ PIN-კოდი" "სხვა PIN-კოდის ცდა" @@ -1041,6 +1046,9 @@ "მიმდინარეობს რეკომენდაციების ჩატვირთვა" "ამ მედია სესიის დახურვა" "არააქტიურია, გადაამოწმეთ აპი" + "შეცდომა, ხელახალი მცდელობა…" + "მოწყობილობა ამოიშალა" + "სტატუსი ვერ იტვირთება" "შეცდომა, ისევ ცადეთ" "მუშავდება" "ხანგრძლივად დააჭირეთ ჩართვის ღილაკს მართვის ახალი საშუალებების სანახავად" diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index b8e0ef5227fdff4a94ccebd700637f9454b41f66..537aa3630b4b09cebdae9ccfd300e9f6a85ebc56 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -430,6 +430,8 @@ "Экранды жазу" "Бастау" "Тоқтату" + + "Қолданбалар арасында ауысу үшін жоғары сырғытыңыз" "Қолданбаларды жылдам ауыстырып қосу үшін оңға қарай сүйреңіз" "Шолуды қосу/өшіру" @@ -712,6 +714,8 @@ "Сөйлесу бөлімінің жоғарғы жағында және қалқыма хабар түрінде көрсетіледі." "Параметрлер" "Маңыздылығы" + + "Жақындағы қалқыма хабарлар жоқ" "Жақында ашылған және жабылған қалқыма хабарлар осы жерде көрсетіледі." "Бұл хабарландыруларды өзгерту мүмкін емес." @@ -1024,6 +1028,8 @@ "\"Қуат\" мәзірінен пайдалануға болатын басқару элементтерін таңдаңыз." "Басқару элементтерінің ретін өзгерту үшін оларды басып тұрып сүйреңіз." "Барлық басқару элементтері өшірілді." + + "Барлық басқару элементі тізімі жүктелмеді." "Басқа" "Құрылғы басқару виджеттеріне қосу" @@ -1032,6 +1038,7 @@ "Басқару элементтері жаңартылды" "PIN коды әріптерден не таңбалардан құралады." "%s растау" + "PIN коды қате" "Расталуда…" "PIN кодын енгізіңіз." "Басқа PIN кодын енгізіңіз" @@ -1041,6 +1048,9 @@ "Жүктеуге қатысты ұсыныстар" "Мультимедиа сеансын жабу" "Өшірулі. Қолданба тексеріңіз." + "Қате, әрекет қайталануда…" + "Құрылғы өшірілді." + "Күйді жүктеу мүмкін емес." "Қате шықты. Қайталап көріңіз." "Орындалуда" "Жаңа басқару элементтерін көру үшін \"Қуат\" түймесін басып тұрыңыз." diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml index ebe3659bd09e434fbf41b8536b5c7cb6f9b73c64..97a1c36b6aeebc3b046eecdc47496528756bc4c5 100644 --- a/packages/SystemUI/res/values-km/strings.xml +++ b/packages/SystemUI/res/values-km/strings.xml @@ -430,6 +430,7 @@ "ការថត​អេក្រង់" "ចាប់ផ្ដើម" "ឈប់" + "ឧបករណ៍" "អូស​ឡើង​លើ​ដើម្បី​ប្តូរ​កម្មវិធី" "អូសទៅស្ដាំដើម្បីប្ដូរកម្មវិធីបានរហ័ស" "បិទ/បើក​ទិដ្ឋភាពរួម" @@ -712,6 +713,7 @@ "បង្ហាញ​នៅខាងលើផ្នែកសន្ទនា និង​បង្ហាញជាពពុះ។" "ការកំណត់" "អាទិភាព" + "%1$s មិនអាចប្រើ​ការកំណត់​ជាក់លាក់សម្រាប់ការសន្ទនា​បានទេ" "មិនមាន​ពពុះ​ថ្មីៗ​ទេ" "ពពុះថ្មីៗ​ និង​ពពុះដែលបានបិទ​​នឹង​បង្ហាញ​នៅទីនេះ" "មិនអាច​កែប្រែ​ការជូនដំណឹង​ទាំងនេះ​បានទេ។" @@ -1024,6 +1026,8 @@ "ជ្រើសរើស​ការគ្រប់គ្រង ដើម្បី​ចូលប្រើ​ពីម៉ឺនុយ​ថាមពល" "ចុច​ឱ្យ​ជាប់ រួចអូស​ដើម្បី​រៀបចំ​ការគ្រប់គ្រង​ឡើងវិញ" "បាន​លុបការគ្រប់គ្រងទាំងអស់ហើយ" + + "មិនអាច​ផ្ទុក​បញ្ជី​នៃការគ្រប់គ្រង​ទាំងអស់​បានទេ។" "ផ្សេងៗ" "បញ្ចូល​ទៅក្នុងផ្ទាំងគ្រប់គ្រងឧបករណ៍" @@ -1032,6 +1036,7 @@ "បានធ្វើបច្ចុប្បន្នភាពការគ្រប់គ្រង" "កូដ PIN មាន​អក្សរ ឬនិមិត្តសញ្ញា" "ផ្ទៀងផ្ទាត់ %s" + "កូដ PIN មិន​ត្រឹមត្រូវ​" "កំពុង​ផ្ទៀងផ្ទាត់…" "បញ្ចូល​កូដ PIN" "សាកល្បងប្រើ​កូដ PIN ផ្សេងទៀត" @@ -1041,6 +1046,9 @@ "កំពុងផ្ទុក​ការណែនាំ" "បិទវគ្គ​មេឌៀ​នេះ" "អសកម្ម ពិនិត្យមើល​កម្មវិធី" + "បញ្ហា កំពុងព្យាយាម​ម្ដងទៀត…" + "បានលុប​ឧបករណ៍" + "មិនអាច​ផ្ទុក​ស្ថានភាព​បានទេ" "មានបញ្ហា សូម​ព្យាយាម​ម្តងទៀត" "កំពុងដំណើរការ" "សង្កត់​ប៊ូតុង​ថាមពល ដើម្បី​មើលឃើញ​ការគ្រប់គ្រង​ថ្មីៗ" diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index 6fb7a1f648f91e463c18f5fa62862d02b76a7580..7fe7d46e1b0e68bb8c271fa029cb5e03121eeed7 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -430,6 +430,8 @@ "ಸ್ಕ್ರೀನ್ ರೆಕಾರ್ಡ್" "ಪ್ರಾರಂಭಿಸಿ" "ನಿಲ್ಲಿಸಿ" + + "ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಬದಲಾಯಿಸಲು ಸ್ವೈಪ್ ಮಾಡಿ" "ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಬದಲಿಸಲು ತ್ವರಿತವಾಗಿ ಬಲಕ್ಕೆ ಡ್ರ್ಯಾಗ್ ಮಾಡಿ" "ಟಾಗಲ್ ನ ಅವಲೋಕನ" @@ -712,6 +714,8 @@ "ಸಂಭಾಷಣೆ ವಿಭಾಗದ ಮೇಲ್ಬಾಗದಲ್ಲಿ ಕಾಣಿಸುತ್ತದೆ ಮತ್ತು ಬಬಲ್‌ನಂತೆ ಗೋಚರಿಸುತ್ತದೆ." "ಸೆಟ್ಟಿಂಗ್‌ಗಳು" "ಆದ್ಯತೆ" + + "ಯಾವುದೇ ಇತ್ತೀಚಿನ ಬಬಲ್ಸ್ ಇಲ್ಲ" "ಇತ್ತೀಚಿನ ಬಬಲ್ಸ್ ಮತ್ತು ವಜಾಗೊಳಿಸಿದ ಬಬಲ್ಸ್ ಇಲ್ಲಿ ಗೋಚರಿಸುತ್ತವೆ" "ಈ ಅಧಿಸೂಚನೆಗಳನ್ನು ಮಾರ್ಪಡಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ." @@ -999,8 +1003,7 @@ "ಯಾವುದೇ ಸಮಯದಲ್ಲಿ ಬಬಲ್ಸ್ ಅನ್ನು ನಿಯಂತ್ರಿಸಿ" "ಈ ಆ್ಯಪ್‌ನಿಂದ ಬಬಲ್ಸ್ ಅನ್ನು ಆಫ್ ಮಾಡಲು ನಿರ್ವಹಿಸಿ ಟ್ಯಾಪ್ ಮಾಡಿ" "ಅರ್ಥವಾಯಿತು" - - + "%1$s ಸೆಟ್ಟಿಂಗ್‌ಗಳು" "ಸಿಸ್ಟಂ ನ್ಯಾವಿಗೇಷನ ಅಪ್‌ಡೇಟ್ ಮಾಡಲಾಗಿದೆ ಬದಲಾವಣೆಗಳನ್ನು ಮಾಡಲು, ಸೆಟ್ಟಿಂಗ್‌ಗಳಿಗೆ ಹೋಗಿ." "ಸಿಸ್ಟಂ ನ್ಯಾವಿಗೇಷನ್ ಅಪ್‌ಡೇಟ್ ಮಾಡಲು ಸೆಟ್ಟಿಂಗ್‌ಗಳಿಗೆ ಹೋಗಿ" "ಸ್ಟ್ಯಾಂಡ್‌ಬೈ" @@ -1025,6 +1028,8 @@ "ಪವರ್ ಮೆನುವಿನಿಂದ ಪ್ರವೇಶಿಸಲು ನಿಯಂತ್ರಣಗಳನ್ನು ಆರಿಸಿ" "ನಿಯಂತ್ರಣಗಳನ್ನು ಮರುಹೊಂದಿಸಲು ಹೋಲ್ಡ್ ಮಾಡಿ ಮತ್ತು ಡ್ರ್ಯಾಗ್‌ ಮಾಡಿ" "ಎಲ್ಲಾ ನಿಯಂತ್ರಣಗಳನ್ನು ತೆಗೆದುಹಾಕಲಾಗಿದೆ" + + "ಎಲ್ಲಾ ನಿಯಂತ್ರಣಗಳ ಪಟ್ಟಿಯನ್ನು ಲೋಡ್ ಮಾಡಲು ಆಗಲಿಲ್ಲ." "ಇತರ" "ಸಾಧನ ನಿಯಂತ್ರಣಗಳಿಗೆ ಸೇರಿಸಿ" @@ -1033,6 +1038,7 @@ "ನಿಯಂತ್ರಣಗಳನ್ನು ನವೀಕರಿಸಲಾಗಿದೆ" "ಪಿನ್ ಅಕ್ಷರಗಳು ಅಥವಾ ಸಂಕೇತಗಳನ್ನು ಒಳಗೊಂಡಿದೆ" "%s ಅನ್ನು ಪರಿಶೀಲಿಸಿ" + "ತಪ್ಪಾದ ಪಿನ್‌" "ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ…" "ಪಿನ್ ನಮೂದಿಸಿ" "ಮತ್ತೊಂದು ಪಿನ್ ಅನ್ನು ಪ್ರಯತ್ನಿಸಿ" @@ -1042,6 +1048,9 @@ "ಶಿಫಾರಸುಗಳು ಲೋಡ್ ಆಗುತ್ತಿವೆ" "ಈ ಮಾಧ್ಯಮ ಸೆಶನ್ ಅನ್ನು ಮುಚ್ಚಿರಿ" "ನಿಷ್ಕ್ರಿಯ, ಆ್ಯಪ್ ಪರಿಶೀಲಿಸಿ" + "ದೋಷ, ಮರುಪ್ರಯತ್ನಿಸಲಾಗುತ್ತಿದೆ…" + "ಸಾಧನವನ್ನು ತೆಗೆದುಹಾಕಲಾಗಿದೆ" + "ಸ್ಥಿತಿ ಲೋಡ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ" "ದೋಷ, ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ" "ಪ್ರಗತಿಯಲ್ಲಿದೆ" "ಹೊಸ ನಿಯಂತ್ರಣಗಳನ್ನು ನೋಡಲು ಪವರ್ ಬಟನ್ ಹಿಡಿದುಕೊಳ್ಳಿ" diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index 38ae28d61cf3eb49ffcb416179233c9248cb44a0..e27f208e55e868df79c990947cc8e0908acc3875 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -430,6 +430,7 @@ "화면 녹화" "시작" "중지" + "기기" "위로 스와이프하여 앱 전환" "앱을 빠르게 전환하려면 오른쪽으로 드래그" "최근 사용 버튼 전환" @@ -712,6 +713,7 @@ "대화 섹션 상단에 대화창으로 표시" "설정" "우선순위" + "%1$s에서는 대화 관련 설정을 지원하지 않습니다." "최근에 닫은 대화창 없음" "최근 대화창과 내가 닫은 대화창이 여기에 표시됩니다." "이 알림은 수정할 수 없습니다." @@ -1024,6 +1026,8 @@ "전원 메뉴에서 액세스할 컨트롤을 선택합니다." "길게 누르고 드래그하여 컨트롤 재정렬" "모든 컨트롤 삭제됨" + + "전체 컨트롤 목록을 로드할 수 없습니다." "기타" "기기 제어에 추가" @@ -1032,6 +1036,7 @@ "컨트롤 업데이트됨" "PIN에 문자나 기호가 포함됨" "%s 확인" + "잘못된 PIN" "확인 중…" "PIN 입력" "다른 PIN으로 다시 시도" @@ -1041,6 +1046,9 @@ "추천 제어 기능 로드 중" "이 미디어 세션 닫기" "비활성. 앱을 확인하세요." + "오류 발생, 다시 시도 중…" + "기기가 삭제됨" + "통계를 로드할 수 없음" "오류. 다시 시도하세요." "진행 중" "새 컨트롤을 보려면 전원 버튼을 길게 누르세요." diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index 0e422d4778b814f831cf5bb4eb28bb8ff165be2a..93deca220b9e6f22f50dd5066ed07ef1676b4cf7 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -430,6 +430,8 @@ "Экранды жаздыруу" "Баштадык" "Токтотуу" + + "Башка колдонмого которулуу үчүн,, өйдө сүрүңүз" "Колдонмолорду тез которуштуруу үчүн, оңго сүйрөңүз" "Сереп салууну өчүрүү/күйгүзүү" @@ -712,6 +714,8 @@ "Жазышуу бөлүмүнүн жогорку жагында көрсөтүлүп, калкып чыкма билдирме катары пайда болот." "Жөндөөлөр" "Маанилүүлүгү" + + "Акыркы калкып чыкма билдирмелер жок" "Кайра жөнөтүлгөн жана жабылган калкып чыкма билдирмелер ушул жерде көрүнөт" "Бул билдирмелерди өзгөртүүгө болбойт." @@ -1024,6 +1028,8 @@ "Күйгүзүү/өчүрүү баскычынын менюсу үчүн көзөмөлдөрдү тандаңыз" "Башкаруу элементтеринин иретин өзгөртүү үчүн кармап туруп, сүйрөңүз" "Бардык башкаруу элементтери өчүрүлдү" + + "Бардык көзөмөлдөрдүн тизмеси жүктөлгөн жок." "Башка" "Түзмөктү башкаруу элементтерине кошуу" @@ -1032,6 +1038,7 @@ "Башкаруу элементтери жаңырды" "PIN код тамгаларды же символдорду камтыйт" "%s түзмөгүн ырастаңыз" + "PIN код туура эмес" "Ырасталууда…" "PIN кодду киргизиңиз" "Башка PIN кодду колдонуңүз" @@ -1041,6 +1048,9 @@ "Сунуштар жүктөлүүдө" "Бул медиа сеансын жабуу" "Жигерсиз. Колдонмону текшериңиз" + "Ката, дагы аракет жасалууда…" + "Түзмөктү көзөмөлдөө өчүрүлдү" + "Абалы жүктөлгөн жок" "Ката, кайталап көрүңүз" "Аткарылууда" "Башкаруу элементтерин көрүү үчүн күйгүзүү/өчүрүү баскычын коё бербей басып туруңуз" diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml index 880ecea877a73216ed178ae257237eafd426f11f..38db899378c7340cb1e1bd58390fdf6620088166 100644 --- a/packages/SystemUI/res/values-lo/strings.xml +++ b/packages/SystemUI/res/values-lo/strings.xml @@ -430,6 +430,7 @@ "ການບັນທຶກໜ້າຈໍ" "ເລີ່ມ" "ຢຸດ" + "ອຸປະກອນ" "ປັດຂື້ນເພື່ອສະຫຼັບແອັບ" "ລາກໄປຂວາເພື່ອສະຫຼັບແອັບດ່ວນ" "ສະຫຼັບພາບຮວມ" @@ -712,6 +713,7 @@ "ສະແດງຢູ່ເທິງສຸດຂອງພາກສ່ວນການສົນທະນາ ແລະ ສະແດງເປັນຟອງ." "ຕັ້ງຄ່າ" "ຄວາມສຳຄັນ" + "%1$s ບໍ່ຮອງຮັບການຕັ້ງຄ່າສະເພາະຂອງການສົນທະນາ" "ບໍ່ມີຟອງຫຼ້າສຸດ" "ຟອງຫຼ້າສຸດ ແລະ ຟອງທີ່ປິດໄປຈະປາກົດຢູ່ບ່ອນນີ້" "ບໍ່ສາມາດແກ້ໄຂການແຈ້ງເຕືອນເຫຼົ່ານີ້ໄດ້." @@ -1024,6 +1026,8 @@ "ເລືອກການຄວບຄຸມເພື່ອເຂົ້າເຖິງຈາກເມນູເປີດປິດ" "ກົດຄ້າງໄວ້ເພື່ອຈັດຮຽງການຄວບຄຸມຄືນໃໝ່" "ລຶບການຄວບຄຸມທັງໝົດອອກແລ້ວ" + + "ບໍ່ສາມາດໂຫຼດລາຍຊື່ການຄວບຄຸມທັງໝົດໄດ້." "ອື່ນໆ" "ເພີ່ມໃສ່ການຄວບຄຸມອຸປະກອນ" @@ -1032,6 +1036,7 @@ "ອັບເດດການຄວບຄຸມແລ້ວ" "PIN ປະກອບມີຕົວອັກສອນ ຫຼື ສັນຍາລັກ" "ຢັ້ງຢືນ %s" + "PIN ບໍ່ຖືກຕ້ອງ" "ກໍາລັງຢັ້ງຢືນ…" "ປ້ອນ PIN" "ລອງໃຊ້ PIN ອື່ນ" @@ -1041,6 +1046,9 @@ "ກຳລັງໂຫຼດຄຳແນະນຳ" "ປິດເຊດຊັນມີເດຍນີ້" "ບໍ່ເຮັດວຽກ, ກະລຸນາກວດສອບແອັບ" + "ຜິດພາດ, ກໍາລັງ​ລອງ​ໃໝ່…" + "ລຶບອຸປະກອນອອກແລ້ວ" + "ບໍ່ສາມາດໂຫຼດສະຖານະໄດ້" "​ຜິດ​ພາດ​, ກະລຸນາລອງໃໝ່" "ກຳລັງດຳເນີນການຢູ່" "ກົດປຸ່ມເປີດປິດຄ້າງໄວ້ເພື່ອເບິ່ງການຄວບຄຸມໃໝ່" diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index 17be731c06c6bfa6cc3d1f0fb17ef80fec65a683..277814fd4099304b09d582825a2bda35cda8de09 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -434,6 +434,8 @@ "Ekrano įrašas" "Pradėti" "Stabdyti" + + "Perbraukite aukštyn, kad perjungtumėte programas" "Vilkite į dešinę, kad greitai perjungtumėte programas" "Perjungti apžvalgą" @@ -718,6 +720,8 @@ "Rodoma pokalbio skilties viršuje kaip burbulas." "Nustatymai" "Prioritetas" + + "Nėra naujausių burbulų" "Naujausi ir atsisakyti burbulus bus rodomi čia" "Šių pranešimų keisti negalima." @@ -1036,6 +1040,8 @@ "Pasirinkite valdiklius, kuriuos norite pasiekti įjungimo meniu" "Norėdami pertvarkyti valdiklius, vilkite laikydami nuspaudę" "Visi valdikliai pašalinti" + + "Nepavyko įkelti visų valdiklių sąrašo." "Kita" "Pridėjimas prie įrenginio valdiklių" @@ -1044,6 +1050,7 @@ "Valdikliai atnaujinti" "PIN kodą sudaro raidės arba simboliai" "%s patvirtinimas" + "Netinkamas PIN kodas" "Patvirtinama…" "Įveskite PIN kodą" "Išbandykite kitą PIN kodą" @@ -1053,6 +1060,9 @@ "Įkeliamos rekomendacijos" "Uždaryti šį medijos seansą" "Neaktyvu, patikrinkite progr." + "Klaida, bandoma iš naujo…" + "Įrenginys pašalintas" + "Nepavyko įkelti būsenos" "Klaida, bandykite dar kartą" "Vyksta" "Jei norite peržiūrėti naujus valdiklius, laikykite paspaudę maitinimo mygtuką" diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index f402323deac3fa4610a67b8e402ce3f6e36941ef..46df9b90c9dab1b5963dd0506ccebb685920877c 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -432,6 +432,8 @@ "Ekrāna ierakstīšana" "Sākt" "Apturēt" + + "Velciet augšup, lai pārslēgtu lietotnes" "Lai ātri pārslēgtu lietotnes, velciet pa labi" "Pārskata pārslēgšana" @@ -715,6 +717,8 @@ "Tiek rādīta sarunas sadaļas augšdaļā kā burbulis." "Iestatījumi" "Prioritārs" + + "Nav nesen aizvērtu burbuļu" "Šeit būs redzami nesen rādītie burbuļi un aizvērtie burbuļi" "Šos paziņojumus nevar modificēt." @@ -1030,6 +1034,8 @@ "Izvēlieties vadīklas, kurām piekļūt no barošanas izvēlnes" "Lai pārkārtotu vadīklas, turiet un velciet tās" "Visas vadīklas ir noņemtas" + + "Nevarēja ielādēt sarakstu ar visām vadīklām." "Cita" "Pievienošana ierīču vadīklām" @@ -1038,6 +1044,7 @@ "Vadīklas atjauninātas" "PIN ietver burtus vai simbolus." "Verifikācija: %s" + "Nepareizs PIN" "Notiek verifikācija…" "Ievadiet PIN." "Izmēģiniet citu PIN" @@ -1047,6 +1054,9 @@ "Notiek ieteikumu ielāde" "Aizvērt multivides sesiju" "Neaktīva, pārbaudiet lietotni" + "Radās kļūda. Mēģina vēlreiz…" + "Ierīce ir noņemta." + "Nevar ielādēt statusu." "Radās kļūda. Mēģiniet vēlreiz." "Sākta" "Nospiediet barošanas pogu un turiet to, lai skatītu jaunas vadīklas" diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml index 0c7aef9e2f2f2265fb92fd010dfc93c1560271e6..bf688baeb2d3a2a68173ae1eff6fe13f508626ff 100644 --- a/packages/SystemUI/res/values-mk/strings.xml +++ b/packages/SystemUI/res/values-mk/strings.xml @@ -416,7 +416,7 @@ "Ноќно светло" "Вклуч. на зајдисонце" "До изгрејсонце" - "Ќе се вклучи во %s" + "Вклучување: %s" "До %s" "Темна тема" "Штедач на батерија" @@ -430,6 +430,7 @@ "Снимање екран" "Започни" "Сопри" + "Уред" "Повлечете нагоре за да се префрлите од една на друга апликација" "Повлечете надесно за брзо префрлање меѓу апликациите" "Вклучи/исклучи преглед" @@ -712,6 +713,7 @@ "Се појавува на горниот дел од разговорот и изгледа како балонче." "Поставки" "Приоритет" + "%1$s не поддржува поставки поврзани со разговорите" "Нема неодамнешни балончиња" "Неодамнешните и отфрлените балончиња ќе се појавуваат тука" "Овие известувања не може да се изменат" @@ -1024,6 +1026,8 @@ "Изберете ги контролите до кои ќе пристапувате од менито за вклучување" "Задржете и влечете за да ги преуредите контролите" "Сите контроли се отстранети" + + "Не можеше да се вчита списокот со сите контроли." "Друга" "Додајте во контроли за уредите" @@ -1032,6 +1036,7 @@ "Контролите се ажурирани" "PIN-кодот содржи букви или симболи" "Потврдете го %s" + "Погрешен PIN" "Се потврдува…" "Внесете PIN" "Обидете се со друг PIN" @@ -1041,6 +1046,9 @@ "Се вчитуваат препораки" "Затвори ја аудиовизуелнава сесија" "Неактивна, провери апликација" + "Грешка, повторен обид…" + "Уредот е отстранет" + "Не може да се вчита статусот" "Грешка, обидете се повторно" "Во тек" "Задржете го копчето за вклучување за да ги видите новите контроли" diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index da4dae0c12d64542212465df6d5b7441f4213673..b4715ca1d1a1a262e9729fe4b5280b916b5a0a7f 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -430,6 +430,8 @@ "സ്‌ക്രീൻ റെക്കോർഡ്" "ആരംഭിക്കുക" "നിര്‍ത്തുക" + + "ആപ്പുകൾ മാറാൻ മുകളിലേക്ക് സ്വൈപ്പ് ചെയ്യുക" "ആപ്പുകൾ പെട്ടെന്ന് മാറാൻ വലത്തോട്ട് വലിച്ചിടുക" "അവലോകനം മാറ്റുക" @@ -712,6 +714,8 @@ "സംഭാഷണ വിഭാഗത്തിന് മുകളിൽ ബബിളായി ദൃശ്യമാവുന്നു." "ക്രമീകരണം" "മുൻഗണന" + + "അടുത്തിടെയുള്ള ബബിളുകൾ ഒന്നുമില്ല" "അടുത്തിടെയുള്ള ബബിളുകൾ, ഡിസ്മിസ് ചെയ്ത ബബിളുകൾ എന്നിവ ഇവിടെ ദൃശ്യമാവും" "ഈ അറിയിപ്പുകൾ പരിഷ്ക്കരിക്കാനാവില്ല." @@ -999,8 +1003,7 @@ "ബബിളുകൾ ഏതുസമയത്തും നിയന്ത്രിക്കുക" "ഈ ആപ്പിൽ നിന്നുള്ള ബബിളുകൾ ഓഫാക്കാൻ മാനേജ് ചെയ്യുക ടാപ്പ് ചെയ്യുക" "ലഭിച്ചു" - - + "%1$s ക്രമീകരണം" "സിസ്‌റ്റം നാവിഗേഷൻ അപ്‌ഡേറ്റ് ചെയ്‌തു. മാറ്റങ്ങൾ വരുത്താൻ ക്രമീകരണത്തിലേക്ക് പോവുക." "സിസ്‌റ്റം നാവിഗേഷൻ അപ്‌ഡേറ്റ് ചെയ്യാൻ ക്രമീകരണത്തിലേക്ക് പോവുക" "സ്‌റ്റാൻഡ്‌ബൈ" @@ -1025,6 +1028,8 @@ "പവർ മെനുവിൽ നിന്ന് ആക്സസ് ചെയ്യേണ്ട നിയന്ത്രണങ്ങൾ തിരഞ്ഞെടുക്കുക" "നിയന്ത്രണങ്ങൾ പുനഃക്രമീകരിക്കാൻ പിടിച്ച് വലിച്ചിടുക" "എല്ലാ നിയന്ത്രണങ്ങളും നീക്കം ചെയ്തു" + + "എല്ലാ നിയന്ത്രണങ്ങളുടെയും ലിസ്റ്റ് ലോഡ് ചെയ്യാനായില്ല." "മറ്റുള്ളവ" "ഉപകരണ നിയന്ത്രണങ്ങളിലേക്ക് ചേർക്കുക" @@ -1033,6 +1038,7 @@ "നിയന്ത്രണങ്ങൾ അപ്ഡേറ്റ് ചെയ്തു" "പിന്നിൽ അക്ഷരങ്ങളോ ചിഹ്നങ്ങളോ അടങ്ങിയിരിക്കുന്നു" "%s പരിശോധിച്ചുറപ്പിക്കുക" + "പിൻ തെറ്റാണ്" "പരിശോധിച്ചുറപ്പിക്കുന്നു…" "പിൻ നൽകുക" "മറ്റൊരു പിൻ പരീക്ഷിക്കുക" @@ -1042,6 +1048,9 @@ "നിർദ്ദേശങ്ങൾ ലോഡ് ചെയ്യുന്നു" "ഈ മീഡിയ സെഷൻ അടയ്ക്കുക" "നിഷ്‌ക്രിയം, ആപ്പ് പരിശോധിക്കൂ" + "പിശക്, വീണ്ടും ശ്രമിക്കുന്നു…" + "ഉപകരണം നീക്കം ചെയ്തു" + "നില ലോഡ് ചെയ്യാനാകുന്നില്ല" "പിശക്, വീണ്ടും ശ്രമിക്കുക" "പുരോഗതിയിലാണ്" "പുതിയ നിയന്ത്രണങ്ങൾ കാണാൻ പവർ ബട്ടൺ പിടിക്കുക" diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml index 1e646bc1ac4aefcf25f6dc2b2715191b90bc46de..bf0b7c8bb6a9175cf00107a35f670f47099a4338 100644 --- a/packages/SystemUI/res/values-mn/strings.xml +++ b/packages/SystemUI/res/values-mn/strings.xml @@ -430,6 +430,7 @@ "Дэлгэцийн бичлэг хийх" "Эхлүүлэх" "Зогсоох" + "Төхөөрөмж" "Апп сэлгэхийн тулд дээш шударна уу" "Аппуудыг хурдан сэлгэхийн тулд баруун тийш чирнэ үү" "Тоймыг унтраах/асаах" @@ -712,6 +713,7 @@ "Харилцан ярианы хэсгийн дээд талд, бөмбөлөг хэлбэрээр харагдана." "Тохиргоо" "Ач холбогдол" + "%1$s харилцан ярианы тодорхой тохиргоог дэмждэггүй" "Саяхны бөмбөлөг алга байна" "Саяхны бөмбөлгүүд болон үл хэрэгссэн бөмбөлгүүд энд харагдана" "Эдгээр мэдэгдлийг өөрчлөх боломжгүй." @@ -1024,6 +1026,8 @@ "Тэжээлийн цэсээс хандах хяналтуудыг сонгоно уу" "Хяналтуудыг дахин засварлахын тулд дараад чирнэ үү" "Бүх хяналтыг хассан" + + "Бүх хяналтын жагсаалтыг ачаалж чадсангүй." "Бусад" "Төхөөрөмжийн хяналт руу нэмэх" @@ -1032,6 +1036,7 @@ "Хяналтуудыг шинэчиллээ" "ПИН нь үсэг эсвэл дүрс тэмдэгт агуулдаг" "%s-г бататгах" + "ПИН код буруу байна" "Баталгаж байна…" "ПИН оруулна уу" "Өөр ПИН ашиглах" @@ -1041,6 +1046,9 @@ "Зөвлөмжүүдийг ачаалж байна" "Медианы энэ харилцан үйлдлийг хаах" "Идэвхгүй байна, аппыг шалгана уу" + "Алдаа, дахин оролдож байна…" + "Төхөөрөмжийг хассан" + "Статус ачаалах боломжгүй" "Алдаа гарав, дахин оролдоно уу" "Үргэлжилж байна" "Шинэ хяналтыг харахын тулд асаах товчийг удаан дарна уу" diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index cd6aa2acdc25c18be5ffad53c9241d56ab5c59b0..6868a7f76054fff8fe7c55ef93bbe62eafe1810d 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -430,6 +430,8 @@ "स्क्रीन रेकॉर्ड" "सुरू" "थांबा" + + "अ‍ॅप्स स्विच करण्यासाठी वर स्वाइप करा" "अ‍ॅप्स वर झटपट स्विच करण्यासाठी उजवीकडे ड्रॅग करा" "अवलोकन टॉगल करा." @@ -712,6 +714,8 @@ "संभाषण विभागाच्या सर्वात वरती दिसते आणि बबलसारखे दिसते." "सेटिंग्ज" "प्राधान्य" + + "अलीकडील कोणतेही बबल नाहीत" "अलीकडील बबल आणि डिसमिस केलेले बबल येथे दिसतील" "या सूचनांमध्ये सुधारणा केली जाऊ शकत नाही." @@ -999,8 +1003,7 @@ "बबल कधीही नियंत्रित करा" "या अ‍ॅपमधून बबल बंद करण्यासाठी व्यवस्थापित करा वर टॅप करा" "समजले" - - + "%1$s सेटिंग्ज" "सिस्टम नेव्हिगेशन अपडेट केले. बदल करण्यासाठी, सेटिंग्जवर जा." "सिस्टम नेव्हिगेशन अपडेट करण्यासाठी सेटिंग्जवर जा" "स्टँडबाय" @@ -1025,6 +1028,8 @@ "पॉवर मेनूमधून अ‍ॅक्सेस करण्यासाठी नियंत्रणे निवडा" "नियंत्रणांची पुनर्रचना करण्यासाठी धरून ठेवा आणि ड्रॅग करा" "सर्व नियंत्रणे काढून टाकली आहेत" + + "सर्व नियंत्रणांची सूची लोड करता आली नाही." "इतर" "डिव्हाइस नियंत्रणांमध्ये जोडा" @@ -1033,6 +1038,7 @@ "नियंत्रणे अपडेट केली आहेत" "पिनमध्ये अक्षरांचा किंवा चिन्हांचा समावेश असतो" "%s ची पडताळणी करा" + "चुकीचा पिन" "पडताळणी करत आहे…" "पिन एंटर करा" "दुसरा पिन वापरून पहा" @@ -1042,6 +1048,9 @@ "शिफारशी लोड करत आहे" "हे मीडिया सेशन बंद करा" "निष्क्रिय, ॲप तपासा" + "एरर, पुन्हा प्रयत्न करत आहे…" + "डिव्हाइस काढून टाकले आहे" + "स्थिती लोड करू शकत नाही" "एरर, पुन्हा प्रयत्न करा" "प्रगतीपथावर आहे" "नवीन नियंत्रणे पाहण्यासाठी पॉवर बटण धरून ठेवा" diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index c1c35a1dbfcbd8bfa9ffe48e3fbf56fc1ab2f830..baaccf3af1ee2604a87f5860b7dd2ec1634855af 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -430,6 +430,8 @@ "Rakam Skrin" "Mula" "Berhenti" + + "Leret ke atas untuk menukar apl" "Seret ke kanan untuk beralih apl dengan pantas" "Togol Ikhtisar" @@ -712,6 +714,8 @@ "Ditunjukkan di sebelah atas bahagian perbualan dan muncul sebagai gelembung." "Tetapan" "Keutamaan" + + "Tiada gelembung terbaharu" "Gelembung baharu dan gelembung yang diketepikan akan dipaparkan di sini" "Pemberitahuan ini tidak boleh diubah suai." @@ -1024,6 +1028,8 @@ "Pilih kawalan untuk diakses daripada menu kuasa" "Tahan & seret untuk mengatur semula kawalan" "Semua kawalan dialih keluar" + + "Senarai semua kawalan tidak dapat dimuatkan." "Lain-lain" "Tambahkan pada kawalan peranti" @@ -1032,6 +1038,7 @@ "Kawalan dikemas kini" "PIN mengandungi huruf atau simbol" "Sahkan %s" + "PIN salah" "Mengesahkan…" "Masukkan PIN" "Cuba PIN lain" @@ -1041,6 +1048,9 @@ "Memuatkan cadangan" "Tutup sesi media ini" "Tidak aktif, semak apl" + "Ralat, mencuba semula…" + "Peranti dialih keluar" + "Tidak dapat memuatkan status" "Ralat, cuba lagi" "Sedang berlangsung" "Tahan butang Kuasa untuk melihat kawalan baharu" diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml index e4a07fbd7a76180019a7981f2aceb9626f6841f1..4a4e96ae26434c6149f274adeb2290f490962a7e 100644 --- a/packages/SystemUI/res/values-my/strings.xml +++ b/packages/SystemUI/res/values-my/strings.xml @@ -430,6 +430,7 @@ "ဖန်သားပြင် မှတ်တမ်းတင်ရန်" "စတင်ရန်" "ရပ်ရန်" + "စက်" "အက်ပ်များကို ဖွင့်ရန် အပေါ်သို့ ပွတ်ဆွဲပါ" "အက်ပ်များကို ပြောင်းရန် ညာဘက်သို့ ဖိဆွဲပါ" "ဖွင့်၊ ပိတ် အနှစ်ချုပ်" @@ -712,6 +713,7 @@ "စကားဝိုင်းကဏ္ဍ၏ ထိပ်ပိုင်းတွင် ပြပြီး ပူဖောင်းကွက်အဖြစ် မြင်ရသည်။" "ဆက်တင်များ" "ဦးစားပေး" + "%1$s က စကားဝိုင်းအလိုက် ဆက်တင်များကို မပံ့ပိုးပါ" "လတ်တလော ပူဖောင်းကွက်များ မရှိပါ" "လတ်တလော ပူဖောင်းကွက်များနှင့် ပိတ်လိုက်သော ပူဖောင်းကွက်များကို ဤနေရာတွင် မြင်ရပါမည်" "ဤအကြောင်းကြားချက်များကို ပြုပြင်၍ မရပါ။" @@ -1024,6 +1026,8 @@ "ဖွင့်ပိတ်မီနူးမှ သုံးရန် ထိန်းချုပ်မှုများ ရွေးပါ" "ထိန်းချုပ်မှုများ ပြန်စီစဉ်ရန် ဖိပြီးဆွဲပါ" "ထိန်းချုပ်မှုအားလုံး ဖယ်ရှားလိုက်သည်" + + "ထိန်းချုပ်မှုအားလုံး၏ စာရင်းကို ဖွင့်၍မရပါ။" "အခြား" "စက်ထိန်းစနစ်သို့ ထည့်ရန်" @@ -1032,6 +1036,7 @@ "ထိန်းချုပ်မှု အပ်ဒိတ်လုပ်ပြီးပြီ" "ပင်နံပါတ်တွင် စာလုံး သို့မဟုတ် သင်္ကေတများပါဝင်သည်" "%s ကို အတည်ပြုခြင်း" + "ပင်နံပါတ် မှားနေသည်" "အတည်ပြုနေသည်…" "ပင်နံပါတ် ထည့်ပါ" "နောက်ပင်နံပါတ်တစ်ခု စမ်းကြည့်ရန်" @@ -1041,6 +1046,9 @@ "အကြံပြုချက်များ ဖွင့်နေသည်" "ဤမီဒီယာစက်ရှင်ကို ပိတ်ပါ" "ရပ်နေသည်၊ အက်ပ်ကို စစ်ဆေးပါ" + "မှားသွားသည်၊ ပြန်စမ်းနေသည်…" + "စက်ကို ဖယ်ရှားထားသည်" + "အခြေအနေကို ဖွင့်၍မရပါ" "မှားသွားသည်၊ ပြန်စမ်းကြည့်ပါ" "ဆောင်ရွက်နေသည်" "ထိန်းချုပ်မှုအသစ်များ ကြည့်ရန် ဖွင့်ပိတ်ခလုတ်ကို ဖိထားပါ" diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index 088371e2449eab6b8553f7412fe55d69c26f6a56..dc749ecf6823d93a032fc06c59091e36c6dcdcf7 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -430,6 +430,7 @@ "Skjermopptak" "Start" "Stopp" + "Enhet" "Sveip opp for å bytte apper" "Dra til høyre for å bytte apper raskt" "Slå oversikten av eller på" @@ -712,6 +713,7 @@ "Vises øverst i en samtaledel og vises som en boble." "Innstillinger" "Prioritet" + "%1$s støtter ikke samtalespesifikke innstillinger" "Ingen nylige bobler" "Nylige bobler og avviste bobler vises her" "Disse varslene kan ikke endres." @@ -1024,6 +1026,8 @@ "Velg kontroller som er tilgjengelige fra av/på-menyen" "Hold og dra for å flytte kontroller" "Alle kontroller er fjernet" + + "Listen over alle kontroller kunne ikke lastes inn." "Annet" "Legg til i enhetsstyring" @@ -1032,6 +1036,7 @@ "Kontrollene er oppdatert" "PIN-koden inneholder bokstaver eller symboler" "Bekreft %s" + "Feil PIN-kode" "Bekrefter …" "Skriv inn PIN-koden" "Prøv en annen PIN-kode" @@ -1041,6 +1046,9 @@ "Laster inn anbefalinger" "Lukk denne medieøkten" "Inaktiv. Sjekk appen" + "Feil. Prøver igjen …" + "Enheten er fjernet" + "Kan ikke laste inn status" "En feil oppsto. Prøv på nytt" "Pågår" "Hold inne av/på-knappen for å se kontroller" diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index f072dc41af0716127d1ffc5f995180401600ad57..04fff85175664d60098643eb07c409d727608180 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -430,6 +430,8 @@ "स्रिनको रेकर्ड" "सुरु गर्नुहोस्" "रोक्नुहोस्" + + "एपहरू बदल्न माथितिर स्वाइप गर्नुहोस्" "एपहरू बदल्न द्रुत गतिमा दायाँतिर ड्र्याग गर्नुहोस्" "परिदृश्य टगल गर्नुहोस्" @@ -712,6 +714,8 @@ "वार्तालाप खण्डको सिरानमा बबलका रूपमा देखा पर्छ।" "सेटिङ" "प्राथमिकता" + + "हालैका बबलहरू छैनन्" "हालैका बबल र खारेज गरिएका बबलहरू यहाँ देखिने छन्" "यी सूचनाहरू परिमार्जन गर्न मिल्दैन।" @@ -999,8 +1003,7 @@ "जुनसुकै बेला बबलहरू नियन्त्रण गर्नुहोस्" "यो अनुप्रयोगबाट आएका बबलहरू निष्क्रिय पार्न व्यवस्थापन गर्नुहोस् नामक बटनमा ट्याप गर्नुहोस्" "बुझेँ" - - + "%1$s का सेटिङहरू" "प्रणालीको नेभिगेसन अद्यावधिक गरियो। परिवर्तन गर्न सेटिङमा जानुहोस्।" "प्रणालीको नेभिगेसन अद्यावधिक गर्न सेटिङमा जानुहोस्" "स्ट्यान्डबाई" @@ -1025,6 +1028,8 @@ "पावर मेनुबाट प्रयोग गर्न चाहेका नियन्त्रण सुविधाहरू छान्नुहोस्" "नियन्त्रणहरूको क्रम मिलाउन तिनलाई थिचेर ड्र्याग गर्नुहोस्" "सबै नियन्त्रणहरू हटाइए" + + "सबै नियन्त्रणहरूको सूची लोड गर्न सकिएन।" "अन्य" "यन्त्र नियन्त्रण गर्ने विजेटहरूको सूचीमा थप्नुहोस्" @@ -1033,6 +1038,7 @@ "नियन्त्रण सुविधाहरू अद्यावधिक गरिए" "PIN मा अक्षर वा चिन्हहरू समाविष्ट हुन्छन्" "%s पुष्टि गर्नुहोस्" + "PIN मिलेन" "पुष्टि गर्दै…" "PIN प्रविष्टि गर्नुहोस्" "अर्को PIN प्रयोग गरी हेर्नु…" @@ -1042,6 +1048,9 @@ "सिफारिसहरू लोड गर्दै" "यो मिडिया सत्र बन्द गर्नुहोस्" "निष्क्रिय छ, एप जाँच गर्नु…" + "त्रुटि भयो, फेरि प्रयास गर्दै…" + "यन्त्र हटाइयो" + "वस्तुस्थिति लोड गर्न सकिएन" "त्रुटि भयो, फेरि प्रयास गर्नु…" "कार्य हुँदै छ" "नयाँ नियन्त्रण सुविधाहरू हेर्न पावर बटन थिचिराख्नुहोस्" diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index dd730d44c69417dec7a01cab92b7e854d7263114..7376861ca5d664bc8d63a16ad0af9f465b0094ca 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -430,6 +430,7 @@ "Schermopname" "Starten" "Stoppen" + "Apparaat" "Veeg omhoog om te schakelen tussen apps" "Sleep naar rechts om snel tussen apps te schakelen" "Overzicht in-/uitschakelen" @@ -712,6 +713,7 @@ "Wordt bovenaan het gedeelte met gesprekken weergegeven en als een bubbel." "Instellingen" "Prioriteit" + "%1$s ondersteunt geen gespreksspecifieke instellingen" "Geen recente bubbels" "Recente bubbels en gesloten bubbels worden hier weergegeven" "Deze meldingen kunnen niet worden aangepast." @@ -1024,6 +1026,8 @@ "Kies bedieningselementen die je vanaf het aan/uit-menu wilt kunnen gebruiken" "Houd vast en sleep om de bedieningselementen opnieuw in te delen" "Alle bedieningselementen verwijderd" + + "Kan lijst met alle bedieningselementen niet laden." "Overig" "Toevoegen aan apparaatbediening" @@ -1032,6 +1036,7 @@ "Bedieningselementen geüpdated" "Pincode bevat letters of symbolen" "%s verifiëren" + "Onjuiste pincode" "Verifiëren…" "Geef de pincode op" "Een andere pincode proberen" @@ -1041,6 +1046,9 @@ "Aanbevelingen laden" "Deze mediasessie sluiten" "Inactief, check de app" + "Fout. Opnieuw proberen…" + "Apparaat verwijderd" + "Kan status niet laden" "Fout, probeer het opnieuw" "Bezig" "Houd de aan/uit-knop ingedrukt om nieuwe bedieningselementen te bekijken" diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml index 8acd97cbf00361c089feddb219a8e64361ce4380..08afd1fc4a58a6da6268dc6fa5d9dbd23cc87fae 100644 --- a/packages/SystemUI/res/values-or/strings.xml +++ b/packages/SystemUI/res/values-or/strings.xml @@ -36,7 +36,7 @@ "ବ୍ୟାଟେରୀ ସେଭର୍‌ ଚାଲୁ କରିବେ?" "ବ୍ୟାଟେରୀ ସେଭର୍ ବିଷୟରେ" "ଅନ୍‌ କରନ୍ତୁ" - "ବ୍ୟାଟେରୀ ସେଭର୍‌ ଅନ୍ କରନ୍ତୁ" + "ବ୍ୟାଟେରୀ ସେଭର୍‌ ଚାଲୁ କରନ୍ତୁ" "ସେଟିଂସ୍" "ୱାଇ-ଫାଇ" "ଅଟୋ-ରୋଟେଟ୍‌ ସ୍କ୍ରିନ୍" @@ -430,6 +430,8 @@ "ସ୍କ୍ରିନ୍ ରେକର୍ଡ" "ଆରମ୍ଭ କରନ୍ତୁ" "ବନ୍ଦ କରନ୍ତୁ" + + "ଆପ୍‌କୁ ବଦଳ କରିବା ପାଇଁ ସ୍ଵାଇପ୍ କରନ୍ତୁ" "ଆପ୍‌ଗୁଡ଼ିକ ମଧ୍ୟରେ ଶୀଘ୍ର ବଦଳ କରିବା ପାଇଁ ଡାହାଣକୁ ଡ୍ରାଗ୍ କରନ୍ତୁ" "ସଂକ୍ଷିପ୍ତ ବିବରଣୀକୁ ଟୋଗଲ୍ କରନ୍ତୁ" @@ -712,6 +714,8 @@ "ଏହା ବାର୍ତ୍ତାଳାପ ବିଭାଗର ଶୀର୍ଷରେ ବବଲ୍ ଭାବେ ଦେଖାଯାଏ।" "ସେଟିଂସ୍" "ପ୍ରାଥମିକତା" + + "ବର୍ତ୍ତମାନ କୌଣସି ବବଲ୍ ନାହିଁ" "ବର୍ତ୍ତମାନର ଏବଂ ଖାରଜ କରାଯାଇଥିବା ବବଲଗୁଡ଼ିକ ଏଠାରେ ଦେଖାଯିବ" "ଏହି ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ପରିବର୍ତ୍ତନ କରିହେବ ନାହିଁ।" @@ -999,8 +1003,7 @@ "ଯେ କୌଣସି ସମୟରେ ବବଲଗୁଡ଼ିକ ନିୟନ୍ତ୍ରଣ କରନ୍ତୁ" "ଏହି ଆପର ବବଲଗୁଡ଼ିକ ବନ୍ଦ କରିବା ପାଇଁ \'ପରିଚାଳନା କରନ୍ତୁ\' ବଟନରେ ଟାପ୍ କରନ୍ତୁ" "ବୁଝିଗଲି" - - + "%1$s ସେଟିଂସ୍" "ସିଷ୍ଟମ୍ ନାଭିଗେସନ୍ ଅପ୍‌ଡେଟ୍ ହୋଇଛି। ପରିବର୍ତ୍ତନ କରିବା ପାଇଁ, ସେଟିଂସ୍‌କୁ ଯାଆନ୍ତୁ।" "ସିଷ୍ଟମ୍ ନାଭିଗେସନ୍ ଅପ୍‌ଡେଟ୍ କରିବା ପାଇଁ ସେଟିଂସ୍‍କୁ ଯାଆନ୍ତୁ" "ଷ୍ଟାଣ୍ଡବାଏ" @@ -1025,6 +1028,8 @@ "ପାୱାର ମେନୁରୁ ଆକ୍ସେସ୍ କରିବାକୁ ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକୁ ବାଛନ୍ତୁ" "ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକ ପୁଣି ସଜାଇବାକୁ ସେଗୁଡ଼ିକୁ ଧରି ଟାଣନ୍ତୁ" "ସମସ୍ତ ନିୟନ୍ତ୍ରଣ କାଢ଼ି ଦିଆଯାଇଛି" + + "ସବୁ ନିୟନ୍ତ୍ରଣର ତାଲିକା ଲୋଡ୍ କରିପାରିଲା ନାହିଁ।" "ଅନ୍ୟ" "ଡିଭାଇସ୍ ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକରେ ଯୋଗ କରନ୍ତୁ" @@ -1033,6 +1038,7 @@ "ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକ ଅପଡେଟ୍ କରାଯାଇଛି" "PINରେ ଅକ୍ଷର କିମ୍ୱା ସଙ୍କେତଗୁଡ଼ିକ ଥାଏ" "%s ଯାଞ୍ଚ କରନ୍ତୁ" + "ଭୁଲ PIN" "ଯାଞ୍ଚ କରାଯାଉଛି…" "PIN ଲେଖନ୍ତୁ" "ଅନ୍ୟ ଏକ PIN ଚେଷ୍ଟା କରି ଦେଖନ୍ତୁ" @@ -1042,6 +1048,9 @@ "ସୁପାରିଶଗୁଡ଼ିକ ଲୋଡ୍ କରାଯାଉଛି" "ଏହି ମିଡିଆ ସେସନ୍ ବନ୍ଦ କରନ୍ତୁ" "ନିଷ୍କ୍ରିୟ ଅଛି, ଆପ ଯାଞ୍ଚ କରନ୍ତୁ" + "ତ୍ରୁଟି, ପୁଣି ଚେଷ୍ଟା କରୁଛି…" + "ଡିଭାଇସ୍ କାଢ଼ି ଦିଆଯାଇଛି" + "ସ୍ଥିତି ଲୋଡ୍ କରାଯାଇପାରିବ ନାହିଁ" "ତ୍ରୁଟି ହୋଇଛି, ପୁଣି ଚେଷ୍ଟା କର" "ପ୍ରଗତିରେ ଅଛି" "ନୂଆ ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକୁ ଦେଖିବା ପାଇଁ ପାୱାର ବଟନକୁ ଧରି ରଖନ୍ତୁ" diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index 4602968b1151a7011ba4ee8d67d7f3a32de073b0..60846c60dc297d439fb19e9f84906bc00a1f778a 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -430,6 +430,8 @@ "ਸਕ੍ਰੀਨ ਰਿਕਾਰਡਰ" "ਸ਼ੁਰੂ ਕਰੋ" "ਰੋਕੋ" + + "ਐਪਾਂ ਵਿਚਾਲੇ ਅਦਲਾ-ਬਦਲੀ ਕਰਨ ਲਈ ਉੱਪਰ ਵੱਲ ਸਵਾਈਪ ਕਰੋ" "ਐਪਾਂ ਵਿਚਾਲੇ ਤੇਜ਼ੀ ਨਾਲ ਅਦਲਾ-ਬਦਲੀ ਕਰਨ ਲਈ ਸੱਜੇ ਪਾਸੇ ਵੱਲ ਘਸੀਟੋ" "ਰੂਪ-ਰੇਖਾ ਨੂੰ ਟੌਗਲ ਕਰੋ" @@ -712,6 +714,8 @@ "ਗੱਲਬਾਤ ਸੈਕਸ਼ਨ ਦੇ ਉੱਪਰ ਅਤੇ ਬਬਲ ਦੇ ਤੌਰ \'ਤੇ ਦਿਖਾਉਂਦਾ ਹੈ।" "ਸੈਟਿੰਗਾਂ" "ਤਰਜੀਹ" + + "ਕੋਈ ਹਾਲੀਆ ਬਬਲ ਨਹੀਂ" "ਹਾਲੀਆ ਬਬਲ ਅਤੇ ਖਾਰਜ ਕੀਤੇ ਬਬਲ ਇੱਥੇ ਦਿਸਣਗੇ" "ਇਹਨਾਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਸੋਧਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ।" @@ -999,8 +1003,7 @@ "ਬਬਲ ਨੂੰ ਕਿਸੇ ਵੇਲੇ ਵੀ ਕੰਟਰੋਲ ਕਰੋ" "ਇਸ ਐਪ \'ਤੇ ਬਬਲ ਬੰਦ ਕਰਨ ਲਈ \'ਪ੍ਰਬੰਧਨ ਕਰੋ\' \'ਤੇ ਟੈਪ ਕਰੋ" "ਸਮਝ ਲਿਆ" - - + "%1$s ਸੈਟਿੰਗਾਂ" "ਸਿਸਟਮ ਨੈਵੀਗੇਸ਼ਨ ਅੱਪਡੇਟ ਹੋ ਗਿਆ। ਤਬਦੀਲੀਆਂ ਕਰਨ ਲਈ, ਸੈਟਿੰਗਾਂ \'ਤੇ ਜਾਓ।" "ਸਿਸਟਮ ਨੈਵੀਗੇਸ਼ਨ ਨੂੰ ਅੱਪਡੇਟ ਕਰਨ ਲਈ ਸੈਟਿੰਗਾਂ \'ਤੇ ਜਾਓ" "ਸਟੈਂਡਬਾਈ" @@ -1025,6 +1028,8 @@ "ਪਹੁੰਚ ਕਰਨ ਲਈ ਪਾਵਰ ਮੀਨੂ ਤੋਂ ਕੰਟਰੋਲ ਚੁਣੋ" "ਕੰਟਰੋਲਾਂ ਨੂੰ ਮੁੜ-ਵਿਵਸਥਿਤ ਕਰਨ ਲਈ ਫੜ੍ਹ ਕੇ ਘਸੀਟੋ" "ਸਾਰੇ ਕੰਟਰੋਲ ਹਟਾਏ ਗਏ" + + "ਸਾਰੇ ਕੰਟਰੋਲਾਂ ਦੀ ਸੂਚੀ ਨੂੰ ਲੋਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ।" "ਹੋਰ" "ਡੀਵਾਈਸ ਕੰਟਰੋਲਾਂ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ" @@ -1033,6 +1038,7 @@ "ਕੰਟਰੋਲ ਅੱਪਡੇਟ ਕੀਤੇ ਗਏ" "ਪਿੰਨ ਵਿੱਚ ਅੱਖਰ ਜਾਂ ਚਿੰਨ੍ਹ ਸ਼ਾਮਲ ਹਨ" "%s ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ" + "ਗਲਤ ਪਿੰਨ" "ਪੁਸ਼ਟੀ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…" "ਪਿੰਨ ਦਾਖਲ ਕਰੋ" "ਕੋਈ ਹੋਰ ਪਿੰਨ ਵਰਤ ਕੇ ਦੇਖੋ" @@ -1042,6 +1048,9 @@ "ਸਿਫ਼ਾਰਸ਼ਾਂ ਲੋਡ ਹੋ ਰਹੀਆਂ ਹਨ" "ਇਸ ਮੀਡੀਆ ਸੈਸ਼ਨ ਨੂੰ ਬੰਦ ਕਰੋ" "ਅਕਿਰਿਆਸ਼ੀਲ, ਐਪ ਦੀ ਜਾਂਚ ਕਰੋ" + "ਗੜਬੜ, ਮੁੜ ਕੋਸ਼ਿਸ਼ ਹੋ ਰਹੀ ਹੈ…" + "ਡੀਵਾਈਸ ਹਟਾਇਆ ਗਿਆ" + "ਸਥਿਤੀ ਲੋਡ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ" "ਗੜਬੜ, ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ" "ਜਾਰੀ ਹੈ" "ਨਵੇਂ ਕੰਟਰੋਲ ਦੇਖਣ ਲਈ ਪਾਵਰ ਬਟਨ ਦਬਾਈ ਰੱਖੋ" diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index 4caf6ae5abb243651d0fd6f8fa12750aa7a6c748..a18df6f224feac4751c941e2c547fa180fa04643 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -91,7 +91,7 @@ "Nagrywanie ekranu" "Stałe powiadomienie o sesji rejestrowania zawartości ekranu" "Rozpocząć nagrywanie?" - "Podczas nagrywania system Android może rejestrować wszelkie informacji poufne wyświetlane na ekranie lub odtwarzane na urządzeniu. Dotyczy to m.in. haseł, szczegółów płatności, zdjęć, wiadomości i odtwarzanych dźwięków." + "Podczas nagrywania system Android może rejestrować wszelkie informacje poufne wyświetlane na ekranie lub odtwarzane na urządzeniu. Dotyczy to m.in. haseł, szczegółów płatności, zdjęć, wiadomości i odtwarzanych dźwięków." "Nagraj dźwięk" "Dźwięki odtwarzane na urządzeniu" "Dźwięki odtwarzane na urządzeniu, na przykład muzyka, połączenia i dzwonki" @@ -431,9 +431,11 @@ "Komunikacja NFC" "Komunikacja NFC jest wyłączona" "Komunikacja NFC jest włączona" - "Zapis ekranu" + "Nagrywanie ekranu" "Rozpocznij" "Zatrzymaj" + + "Przesuń w górę, by przełączyć aplikacje" "Szybko przeciągnij w prawo, by przełączyć aplikacje" "Przełącz Przegląd" @@ -718,6 +720,8 @@ "Wyświetla się u góry sekcji rozmów i ma postać dymku." "Ustawienia" "Priorytet" + + "Brak ostatnich dymków" "Tutaj będą pojawiać się ostatnie i odrzucone dymki" "Tych powiadomień nie można zmodyfikować." @@ -1036,6 +1040,8 @@ "Wybierz elementy sterujące dostępne w menu zasilania" "Przytrzymaj i przeciągnij, aby przestawić elementy sterujące" "Usunięto wszystkie elementy sterujące" + + "Nie udało się wczytać listy elementów sterujących." "Inne" "Dodaj do sterowania urządzeniami" @@ -1044,6 +1050,7 @@ "Zaktualizowano elementy sterujące" "Kod PIN zawiera litery lub symbole" "Sprawdź urządzenie %s" + "Nieprawidłowy kod PIN" "Sprawdzam…" "Wpisz kod PIN" "Spróbuj użyć innego kodu PIN" @@ -1053,6 +1060,9 @@ "Wczytuję rekomendacje" "Zamknij tę sesję multimediów" "Nieaktywny, sprawdź aplikację" + "Błąd, próbuję jeszcze raz…" + "Usunięto urządzenie" + "Nie udało się wczytać stanu" "Błąd, spróbuj ponownie" "W toku" "Przytrzymaj przycisk zasilania, by zobaczyć nowe elementy sterujące" diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index 0544c50b2aa7500cbdc7c9d68aed490bdb677873..6e97aa6ea1cd93ff57a04b68bc2b272b5126f579 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -430,6 +430,7 @@ "Gravação de tela" "Iniciar" "Parar" + "Dispositivo" "Deslize para cima para alternar entre os apps" "Arraste para a direita para alternar rapidamente entre os apps" "Alternar Visão geral" @@ -712,6 +713,7 @@ "Aparece na parte superior de uma seção de conversa e em forma de balão." "Configurações" "Prioridade" + "%1$s não é compatível com configurações específicas de conversa" "Nenhum balão recente" "Os balões recentes e dispensados aparecerão aqui" "Não é possível modificar essas notificações." @@ -1024,6 +1026,8 @@ "Escolha os controles para acessar pelo menu do botão liga/desliga" "Mantenha a tela pressionada e arraste para reorganizar os controles" "Todos os controles foram removidos" + + "Não foi possível carregar a lista de controles." "Outro" "Adicionar aos controles do dispositivo" @@ -1032,6 +1036,7 @@ "Controles atualizados" "O PIN contém letras ou símbolos" "Verificar %s" + "PIN incorreto" "Verificando…" "Insira o PIN" "Tente usar outro PIN" @@ -1041,6 +1046,9 @@ "Carregando recomendações" "Encerrar esta sessão de mídia" "Inativo, verifique o app" + "Erro. Tentando novamente…" + "Dispositivo removido" + "Falha ao carregar o status" "Erro. Tente novamente" "Em andamento" "Mantenha o botão liga/desliga pressionado para ver os novos controles" diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index db7dc624d842b5a54e59919b3d5413911f6aff41..cc2baad4447bb497d92d71a7cec2aad7bfe27c9f 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -430,6 +430,8 @@ "Gravação de ecrã" "Iniciar" "Parar" + + "Deslizar rapidamente para cima para mudar de aplicação" "Arraste para a direita para mudar rapidamente de aplicação." "Ativar/desativar Vista geral" @@ -712,6 +714,8 @@ "Aparece na parte superior da secção de conversas e surge como um balão." "Definições" "Prioridade" + + "Nenhum balão recente" "Os balões recentes e ignorados vão aparecer aqui." "Não é possível modificar estas notificações." @@ -1024,6 +1028,8 @@ "Escolha os controlos a que pretende aceder a partir do menu ligar/desligar." "Toque sem soltar e arraste para reorganizar os controlos." "Todos os controlos foram removidos." + + "Não foi possível carregar a lista dos controlos." "Outro" "Adicione aos controlos de dispositivos" @@ -1032,6 +1038,7 @@ "Controlos atualizados" "O PIN contém letras ou símbolos." "Valide %s" + "PIN incorreto" "A validar…" "Introduzir PIN" "Experimente outro PIN." @@ -1041,6 +1048,9 @@ "A carregar recomendações…" "Fechar esta sessão multimédia" "Inativa. Consulte a app." + "Erro. A tentar novamente…" + "Dispositivo removido." + "Impossível carregar o estado." "Erro. Tente novamente." "Em curso" "Mantenha premido o botão ligar/desligar para ver os novos controlos." diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index 0544c50b2aa7500cbdc7c9d68aed490bdb677873..6e97aa6ea1cd93ff57a04b68bc2b272b5126f579 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -430,6 +430,7 @@ "Gravação de tela" "Iniciar" "Parar" + "Dispositivo" "Deslize para cima para alternar entre os apps" "Arraste para a direita para alternar rapidamente entre os apps" "Alternar Visão geral" @@ -712,6 +713,7 @@ "Aparece na parte superior de uma seção de conversa e em forma de balão." "Configurações" "Prioridade" + "%1$s não é compatível com configurações específicas de conversa" "Nenhum balão recente" "Os balões recentes e dispensados aparecerão aqui" "Não é possível modificar essas notificações." @@ -1024,6 +1026,8 @@ "Escolha os controles para acessar pelo menu do botão liga/desliga" "Mantenha a tela pressionada e arraste para reorganizar os controles" "Todos os controles foram removidos" + + "Não foi possível carregar a lista de controles." "Outro" "Adicionar aos controles do dispositivo" @@ -1032,6 +1036,7 @@ "Controles atualizados" "O PIN contém letras ou símbolos" "Verificar %s" + "PIN incorreto" "Verificando…" "Insira o PIN" "Tente usar outro PIN" @@ -1041,6 +1046,9 @@ "Carregando recomendações" "Encerrar esta sessão de mídia" "Inativo, verifique o app" + "Erro. Tentando novamente…" + "Dispositivo removido" + "Falha ao carregar o status" "Erro. Tente novamente" "Em andamento" "Mantenha o botão liga/desliga pressionado para ver os novos controles" diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index 37896aaa14a80814a52ce10a1f744fcd05d1f84e..fed444139c089b193c0de39e53a5a90e080ff237 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -432,6 +432,7 @@ "Înregistrarea ecranului" "Începeți" "Opriți" + "Dispozitiv" "Glisați în sus pentru a comuta între aplicații" "Glisați la dreapta pentru a comuta rapid între aplicații" "Comutați secțiunea Recente" @@ -715,6 +716,7 @@ "Se afișează în partea de sus a secțiunii de conversație și apare ca un balon." "Setări" "Prioritate" + "%1$s nu acceptă setările pentru conversații" "Nu există baloane recente" "Baloanele recente și baloanele respinse vor apărea aici" "Aceste notificări nu pot fi modificate." @@ -1030,6 +1032,8 @@ "Alegeți comenzile de accesat din meniul de alimentare" "Țineți apăsat și trageți pentru a rearanja comenzile" "Au fost șterse toate comenzile" + + "Lista cu toate comenzile nu a putut fi încărcată." "Altul" "Adăugați la comenzile dispozitivelor" @@ -1038,6 +1042,7 @@ "S-au actualizat comenzile" "Codul PIN conține litere sau simboluri" "Verificați %s" + "Cod PIN greșit" "Se verifică…" "Introduceți codul PIN" "Încercați alt cod PIN" @@ -1047,6 +1052,9 @@ "Se încarcă recomandările" "Închideți această sesiune media" "Inactiv, verificați aplicația" + "Eroare, se încearcă din nou…" + "Dispozitivul a fost eliminat" + "Starea nu se poate încărca" "Eroare, încercați din nou" "În curs" "Apăsați butonul de alimentare pentru a vedea noile comenzi" diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index 00e8e60de139e1924061fbad6d412c3fff48508b..f7638ce50c4d4ed2a54cc32a67a74af666a87f96 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -434,6 +434,7 @@ "Запись экрана" "Начать" "Остановить" + "Устройство" "Чтобы переключиться между приложениями, проведите по экрану вверх." "Перетащите вправо, чтобы быстро переключиться между приложениями" "Переключить режим обзора" @@ -718,6 +719,7 @@ "Появляется в верхней части списка разговоров и в виде всплывающего чата." "Настройки" "Приоритет" + "Приложение \"%1$s\" не поддерживает настройки разговора." "Нет недавних всплывающих чатов" "Здесь будут появляться недавние и закрытые всплывающие чаты." "Эти уведомления нельзя изменить." @@ -1036,6 +1038,8 @@ "Выберите элементы управления, которые будут доступны в меню кнопки питания." "Чтобы изменить порядок элементов управления, перетащите их" "Все элементы управления удалены" + + "Не удалось загрузить список элементов управления." "Другое" "Добавьте виджеты управления устройствами" @@ -1044,6 +1048,7 @@ "Элементы управления обновлены." "PIN-код содержит буквы или символы" "Подтвердите устройство \"%s\"" + "Неверный PIN-код" "Проверка…" "Введите PIN-код" "Введите другой PIN-код" @@ -1053,6 +1058,9 @@ "Загрузка рекомендаций…" "Закрыть этот мультимедийный сеанс" "Нет ответа. Проверьте приложение." + "Ошибка. Повторная попытка…" + "Устройство удалено." + "Не удалось загрузить статус." "Ошибка. Повторите попытку." "Выполняется" "Удерживайте кнопку питания, чтобы увидеть новые элементы управления" diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml index 70083b0371277f963decf05c49cc5347d20561f3..2bcd5e399c96f82bc12743f0c8e19f9d18514ac0 100644 --- a/packages/SystemUI/res/values-si/strings.xml +++ b/packages/SystemUI/res/values-si/strings.xml @@ -430,6 +430,7 @@ "තිර පටිගත කිරීම" "ආරම්භ කරන්න" "නතර කරන්න" + "උපාංගය" "යෙදුම් මාරු කිරීමට ස්වයිප් කරන්න" "ඉක්මනින් යෙදුම් මාරු කිරීමට දකුණට අදින්න" "දළ විශ්ලේෂණය ටොගල කරන්න" @@ -712,6 +713,7 @@ "සංවාද කොටසේ ඉහළම පෙන්වන අතර බුබුළක් ලෙස දිස් වේ." "සැකසීම්" "ප්‍රමුඛතාව" + "%1$s සංවාදය නිශ්චිත සැකසීම්වලට සහාය නොදක්වයි" "මෑත බුබුලු නැත" "මෑත බුබුලු සහ ඉවත ලූ බුබුලු මෙහි දිස් වනු ඇත" "මෙම දැනුම්දීම් වෙනස් කළ නොහැක." @@ -1024,6 +1026,8 @@ "බල මෙනුවෙන් ප්‍රවේශ වීමට පාලන තෝරා ගන්න" "පාලන නැවත පිළියෙළ කිරීමට අල්ලාගෙන සිට අදින්න" "සියලු පාලන ඉවත් කර ඇත" + + "සියලු පාලනවල ලැයිස්තුව පූරණය කළ නොහැකි විය." "වෙනත්" "උපාංග පාලන වෙත එක් කරන්න" @@ -1032,6 +1036,7 @@ "පාලන යාවත්කාලීනයි" "PIN හි අකුරු හෝ සංකේත අඩංගු වේ" "%s සත්‍යාපනය කරන්න" + "වැරදි PIN එකකි" "සත්‍යාපනය කරමින්…" "PIN ඇතුළු කරන්න" "තවත් PIN එකක් උත්සාහ කරන්න" @@ -1041,6 +1046,9 @@ "නිර්දේශ පූරණය කරමින්" "මෙම මාධ්‍ය සැසිය වසන්න" "අක්‍රියයි, යෙදුම පරීක්ෂා කරන්න" + "දෝෂයකි, නැවත උත්සාහ කරමින්…" + "උපාංගය ඉවත් කර ඇත" + "තත්ත්වය පූරණය කළ නොහැකිය" "දෝෂයකි, නැවත උත්සාහ කරන්න" "ප්‍රගතියේ පවතී" "නව පාලන බැලීමට බල බොත්තම අල්ලාගෙන සිටින්න" diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index c71e4fa613e44947ac12a9eed1738e4406063902..620bcd67738d83803f5a5d3935ad3ab67ea50517 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -434,6 +434,8 @@ "Záznam obrazovky" "Začať" "Ukončiť" + + "Potiahnutím nahor prepnete aplikácie" "Presunutím doprava rýchlo prepnete aplikácie" "Prepnúť prehľad" @@ -718,6 +720,8 @@ "Zobrazuje sa v hornej časti konverzácie ako bublina." "Nastavenia" "Priorita" + + "Žiadne nedávne bubliny" "Tu sa budú zobrazovať nedávne a zavreté bubliny" "Tieto upozornenia sa nedajú upraviť." @@ -1036,6 +1040,8 @@ "Vyberte si ovládacie prvky, ku ktorým chcete mať prístup v ponuke vypínača" "Ovládacie prvky môžete usporiadať pridržaním a presunutím" "Všetky ovládacie prvky boli odstránené" + + "Zoznam všetkých ovl. prvkov sa nepodarilo načítať." "Iné" "Pridanie do ovládania zariadenia" @@ -1044,6 +1050,7 @@ "Ovládanie bolo aktualizované" "Kód PIN obsahuje písmená alebo symboly" "Overiť %s" + "Nesprávny PIN" "Overuje sa…" "Zadajte PIN" "Vyskúšajte iný kód PIN" @@ -1053,6 +1060,9 @@ "Načítavajú sa odporúčania" "Zavrieť túto reláciu média" "Neaktívne, preverte aplikáciu" + "Chyba, skúša sa znova…" + "Zariadenie je odstránené" + "Stav sa nepodarilo načítať" "Chyba, skúste to znova" "Prebieha" "Pridržaním vypínača zobrazíte nové ovládacie prvky" diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index d41b2a34727b95b8d9efd635ac98ba9f0f051fce..ba73b1aa92cc1ed344a0e32cc772db5c0701d8c9 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -434,6 +434,7 @@ "Snemanje zaslona" "Začni" "Ustavi" + "Naprava" "Za preklop aplikacij povlecite navzgor" "Povlecite v desno za hiter preklop med aplikacijami" "Vklop/izklop pregleda" @@ -718,6 +719,7 @@ "Prikazano je na vrhu razdelka s pogovorom in v oblačku." "Nastavitve" "Prednost" + "Aplikacija %1$s ne podpira posebnih nastavitev za pogovore" "Ni nedavnih oblačkov" "Tukaj bodo prikazani tako nedavni kot tudi opuščeni oblački" "Za ta obvestila ni mogoče spremeniti nastavitev." @@ -1036,6 +1038,8 @@ "Izberite kontrolnike, do katerih želite imeti dostop prek menija za vklop/izklop" "Držite in povlecite, da prerazporedite kontrolnike" "Vsi kontrolniki so bili odstranjeni" + + "Seznama vseh kontrolnikov ni bilo mogoče naložiti." "Drugo" "Dodajanje med kontrolnike naprave" @@ -1044,6 +1048,7 @@ "Kontrolniki so posodobljeni" "Koda PIN vsebuje črke ali simbole" "Preverjanje naprave %s" + "Napačna koda PIN" "Preverjanje …" "Vnesite kodo PIN" "Poskusite z drugo kodo PIN" @@ -1053,6 +1058,9 @@ "Nalaganje priporočil" "Zapri to sejo predstavnosti" "Neaktivno, poglejte aplikacijo" + "Napaka, vnovični poskus …" + "Naprava je bila odstranjena" + "Stanja ni mogoče naložiti" "Napaka, poskusite znova" "V teku" "Za ogled novih kontrolnikov pridržite gumb za vklop" diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index bc07100c82c89610769d10163b8624ed77032ccf..392c1f196e054a355083c5a9f5f717ef499099ae 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -430,6 +430,8 @@ "Regjistrimi i ekranit" "Nis" "Ndalo" + + "Rrëshqit shpejt lart për të ndërruar aplikacionet" "Zvarrit djathtas për të ndërruar aplikacionet me shpejtësi" "Kalo te përmbledhja" @@ -712,6 +714,8 @@ "Shfaqet në krye të seksionit të bisedës dhe shfaqet si flluskë." "Cilësimet" "Përparësia" + + "Nuk ka flluska të fundit" "Flluskat e fundit dhe flluskat e hequra do të shfaqen këtu" "Këto njoftime nuk mund të modifikohen." @@ -1024,6 +1028,8 @@ "Zgjidh kontrollet për të pasur qasje nga menyja e energjisë" "Mbaje të shtypur dhe zvarrit për të risistemuar kontrollet" "Të gjitha kontrollet u hoqën" + + "Lista e të gjitha kontrolleve nuk mund të ngarkohej." "Tjetër" "Shto te kontrollet e pajisjes" @@ -1032,6 +1038,7 @@ "Kontrollet u përditësuan" "Kodi PIN përmban shkronja ose simbole" "Verifiko %s" + "Kod PIN i gabuar" "Po verifikon…" "Fut kodin PIN" "Provo një kod tjetër PIN" @@ -1041,6 +1048,9 @@ "Po ngarkon rekomandimet" "Mbyll këtë sesion të medias" "Joaktive, kontrollo aplikacionin" + "Gabim, po provohet përsëri" + "Pajisja u hoq" + "Statusi nuk mund të ngarkohet" "Gabim, provo sërish" "Në vazhdim" "Mbaj shtypur butonin e energjisë për të parë kontrollet e reja" diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index b01dc4fd21bfad166f8432f7129a15cefd23695e..54d7fc898270603e5ac22a72d329da9e30254379 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -432,6 +432,7 @@ "Снимак екрана" "Почните" "Зауставите" + "Уређај" "Превуците нагоре да бисте мењали апликације" "Превуците удесно да бисте брзо променили апликације" "Укључи/искључи преглед" @@ -715,6 +716,7 @@ "Приказује се у врху одељка конверзације и као облачић." "Подешавања" "Приоритет" + "%1$s не подржава подешавања за конверзације" "Нема недавних облачића" "Овде се приказују недавни и одбачени облачићи" "Ова обавештења не могу да се мењају." @@ -1030,6 +1032,7 @@ "Одаберите контроле којима ћете приступати из менија напајања" "Задржите и превуците да бисте променили распоред контрола" "Све контроле су уклоњене" + "Промене нису сачуване" "Учитавање листе свих контрола није успело." "Друго" "Додајте у контроле уређаја" @@ -1038,6 +1041,7 @@ "Контроле су ажуриране" "PIN садржи слова или симболе" "Верификујте: %s" + "Погрешан PIN" "Верификује се…" "Унесите PIN" "Пробајте помоћу другог PIN-а" @@ -1047,6 +1051,9 @@ "Учитавају се препоруке" "Затворите ову сесију медија" "Неактивно. Видите апликацију" + "Грешка, покушава се поново…" + "Уређај је уклоњен" + "Учитавање статуса није успело" "Грешка. Пробајте поново" "У току" "Задржите дугме за укључивање да бисте видели нове контроле" diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index c7943980b0e847365b9d2ead94922459bbe8301e..70e97f20e24ff6b16da28869bdade16075d8ed0e 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -430,6 +430,8 @@ "Skärminspelning" "Starta" "Stoppa" + + "Byt appar genom att svepa uppåt" "Tryck och dra åt höger för att snabbt byta mellan appar" "Aktivera och inaktivera översikten" @@ -712,6 +714,8 @@ "Visas högst upp bland konversationerna som en bubbla" "Inställningar" "Prioritet" + + "Inga nya bubblor" "De senaste bubblorna och ignorerade bubblor visas här" "Det går inte att ändra de här aviseringarna." @@ -1024,6 +1028,8 @@ "Välj snabbkontroller som ska visas i strömbrytarmenyn" "Ändra ordning på kontrollerna genom att trycka och dra" "Alla kontroller har tagits bort" + + "Listan med alla kontroller kunde inte läsas in." "Övrigt" "Lägg till i enhetsstyrning" @@ -1032,6 +1038,7 @@ "Snabbkontroller uppdaterade" "Pinkoden innehåller bokstäver eller symboler" "Verifiera %s" + "Fel pinkod" "Verifierar …" "Ange pinkod" "Testa en annan pinkod" @@ -1041,6 +1048,9 @@ "Rekommendationer läses in" "Stäng den här sessionen" "Inaktiv, kolla appen" + "Fel, försöker igen …" + "Enheten har tagits bort" + "Ingen status lästes in" "Fel, försök igen" "Pågår" "De nya snabbkontrollerna visas om du håller strömbrytaren nedtryckt" diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index 01cd04a0f00548de5ebb5aab75d11e4a91edca24..6ea4253acd70a630eecd116f3e530bfe97c7b3d7 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -430,6 +430,8 @@ "Rekodi ya Skrini" "Anza kurekodi" "Acha kurekodi" + + "Telezesha kidole juu ili ubadilishe programu" "Buruta kulia ili ubadilishe programu haraka" "Washa Muhtasari" @@ -712,6 +714,8 @@ "Huonyeshwa sehemu ya juu ya mazungumzo na huonekana kama kiputo." "Mipangilio" "Kipaumbele" + + "Hakuna viputo vya hivi majuzi" "Viputo vya hivi karibuni na vile vilivyoondolewa vitaonekana hapa" "Arifa hizi haziwezi kubadilishwa." @@ -1024,6 +1028,8 @@ "Chagua vidhibiti vya kufikia ukitumia menyu ya kuwasha/kuzima" "Shikilia na uburute ili upange upya vidhibiti" "Umeondoa vidhibiti vyote" + + "Imeshindwa kupakia orodha ya vidhibiti vyote." "Nyingine" "Weka kwenye vidhibiti vya vifaa" @@ -1032,6 +1038,7 @@ "Umesasisha vidhibiti" "PIN ina herufi au alama" "Thibitisha %s" + "Nambari ya PIN si sahihi" "Inathibitisha…" "Weka PIN" "Jaribu PIN nyingine" @@ -1041,6 +1048,9 @@ "Inapakia mapendekezo" "Funga kipindi hiki cha maudhui" "Haitumiki, angalia programu" + "Hitilafu, inajaribu tena…" + "Kifaa kimeondolewa" + "Imeshindwa kupakia hali" "Hitilafu, jaribu tena" "Inaendelea" "Shikilia kitufe cha kuwasha/kuzima ili uone vidhibiti vipya" diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index 6951872bde027df4b96ec9d4a6a286d109cb07f0..81204e3c558ea15c8a022804b9fabfafcd459aa7 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -430,6 +430,8 @@ "ஸ்கிரீன் ரெக்கார்டு" "தொடங்கு" "நிறுத்து" + + "ஆப்ஸிற்கு இடையே மாற்றுவதற்கு, மேல்நோக்கி ஸ்வைப் செய்க" "ஆப்ஸை வேகமாக மாற்ற, வலப்புறம் இழுக்கவும்" "மேலோட்டப் பார்வையை நிலைமாற்று" @@ -712,6 +714,8 @@ "உரையாடல் பிரிவின் மேற்பகுதியில் ஒரு குமிழாகக் காட்டப்படும்." "அமைப்புகள்" "முன்னுரிமை" + + "சமீபத்திய குமிழ்கள் இல்லை" "சமீபத்திய குமிழ்களும் நிராகரிக்கப்பட்ட குமிழ்களும் இங்கே தோன்றும்" "இந்த அறிவிப்புகளை மாற்ற இயலாது." @@ -1025,6 +1029,8 @@ "பவர் மெனுவில் இருந்து அணுகுவதற்கான கட்டுப்பாடுகளைத் தேர்ந்தெடுக்கலாம்" "கட்டுப்பாடுகளை மறுவரிசைப்படுத்த அவற்றைப் பிடித்து இழுக்கவும்" "கட்டுப்பாடுகள் அனைத்தும் அகற்றப்பட்டன" + + "எல்லா கட்டுப்பாடுகளின் பட்டியலை ஏற்ற முடியவில்லை." "பிற" "சாதனக் கட்டுப்பாடுகளில் சேர்த்தல்" @@ -1033,6 +1039,7 @@ "கட்டுப்பாடுகள் மாற்றப்பட்டன" "பின்னில் எழுத்துகள் அல்லது குறிகள் உள்ளன" "%s ஐச் சரிபார்த்தல்" + "தவறான பின்" "சரிபார்க்கிறது…" "பின்னை உள்ளிடுக" "வேறு பின்னைப் பயன்படுத்தவும்" @@ -1042,6 +1049,9 @@ "பரிந்துரைகளை ஏற்றுகிறது" "இந்த மீடியா அமர்வை மூடுக" "செயலில் இல்லை , சரிபார்க்கவும்" + "பிழை, மீண்டும் முயல்கிறது…" + "சாதனம் அகற்றப்பட்டது" + "நிலையைக் காட்ட முடியவில்லை" "பிழை, மீண்டும் முயலவும்" "செயல்பாட்டிலுள்ளது" "புதிய கட்டுப்பாடுகளைப் பார்க்க பவர் பட்டனைப் பிடித்திருக்கவும்" diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index 4d90e7866cd707dbb9f2b147b221a1c8191c6967..cfd420a326e560f38db2110acc8991f2a8fcc8d2 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -430,6 +430,8 @@ "స్క్రీన్ రికార్డ్" "ప్రారంభించు" "ఆపు" + + "యాప్‌లను మార్చడం కోసం ఎగువకు స్వైప్ చేయండి" "యాప్‌లను శీఘ్రంగా స్విచ్ చేయడానికి కుడి వైపుకు లాగండి" "స్థూలదృష్టిని టోగుల్ చేయి" @@ -712,6 +714,8 @@ "సంభాషణ విభాగానికి ఎగువున ఉంటుంది, బబుల్‌లాగా కనిపిస్తుంది." "సెట్టింగ్‌లు" "ప్రాధాన్యత" + + "ఇటీవలి బబుల్స్ ఏవీ లేవు" "ఇటీవలి బబుల్స్, తీసివేసిన బబుల్స్ ఇక్కడ కనిపిస్తాయి" "ఈ నోటిఫికేషన్‌లను సవరించడం వీలుపడదు." @@ -999,8 +1003,7 @@ "బబుల్స్‌ను ఎప్పుడైనా నియంత్రించండి" "ఈ యాప్ నుండి వచ్చే బబుల్స్‌ను ఆఫ్ చేయడానికి మేనేజ్ బటన్‌ను ట్యాప్ చేయండి" "అర్థమైంది" - - + "%1$s సెట్టింగ్‌లు" "సిస్టమ్ నావిగేషన్ అప్‌డేట్ చేయబడింది. మార్పులు చేయడానికి, సెట్టింగ్‌లకు వెళ్లండి." "సిస్టమ్ నావిగేషన్‌ను అప్‌డేట్ చేయడానికి సెట్టింగ్‌లకు వెళ్లండి" "స్టాండ్‌బై" @@ -1025,6 +1028,8 @@ "పవర్ మెనూ నుండి యాక్సెస్ చేయడానికి నియంత్రణలను ఎంచుకోండి" "నియంత్రణల క్రమం మార్చడానికి పట్టుకుని&amp, లాగండి" "అన్ని నియంత్రణలు తీసివేయబడ్డాయి" + + "అన్ని నియంత్రణలు గల జాబితాను లోడ్ చేయలేకపోయాము." "ఇతరం" "పరికరం నియంత్రణలకు జోడించడం" @@ -1033,6 +1038,7 @@ "నియంత్రణలు అప్‌డేట్ అయ్యాయి" "పిన్ అక్షరాలను లేదా చిహ్నాలను కలిగి ఉంది" "%sను వెరిఫై చేయండి" + "పిన్ తప్పు" "వెరిఫై చేస్తోంది..." "పిన్‌ని ఎంటర్ చేయండి" "మరొక పిన్‌ని ప్రయత్నించండి" @@ -1042,6 +1048,9 @@ "సిఫార్సులు లోడ్ అవుతున్నాయి" "ఈ మీడియా సెషన్‌ని మూసివేయండి" "ఇన్‌యాక్టివ్, యాప్ చెక్ చేయండి" + "లోపం, మళ్లీ ప్రయత్నిస్తోంది..." + "పరికరం తీసివేయబడింది" + "స్థితిని లోడ్ చేయడం సాధ్యపడదు" "ఎర్రర్, మళ్లీ ప్రయత్నించండి" "పురోగతిలో ఉంది" "కొత్త నియంత్రణలను చూడడానికి పవర్ బటన్‌ని నొక్కి పట్టుకోండి" diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index a51f62ee782ac2e2278a899a754520d0b0a8032c..45a0661226e4961e6299bbe94bba29c849573533 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -430,6 +430,7 @@ "บันทึกหน้าจอ" "เริ่ม" "หยุด" + "อุปกรณ์" "เลื่อนขึ้นเพื่อสลับแอป" "ลากไปทางขวาเพื่อสลับแอปอย่างรวดเร็ว" "สลับภาพรวม" @@ -712,6 +713,7 @@ "แสดงที่ด้านบนของส่วนการสนทนาและปรากฏเป็นบับเบิล" "การตั้งค่า" "ลำดับความสำคัญ" + "%1$s ไม่รองรับการตั้งค่าเฉพาะสำหรับการสนทนา" "ไม่มีบับเบิลเมื่อเร็วๆ นี้" "บับเบิลที่แสดงและที่ปิดไปเมื่อเร็วๆ นี้จะปรากฏที่นี่" "แก้ไขการแจ้งเตือนเหล่านี้ไม่ได้" @@ -1024,6 +1026,8 @@ "เลือกตัวควบคุมที่ต้องการให้เข้าถึงได้จากเมนูเปิด/ปิด" "กดตัวควบคุมค้างไว้แล้วลากเพื่อจัดเรียงใหม่" "นำตัวควบคุมทั้งหมดออกแล้ว" + + "โหลดรายการตัวควบคุมทั้งหมดไม่ได้" "อื่นๆ" "เพิ่มไปยังระบบควบคุมอุปกรณ์" @@ -1032,6 +1036,7 @@ "อัปเดตตัวควบคุมแล้ว" "PIN ประกอบด้วยตัวอักษรหรือสัญลักษณ์" "ยืนยัน %s" + "PIN ไม่ถูกต้อง" "กำลังยืนยัน…" "ป้อน PIN" "ลองใช้ PIN อื่น" @@ -1041,6 +1046,9 @@ "กำลังโหลดคำแนะนำ" "ปิดเซสชันสื่อนี้" "ไม่มีการใช้งาน โปรดตรวจสอบแอป" + "มีข้อผิดพลาด กำลังลองอีกครั้ง…" + "นำอุปกรณ์ออกแล้ว" + "โหลดสถานะไม่ได้" "พบข้อผิดพลาด โปรดลองอีกครั้ง" "กำลังดำเนินการ" "กดปุ่มเปิด/ปิดค้างไว้เพื่อดูตัวควบคุมใหม่ๆ" diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index 082b5c72ad0e01e0f60f5a06fece8436101e8878..db00e8a6856aee6763f25fa3c29072136af0de7c 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -430,6 +430,7 @@ "Pag-record ng Screen" "Magsimula" "Ihinto" + "Device" "Mag-swipe pataas upang lumipat ng app" "I-drag pakanan para mabilisang magpalipat-lipat ng app" "I-toggle ang Overview" @@ -712,6 +713,7 @@ "Lumalabas sa itaas ng seksyon ng pag-uusap at nagpapakita bilang bubble." "Mga Setting" "Priyoridad" + "Hindi sinusuportahan ng %1$s ang mga setting na partikular sa pag-uusap" "Walang kamakailang bubble" "Lalabas dito ang mga kamakailang bubble at na-dismiss na bubble" "Hindi puwedeng baguhin ang mga notification na ito." @@ -1024,6 +1026,8 @@ "Pumili ng mga kontrol na maa-access mula sa power menu" "I-hold at i-drag para baguhin ang pagkakaayos ng mga kontrol" "Inalis ang lahat ng kontrol" + + "Hindi ma-load ang listahan ng lahat ng control." "Iba pa" "Idagdag sa mga kontrol ng device" @@ -1032,6 +1036,7 @@ "Na-update na ang mga kontrol" "May mga titik o simbolo ang PIN" "I-verify ang %s" + "Maling PIN" "Vine-verify…" "Ilagay ang PIN" "Sumubok ng ibang PIN" @@ -1041,6 +1046,9 @@ "Nilo-load ang rekomendasyon" "Isara ang session ng media na ito" "Hindi aktibo, tingnan ang app" + "Nagka-error, sinusubukan ulit…" + "Inalis ang device" + "Hindi ma-load ang status" "Nagka-error, subukan ulit" "Isinasagawa" "Pindutin nang matagal ang Power button para makita ang mga bagong kontrol" diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index d81066cb3c160975851e0b6bf984af1faf696b8a..51aad9dce2712c531725ec87c18f36cc953f329d 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -430,6 +430,8 @@ "Ekran Kaydı" "Başlat" "Durdur" + + "Uygulamalar arasında geçiş yapmak için yukarı kaydırın" "Uygulamaları hızlıca değiştirmek için sağa kaydırın" "Genel bakışı aç/kapat" @@ -712,6 +714,8 @@ "Görüşme bölümünün üstünde baloncuk olarak gösterilir." "Ayarlar" "Öncelik" + + "Son kapatılan baloncuk yok" "Son baloncuklar ve kapattığınız baloncuklar burada görünür" "Bu bildirimler değiştirilemez." @@ -1024,6 +1028,8 @@ "Güç menüsünden erişmek için denetimleri seçin" "Kontrolleri yeniden düzenlemek için basılı tutup sürükleyin" "Tüm kontroller kaldırıldı" + + "Tüm kontrollerin listesi yüklenemedi." "Diğer" "Cihaz denetimlerine ekle" @@ -1032,6 +1038,7 @@ "Denetimler güncellendi" "PIN, harf veya simge içerir" "%s cihazını doğrulayın" + "Yanlış PIN" "Doğrulanıyor…" "PIN girin" "Başka bir PIN deneyin" @@ -1041,6 +1048,9 @@ "Öneriler yükleniyor" "Bu medya oturumunu kapat" "Devre dışı, uygulamaya bakın" + "Hata, yeniden deneniyor…" + "Cihaz kaldırıldı" + "Durum yüklenemiyor" "Hata, yeniden deneyin" "Devam ediyor" "Yeni kontrolleri görmek için Güç düğmesini basılı tutun" diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index a6da1b4b2a1838cb3102901023381433e28a6b4e..fe63ad63e443ecb07e25c5552d5530054946fbb8 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -434,6 +434,8 @@ "Запис екрана" "Почати" "Зупинити" + + "Проводьте пальцем угору, щоб переходити між додатками" "Перетягуйте праворуч, щоб швидко переходити між додатками" "Увімкнути або вимкнути огляд" @@ -718,6 +720,8 @@ "З\'являється вгорі розділу з розмовами у вигляді спливаючого чату." "Налаштування" "Пріоритет" + + "Немає нещодавніх спливаючих чатів" "Тут з\'являтимуться нещодавні й закриті спливаючі чати" "Ці сповіщення не можна змінити." @@ -1036,6 +1040,8 @@ "Виберіть, які елементи керування будуть у меню \"Живлення\"" "Щоб змінити порядок елементів керування, перетягуйте їх" "Усі елементи керування вилучено" + + "Не вдалося завантажити список усіх елементів керування." "Інше" "Додати до елементів керування пристроями" @@ -1044,6 +1050,7 @@ "Елементи керування оновлено" "PIN-код містить літери чи символи" "%s: підтвердити" + "Неправильний PIN-код" "Підтвердження…" "Введіть PIN-код" "Спробуйте інший PIN-код" @@ -1053,6 +1060,9 @@ "Завантаження рекомендацій" "Закрити цей сеанс медіа" "Неактивно, перейдіть у додаток" + "Помилка. Повторна спроба…" + "Пристрій вилучено" + "Не вдалося завантажити статус" "Помилка. Спробуйте знову" "Виконується" "Утримуйте кнопку живлення, щоб переглянути нові елементи керування" diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml index b9cc796434fff067a4f5f2f6e697a995662ccc57..eb5094d665f2dbdc43c1d72f9a53680d1c91bb7c 100644 --- a/packages/SystemUI/res/values-ur/strings.xml +++ b/packages/SystemUI/res/values-ur/strings.xml @@ -430,6 +430,8 @@ "اسکرین ریکارڈر کریں" "آغاز" "روکیں" + + "ایپس سوئچ کرنے کیلئے اوپر سوائپ کریں" "تیزی سے ایپس کو سوئچ کرنے کے لیے دائیں طرف گھسیٹیں" "مجموعی جائزہ ٹوگل کریں" @@ -712,6 +714,8 @@ "گفتگو کے سیکشن میں سب سے اوپر دکھاتا ہے اور بلبلہ کے طور پر ظاہر ہوتا ہے۔" "ترتیبات" "ترجیح" + + "کوئی حالیہ بلبلہ نہیں" "حالیہ بلبلے اور برخاست شدہ بلبلے یہاں ظاہر ہوں گے" "ان اطلاعات کی ترمیم نہیں کی جا سکتی۔" @@ -999,8 +1003,7 @@ "کسی بھی وقت بلبلے کو کنٹرول کریں" "اس ایپ سے بلبلوں کو آف کرنے کے لیے نظم کریں پر تھپتھپائیں" "سمجھ آ گئی" - - + "%1$s ترتیبات" "سسٹم نیویگیشن اپ ڈیٹ کیا گیا۔ تبدیلیاں کرنے کے لیے، ترتیبات پر جائیں۔" "سسٹم نیویگیشن اپ ڈیٹ کرنے کے لیے ترتیبات پر جائیں" "اسٹینڈ بائی" @@ -1025,6 +1028,8 @@ "پاور مینو سے رسائی حاصل کرنے کے لیے کنٹرولز کو منتخب کریں" "کنٹرولز کو دوبارہ ترتیب دینے کے ليے پکڑیں اور گھسیٹیں" "سبھی کنٹرولز ہٹا دیے گئے" + + "تمام کنٹرولز کی فہرست لوڈ نہیں کی جا سکی۔" "دیگر" "آلہ کے کنٹرولز میں شامل کریں" @@ -1033,6 +1038,7 @@ "کنٹرولز اپ ڈیٹ کیے گئے" "‏PIN میں حروف یا علامات شامل ہیں" "%s کی تصدیق کریں" + "‏غلط PIN" "توثیق ہو رہی ہے…" "‏PIN درج کریں" "‏کوئی دوسرا PIN آزمائیں" @@ -1042,6 +1048,9 @@ "تجاویز لوڈ ہو رہی ہیں" "اس میڈیا سیشن کو بند کریں" "غیر فعال، ایپ چیک کریں" + "خرابی، دوبارہ کوشش کی جا رہی ہے…" + "آلہ ہٹا دیا گیا" + "صورتحال لوڈ نہیں ہو سکتی" "خرابی، دوبارہ کوشش کریں" "پیشرفت میں" "نئے کنٹرولز دیکھنے کے لیے پاور بٹن کو دبائے رکھیں" diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml index b926d753b5db3f836c655133ed59350b8fadceba..c83f9771c39739e667e10646e5bba145d26925b5 100644 --- a/packages/SystemUI/res/values-uz/strings.xml +++ b/packages/SystemUI/res/values-uz/strings.xml @@ -430,6 +430,7 @@ "Ekranni yozib olish" "Boshlash" "Toʻxtatish" + "Qurilma" "Ilovalarni almashtirish uchun ekranni tepaga suring" "Ilovalarni tezkor almashtirish uchun o‘ngga torting" "Umumiy nazar rejimini almashtirish" @@ -712,6 +713,7 @@ "Suhbatlar boʻlimining yuqori qismida bulutcha shaklida chiqadi." "Sozlamalar" "Muhimligi" + "%1$s ilovasida suhbat sozlamalari ishlamaydi" "Avvalgi bulutchalar topilmadi" "Bu yerda oxirgi va yopilgan bulutcha shaklidagi bildirishnomalar chiqadi" "Bu bildirishnomalarni tahrirlash imkonsiz." @@ -1024,6 +1026,8 @@ "Quvvat tugmasi menyusida chiqadigan boshqaruv elementlarini tanlang" "Boshqaruv elementlarini qayta tartiblash uchun ushlab torting" "Barcha boshqaruv elementlari olib tashlandi" + + "Boshqaruv elementlarining barchasi yuklanmadi." "Boshqa" "Qurilma boshqaruv elementlariga kiritish" @@ -1032,6 +1036,7 @@ "Boshqaruv elementlari yangilandi" "PIN kod harflar va belgilardan iborat boʻladi" "Tekshirish: %s" + "PIN kod xato" "Tekshirilmoqda…" "PIN kodni kiriting" "Boshqa PIN kod ishlating" @@ -1041,6 +1046,9 @@ "Tavsiyalar yuklanmoqda" "Bu media seansni yopish" "Nofaol. Ilovani tekshiring" + "Xato, qayta urinilmoqda…" + "Qurilma olib tashlandi" + "Holat axboroti yuklanmadi" "Xato, qayta urining" "Bajarilmoqda" "Yangi boshqaruv elementlari bilan tanishish uchun quvvat tugmasini bosib turing" diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index ed8b3a556998059ed5b2a826b57f0bdfdb0c520b..63af035a5f432f12270e085b28464dd9ac8efaa1 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -430,6 +430,8 @@ "Ghi lại nội dung trên màn hình" "Bắt đầu" "Dừng" + + "Vuốt lên để chuyển đổi ứng dụng" "Kéo sang phải để chuyển đổi nhanh giữa các ứng dụng" "Bật/tắt chế độ xem Tổng quan" @@ -712,6 +714,8 @@ "Hiển thị dưới dạng bong bóng ở đầu cuộc trò chuyện." "Cài đặt" "Mức độ ưu tiên" + + "Không có bong bóng trò chuyện nào gần đây" "Bong bóng trò chuyện đã đóng và bong bóng trò chuyện gần đây sẽ xuất hiện ở đây" "Không thể sửa đổi các thông báo này." @@ -1024,6 +1028,8 @@ "Chọn các tùy chọn điều khiển để truy cập từ trình đơn nguồn" "Giữ và kéo để sắp xếp lại các tùy chọn điều khiển" "Đã xóa tất cả tùy chọn điều khiển" + + "Không thể tải danh sách tất cả tùy chọn điều khiển." "Khác" "Thêm vào mục điều khiển thiết bị" @@ -1032,6 +1038,7 @@ "Đã cập nhật các tùy chọn điều khiển" "Mã PIN chứa các ký tự hoặc ký hiệu" "Xác minh %s" + "Mã PIN sai" "Đang xác minh…" "Nhập mã PIN" "Thử một mã PIN khác" @@ -1041,6 +1048,9 @@ "Đang tải các đề xuất" "Đóng phiên đa phương tiện này" "Không hoạt động, hãy kiểm tra ứng dụng" + "Lỗi, đang thử lại…" + "Đã xóa thiết bị" + "Không tải được trạng thái" "Lỗi, hãy thử lại" "Đang thực hiện" "Giữ nút Nguồn để xem các tùy chọn điều khiển mới" diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index 6fe19c9efedee9a27bb607e356401b90710c5526..323324d5805fd000282a38ce1166ee6e870649ce 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -430,6 +430,7 @@ "屏幕录制" "开始" "停止" + "设备" "向上滑动可切换应用" "向右拖动可快速切换应用" "切换概览" @@ -712,6 +713,7 @@ "以对话泡形式显示在对话部分顶部。" "设置" "优先级" + "%1$s不支持对话专用设置" "最近没有对话泡" "此处会显示最近的对话泡和已关闭的对话泡" "无法修改这些通知。" @@ -1024,6 +1026,8 @@ "选择要从电源菜单访问的控件" "按住并拖动即可重新排列控件" "已移除所有控件" + + "无法加载所有控件的列表。" "其他" "添加到设备控制器" @@ -1032,6 +1036,7 @@ "控件已更新" "PIN 码由字母或符号组成" "验证%s" + "PIN 码错误" "正在验证…" "输入 PIN 码" "试试其他 PIN 码" @@ -1041,6 +1046,9 @@ "正在加载推荐内容" "关闭此媒体会话" "无效,请检查应用" + "出现错误,正在重试…" + "设备已移除" + "无法加载状态" "出现错误,请重试" "正在进行" "按住电源按钮即可查看新控件" diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index 9f4bf907ef9850d0b863950635a924e61708f12a..f78604cdcd82819942f4eac752655f7d29a16983 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -430,6 +430,7 @@ "畫面錄影" "開始" "停" + "裝置" "向上滑動即可切換應用程式" "向右拖曳即可快速切換應用程式" "切換概覽" @@ -712,6 +713,7 @@ "在對話部分的頂部以小視窗顯示。" "設定" "重要" + "「%1$s」不支援對話專用設定" "沒有最近曾使用的小視窗" "最近使用和關閉的小視窗會在這裡顯示" "無法修改這些通知。" @@ -1024,6 +1026,8 @@ "從電源選單選擇要存取的控制項" "按住並拖曳便可重新排列控制項" "已移除所有控制項" + + "無法載入完整控制項清單。" "其他" "加到裝置控制" @@ -1032,6 +1036,7 @@ "已更新控制項" "PIN 含有字母或符號" "驗證%s" + "PIN 錯誤" "正在驗證…" "輸入 PIN" "嘗試其他 PIN" @@ -1041,6 +1046,9 @@ "正在載入建議" "關閉此媒體版面" "已停用,請檢查應用程式" + "發生錯誤,正在重試…" + "已移除裝置" + "無法載入狀態" "發生錯誤,請再試一次" "進行中" "按住「開關」按鈕以查看新控制項" diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index 94990c79b82905afae5608ef71ece4183062d3b2..141452b07ac849985d08d23d3cb997ef43552af1 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -430,6 +430,7 @@ "螢幕畫面錄製" "開始" "停止" + "裝置" "向上滑動即可切換應用程式" "向右拖曳即可快速切換應用程式" "切換總覽" @@ -712,6 +713,7 @@ "以對話框形式顯示在對話部分的頂端。" "設定" "優先" + "「%1$s」不支援對話專用設定" "最近沒有任何對話框" "最近的對話框和已關閉的對話框會顯示在這裡" "無法修改這些通知。" @@ -1024,6 +1026,8 @@ "選擇要從電源選單存取的控制項" "按住並拖曳即可重新排列控制項" "所有控制項都已移除" + + "無法載入完整的控制項清單。" "其他" "新增至裝置控制" @@ -1032,6 +1036,7 @@ "已更新控制項" "PIN 碼含有字母或符號" "驗證「%s」" + "PIN 碼錯誤" "驗證中…" "請輸入 PIN 碼" "試試其他 PIN 碼" @@ -1041,6 +1046,9 @@ "正在載入建議控制項" "關閉這個媒體工作階段" "無效,請查看應用程式" + "發生錯誤,正在重試…" + "裝置已遭到移除" + "無法載入狀態" "發生錯誤,請再試一次" "進行中" "按住電源按鈕即可查看新的控制項" diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index c9bef049e05e22f90423f28bc75c936359bd37c4..b6de81bd69fc509f1a280fb3943746f59673a828 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -430,6 +430,7 @@ "Irekhodi lesikrini" "Qala" "Misa" + "Idivayisi" "Swayiphela phezulu ukuze ushintshe izinhlelo zokusebenza" "Hudula ngqo ukuze ushintshe ngokushesha izinhlelo zokusebenza" "Guqula ukubuka konke" @@ -712,6 +713,7 @@ "Kubonakala esigabeni esiphezulu sengxoxo futhi kuvela njengebhamuza" "Izilungiselelo" "Okubalulekile" + "I-%1$s ayisekeli amasethingi athile engxoxo" "Awekho amabhamuza akamuva" "Amabhamuza akamuva namabhamuza asusiwe azobonakala lapha." "Lezi zaziso azikwazi ukushintshwa." @@ -1024,6 +1026,8 @@ "Khetha izilawuli ukuze ufinyelele kusuka kumenyu yamandla" "Bamba futhi uhudule ukuze uphinde ulungise izilawuli" "Zonke izilawuli zisusiwe" + + "Uhlu lwazo zonke izilawuli alilayishekanga." "Okunye" "Engeza kuzilawuli zezinsiza" @@ -1032,6 +1036,7 @@ "Izilawuli zibuyekeziwe" "Iphinikhodi iqukethe amaletha namasimbui" "Qinisekisa i-%s" + "Iphinikhodi engalungile" "Iyaqinisekisa…" "Faka i-PIN" "Zama enye Iphinikhodi" @@ -1041,6 +1046,9 @@ "Ilayisha izincomo" "Vala leseshini yemidiya" "Akusebenzi, hlola uhlelo lokusebenza" + "Iphutha, iyazama futhi…" + "Idivayisi isusiwe" + "Ayikwazi ukulayisha isimo" "Iphutha, zama futhi" "Iyaqhubeka" "Bamba Inkinobho yamandla ukuze ubone izilawuli ezintsha" diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index e60b543059569a497c4dc64848aca4a901262c25..e32fe4da2bf60f3d774a29e25646a188b2b58c6e 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -205,14 +205,26 @@ far break points. A sensor value less than this is considered "near". --> + + + - + + + 130 diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 5d625a87b2828868e9bd222afd1e9651e321adee..2c2e7244ce2ed0aa9a41b3e7a2283c985eb5bec6 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -304,6 +304,7 @@ 20dp 20dp + 400dp 80dp 6dp 48dp @@ -326,6 +327,7 @@ 8dp 16dp 14sp + 80dp @@ -993,7 +995,7 @@ 30dp - 30dp + 48dp 8dp @@ -1248,9 +1250,17 @@ 4dp 48dp - 40dp - 44dp - 22sp + 24dp + 24dp + 48dp + 20sp + 16sp + 16sp + 56dp + 12dp + 16dp + 24dp + 20dp 14sp 24dp 4dp @@ -1267,10 +1277,9 @@ 40% - 25dp - 12dp 100dp 17sp + @*android:dimen/config_bottomDialogCornerRadius 48dp diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 96b8c1c0490ca3f6882dbff364d3d8e499039ac8..2b3e661c4f7ea79db7084cf204552b11742d66ed 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -644,6 +644,9 @@ Notification dismissed. + + Bubble dismissed. + Notification shade. @@ -2648,13 +2651,13 @@ Standby - + Show at top of conversation section - + Show profile picture on lock screen - + Appear as a floating bubble on top of apps - + Interrupt Do Not Disturb Got it diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml index f67bb6b79f37e9240739cc55aa402c7a15af7960..d3a5f04b72854453f1040da68c723221ebe70054 100644 --- a/packages/SystemUI/res/values/styles.xml +++ b/packages/SystemUI/res/values/styles.xml @@ -258,7 +258,7 @@ @@ -278,7 +278,7 @@