diff options
538 files changed, 8036 insertions, 3253 deletions
diff --git a/apex/media/framework/java/android/media/MediaParser.java b/apex/media/framework/java/android/media/MediaParser.java index 070b13b9e592..7cbb98e1bb4e 100644 --- a/apex/media/framework/java/android/media/MediaParser.java +++ b/apex/media/framework/java/android/media/MediaParser.java @@ -219,7 +219,8 @@ public final class MediaParser { * duration is unknown. */ public long getDurationMicros() { - return mExoPlayerSeekMap.getDurationUs(); + long durationUs = mExoPlayerSeekMap.getDurationUs(); + return durationUs != C.TIME_UNSET ? durationUs : UNKNOWN_DURATION; } /** diff --git a/apex/statsd/framework/java/android/util/StatsEvent.java b/apex/statsd/framework/java/android/util/StatsEvent.java index 8bd36a516b12..8be5c63f31e3 100644 --- a/apex/statsd/framework/java/android/util/StatsEvent.java +++ b/apex/statsd/framework/java/android/util/StatsEvent.java @@ -26,6 +26,8 @@ import android.os.SystemClock; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; +import java.util.Arrays; + /** * StatsEvent builds and stores the buffer sent over the statsd socket. * This class defines and encapsulates the socket protocol. @@ -224,7 +226,9 @@ public final class StatsEvent { // Max payload size is 4 bytes less as 4 bytes are reserved for statsEventTag. // See android_util_StatsLog.cpp. - private static final int MAX_PAYLOAD_SIZE = LOGGER_ENTRY_MAX_PAYLOAD - 4; + private static final int MAX_PUSH_PAYLOAD_SIZE = LOGGER_ENTRY_MAX_PAYLOAD - 4; + + private static final int MAX_PULL_PAYLOAD_SIZE = 50 * 1024; // 50 KB private final int mAtomId; private final byte[] mPayload; @@ -619,6 +623,7 @@ public final class StatsEvent { @NonNull public Builder usePooledBuffer() { mUsePooledBuffer = true; + mBuffer.setMaxSize(MAX_PUSH_PAYLOAD_SIZE, mPos); return this; } @@ -694,8 +699,9 @@ public final class StatsEvent { @GuardedBy("sLock") private static Buffer sPool; - private final byte[] mBytes = new byte[MAX_PAYLOAD_SIZE]; + private byte[] mBytes = new byte[MAX_PUSH_PAYLOAD_SIZE]; private boolean mOverflow = false; + private int mMaxSize = MAX_PULL_PAYLOAD_SIZE; @NonNull private static Buffer obtain() { @@ -717,15 +723,26 @@ public final class StatsEvent { } private void release() { - synchronized (sLock) { - if (null == sPool) { - sPool = this; + // Recycle this Buffer if its size is MAX_PUSH_PAYLOAD_SIZE or under. + if (mBytes.length <= MAX_PUSH_PAYLOAD_SIZE) { + synchronized (sLock) { + if (null == sPool) { + sPool = this; + } } } } private void reset() { mOverflow = false; + mMaxSize = MAX_PULL_PAYLOAD_SIZE; + } + + private void setMaxSize(final int maxSize, final int numBytesWritten) { + mMaxSize = maxSize; + if (numBytesWritten > maxSize) { + mOverflow = true; + } } private boolean hasOverflowed() { @@ -740,11 +757,28 @@ public final class StatsEvent { * @return true if space is available, false otherwise. **/ private boolean hasEnoughSpace(final int index, final int numBytes) { - final boolean result = index + numBytes < MAX_PAYLOAD_SIZE; - if (!result) { + final int totalBytesNeeded = index + numBytes; + + if (totalBytesNeeded > mMaxSize) { mOverflow = true; + return false; } - return result; + + // Expand buffer if needed. + if (mBytes.length < mMaxSize && totalBytesNeeded > mBytes.length) { + int newSize = mBytes.length; + do { + newSize *= 2; + } while (newSize <= totalBytesNeeded); + + if (newSize > mMaxSize) { + newSize = mMaxSize; + } + + mBytes = Arrays.copyOf(mBytes, newSize); + } + + return true; } /** diff --git a/apex/statsd/framework/test/src/android/util/StatsEventTest.java b/apex/statsd/framework/test/src/android/util/StatsEventTest.java index 7b511553a26f..8d263699d9c8 100644 --- a/apex/statsd/framework/test/src/android/util/StatsEventTest.java +++ b/apex/statsd/framework/test/src/android/util/StatsEventTest.java @@ -33,6 +33,7 @@ import org.junit.runner.RunWith; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.util.Random; /** * Internal tests for {@link StatsEvent}. @@ -644,6 +645,165 @@ public class StatsEventTest { statsEvent.release(); } + @Test + public void testLargePulledEvent() { + final int expectedAtomId = 10_020; + byte[] field1 = new byte[10 * 1024]; + new Random().nextBytes(field1); + + final long minTimestamp = SystemClock.elapsedRealtimeNanos(); + final StatsEvent statsEvent = + StatsEvent.newBuilder().setAtomId(expectedAtomId).writeByteArray(field1).build(); + final long maxTimestamp = SystemClock.elapsedRealtimeNanos(); + + assertThat(statsEvent.getAtomId()).isEqualTo(expectedAtomId); + + final ByteBuffer buffer = + ByteBuffer.wrap(statsEvent.getBytes()).order(ByteOrder.LITTLE_ENDIAN); + + assertWithMessage("Root element in buffer is not TYPE_OBJECT") + .that(buffer.get()) + .isEqualTo(StatsEvent.TYPE_OBJECT); + + assertWithMessage("Incorrect number of elements in root object") + .that(buffer.get()) + .isEqualTo(3); + + assertWithMessage("First element is not timestamp") + .that(buffer.get()) + .isEqualTo(StatsEvent.TYPE_LONG); + + assertWithMessage("Incorrect timestamp") + .that(buffer.getLong()) + .isIn(Range.closed(minTimestamp, maxTimestamp)); + + assertWithMessage("Second element is not atom id") + .that(buffer.get()) + .isEqualTo(StatsEvent.TYPE_INT); + + assertWithMessage("Incorrect atom id").that(buffer.getInt()).isEqualTo(expectedAtomId); + + assertWithMessage("Third element is not byte array") + .that(buffer.get()) + .isEqualTo(StatsEvent.TYPE_BYTE_ARRAY); + + final byte[] field1Actual = getByteArrayFromByteBuffer(buffer); + assertWithMessage("Incorrect field 1").that(field1Actual).isEqualTo(field1); + + assertThat(statsEvent.getNumBytes()).isEqualTo(buffer.position()); + + statsEvent.release(); + } + + @Test + public void testPulledEventOverflow() { + final int expectedAtomId = 10_020; + byte[] field1 = new byte[50 * 1024]; + new Random().nextBytes(field1); + + final long minTimestamp = SystemClock.elapsedRealtimeNanos(); + final StatsEvent statsEvent = + StatsEvent.newBuilder().setAtomId(expectedAtomId).writeByteArray(field1).build(); + final long maxTimestamp = SystemClock.elapsedRealtimeNanos(); + + assertThat(statsEvent.getAtomId()).isEqualTo(expectedAtomId); + + final ByteBuffer buffer = + ByteBuffer.wrap(statsEvent.getBytes()).order(ByteOrder.LITTLE_ENDIAN); + + assertWithMessage("Root element in buffer is not TYPE_OBJECT") + .that(buffer.get()) + .isEqualTo(StatsEvent.TYPE_OBJECT); + + assertWithMessage("Incorrect number of elements in root object") + .that(buffer.get()) + .isEqualTo(3); + + assertWithMessage("First element is not timestamp") + .that(buffer.get()) + .isEqualTo(StatsEvent.TYPE_LONG); + + assertWithMessage("Incorrect timestamp") + .that(buffer.getLong()) + .isIn(Range.closed(minTimestamp, maxTimestamp)); + + assertWithMessage("Second element is not atom id") + .that(buffer.get()) + .isEqualTo(StatsEvent.TYPE_INT); + + assertWithMessage("Incorrect atom id").that(buffer.getInt()).isEqualTo(expectedAtomId); + + assertWithMessage("Third element is not errors type") + .that(buffer.get()) + .isEqualTo(StatsEvent.TYPE_ERRORS); + + final int errorMask = buffer.getInt(); + + assertWithMessage("ERROR_OVERFLOW should be the only error in the error mask") + .that(errorMask) + .isEqualTo(StatsEvent.ERROR_OVERFLOW); + + assertThat(statsEvent.getNumBytes()).isEqualTo(buffer.position()); + + statsEvent.release(); + } + + @Test + public void testPushedEventOverflow() { + final int expectedAtomId = 10_020; + byte[] field1 = new byte[10 * 1024]; + new Random().nextBytes(field1); + + final long minTimestamp = SystemClock.elapsedRealtimeNanos(); + final StatsEvent statsEvent = StatsEvent.newBuilder() + .setAtomId(expectedAtomId) + .writeByteArray(field1) + .usePooledBuffer() + .build(); + final long maxTimestamp = SystemClock.elapsedRealtimeNanos(); + + assertThat(statsEvent.getAtomId()).isEqualTo(expectedAtomId); + + final ByteBuffer buffer = + ByteBuffer.wrap(statsEvent.getBytes()).order(ByteOrder.LITTLE_ENDIAN); + + assertWithMessage("Root element in buffer is not TYPE_OBJECT") + .that(buffer.get()) + .isEqualTo(StatsEvent.TYPE_OBJECT); + + assertWithMessage("Incorrect number of elements in root object") + .that(buffer.get()) + .isEqualTo(3); + + assertWithMessage("First element is not timestamp") + .that(buffer.get()) + .isEqualTo(StatsEvent.TYPE_LONG); + + assertWithMessage("Incorrect timestamp") + .that(buffer.getLong()) + .isIn(Range.closed(minTimestamp, maxTimestamp)); + + assertWithMessage("Second element is not atom id") + .that(buffer.get()) + .isEqualTo(StatsEvent.TYPE_INT); + + assertWithMessage("Incorrect atom id").that(buffer.getInt()).isEqualTo(expectedAtomId); + + assertWithMessage("Third element is not errors type") + .that(buffer.get()) + .isEqualTo(StatsEvent.TYPE_ERRORS); + + final int errorMask = buffer.getInt(); + + assertWithMessage("ERROR_OVERFLOW should be the only error in the error mask") + .that(errorMask) + .isEqualTo(StatsEvent.ERROR_OVERFLOW); + + assertThat(statsEvent.getNumBytes()).isEqualTo(buffer.position()); + + statsEvent.release(); + } + private static byte[] getByteArrayFromByteBuffer(final ByteBuffer buffer) { final int numBytes = buffer.getInt(); byte[] bytes = new byte[numBytes]; diff --git a/api/test-current.txt b/api/test-current.txt index ed4c9b13dacd..1142fb631891 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -193,6 +193,7 @@ package android.app { method public static int opToDefaultMode(@NonNull String); method public static String opToPermission(int); method public static int permissionToOpCode(String); + method @RequiresPermission("android.permission.MANAGE_APPOPS") public void rebootHistory(long); method @RequiresPermission("android.permission.MANAGE_APPOPS") public void reloadNonHistoricalState(); method @RequiresPermission("android.permission.MANAGE_APPOPS") public void resetHistoryParameters(); method @RequiresPermission("android.permission.MANAGE_APPOPS") public void setHistoryParameters(int, long, int); @@ -1298,6 +1299,130 @@ package android.hardware.display { } +package android.hardware.hdmi { + + public final class HdmiControlManager { + method @Nullable public android.hardware.hdmi.HdmiSwitchClient getSwitchClient(); + method @RequiresPermission("android.permission.HDMI_CEC") public void setStandbyMode(boolean); + field public static final String ACTION_OSD_MESSAGE = "android.hardware.hdmi.action.OSD_MESSAGE"; + field public static final int AVR_VOLUME_MUTED = 101; // 0x65 + field public static final int CLEAR_TIMER_STATUS_CEC_DISABLE = 162; // 0xa2 + field public static final int CLEAR_TIMER_STATUS_CHECK_RECORDER_CONNECTION = 160; // 0xa0 + field public static final int CLEAR_TIMER_STATUS_FAIL_TO_CLEAR_SELECTED_SOURCE = 161; // 0xa1 + field public static final int CLEAR_TIMER_STATUS_TIMER_CLEARED = 128; // 0x80 + field public static final int CLEAR_TIMER_STATUS_TIMER_NOT_CLEARED_NO_INFO_AVAILABLE = 2; // 0x2 + field public static final int CLEAR_TIMER_STATUS_TIMER_NOT_CLEARED_NO_MATCHING = 1; // 0x1 + field public static final int CLEAR_TIMER_STATUS_TIMER_NOT_CLEARED_RECORDING = 0; // 0x0 + field public static final int CONTROL_STATE_CHANGED_REASON_SETTING = 1; // 0x1 + field public static final int CONTROL_STATE_CHANGED_REASON_STANDBY = 3; // 0x3 + field public static final int CONTROL_STATE_CHANGED_REASON_START = 0; // 0x0 + field public static final int CONTROL_STATE_CHANGED_REASON_WAKEUP = 2; // 0x2 + field public static final int DEVICE_EVENT_ADD_DEVICE = 1; // 0x1 + field public static final int DEVICE_EVENT_REMOVE_DEVICE = 2; // 0x2 + field public static final int DEVICE_EVENT_UPDATE_DEVICE = 3; // 0x3 + field public static final String EXTRA_MESSAGE_EXTRA_PARAM1 = "android.hardware.hdmi.extra.MESSAGE_EXTRA_PARAM1"; + field public static final String EXTRA_MESSAGE_ID = "android.hardware.hdmi.extra.MESSAGE_ID"; + field public static final int ONE_TOUCH_RECORD_ALREADY_RECORDING = 18; // 0x12 + field public static final int ONE_TOUCH_RECORD_CEC_DISABLED = 51; // 0x33 + field public static final int ONE_TOUCH_RECORD_CHECK_RECORDER_CONNECTION = 49; // 0x31 + field public static final int ONE_TOUCH_RECORD_DISALLOW_TO_COPY = 13; // 0xd + field public static final int ONE_TOUCH_RECORD_DISALLOW_TO_FUTHER_COPIES = 14; // 0xe + field public static final int ONE_TOUCH_RECORD_FAIL_TO_RECORD_DISPLAYED_SCREEN = 50; // 0x32 + field public static final int ONE_TOUCH_RECORD_INVALID_EXTERNAL_PHYSICAL_ADDRESS = 10; // 0xa + field public static final int ONE_TOUCH_RECORD_INVALID_EXTERNAL_PLUG_NUMBER = 9; // 0x9 + field public static final int ONE_TOUCH_RECORD_MEDIA_PROBLEM = 21; // 0x15 + field public static final int ONE_TOUCH_RECORD_MEDIA_PROTECTED = 19; // 0x13 + field public static final int ONE_TOUCH_RECORD_NOT_ENOUGH_SPACE = 22; // 0x16 + field public static final int ONE_TOUCH_RECORD_NO_MEDIA = 16; // 0x10 + field public static final int ONE_TOUCH_RECORD_NO_OR_INSUFFICIENT_CA_ENTITLEMENTS = 12; // 0xc + field public static final int ONE_TOUCH_RECORD_NO_SOURCE_SIGNAL = 20; // 0x14 + field public static final int ONE_TOUCH_RECORD_OTHER_REASON = 31; // 0x1f + field public static final int ONE_TOUCH_RECORD_PARENT_LOCK_ON = 23; // 0x17 + field public static final int ONE_TOUCH_RECORD_PLAYING = 17; // 0x11 + field public static final int ONE_TOUCH_RECORD_PREVIOUS_RECORDING_IN_PROGRESS = 48; // 0x30 + field public static final int ONE_TOUCH_RECORD_RECORDING_ALREADY_TERMINATED = 27; // 0x1b + field public static final int ONE_TOUCH_RECORD_RECORDING_ANALOGUE_SERVICE = 3; // 0x3 + field public static final int ONE_TOUCH_RECORD_RECORDING_CURRENTLY_SELECTED_SOURCE = 1; // 0x1 + field public static final int ONE_TOUCH_RECORD_RECORDING_DIGITAL_SERVICE = 2; // 0x2 + field public static final int ONE_TOUCH_RECORD_RECORDING_EXTERNAL_INPUT = 4; // 0x4 + field public static final int ONE_TOUCH_RECORD_RECORDING_TERMINATED_NORMALLY = 26; // 0x1a + field public static final int ONE_TOUCH_RECORD_UNABLE_ANALOGUE_SERVICE = 6; // 0x6 + field public static final int ONE_TOUCH_RECORD_UNABLE_DIGITAL_SERVICE = 5; // 0x5 + field public static final int ONE_TOUCH_RECORD_UNABLE_SELECTED_SERVICE = 7; // 0x7 + field public static final int ONE_TOUCH_RECORD_UNSUPPORTED_CA = 11; // 0xb + field public static final int OSD_MESSAGE_ARC_CONNECTED_INVALID_PORT = 1; // 0x1 + field public static final int OSD_MESSAGE_AVR_VOLUME_CHANGED = 2; // 0x2 + field public static final int POWER_STATUS_ON = 0; // 0x0 + field public static final int POWER_STATUS_STANDBY = 1; // 0x1 + field public static final int POWER_STATUS_TRANSIENT_TO_ON = 2; // 0x2 + field public static final int POWER_STATUS_TRANSIENT_TO_STANDBY = 3; // 0x3 + field public static final int POWER_STATUS_UNKNOWN = -1; // 0xffffffff + field @Deprecated public static final int RESULT_ALREADY_IN_PROGRESS = 4; // 0x4 + field public static final int RESULT_COMMUNICATION_FAILED = 7; // 0x7 + field public static final int RESULT_EXCEPTION = 5; // 0x5 + field public static final int RESULT_INCORRECT_MODE = 6; // 0x6 + field public static final int RESULT_SOURCE_NOT_AVAILABLE = 2; // 0x2 + field public static final int RESULT_SUCCESS = 0; // 0x0 + field public static final int RESULT_TARGET_NOT_AVAILABLE = 3; // 0x3 + field public static final int RESULT_TIMEOUT = 1; // 0x1 + field public static final int TIMER_RECORDING_RESULT_EXTRA_CEC_DISABLED = 3; // 0x3 + field public static final int TIMER_RECORDING_RESULT_EXTRA_CHECK_RECORDER_CONNECTION = 1; // 0x1 + field public static final int TIMER_RECORDING_RESULT_EXTRA_FAIL_TO_RECORD_SELECTED_SOURCE = 2; // 0x2 + field public static final int TIMER_RECORDING_RESULT_EXTRA_NO_ERROR = 0; // 0x0 + field public static final int TIMER_RECORDING_TYPE_ANALOGUE = 2; // 0x2 + field public static final int TIMER_RECORDING_TYPE_DIGITAL = 1; // 0x1 + field public static final int TIMER_RECORDING_TYPE_EXTERNAL = 3; // 0x3 + field public static final int TIMER_STATUS_MEDIA_INFO_NOT_PRESENT = 2; // 0x2 + field public static final int TIMER_STATUS_MEDIA_INFO_PRESENT_NOT_PROTECTED = 0; // 0x0 + field public static final int TIMER_STATUS_MEDIA_INFO_PRESENT_PROTECTED = 1; // 0x1 + field public static final int TIMER_STATUS_NOT_PROGRAMMED_CA_NOT_SUPPORTED = 6; // 0x6 + field public static final int TIMER_STATUS_NOT_PROGRAMMED_CLOCK_FAILURE = 10; // 0xa + field public static final int TIMER_STATUS_NOT_PROGRAMMED_DATE_OUT_OF_RANGE = 2; // 0x2 + field public static final int TIMER_STATUS_NOT_PROGRAMMED_DUPLICATED = 14; // 0xe + field public static final int TIMER_STATUS_NOT_PROGRAMMED_INVALID_EXTERNAL_PHYSICAL_NUMBER = 5; // 0x5 + field public static final int TIMER_STATUS_NOT_PROGRAMMED_INVALID_EXTERNAL_PLUG_NUMBER = 4; // 0x4 + field public static final int TIMER_STATUS_NOT_PROGRAMMED_INVALID_SEQUENCE = 3; // 0x3 + field public static final int TIMER_STATUS_NOT_PROGRAMMED_NO_CA_ENTITLEMENTS = 7; // 0x7 + field public static final int TIMER_STATUS_NOT_PROGRAMMED_NO_FREE_TIME = 1; // 0x1 + field public static final int TIMER_STATUS_NOT_PROGRAMMED_PARENTAL_LOCK_ON = 9; // 0x9 + field public static final int TIMER_STATUS_NOT_PROGRAMMED_UNSUPPORTED_RESOLUTION = 8; // 0x8 + field public static final int TIMER_STATUS_PROGRAMMED_INFO_ENOUGH_SPACE = 8; // 0x8 + field public static final int TIMER_STATUS_PROGRAMMED_INFO_MIGHT_NOT_ENOUGH_SPACE = 11; // 0xb + field public static final int TIMER_STATUS_PROGRAMMED_INFO_NOT_ENOUGH_SPACE = 9; // 0x9 + field public static final int TIMER_STATUS_PROGRAMMED_INFO_NO_MEDIA_INFO = 10; // 0xa + } + + public final class HdmiControlServiceWrapper { + ctor public HdmiControlServiceWrapper(); + method @NonNull public android.hardware.hdmi.HdmiControlManager createHdmiControlManager(); + method @BinderThread public void setDeviceTypes(@NonNull int[]); + method @BinderThread public void setPortInfo(@NonNull java.util.List<android.hardware.hdmi.HdmiPortInfo>); + field public static final int DEVICE_PURE_CEC_SWITCH = 6; // 0x6 + } + + public final class HdmiPortInfo implements android.os.Parcelable { + ctor public HdmiPortInfo(int, int, int, boolean, boolean, boolean); + method public int describeContents(); + method public int getAddress(); + method public int getId(); + method public int getType(); + method public boolean isArcSupported(); + method public boolean isCecSupported(); + method public boolean isMhlSupported(); + field @NonNull public static final android.os.Parcelable.Creator<android.hardware.hdmi.HdmiPortInfo> CREATOR; + field public static final int PORT_INPUT = 0; // 0x0 + field public static final int PORT_OUTPUT = 1; // 0x1 + } + + public class HdmiSwitchClient { + method public int getDeviceType(); + method @NonNull public java.util.List<android.hardware.hdmi.HdmiPortInfo> getPortInfo(); + method public void sendKeyEvent(int, boolean); + method public void sendVendorCommand(int, byte[], boolean); + } + +} + package android.hardware.lights { public final class Light implements android.os.Parcelable { diff --git a/cmds/idmap2/Android.bp b/cmds/idmap2/Android.bp index ef5c4cec9166..fb5830506925 100644 --- a/cmds/idmap2/Android.bp +++ b/cmds/idmap2/Android.bp @@ -168,13 +168,13 @@ cc_binary { ], host_supported: true, srcs: [ + "idmap2/CommandUtils.cpp", "idmap2/Create.cpp", "idmap2/CreateMultiple.cpp", "idmap2/Dump.cpp", "idmap2/Lookup.cpp", "idmap2/Main.cpp", "idmap2/Scan.cpp", - "idmap2/Verify.cpp", ], target: { android: { diff --git a/cmds/idmap2/idmap2/Verify.cpp b/cmds/idmap2/idmap2/CommandUtils.cpp index 9cb67b33e6cf..e058cd6e7e70 100644 --- a/cmds/idmap2/idmap2/Verify.cpp +++ b/cmds/idmap2/idmap2/CommandUtils.cpp @@ -19,30 +19,19 @@ #include <string> #include <vector> -#include "idmap2/CommandLineOptions.h" #include "idmap2/Idmap.h" #include "idmap2/Result.h" #include "idmap2/SysTrace.h" -using android::idmap2::CommandLineOptions; using android::idmap2::Error; using android::idmap2::IdmapHeader; using android::idmap2::Result; using android::idmap2::Unit; -Result<Unit> Verify(const std::vector<std::string>& args) { - SYSTRACE << "Verify " << args; - std::string idmap_path; - - const CommandLineOptions opts = - CommandLineOptions("idmap2 verify") - .MandatoryOption("--idmap-path", "input: path to idmap file to verify", &idmap_path); - - const auto opts_ok = opts.Parse(args); - if (!opts_ok) { - return opts_ok.GetError(); - } - +Result<Unit> Verify(const std::string& idmap_path, const std::string& target_path, + const std::string& overlay_path, uint32_t fulfilled_policies, + bool enforce_overlayable) { + SYSTRACE << "Verify " << idmap_path; std::ifstream fin(idmap_path); const std::unique_ptr<const IdmapHeader> header = IdmapHeader::FromBinaryStream(fin); fin.close(); @@ -50,7 +39,8 @@ Result<Unit> Verify(const std::vector<std::string>& args) { return Error("failed to parse idmap header"); } - const auto header_ok = header->IsUpToDate(); + const auto header_ok = header->IsUpToDate(target_path.c_str(), overlay_path.c_str(), + fulfilled_policies, enforce_overlayable); if (!header_ok) { return Error(header_ok.GetError(), "idmap not up to date"); } diff --git a/cmds/idmap2/idmap2/CommandUtils.h b/cmds/idmap2/idmap2/CommandUtils.h new file mode 100644 index 000000000000..99605de30988 --- /dev/null +++ b/cmds/idmap2/idmap2/CommandUtils.h @@ -0,0 +1,28 @@ +/* + * 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. + */ + +#ifndef IDMAP2_IDMAP2_COMMAND_UTILS_H_ +#define IDMAP2_IDMAP2_COMMAND_UTILS_H_ + +#include "idmap2/Result.h" + +android::idmap2::Result<android::idmap2::Unit> Verify(const std::string& idmap_path, + const std::string& target_path, + const std::string& overlay_path, + uint32_t fulfilled_policies, + bool enforce_overlayable); + +#endif // IDMAP2_IDMAP2_COMMAND_UTILS_H_ diff --git a/cmds/idmap2/idmap2/Commands.h b/cmds/idmap2/idmap2/Commands.h index e626738a2895..69eea8d262d2 100644 --- a/cmds/idmap2/idmap2/Commands.h +++ b/cmds/idmap2/idmap2/Commands.h @@ -27,6 +27,5 @@ android::idmap2::Result<android::idmap2::Unit> CreateMultiple(const std::vector< android::idmap2::Result<android::idmap2::Unit> Dump(const std::vector<std::string>& args); android::idmap2::Result<android::idmap2::Unit> Lookup(const std::vector<std::string>& args); android::idmap2::Result<android::idmap2::Unit> Scan(const std::vector<std::string>& args); -android::idmap2::Result<android::idmap2::Unit> Verify(const std::vector<std::string>& args); #endif // IDMAP2_IDMAP2_COMMANDS_H_ diff --git a/cmds/idmap2/idmap2/CreateMultiple.cpp b/cmds/idmap2/idmap2/CreateMultiple.cpp index 4b70acc2969c..abdfaf4dccab 100644 --- a/cmds/idmap2/idmap2/CreateMultiple.cpp +++ b/cmds/idmap2/idmap2/CreateMultiple.cpp @@ -26,6 +26,7 @@ #include "android-base/stringprintf.h" #include "idmap2/BinaryStreamVisitor.h" #include "idmap2/CommandLineOptions.h" +#include "idmap2/CommandUtils.h" #include "idmap2/FileUtils.h" #include "idmap2/Idmap.h" #include "idmap2/Policies.h" @@ -103,7 +104,8 @@ Result<Unit> CreateMultiple(const std::vector<std::string>& args) { continue; } - if (!Verify(std::vector<std::string>({"--idmap-path", idmap_path}))) { + if (!Verify(idmap_path, target_apk_path, overlay_apk_path, fulfilled_policies, + !ignore_overlayable)) { const std::unique_ptr<const ApkAssets> overlay_apk = ApkAssets::Load(overlay_apk_path); if (!overlay_apk) { LOG(WARNING) << "failed to load apk " << overlay_apk_path.c_str(); diff --git a/cmds/idmap2/idmap2/Main.cpp b/cmds/idmap2/idmap2/Main.cpp index a07e793d9f47..fb093f0f22a4 100644 --- a/cmds/idmap2/idmap2/Main.cpp +++ b/cmds/idmap2/idmap2/Main.cpp @@ -53,9 +53,8 @@ void PrintUsage(const NameToFunctionMap& commands, std::ostream& out) { int main(int argc, char** argv) { SYSTRACE << "main"; const NameToFunctionMap commands = { - {"create", Create}, {"create-multiple", CreateMultiple}, - {"dump", Dump}, {"lookup", Lookup}, - {"scan", Scan}, {"verify", Verify}, + {"create", Create}, {"create-multiple", CreateMultiple}, {"dump", Dump}, {"lookup", Lookup}, + {"scan", Scan}, }; if (argc <= 1) { PrintUsage(commands, std::cerr); diff --git a/cmds/idmap2/idmap2/Scan.cpp b/cmds/idmap2/idmap2/Scan.cpp index da0453216f03..36250450cc74 100644 --- a/cmds/idmap2/idmap2/Scan.cpp +++ b/cmds/idmap2/idmap2/Scan.cpp @@ -27,8 +27,11 @@ #include "Commands.h" #include "android-base/properties.h" #include "idmap2/CommandLineOptions.h" +#include "idmap2/CommandUtils.h" #include "idmap2/FileUtils.h" #include "idmap2/Idmap.h" +#include "idmap2/Policies.h" +#include "idmap2/PolicyUtils.h" #include "idmap2/ResourceUtils.h" #include "idmap2/Result.h" #include "idmap2/SysTrace.h" @@ -48,6 +51,7 @@ using android::idmap2::policy::kPolicyVendor; using android::idmap2::utils::ExtractOverlayManifestInfo; using android::idmap2::utils::FindFiles; using android::idmap2::utils::OverlayManifestInfo; +using android::idmap2::utils::PoliciesToBitmaskResult; using PolicyBitmask = android::ResTable_overlayable_policy_header::PolicyBitmask; @@ -215,7 +219,15 @@ Result<Unit> Scan(const std::vector<std::string>& args) { std::stringstream stream; for (const auto& overlay : interesting_apks) { - if (!Verify(std::vector<std::string>({"--idmap-path", overlay.idmap_path}))) { + const auto policy_bitmask = PoliciesToBitmaskResult(overlay.policies); + if (!policy_bitmask) { + LOG(WARNING) << "failed to create idmap for overlay apk path \"" << overlay.apk_path + << "\": " << policy_bitmask.GetErrorMessage(); + continue; + } + + if (!Verify(overlay.idmap_path, target_apk_path, overlay.apk_path, *policy_bitmask, + !overlay.ignore_overlayable)) { std::vector<std::string> create_args = {"--target-apk-path", target_apk_path, "--overlay-apk-path", overlay.apk_path, "--idmap-path", overlay.idmap_path}; diff --git a/cmds/idmap2/idmap2d/Idmap2Service.cpp b/cmds/idmap2/idmap2d/Idmap2Service.cpp index a93184ff4787..908d96612269 100644 --- a/cmds/idmap2/idmap2d/Idmap2Service.cpp +++ b/cmds/idmap2/idmap2d/Idmap2Service.cpp @@ -33,16 +33,19 @@ #include "idmap2/BinaryStreamVisitor.h" #include "idmap2/FileUtils.h" #include "idmap2/Idmap.h" +#include "idmap2/Result.h" #include "idmap2/SysTrace.h" #include "idmap2/ZipFile.h" #include "utils/String8.h" using android::IPCThreadState; +using android::base::StringPrintf; using android::binder::Status; using android::idmap2::BinaryStreamVisitor; using android::idmap2::GetPackageCrc; using android::idmap2::Idmap; using android::idmap2::IdmapHeader; +using android::idmap2::ZipFile; using android::idmap2::utils::kIdmapCacheDir; using android::idmap2::utils::kIdmapFilePermissionMask; using android::idmap2::utils::UidHasWriteAccessToPath; @@ -66,6 +69,21 @@ PolicyBitmask ConvertAidlArgToPolicyBitmask(int32_t arg) { return static_cast<PolicyBitmask>(arg); } +Status GetCrc(const std::string& apk_path, uint32_t* out_crc) { + const auto overlay_zip = ZipFile::Open(apk_path); + if (!overlay_zip) { + return error(StringPrintf("failed to open apk %s", apk_path.c_str())); + } + + const auto crc = GetPackageCrc(*overlay_zip); + if (!crc) { + return error(crc.GetErrorMessage()); + } + + *out_crc = *crc; + return ok(); +} + } // namespace namespace android::os { @@ -98,10 +116,9 @@ Status Idmap2Service::removeIdmap(const std::string& overlay_apk_path, } Status Idmap2Service::verifyIdmap(const std::string& target_apk_path, - const std::string& overlay_apk_path, - int32_t fulfilled_policies ATTRIBUTE_UNUSED, - bool enforce_overlayable ATTRIBUTE_UNUSED, - int32_t user_id ATTRIBUTE_UNUSED, bool* _aidl_return) { + const std::string& overlay_apk_path, int32_t fulfilled_policies, + bool enforce_overlayable, int32_t user_id ATTRIBUTE_UNUSED, + bool* _aidl_return) { SYSTRACE << "Idmap2Service::verifyIdmap " << overlay_apk_path; assert(_aidl_return); const std::string idmap_path = Idmap::CanonicalIdmapPathFor(kIdmapCacheDir, overlay_apk_path); @@ -113,34 +130,38 @@ Status Idmap2Service::verifyIdmap(const std::string& target_apk_path, return error("failed to parse idmap header"); } - if (strcmp(header->GetTargetPath().data(), target_apk_path.data()) != 0) { - *_aidl_return = false; - return ok(); - } - - if (target_apk_path != kFrameworkPath) { - *_aidl_return = (bool) header->IsUpToDate(); + uint32_t target_crc; + if (target_apk_path == kFrameworkPath && android_crc_) { + target_crc = *android_crc_; } else { - if (!android_crc_) { - // Loading the framework zip can take several milliseconds. Cache the crc of the framework - // resource APK to reduce repeated work during boot. - const auto target_zip = idmap2::ZipFile::Open(target_apk_path); - if (!target_zip) { - return error(base::StringPrintf("failed to open target %s", target_apk_path.c_str())); - } - - const auto target_crc = GetPackageCrc(*target_zip); - if (!target_crc) { - return error(target_crc.GetErrorMessage()); - } - - android_crc_ = *target_crc; + auto target_crc_status = GetCrc(target_apk_path, &target_crc); + if (!target_crc_status.isOk()) { + *_aidl_return = false; + return target_crc_status; + } + + // Loading the framework zip can take several milliseconds. Cache the crc of the framework + // resource APK to reduce repeated work during boot. + if (target_apk_path == kFrameworkPath) { + android_crc_ = target_crc; } + } - *_aidl_return = (bool) header->IsUpToDate(android_crc_.value()); + uint32_t overlay_crc; + auto overlay_crc_status = GetCrc(overlay_apk_path, &overlay_crc); + if (!overlay_crc_status.isOk()) { + *_aidl_return = false; + return overlay_crc_status; + } + + auto up_to_date = + header->IsUpToDate(target_apk_path.c_str(), overlay_apk_path.c_str(), target_crc, overlay_crc, + fulfilled_policies, enforce_overlayable); + if (!up_to_date) { + *_aidl_return = false; + return error(up_to_date.GetErrorMessage()); } - // TODO(b/119328308): Check that the set of fulfilled policies of the overlay has not changed return ok(); } diff --git a/cmds/idmap2/include/idmap2/Idmap.h b/cmds/idmap2/include/idmap2/Idmap.h index 77a7b30a230e..8f25b8d6a734 100644 --- a/cmds/idmap2/include/idmap2/Idmap.h +++ b/cmds/idmap2/include/idmap2/Idmap.h @@ -117,6 +117,14 @@ class IdmapHeader { return overlay_crc_; } + inline uint32_t GetFulfilledPolicies() const { + return fulfilled_policies_; + } + + bool GetEnforceOverlayable() const { + return enforce_overlayable_; + } + inline StringPiece GetTargetPath() const { return StringPiece(target_path_); } @@ -132,8 +140,11 @@ class IdmapHeader { // Invariant: anytime the idmap data encoding is changed, the idmap version // field *must* be incremented. Because of this, we know that if the idmap // header is up-to-date the entire file is up-to-date. - Result<Unit> IsUpToDate() const; - Result<Unit> IsUpToDate(uint32_t target_crc_) const; + Result<Unit> IsUpToDate(const char* target_path, const char* overlay_path, + uint32_t fulfilled_policies, bool enforce_overlayable) const; + Result<Unit> IsUpToDate(const char* target_path, const char* overlay_path, uint32_t target_crc, + uint32_t overlay_crc, uint32_t fulfilled_policies, + bool enforce_overlayable) const; void accept(Visitor* v) const; @@ -145,6 +156,8 @@ class IdmapHeader { uint32_t version_; uint32_t target_crc_; uint32_t overlay_crc_; + uint32_t fulfilled_policies_; + bool enforce_overlayable_; char target_path_[kIdmapStringLength]; char overlay_path_[kIdmapStringLength]; std::string debug_info_; diff --git a/cmds/idmap2/libidmap2/BinaryStreamVisitor.cpp b/cmds/idmap2/libidmap2/BinaryStreamVisitor.cpp index 362dcb36007a..255212ad4c66 100644 --- a/cmds/idmap2/libidmap2/BinaryStreamVisitor.cpp +++ b/cmds/idmap2/libidmap2/BinaryStreamVisitor.cpp @@ -66,6 +66,8 @@ void BinaryStreamVisitor::visit(const IdmapHeader& header) { Write32(header.GetVersion()); Write32(header.GetTargetCrc()); Write32(header.GetOverlayCrc()); + Write32(header.GetFulfilledPolicies()); + Write8(static_cast<uint8_t>(header.GetEnforceOverlayable())); WriteString256(header.GetTargetPath()); WriteString256(header.GetOverlayPath()); WriteString(header.GetDebugInfo()); diff --git a/cmds/idmap2/libidmap2/Idmap.cpp b/cmds/idmap2/libidmap2/Idmap.cpp index 706b842b3b47..0bea21735b24 100644 --- a/cmds/idmap2/libidmap2/Idmap.cpp +++ b/cmds/idmap2/libidmap2/Idmap.cpp @@ -112,14 +112,18 @@ Result<uint32_t> GetPackageCrc(const ZipFile& zip) { std::unique_ptr<const IdmapHeader> IdmapHeader::FromBinaryStream(std::istream& stream) { std::unique_ptr<IdmapHeader> idmap_header(new IdmapHeader()); - + uint8_t enforce_overlayable; if (!Read32(stream, &idmap_header->magic_) || !Read32(stream, &idmap_header->version_) || !Read32(stream, &idmap_header->target_crc_) || !Read32(stream, &idmap_header->overlay_crc_) || + !Read32(stream, &idmap_header->fulfilled_policies_) || + !Read8(stream, &enforce_overlayable) || !ReadString256(stream, idmap_header->target_path_) || !ReadString256(stream, idmap_header->overlay_path_)) { return nullptr; } + idmap_header->enforce_overlayable_ = static_cast<bool>(enforce_overlayable); + auto debug_str = ReadString(stream); if (!debug_str) { return nullptr; @@ -129,21 +133,35 @@ std::unique_ptr<const IdmapHeader> IdmapHeader::FromBinaryStream(std::istream& s return std::move(idmap_header); } -Result<Unit> IdmapHeader::IsUpToDate() const { - const std::unique_ptr<const ZipFile> target_zip = ZipFile::Open(target_path_); +Result<Unit> IdmapHeader::IsUpToDate(const char* target_path, const char* overlay_path, + uint32_t fulfilled_policies, bool enforce_overlayable) const { + const std::unique_ptr<const ZipFile> target_zip = ZipFile::Open(target_path); if (!target_zip) { - return Error("failed to open target %s", GetTargetPath().to_string().c_str()); + return Error("failed to open target %s", target_path); } - Result<uint32_t> target_crc = GetPackageCrc(*target_zip); + const Result<uint32_t> target_crc = GetPackageCrc(*target_zip); if (!target_crc) { return Error("failed to get target crc"); } - return IsUpToDate(*target_crc); + const std::unique_ptr<const ZipFile> overlay_zip = ZipFile::Open(overlay_path); + if (!overlay_zip) { + return Error("failed to overlay target %s", overlay_path); + } + + const Result<uint32_t> overlay_crc = GetPackageCrc(*overlay_zip); + if (!overlay_crc) { + return Error("failed to get overlay crc"); + } + + return IsUpToDate(target_path, overlay_path, *target_crc, *overlay_crc, fulfilled_policies, + enforce_overlayable); } -Result<Unit> IdmapHeader::IsUpToDate(uint32_t target_crc) const { +Result<Unit> IdmapHeader::IsUpToDate(const char* target_path, const char* overlay_path, + uint32_t target_crc, uint32_t overlay_crc, + uint32_t fulfilled_policies, bool enforce_overlayable) const { if (magic_ != kIdmapMagic) { return Error("bad magic: actual 0x%08x, expected 0x%08x", magic_, kIdmapMagic); } @@ -157,19 +175,30 @@ Result<Unit> IdmapHeader::IsUpToDate(uint32_t target_crc) const { target_crc); } - const std::unique_ptr<const ZipFile> overlay_zip = ZipFile::Open(overlay_path_); - if (!overlay_zip) { - return Error("failed to open overlay %s", GetOverlayPath().to_string().c_str()); + if (overlay_crc_ != overlay_crc) { + return Error("bad overlay crc: idmap version 0x%08x, file system version 0x%08x", overlay_crc_, + overlay_crc); } - Result<uint32_t> overlay_crc = GetPackageCrc(*overlay_zip); - if (!overlay_crc) { - return Error("failed to get overlay crc"); + if (fulfilled_policies_ != fulfilled_policies) { + return Error("bad fulfilled policies: idmap version 0x%08x, file system version 0x%08x", + fulfilled_policies, fulfilled_policies_); } - if (overlay_crc_ != *overlay_crc) { - return Error("bad overlay crc: idmap version 0x%08x, file system version 0x%08x", overlay_crc_, - *overlay_crc); + if (enforce_overlayable != enforce_overlayable_) { + return Error("bad enforce overlayable: idmap version %s, file system version %s", + enforce_overlayable ? "true" : "false", + enforce_overlayable_ ? "true" : "false"); + } + + if (strcmp(target_path, target_path_) != 0) { + return Error("bad target path: idmap version %s, file system version %s", target_path, + target_path_); + } + + if (strcmp(overlay_path, overlay_path_) != 0) { + return Error("bad overlay path: idmap version %s, file system version %s", overlay_path, + overlay_path_); } return Unit{}; @@ -320,6 +349,9 @@ Result<std::unique_ptr<const Idmap>> Idmap::FromApkAssets(const ApkAssets& targe } header->overlay_crc_ = *crc; + header->fulfilled_policies_ = fulfilled_policies; + header->enforce_overlayable_ = enforce_overlayable; + if (target_apk_path.size() > sizeof(header->target_path_)) { return Error("target apk path \"%s\" longer than maximum size %zu", target_apk_path.c_str(), sizeof(header->target_path_)); diff --git a/cmds/idmap2/libidmap2/RawPrintVisitor.cpp b/cmds/idmap2/libidmap2/RawPrintVisitor.cpp index 751c60c4add4..3f62a2ae2029 100644 --- a/cmds/idmap2/libidmap2/RawPrintVisitor.cpp +++ b/cmds/idmap2/libidmap2/RawPrintVisitor.cpp @@ -23,10 +23,12 @@ #include "android-base/macros.h" #include "android-base/stringprintf.h" #include "androidfw/ApkAssets.h" +#include "idmap2/PolicyUtils.h" #include "idmap2/ResourceUtils.h" #include "idmap2/Result.h" using android::ApkAssets; +using android::idmap2::policy::PoliciesToDebugString; namespace { @@ -39,9 +41,6 @@ size_t StringSizeWhenEncoded(const std::string& s) { namespace android::idmap2 { -// verbatim copy fomr PrettyPrintVisitor.cpp, move to common utils -#define RESID(pkg, type, entry) (((pkg) << 24) | ((type) << 16) | (entry)) - void RawPrintVisitor::visit(const Idmap& idmap ATTRIBUTE_UNUSED) { } @@ -50,6 +49,9 @@ void RawPrintVisitor::visit(const IdmapHeader& header) { print(header.GetVersion(), "version"); print(header.GetTargetCrc(), "target crc"); print(header.GetOverlayCrc(), "overlay crc"); + print(header.GetFulfilledPolicies(), "fulfilled policies: %s", + PoliciesToDebugString(header.GetFulfilledPolicies()).c_str()); + print(static_cast<uint8_t>(header.GetEnforceOverlayable()), "enforce overlayable"); print(header.GetTargetPath().to_string(), kIdmapStringLength, "target path"); print(header.GetOverlayPath().to_string(), kIdmapStringLength, "overlay path"); print("...", StringSizeWhenEncoded(header.GetDebugInfo()), "debug info"); diff --git a/cmds/idmap2/libidmap2/ResourceMapping.cpp b/cmds/idmap2/libidmap2/ResourceMapping.cpp index 44acbcaf8ace..34589a1c39dc 100644 --- a/cmds/idmap2/libidmap2/ResourceMapping.cpp +++ b/cmds/idmap2/libidmap2/ResourceMapping.cpp @@ -61,8 +61,7 @@ Result<Unit> CheckOverlayable(const LoadedPackage& target_package, const ResourceId& target_resource) { static constexpr const PolicyBitmask sDefaultPolicies = PolicyFlags::ODM_PARTITION | PolicyFlags::OEM_PARTITION | PolicyFlags::SYSTEM_PARTITION | - PolicyFlags::VENDOR_PARTITION | PolicyFlags::PRODUCT_PARTITION | PolicyFlags::SIGNATURE | - PolicyFlags::ACTOR_SIGNATURE; + PolicyFlags::VENDOR_PARTITION | PolicyFlags::PRODUCT_PARTITION | PolicyFlags::SIGNATURE; // If the resource does not have an overlayable definition, allow the resource to be overlaid if // the overlay is preinstalled or signed with the same signature as the target. @@ -292,13 +291,6 @@ Result<ResourceMapping> ResourceMapping::FromApkAssets(const ApkAssets& target_a const PolicyBitmask& fulfilled_policies, bool enforce_overlayable, LogInfo& log_info) { - if (enforce_overlayable) { - log_info.Info(LogMessage() << "fulfilled_policies=" - << ConcatPolicies(BitmaskToPolicies(fulfilled_policies)) - << " enforce_overlayable=" - << (enforce_overlayable ? "true" : "false")); - } - AssetManager2 target_asset_manager; if (!target_asset_manager.SetApkAssets({&target_apk_assets}, true /* invalidate_caches */, false /* filter_incompatible_configs*/)) { diff --git a/cmds/idmap2/libidmap2_policies/include/idmap2/Policies.h b/cmds/idmap2/libidmap2_policies/include/idmap2/Policies.h index 4973b7638d10..5bd353af4ad3 100644 --- a/cmds/idmap2/libidmap2_policies/include/idmap2/Policies.h +++ b/cmds/idmap2/libidmap2_policies/include/idmap2/Policies.h @@ -21,9 +21,12 @@ #include <string> #include <vector> +#include "android-base/stringprintf.h" #include "androidfw/ResourceTypes.h" #include "androidfw/StringPiece.h" +using android::base::StringPrintf; + using PolicyBitmask = android::ResTable_overlayable_policy_header::PolicyBitmask; using PolicyFlags = android::ResTable_overlayable_policy_header::PolicyFlags; @@ -48,6 +51,29 @@ inline static const std::array<std::pair<StringPiece, PolicyFlags>, 8> kPolicySt {kPolicySystem, PolicyFlags::SYSTEM_PARTITION}, {kPolicyVendor, PolicyFlags::VENDOR_PARTITION}, }; + +inline static std::string PoliciesToDebugString(PolicyBitmask policies) { + std::string str; + uint32_t remaining = policies; + for (auto const& policy : kPolicyStringToFlag) { + if ((policies & policy.second) != policy.second) { + continue; + } + if (!str.empty()) { + str.append("|"); + } + str.append(policy.first.data()); + remaining &= ~policy.second; + } + if (remaining != 0) { + if (!str.empty()) { + str.append("|"); + } + str.append(StringPrintf("0x%08x", remaining)); + } + return !str.empty() ? str : "none"; +} + } // namespace android::idmap2::policy #endif // IDMAP2_INCLUDE_IDMAP2_POLICIES_H_ diff --git a/cmds/idmap2/tests/BinaryStreamVisitorTests.cpp b/cmds/idmap2/tests/BinaryStreamVisitorTests.cpp index db4778c8ee09..5fea7bcdaac5 100644 --- a/cmds/idmap2/tests/BinaryStreamVisitorTests.cpp +++ b/cmds/idmap2/tests/BinaryStreamVisitorTests.cpp @@ -48,6 +48,11 @@ TEST(BinaryStreamVisitorTests, CreateBinaryStreamViaBinaryStreamVisitor) { ASSERT_TRUE(result2); const auto idmap2 = std::move(*result2); + ASSERT_EQ(idmap1->GetHeader()->GetFulfilledPolicies(), + idmap2->GetHeader()->GetFulfilledPolicies()); + ASSERT_EQ(idmap1->GetHeader()->GetEnforceOverlayable(), + idmap2->GetHeader()->GetEnforceOverlayable()); + ASSERT_EQ(idmap1->GetHeader()->GetTargetPath(), idmap2->GetHeader()->GetTargetPath()); ASSERT_EQ(idmap1->GetHeader()->GetTargetCrc(), idmap2->GetHeader()->GetTargetCrc()); ASSERT_EQ(idmap1->GetHeader()->GetTargetPath(), idmap2->GetHeader()->GetTargetPath()); ASSERT_EQ(idmap1->GetData().size(), 1U); diff --git a/cmds/idmap2/tests/IdmapTests.cpp b/cmds/idmap2/tests/IdmapTests.cpp index 87da36c01192..6fab5e0f8ae1 100644 --- a/cmds/idmap2/tests/IdmapTests.cpp +++ b/cmds/idmap2/tests/IdmapTests.cpp @@ -62,9 +62,11 @@ TEST(IdmapTests, CreateIdmapHeaderFromBinaryStream) { std::unique_ptr<const IdmapHeader> header = IdmapHeader::FromBinaryStream(stream); ASSERT_THAT(header, NotNull()); ASSERT_EQ(header->GetMagic(), 0x504d4449U); - ASSERT_EQ(header->GetVersion(), 0x03U); + ASSERT_EQ(header->GetVersion(), 0x04U); ASSERT_EQ(header->GetTargetCrc(), 0x1234U); ASSERT_EQ(header->GetOverlayCrc(), 0x5678U); + ASSERT_EQ(header->GetFulfilledPolicies(), 0x11); + ASSERT_EQ(header->GetEnforceOverlayable(), true); ASSERT_EQ(header->GetTargetPath().to_string(), "targetX.apk"); ASSERT_EQ(header->GetOverlayPath().to_string(), "overlayX.apk"); ASSERT_EQ(header->GetDebugInfo(), "debug"); @@ -73,7 +75,7 @@ TEST(IdmapTests, CreateIdmapHeaderFromBinaryStream) { TEST(IdmapTests, FailToCreateIdmapHeaderFromBinaryStreamIfPathTooLong) { std::string raw(reinterpret_cast<const char*>(idmap_raw_data), idmap_raw_data_len); // overwrite the target path string, including the terminating null, with '.' - for (size_t i = 0x10; i < 0x110; i++) { + for (size_t i = 0x15; i < 0x115; i++) { raw[i] = '.'; } std::istringstream stream(raw); @@ -82,7 +84,7 @@ TEST(IdmapTests, FailToCreateIdmapHeaderFromBinaryStreamIfPathTooLong) { } TEST(IdmapTests, CreateIdmapDataHeaderFromBinaryStream) { - const size_t offset = 0x21c; + const size_t offset = 0x221; std::string raw(reinterpret_cast<const char*>(idmap_raw_data + offset), idmap_raw_data_len - offset); std::istringstream stream(raw); @@ -94,7 +96,7 @@ TEST(IdmapTests, CreateIdmapDataHeaderFromBinaryStream) { } TEST(IdmapTests, CreateIdmapDataFromBinaryStream) { - const size_t offset = 0x21c; + const size_t offset = 0x221; std::string raw(reinterpret_cast<const char*>(idmap_raw_data + offset), idmap_raw_data_len - offset); std::istringstream stream(raw); @@ -128,9 +130,11 @@ TEST(IdmapTests, CreateIdmapFromBinaryStream) { ASSERT_THAT(idmap->GetHeader(), NotNull()); ASSERT_EQ(idmap->GetHeader()->GetMagic(), 0x504d4449U); - ASSERT_EQ(idmap->GetHeader()->GetVersion(), 0x03U); + ASSERT_EQ(idmap->GetHeader()->GetVersion(), 0x04U); ASSERT_EQ(idmap->GetHeader()->GetTargetCrc(), 0x1234U); ASSERT_EQ(idmap->GetHeader()->GetOverlayCrc(), 0x5678U); + ASSERT_EQ(idmap->GetHeader()->GetFulfilledPolicies(), 0x11); + ASSERT_EQ(idmap->GetHeader()->GetEnforceOverlayable(), true); ASSERT_EQ(idmap->GetHeader()->GetTargetPath().to_string(), "targetX.apk"); ASSERT_EQ(idmap->GetHeader()->GetOverlayPath().to_string(), "overlayX.apk"); @@ -180,9 +184,11 @@ TEST(IdmapTests, CreateIdmapHeaderFromApkAssets) { ASSERT_THAT(idmap->GetHeader(), NotNull()); ASSERT_EQ(idmap->GetHeader()->GetMagic(), 0x504d4449U); - ASSERT_EQ(idmap->GetHeader()->GetVersion(), 0x03U); + ASSERT_EQ(idmap->GetHeader()->GetVersion(), 0x04U); ASSERT_EQ(idmap->GetHeader()->GetTargetCrc(), android::idmap2::TestConstants::TARGET_CRC); ASSERT_EQ(idmap->GetHeader()->GetOverlayCrc(), android::idmap2::TestConstants::OVERLAY_CRC); + ASSERT_EQ(idmap->GetHeader()->GetFulfilledPolicies(), PolicyFlags::PUBLIC); + ASSERT_EQ(idmap->GetHeader()->GetEnforceOverlayable(), true); ASSERT_EQ(idmap->GetHeader()->GetTargetPath().to_string(), target_apk_path); ASSERT_EQ(idmap->GetHeader()->GetOverlayPath(), overlay_apk_path); } @@ -389,7 +395,8 @@ TEST(IdmapTests, IdmapHeaderIsUpToDate) { std::unique_ptr<const IdmapHeader> header = IdmapHeader::FromBinaryStream(stream); ASSERT_THAT(header, NotNull()); - ASSERT_TRUE(header->IsUpToDate()); + ASSERT_TRUE(header->IsUpToDate(target_apk_path.c_str(), overlay_apk_path.c_str(), + PolicyFlags::PUBLIC, /* enforce_overlayable */ true)); // magic: bytes (0x0, 0x03) std::string bad_magic_string(stream.str()); @@ -402,7 +409,8 @@ TEST(IdmapTests, IdmapHeaderIsUpToDate) { IdmapHeader::FromBinaryStream(bad_magic_stream); ASSERT_THAT(bad_magic_header, NotNull()); ASSERT_NE(header->GetMagic(), bad_magic_header->GetMagic()); - ASSERT_FALSE(bad_magic_header->IsUpToDate()); + ASSERT_FALSE(bad_magic_header->IsUpToDate(target_apk_path.c_str(), overlay_apk_path.c_str(), + PolicyFlags::PUBLIC, /* enforce_overlayable */ true)); // version: bytes (0x4, 0x07) std::string bad_version_string(stream.str()); @@ -415,7 +423,8 @@ TEST(IdmapTests, IdmapHeaderIsUpToDate) { IdmapHeader::FromBinaryStream(bad_version_stream); ASSERT_THAT(bad_version_header, NotNull()); ASSERT_NE(header->GetVersion(), bad_version_header->GetVersion()); - ASSERT_FALSE(bad_version_header->IsUpToDate()); + ASSERT_FALSE(bad_magic_header->IsUpToDate(target_apk_path.c_str(), overlay_apk_path.c_str(), + PolicyFlags::PUBLIC, /* enforce_overlayable */ true)); // target crc: bytes (0x8, 0xb) std::string bad_target_crc_string(stream.str()); @@ -428,7 +437,8 @@ TEST(IdmapTests, IdmapHeaderIsUpToDate) { IdmapHeader::FromBinaryStream(bad_target_crc_stream); ASSERT_THAT(bad_target_crc_header, NotNull()); ASSERT_NE(header->GetTargetCrc(), bad_target_crc_header->GetTargetCrc()); - ASSERT_FALSE(bad_target_crc_header->IsUpToDate()); + ASSERT_FALSE(bad_magic_header->IsUpToDate(target_apk_path.c_str(), overlay_apk_path.c_str(), + PolicyFlags::PUBLIC, /* enforce_overlayable */ true)); // overlay crc: bytes (0xc, 0xf) std::string bad_overlay_crc_string(stream.str()); @@ -441,27 +451,55 @@ TEST(IdmapTests, IdmapHeaderIsUpToDate) { IdmapHeader::FromBinaryStream(bad_overlay_crc_stream); ASSERT_THAT(bad_overlay_crc_header, NotNull()); ASSERT_NE(header->GetOverlayCrc(), bad_overlay_crc_header->GetOverlayCrc()); - ASSERT_FALSE(bad_overlay_crc_header->IsUpToDate()); - - // target path: bytes (0x10, 0x10f) + ASSERT_FALSE(bad_magic_header->IsUpToDate(target_apk_path.c_str(), overlay_apk_path.c_str(), + PolicyFlags::PUBLIC, /* enforce_overlayable */ true)); + + // fulfilled policy: bytes (0x10, 0x13) + std::string bad_policy_string(stream.str()); + bad_policy_string[0x10] = '.'; + bad_policy_string[0x11] = '.'; + bad_policy_string[0x12] = '.'; + bad_policy_string[0x13] = '.'; + std::stringstream bad_policy_stream(bad_policy_string); + std::unique_ptr<const IdmapHeader> bad_policy_header = + IdmapHeader::FromBinaryStream(bad_policy_stream); + ASSERT_THAT(bad_policy_header, NotNull()); + ASSERT_NE(header->GetFulfilledPolicies(), bad_policy_header->GetFulfilledPolicies()); + ASSERT_FALSE(bad_policy_header->IsUpToDate(target_apk_path.c_str(), overlay_apk_path.c_str(), + PolicyFlags::PUBLIC, /* enforce_overlayable */ true)); + + // enforce overlayable: bytes (0x14) + std::string bad_enforce_string(stream.str()); + bad_enforce_string[0x14] = '\0'; + std::stringstream bad_enforce_stream(bad_enforce_string); + std::unique_ptr<const IdmapHeader> bad_enforce_header = + IdmapHeader::FromBinaryStream(bad_enforce_stream); + ASSERT_THAT(bad_enforce_header, NotNull()); + ASSERT_NE(header->GetEnforceOverlayable(), bad_enforce_header->GetEnforceOverlayable()); + ASSERT_FALSE(bad_enforce_header->IsUpToDate(target_apk_path.c_str(), overlay_apk_path.c_str(), + PolicyFlags::PUBLIC, /* enforce_overlayable */ true)); + + // target path: bytes (0x15, 0x114) std::string bad_target_path_string(stream.str()); - bad_target_path_string[0x10] = '\0'; + bad_target_path_string[0x15] = '\0'; std::stringstream bad_target_path_stream(bad_target_path_string); std::unique_ptr<const IdmapHeader> bad_target_path_header = IdmapHeader::FromBinaryStream(bad_target_path_stream); ASSERT_THAT(bad_target_path_header, NotNull()); ASSERT_NE(header->GetTargetPath(), bad_target_path_header->GetTargetPath()); - ASSERT_FALSE(bad_target_path_header->IsUpToDate()); + ASSERT_FALSE(bad_magic_header->IsUpToDate(target_apk_path.c_str(), overlay_apk_path.c_str(), + PolicyFlags::PUBLIC, /* enforce_overlayable */ true)); - // overlay path: bytes (0x110, 0x20f) + // overlay path: bytes (0x115, 0x214) std::string bad_overlay_path_string(stream.str()); - bad_overlay_path_string[0x110] = '\0'; + bad_overlay_path_string[0x115] = '\0'; std::stringstream bad_overlay_path_stream(bad_overlay_path_string); std::unique_ptr<const IdmapHeader> bad_overlay_path_header = IdmapHeader::FromBinaryStream(bad_overlay_path_stream); ASSERT_THAT(bad_overlay_path_header, NotNull()); ASSERT_NE(header->GetOverlayPath(), bad_overlay_path_header->GetOverlayPath()); - ASSERT_FALSE(bad_overlay_path_header->IsUpToDate()); + ASSERT_FALSE(bad_magic_header->IsUpToDate(target_apk_path.c_str(), overlay_apk_path.c_str(), + PolicyFlags::PUBLIC, /* enforce_overlayable */ true)); } class TestVisitor : public Visitor { diff --git a/cmds/idmap2/tests/RawPrintVisitorTests.cpp b/cmds/idmap2/tests/RawPrintVisitorTests.cpp index 5c5c81edee90..b268d5add141 100644 --- a/cmds/idmap2/tests/RawPrintVisitorTests.cpp +++ b/cmds/idmap2/tests/RawPrintVisitorTests.cpp @@ -43,6 +43,8 @@ namespace android::idmap2 { << str << "--------"; \ } while (0) +#define ADDRESS "[0-9a-f]{8}: " + TEST(RawPrintVisitorTests, CreateRawPrintVisitor) { fclose(stderr); // silence expected warnings @@ -62,15 +64,16 @@ TEST(RawPrintVisitorTests, CreateRawPrintVisitor) { RawPrintVisitor visitor(stream); (*idmap)->accept(&visitor); -#define ADDRESS "[0-9a-f]{8}: " ASSERT_CONTAINS_REGEX(ADDRESS "504d4449 magic\n", stream.str()); - ASSERT_CONTAINS_REGEX(ADDRESS "00000003 version\n", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS "00000004 version\n", stream.str()); ASSERT_CONTAINS_REGEX( StringPrintf(ADDRESS "%s target crc\n", android::idmap2::TestConstants::TARGET_CRC_STRING), stream.str()); ASSERT_CONTAINS_REGEX( StringPrintf(ADDRESS "%s overlay crc\n", android::idmap2::TestConstants::OVERLAY_CRC_STRING), stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS "00000001 fulfilled policies: public\n", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS " 01 enforce overlayable\n", stream.str()); ASSERT_CONTAINS_REGEX(ADDRESS " 7f target package id\n", stream.str()); ASSERT_CONTAINS_REGEX(ADDRESS " 7f overlay package id\n", stream.str()); ASSERT_CONTAINS_REGEX(ADDRESS "00000004 target entry count\n", stream.str()); @@ -83,7 +86,6 @@ TEST(RawPrintVisitorTests, CreateRawPrintVisitor) { ASSERT_CONTAINS_REGEX(ADDRESS "7f010000 value: integer/int1\n", stream.str()); ASSERT_CONTAINS_REGEX(ADDRESS "7f010000 overlay id: integer/int1\n", stream.str()); ASSERT_CONTAINS_REGEX(ADDRESS "7f010000 target id: integer/int1\n", stream.str()); -#undef ADDRESS } TEST(RawPrintVisitorTests, CreateRawPrintVisitorWithoutAccessToApks) { @@ -99,22 +101,23 @@ TEST(RawPrintVisitorTests, CreateRawPrintVisitorWithoutAccessToApks) { RawPrintVisitor visitor(stream); (*idmap)->accept(&visitor); - ASSERT_NE(stream.str().find("00000000: 504d4449 magic\n"), std::string::npos); - ASSERT_NE(stream.str().find("00000004: 00000003 version\n"), std::string::npos); - ASSERT_NE(stream.str().find("00000008: 00001234 target crc\n"), std::string::npos); - ASSERT_NE(stream.str().find("0000000c: 00005678 overlay crc\n"), std::string::npos); - ASSERT_NE(stream.str().find("0000021c: 7f target package id\n"), std::string::npos); - ASSERT_NE(stream.str().find("0000021d: 7f overlay package id\n"), std::string::npos); - ASSERT_NE(stream.str().find("0000021e: 00000003 target entry count\n"), std::string::npos); - ASSERT_NE(stream.str().find("00000222: 00000003 overlay entry count\n"), std::string::npos); - ASSERT_NE(stream.str().find("00000226: 00000000 string pool index offset\n"), std::string::npos); - ASSERT_NE(stream.str().find("0000022a: 00000000 string pool byte length\n"), std::string::npos); - ASSERT_NE(stream.str().find("0000022e: 7f020000 target id\n"), std::string::npos); - ASSERT_NE(stream.str().find("00000232: 01 type: reference\n"), std::string::npos); - ASSERT_NE(stream.str().find("00000233: 7f020000 value\n"), std::string::npos); - - ASSERT_NE(stream.str().find("00000249: 7f020000 overlay id\n"), std::string::npos); - ASSERT_NE(stream.str().find("0000024d: 7f020000 target id\n"), std::string::npos); + ASSERT_CONTAINS_REGEX(ADDRESS "504d4449 magic\n", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS "00000004 version\n", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS "00001234 target crc\n", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS "00005678 overlay crc\n", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS "00000011 fulfilled policies: public|signature\n", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS " 01 enforce overlayable\n", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS " 7f target package id\n", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS " 7f overlay package id\n", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS "00000003 target entry count\n", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS "00000003 overlay entry count\n", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS "00000000 string pool index offset\n", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS "00000000 string pool byte length\n", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS "7f020000 target id\n", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS " 01 type: reference\n", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS "7f020000 value\n", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS "7f020000 overlay id\n", stream.str()); + ASSERT_CONTAINS_REGEX(ADDRESS "7f020000 target id\n", stream.str()); } } // namespace android::idmap2 diff --git a/cmds/idmap2/tests/ResourceMappingTests.cpp b/cmds/idmap2/tests/ResourceMappingTests.cpp index 5754eaf078a9..de039f440e33 100644 --- a/cmds/idmap2/tests/ResourceMappingTests.cpp +++ b/cmds/idmap2/tests/ResourceMappingTests.cpp @@ -287,26 +287,66 @@ TEST(ResourceMappingTests, ResourcesFromApkAssetsNoDefinedOverlayableAndNoTarget R::overlay::string::str4, false /* rewrite */)); } - -// Overlays that are pre-installed or are signed with the same signature as the target/actor can +// Overlays that are neither pre-installed nor signed with the same signature as the target cannot // overlay packages that have not defined overlayable resources. -TEST(ResourceMappingTests, ResourcesFromApkAssetsDefaultPolicies) { - constexpr PolicyBitmask kDefaultPolicies = - PolicyFlags::SIGNATURE | PolicyFlags::ACTOR_SIGNATURE | PolicyFlags::PRODUCT_PARTITION | - PolicyFlags::SYSTEM_PARTITION | PolicyFlags::VENDOR_PARTITION | PolicyFlags::ODM_PARTITION | - PolicyFlags::OEM_PARTITION; +TEST(ResourceMappingTests, ResourcesFromApkAssetsDefaultPoliciesPublicFail) { + auto resources = TestGetResourceMapping("/target/target-no-overlayable.apk", + "/overlay/overlay-no-name.apk", PolicyFlags::PUBLIC, + /* enforce_overlayable */ true); + + ASSERT_TRUE(resources) << resources.GetErrorMessage(); + ASSERT_EQ(resources->GetTargetToOverlayMap().size(), 0U); +} - for (PolicyBitmask policy = 1U << (sizeof(PolicyBitmask) * 8 - 1); policy > 0; - policy = policy >> 1U) { +// Overlays that are pre-installed or are signed with the same signature as the target can overlay +// packages that have not defined overlayable resources. +TEST(ResourceMappingTests, ResourcesFromApkAssetsDefaultPolicies) { + auto CheckEntries = [&](const PolicyBitmask& fulfilled_policies) -> void { auto resources = TestGetResourceMapping("/target/target-no-overlayable.apk", "/system-overlay-invalid/system-overlay-invalid.apk", - policy, /* enforce_overlayable */ true); - ASSERT_TRUE(resources) << resources.GetErrorMessage(); + fulfilled_policies, + /* enforce_overlayable */ true); - const size_t expected_overlaid = (policy & kDefaultPolicies) != 0 ? 10U : 0U; - ASSERT_EQ(expected_overlaid, resources->GetTargetToOverlayMap().size()) - << "Incorrect number of resources overlaid through policy " << policy; - } + ASSERT_TRUE(resources) << resources.GetErrorMessage(); + auto& res = *resources; + ASSERT_EQ(resources->GetTargetToOverlayMap().size(), 10U); + ASSERT_RESULT(MappingExists(res, R::target::string::not_overlayable, Res_value::TYPE_REFERENCE, + R::system_overlay_invalid::string::not_overlayable, + false /* rewrite */)); + ASSERT_RESULT(MappingExists(res, R::target::string::other, Res_value::TYPE_REFERENCE, + R::system_overlay_invalid::string::other, false /* rewrite */)); + ASSERT_RESULT(MappingExists(res, R::target::string::policy_actor, Res_value::TYPE_REFERENCE, + R::system_overlay_invalid::string::policy_actor, + false /* rewrite */)); + ASSERT_RESULT(MappingExists(res, R::target::string::policy_odm, Res_value::TYPE_REFERENCE, + R::system_overlay_invalid::string::policy_odm, + false /* rewrite */)); + ASSERT_RESULT(MappingExists(res, R::target::string::policy_oem, Res_value::TYPE_REFERENCE, + R::system_overlay_invalid::string::policy_oem, + false /* rewrite */)); + ASSERT_RESULT(MappingExists(res, R::target::string::policy_product, Res_value::TYPE_REFERENCE, + R::system_overlay_invalid::string::policy_product, + false /* rewrite */)); + ASSERT_RESULT(MappingExists(res, R::target::string::policy_public, Res_value::TYPE_REFERENCE, + R::system_overlay_invalid::string::policy_public, + false /* rewrite */)); + ASSERT_RESULT(MappingExists(res, R::target::string::policy_signature, Res_value::TYPE_REFERENCE, + R::system_overlay_invalid::string::policy_signature, + false /* rewrite */)); + ASSERT_RESULT(MappingExists(res, R::target::string::policy_system, Res_value::TYPE_REFERENCE, + R::system_overlay_invalid::string::policy_system, + false /* rewrite */)); + ASSERT_RESULT(MappingExists( + res, R::target::string::policy_system_vendor, Res_value::TYPE_REFERENCE, + R::system_overlay_invalid::string::policy_system_vendor, false /* rewrite */)); + }; + + CheckEntries(PolicyFlags::SIGNATURE); + CheckEntries(PolicyFlags::PRODUCT_PARTITION); + CheckEntries(PolicyFlags::SYSTEM_PARTITION); + CheckEntries(PolicyFlags::VENDOR_PARTITION); + CheckEntries(PolicyFlags::ODM_PARTITION); + CheckEntries(PolicyFlags::OEM_PARTITION); } } // namespace android::idmap2 diff --git a/cmds/idmap2/tests/TestHelpers.h b/cmds/idmap2/tests/TestHelpers.h index e899589c7e61..b599dcb0069a 100644 --- a/cmds/idmap2/tests/TestHelpers.h +++ b/cmds/idmap2/tests/TestHelpers.h @@ -30,7 +30,7 @@ const unsigned char idmap_raw_data[] = { 0x49, 0x44, 0x4d, 0x50, // 0x4: version - 0x03, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, // 0x8: target crc 0x34, 0x12, 0x00, 0x00, @@ -38,7 +38,13 @@ const unsigned char idmap_raw_data[] = { // 0xc: overlay crc 0x78, 0x56, 0x00, 0x00, - // 0x10: target path "targetX.apk" + // 0x10: fulfilled policies + 0x11, 0x00, 0x00, 0x00, + + // 0x14: enforce overlayable + 0x01, + + // 0x15: target path "targetX.apk" 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x58, 0x2e, 0x61, 0x70, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -56,7 +62,7 @@ const unsigned char idmap_raw_data[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - // 0x110: overlay path "overlayX.apk" + // 0x115: overlay path "overlayX.apk" 0x6f, 0x76, 0x65, 0x72, 0x6c, 0x61, 0x79, 0x58, 0x2e, 0x61, 0x70, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -74,7 +80,7 @@ const unsigned char idmap_raw_data[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - // 0x210: debug string + // 0x215: debug string // string length, including terminating null 0x08, 0x00, 0x00, 0x00, @@ -82,63 +88,63 @@ const unsigned char idmap_raw_data[] = { 0x64, 0x65, 0x62, 0x75, 0x67, 0x00, 0x00, 0x00, // DATA HEADER - // 0x21c: target_package_id + // 0x221: target_package_id 0x7f, - // 0x21d: overlay_package_id + // 0x222: overlay_package_id 0x7f, - // 0x21e: target_entry_count + // 0x223: target_entry_count 0x03, 0x00, 0x00, 0x00, - // 0x222: overlay_entry_count + // 0x227: overlay_entry_count 0x03, 0x00, 0x00, 0x00, - // 0x226: string_pool_offset + // 0x22b: string_pool_offset 0x00, 0x00, 0x00, 0x00, - // 0x22a: string_pool_byte_length + // 0x22f: string_pool_byte_length 0x00, 0x00, 0x00, 0x00, // TARGET ENTRIES - // 0x22e: 0x7f020000 + // 0x233: 0x7f020000 0x00, 0x00, 0x02, 0x7f, - // 0x232: TYPE_REFERENCE + // 0x237: TYPE_REFERENCE 0x01, - // 0x233: 0x7f020000 + // 0x238: 0x7f020000 0x00, 0x00, 0x02, 0x7f, - // 0x237: 0x7f030000 + // 0x23c: 0x7f030000 0x00, 0x00, 0x03, 0x7f, - // 0x23b: TYPE_REFERENCE + // 0x240: TYPE_REFERENCE 0x01, - // 0x23c: 0x7f030000 + // 0x241: 0x7f030000 0x00, 0x00, 0x03, 0x7f, - // 0x240: 0x7f030002 + // 0x245: 0x7f030002 0x02, 0x00, 0x03, 0x7f, - // 0x244: TYPE_REFERENCE + // 0x249: TYPE_REFERENCE 0x01, - // 0x245: 0x7f030001 + // 0x24a: 0x7f030001 0x01, 0x00, 0x03, 0x7f, // OVERLAY ENTRIES - // 0x249: 0x7f020000 -> 0x7f020000 + // 0x24e: 0x7f020000 -> 0x7f020000 0x00, 0x00, 0x02, 0x7f, 0x00, 0x00, 0x02, 0x7f, - // 0x251: 0x7f030000 -> 0x7f030000 + // 0x256: 0x7f030000 -> 0x7f030000 0x00, 0x00, 0x03, 0x7f, 0x00, 0x00, 0x03, 0x7f, - // 0x259: 0x7f030001 -> 0x7f030002 + // 0x25e: 0x7f030001 -> 0x7f030002 0x01, 0x00, 0x03, 0x7f, 0x02, 0x00, 0x03, 0x7f}; -const unsigned int idmap_raw_data_len = 0x261; +const unsigned int idmap_raw_data_len = 0x266; std::string GetTestDataPath(); diff --git a/cmds/incidentd/src/Section.cpp b/cmds/incidentd/src/Section.cpp index 61e5eb07130c..33e764988b75 100644 --- a/cmds/incidentd/src/Section.cpp +++ b/cmds/incidentd/src/Section.cpp @@ -477,14 +477,15 @@ status_t TextDumpsysSection::Execute(ReportWriter* writer) const { // Run dumping thread const uint64_t start = Nanotime(); - std::thread worker([&]() { + std::thread worker([write_fd = std::move(dumpPipe.writeFd()), service = std::move(service), + this]() mutable { // Don't crash the service if writing to a closed pipe (may happen if dumping times out) signal(SIGPIPE, sigpipe_handler); - status_t err = service->dump(dumpPipe.writeFd().get(), mArgs); + status_t err = service->dump(write_fd.get(), this->mArgs); if (err != OK) { ALOGW("[%s] dump thread failed. Error: %s", this->name.string(), strerror(-err)); } - dumpPipe.writeFd().reset(); + write_fd.reset(); }); // Collect dump content diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto index 9abae528b474..22166337cb42 100644 --- a/cmds/statsd/src/atoms.proto +++ b/cmds/statsd/src/atoms.proto @@ -446,6 +446,10 @@ message Atom { 277 [(module) = "settings"]; CellBroadcastMessageFiltered cb_message_filtered = 278 [(module) = "cellbroadcast"]; + TvTunerDvrStatus tv_tuner_dvr_status = 279 [(module) = "framework"]; + TvCasSessionOpenStatus tv_cas_session_open_status = + 280 [(module) = "framework"]; + AssistantInvocationReported assistant_invocation_reported = 281 [(module) = "framework"]; // StatsdStats tracks platform atoms with ids upto 500. // Update StatsdStats::kMaxPushedAtomId when atom ids here approach that value. @@ -5800,7 +5804,7 @@ message ProcessStatsProto { optional string process = 1; // Uid of the process. - optional int32 uid = 2; + optional int32 uid = 2 [(is_uid) = true]; // Information about how often kills occurred message Kill { @@ -5827,13 +5831,16 @@ message ProcessStatsProto { repeated ProcessStatsAssociationProto assocs = 7; } -// Next Tag: 5 +// Next Tag: 6 message ProcessStatsAssociationProto { // Procss Name of the associated process (client process of service binding) optional string assoc_process_name = 1; // Package Name of the associated package (client package of service binding) - optional string assoc_package_name = 2; + optional string assoc_package_name = 2 [deprecated = true]; + + // UID of the associated process/package (client package of service binding) + optional int32 assoc_uid = 5 [(is_uid) = true]; // Total count of the times this association (service binding) appeared. optional int32 total_count = 3; @@ -9242,6 +9249,58 @@ message TvTunerStateChanged { // new state optional State state = 2; } + +/** + * Logs the status of a dvr playback or record. + * This is atom ID 279. + * + * Logged from: + * frameworks/base/media/java/android/media/tv/tuner/dvr + */ +message TvTunerDvrStatus { + enum Type { + UNKNOWN_TYPE = 0; + PLAYBACK = 1; // is a playback + RECORD = 2; // is a record + } + enum State { + UNKNOWN_STATE = 0; + STARTED = 1; // DVR is started + STOPPED = 2; // DVR is stopped + } + // The uid of the application that sent this custom atom. + optional int32 uid = 1 [(is_uid) = true]; + // DVR type + optional Type type = 2; + // DVR state + optional State state = 3; + // Identify the segment of a record or playback + optional int32 segment_id = 4; + // indicate how many overflow or underflow happened between started to stopped + optional int32 overflow_underflow_count = 5; +} + +/** + * Logs when a cas session opened through MediaCas. + * This is atom ID 280. + * + * Logged from: + * frameworks/base/media/java/android/media/MediaCas.java + */ +message TvCasSessionOpenStatus { + enum State { + UNKNOWN = 0; + SUCCEEDED = 1; // indicate that the session is opened successfully. + FAILED = 2; // indicate that the session isn’t opened successfully. + } + // The uid of the application that sent this custom atom. + optional int32 uid = 1 [(is_uid) = true]; + // Cas system Id + optional int32 cas_system_id = 2; + // State of the session + optional State state = 3; +} + /** * Logs when an app is frozen or unfrozen. * @@ -9940,3 +9999,42 @@ message MediaOutputOpSwitchReported { // The amount of applied devices within a remote dynamic group after a switching is done. optional int32 applied_device_count_within_remote_group = 9; } + +/** + * Logs when the Assistant is invoked. + * + * Logged from: + * frameworks/base/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java + */ +message AssistantInvocationReported { + + // The event_id (as for UiEventReported). + optional int32 event_id = 1; + + // The registered Assistant's uid and package (as for UiEventReported). + optional int32 uid = 2 [(is_uid) = true]; + optional string package_name = 3; + + // An identifier used to disambiguate which logs refer to a particular invocation of the + // Assistant (as for UiEventReported). + optional int32 instance_id = 4; + + // The state of the device at the time of invocation. + enum DeviceState { + UNKNOWN_DEVICE_STATE = 0; + AOD1 = 1; + AOD2 = 2; + BOUNCER = 3; + UNLOCKED_LOCKSCREEN = 4; + LAUNCHER_HOME = 5; + LAUNCHER_OVERVIEW = 6; + LAUNCHER_ALL_APPS = 7; + APP_DEFAULT = 8; + APP_IMMERSIVE = 9; + APP_FULLSCREEN = 10; + } + optional DeviceState device_state = 5; + + // Whether the Assistant handles were showing at the time of invocation. + optional bool assistant_handles_showing = 6; +} diff --git a/cmds/statsd/src/metrics/MetricProducer.cpp b/cmds/statsd/src/metrics/MetricProducer.cpp index cdd20cdd70f9..fe143e496373 100644 --- a/cmds/statsd/src/metrics/MetricProducer.cpp +++ b/cmds/statsd/src/metrics/MetricProducer.cpp @@ -98,7 +98,7 @@ void MetricProducer::onMatchedLogEventLocked(const size_t matcherIndex, const Lo // Stores atom id to primary key pairs for each state atom that the metric is // sliced by. - std::map<int, HashableDimensionKey> statePrimaryKeys; + std::map<int32_t, HashableDimensionKey> statePrimaryKeys; // For states with primary fields, use MetricStateLinks to get the primary // field values from the log event. These values will form a primary key diff --git a/cmds/statsd/src/metrics/ValueMetricProducer.cpp b/cmds/statsd/src/metrics/ValueMetricProducer.cpp index c0d117402314..8203f38de393 100644 --- a/cmds/statsd/src/metrics/ValueMetricProducer.cpp +++ b/cmds/statsd/src/metrics/ValueMetricProducer.cpp @@ -189,11 +189,6 @@ void ValueMetricProducer::onStateChanged(int64_t eventTimeNs, int32_t atomId, VLOG("ValueMetric %lld onStateChanged time %lld, State %d, key %s, %d -> %d", (long long)mMetricId, (long long)eventTimeNs, atomId, primaryKey.toString().c_str(), oldState.mValue.int_value, newState.mValue.int_value); - // If condition is not true or metric is not active, we do not need to pull - // for this state change. - if (mCondition != ConditionState::kTrue || !mIsActive) { - return; - } // If old and new states are in the same StateGroup, then we do not need to // pull for this state change. @@ -205,6 +200,12 @@ void ValueMetricProducer::onStateChanged(int64_t eventTimeNs, int32_t atomId, return; } + // If condition is not true or metric is not active, we do not need to pull + // for this state change. + if (mCondition != ConditionState::kTrue || !mIsActive) { + return; + } + bool isEventLate = eventTimeNs < mCurrentBucketStartTimeNs; if (isEventLate) { VLOG("Skip event due to late arrival: %lld vs %lld", (long long)eventTimeNs, @@ -412,7 +413,6 @@ void ValueMetricProducer::resetBase() { for (auto& slice : mCurrentBaseInfo) { for (auto& baseInfo : slice.second) { baseInfo.hasBase = false; - baseInfo.hasCurrentState = false; } } mHasGlobalBase = false; @@ -625,7 +625,6 @@ void ValueMetricProducer::accumulateEvents(const std::vector<std::shared_ptr<Log auto it = mCurrentBaseInfo.find(whatKey); for (auto& baseInfo : it->second) { baseInfo.hasBase = false; - baseInfo.hasCurrentState = false; } } } @@ -820,6 +819,8 @@ void ValueMetricProducer::onMatchedLogEventInternalLocked( Interval& interval = intervals[i]; interval.valueIndex = i; Value value; + baseInfo.hasCurrentState = true; + baseInfo.currentState = stateKey; if (!getDoubleOrLong(event, matcher, value)) { VLOG("Failed to get value %d from event %s", i, event.ToString().c_str()); StatsdStats::getInstance().noteBadValueType(mMetricId); @@ -907,7 +908,6 @@ void ValueMetricProducer::onMatchedLogEventInternalLocked( interval.hasValue = true; } interval.sampleSize += 1; - baseInfo.currentState = stateKey; } // Only trigger the tracker if all intervals are correct diff --git a/cmds/statsd/src/metrics/ValueMetricProducer.h b/cmds/statsd/src/metrics/ValueMetricProducer.h index 3de5b99a2b09..b359af745c91 100644 --- a/cmds/statsd/src/metrics/ValueMetricProducer.h +++ b/cmds/statsd/src/metrics/ValueMetricProducer.h @@ -75,7 +75,7 @@ public: if (!mSplitBucketForAppUpgrade) { return; } - if (mIsPulled && mCondition) { + if (mIsPulled && mCondition == ConditionState::kTrue) { pullAndMatchEventsLocked(eventTimeNs); } flushCurrentBucketLocked(eventTimeNs, eventTimeNs); @@ -84,7 +84,7 @@ public: // ValueMetric needs special logic if it's a pulled atom. void onStatsdInitCompleted(const int64_t& eventTimeNs) override { std::lock_guard<std::mutex> lock(mMutex); - if (mIsPulled && mCondition) { + if (mIsPulled && mCondition == ConditionState::kTrue) { pullAndMatchEventsLocked(eventTimeNs); } flushCurrentBucketLocked(eventTimeNs, eventTimeNs); @@ -313,6 +313,7 @@ private: FRIEND_TEST(ValueMetricProducerTest, TestSlicedState); FRIEND_TEST(ValueMetricProducerTest, TestSlicedStateWithMap); FRIEND_TEST(ValueMetricProducerTest, TestSlicedStateWithPrimaryField_WithDimensions); + FRIEND_TEST(ValueMetricProducerTest, TestSlicedStateWithCondition); FRIEND_TEST(ValueMetricProducerTest, TestTrimUnusedDimensionKey); FRIEND_TEST(ValueMetricProducerTest, TestUseZeroDefaultBase); FRIEND_TEST(ValueMetricProducerTest, TestUseZeroDefaultBaseWithPullFailures); diff --git a/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp b/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp index 1bcc35d99d18..f0419964e892 100644 --- a/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp +++ b/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp @@ -167,6 +167,32 @@ public: return valueProducer; } + static sp<ValueMetricProducer> createValueProducerWithConditionAndState( + sp<MockStatsPullerManager>& pullerManager, ValueMetric& metric, + vector<int32_t> slicedStateAtoms, + unordered_map<int, unordered_map<int, int64_t>> stateGroupMap, + ConditionState conditionAfterFirstBucketPrepared) { + UidMap uidMap; + SimpleAtomMatcher atomMatcher; + atomMatcher.set_atom_id(tagId); + sp<EventMatcherWizard> eventMatcherWizard = + new EventMatcherWizard({new SimpleLogMatchingTracker( + atomMatcherId, logEventMatcherIndex, atomMatcher, uidMap)}); + sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>(); + EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, kConfigKey, _, _, _)) + .WillOnce(Return()); + EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, kConfigKey, _)) + .WillRepeatedly(Return()); + + sp<ValueMetricProducer> valueProducer = new ValueMetricProducer( + kConfigKey, metric, 0 /* condition tracker index */, {ConditionState::kUnknown}, + wizard, logEventMatcherIndex, eventMatcherWizard, tagId, bucketStartTimeNs, + bucketStartTimeNs, pullerManager, {}, {}, slicedStateAtoms, stateGroupMap); + valueProducer->prepareFirstBucket(); + valueProducer->mCondition = conditionAfterFirstBucketPrepared; + return valueProducer; + } + static ValueMetric createMetric() { ValueMetric metric; metric.set_id(metricId); @@ -188,6 +214,13 @@ public: metric.add_slice_by_state(StringToId(state)); return metric; } + + static ValueMetric createMetricWithConditionAndState(string state) { + ValueMetric metric = ValueMetricProducerTestHelper::createMetric(); + metric.set_condition(StringToId("SCREEN_ON")); + metric.add_slice_by_state(StringToId(state)); + return metric; + } }; // Setup for parameterized tests. @@ -3893,13 +3926,13 @@ TEST(ValueMetricProducerTest, TestSlicedState) { return true; })); + StateManager::getInstance().clear(); sp<ValueMetricProducer> valueProducer = ValueMetricProducerTestHelper::createValueProducerWithState( pullerManager, metric, {util::SCREEN_STATE_CHANGED}, {}); EXPECT_EQ(1, valueProducer->mSlicedStateAtoms.size()); // Set up StateManager and check that StateTrackers are initialized. - StateManager::getInstance().clear(); StateManager::getInstance().registerListener(SCREEN_STATE_ATOM_ID, valueProducer); EXPECT_EQ(1, StateManager::getInstance().getStateTrackersCount()); EXPECT_EQ(1, StateManager::getInstance().getListenersCount(SCREEN_STATE_ATOM_ID)); @@ -4105,12 +4138,12 @@ TEST(ValueMetricProducerTest, TestSlicedStateWithMap) { } } + StateManager::getInstance().clear(); sp<ValueMetricProducer> valueProducer = ValueMetricProducerTestHelper::createValueProducerWithState( pullerManager, metric, {util::SCREEN_STATE_CHANGED}, stateGroupMap); // Set up StateManager and check that StateTrackers are initialized. - StateManager::getInstance().clear(); StateManager::getInstance().registerListener(SCREEN_STATE_ATOM_ID, valueProducer); EXPECT_EQ(1, StateManager::getInstance().getStateTrackersCount()); EXPECT_EQ(1, StateManager::getInstance().getListenersCount(SCREEN_STATE_ATOM_ID)); @@ -4357,12 +4390,12 @@ TEST(ValueMetricProducerTest, TestSlicedStateWithPrimaryField_WithDimensions) { return true; })); + StateManager::getInstance().clear(); sp<ValueMetricProducer> valueProducer = ValueMetricProducerTestHelper::createValueProducerWithState( pullerManager, metric, {UID_PROCESS_STATE_ATOM_ID}, {}); // Set up StateManager and check that StateTrackers are initialized. - StateManager::getInstance().clear(); StateManager::getInstance().registerListener(UID_PROCESS_STATE_ATOM_ID, valueProducer); EXPECT_EQ(1, StateManager::getInstance().getStateTrackersCount()); EXPECT_EQ(1, StateManager::getInstance().getListenersCount(UID_PROCESS_STATE_ATOM_ID)); @@ -4722,6 +4755,212 @@ TEST(ValueMetricProducerTest, TestSlicedStateWithPrimaryField_WithDimensions) { EXPECT_EQ(5, report.value_metrics().data(4).bucket_info(1).values(0).value_long()); } +TEST(ValueMetricProducerTest, TestSlicedStateWithCondition) { + // Set up ValueMetricProducer. + ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithConditionAndState( + "BATTERY_SAVER_MODE_STATE"); + sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _, _)) + // Condition changed to true. + .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, + vector<std::shared_ptr<LogEvent>>* data, bool) { + EXPECT_EQ(eventTimeNs, bucketStartTimeNs + 20 * NS_PER_SEC); + data->clear(); + data->push_back( + CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 20 * NS_PER_SEC, 3)); + return true; + })) + // Battery saver mode state changed to OFF. + .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, + vector<std::shared_ptr<LogEvent>>* data, bool) { + EXPECT_EQ(eventTimeNs, bucketStartTimeNs + 30 * NS_PER_SEC); + data->clear(); + data->push_back( + CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 30 * NS_PER_SEC, 5)); + return true; + })) + // Condition changed to false. + .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, + vector<std::shared_ptr<LogEvent>>* data, bool) { + EXPECT_EQ(eventTimeNs, bucket2StartTimeNs + 10 * NS_PER_SEC); + data->clear(); + data->push_back(CreateRepeatedValueLogEvent( + tagId, bucket2StartTimeNs + 10 * NS_PER_SEC, 15)); + return true; + })); + + StateManager::getInstance().clear(); + sp<ValueMetricProducer> valueProducer = + ValueMetricProducerTestHelper::createValueProducerWithConditionAndState( + pullerManager, metric, {util::BATTERY_SAVER_MODE_STATE_CHANGED}, {}, + ConditionState::kFalse); + EXPECT_EQ(1, valueProducer->mSlicedStateAtoms.size()); + + // Set up StateManager and check that StateTrackers are initialized. + StateManager::getInstance().registerListener(util::BATTERY_SAVER_MODE_STATE_CHANGED, + valueProducer); + EXPECT_EQ(1, StateManager::getInstance().getStateTrackersCount()); + EXPECT_EQ(1, StateManager::getInstance().getListenersCount( + util::BATTERY_SAVER_MODE_STATE_CHANGED)); + + // Bucket status after battery saver mode ON event. + // Condition is false so we do nothing. + unique_ptr<LogEvent> batterySaverOnEvent = + CreateBatterySaverOnEvent(/*timestamp=*/bucketStartTimeNs + 10 * NS_PER_SEC); + StateManager::getInstance().onLogEvent(*batterySaverOnEvent); + EXPECT_EQ(0UL, valueProducer->mCurrentSlicedBucket.size()); + EXPECT_EQ(0UL, valueProducer->mCurrentBaseInfo.size()); + + // Bucket status after condition change to true. + valueProducer->onConditionChanged(true, bucketStartTimeNs + 20 * NS_PER_SEC); + // Base for dimension key {} + ASSERT_EQ(1UL, valueProducer->mCurrentBaseInfo.size()); + std::unordered_map<HashableDimensionKey, std::vector<ValueMetricProducer::BaseInfo>>::iterator + itBase = valueProducer->mCurrentBaseInfo.find(DEFAULT_DIMENSION_KEY); + EXPECT_TRUE(itBase->second[0].hasBase); + EXPECT_EQ(3, itBase->second[0].base.long_value); + EXPECT_TRUE(itBase->second[0].hasCurrentState); + ASSERT_EQ(1, itBase->second[0].currentState.getValues().size()); + EXPECT_EQ(BatterySaverModeStateChanged::ON, + itBase->second[0].currentState.getValues()[0].mValue.int_value); + // Value for key {{}, -1} + ASSERT_EQ(1UL, valueProducer->mCurrentSlicedBucket.size()); + std::unordered_map<MetricDimensionKey, std::vector<ValueMetricProducer::Interval>>::iterator + it = valueProducer->mCurrentSlicedBucket.begin(); + EXPECT_EQ(0, it->first.getDimensionKeyInWhat().getValues().size()); + ASSERT_EQ(1, it->first.getStateValuesKey().getValues().size()); + EXPECT_EQ(-1 /*StateTracker::kUnknown*/, + it->first.getStateValuesKey().getValues()[0].mValue.int_value); + EXPECT_FALSE(it->second[0].hasValue); + + // Bucket status after battery saver mode OFF event. + unique_ptr<LogEvent> batterySaverOffEvent = + CreateBatterySaverOffEvent(/*timestamp=*/bucketStartTimeNs + 30 * NS_PER_SEC); + StateManager::getInstance().onLogEvent(*batterySaverOffEvent); + // Base for dimension key {} + ASSERT_EQ(1UL, valueProducer->mCurrentBaseInfo.size()); + itBase = valueProducer->mCurrentBaseInfo.find(DEFAULT_DIMENSION_KEY); + EXPECT_TRUE(itBase->second[0].hasBase); + EXPECT_EQ(5, itBase->second[0].base.long_value); + EXPECT_TRUE(itBase->second[0].hasCurrentState); + ASSERT_EQ(1, itBase->second[0].currentState.getValues().size()); + EXPECT_EQ(BatterySaverModeStateChanged::OFF, + itBase->second[0].currentState.getValues()[0].mValue.int_value); + // Value for key {{}, ON} + ASSERT_EQ(2UL, valueProducer->mCurrentSlicedBucket.size()); + it = valueProducer->mCurrentSlicedBucket.begin(); + EXPECT_EQ(0, it->first.getDimensionKeyInWhat().getValues().size()); + ASSERT_EQ(1, it->first.getStateValuesKey().getValues().size()); + EXPECT_EQ(BatterySaverModeStateChanged::ON, + it->first.getStateValuesKey().getValues()[0].mValue.int_value); + EXPECT_TRUE(it->second[0].hasValue); + EXPECT_EQ(2, it->second[0].value.long_value); + + // Pull at end of first bucket. + vector<shared_ptr<LogEvent>> allData; + allData.clear(); + allData.push_back(CreateRepeatedValueLogEvent(tagId, bucket2StartTimeNs, 11)); + valueProducer->onDataPulled(allData, /** succeed */ true, bucket2StartTimeNs); + + EXPECT_EQ(2UL, valueProducer->mPastBuckets.size()); + EXPECT_EQ(3UL, valueProducer->mCurrentSlicedBucket.size()); + // Base for dimension key {} + ASSERT_EQ(1UL, valueProducer->mCurrentBaseInfo.size()); + itBase = valueProducer->mCurrentBaseInfo.find(DEFAULT_DIMENSION_KEY); + EXPECT_TRUE(itBase->second[0].hasBase); + EXPECT_EQ(11, itBase->second[0].base.long_value); + EXPECT_TRUE(itBase->second[0].hasCurrentState); + ASSERT_EQ(1, itBase->second[0].currentState.getValues().size()); + EXPECT_EQ(BatterySaverModeStateChanged::OFF, + itBase->second[0].currentState.getValues()[0].mValue.int_value); + + // Bucket 2 status after condition change to false. + valueProducer->onConditionChanged(false, bucket2StartTimeNs + 10 * NS_PER_SEC); + // Base for dimension key {} + ASSERT_EQ(1UL, valueProducer->mCurrentBaseInfo.size()); + itBase = valueProducer->mCurrentBaseInfo.find(DEFAULT_DIMENSION_KEY); + EXPECT_FALSE(itBase->second[0].hasBase); + EXPECT_TRUE(itBase->second[0].hasCurrentState); + ASSERT_EQ(1, itBase->second[0].currentState.getValues().size()); + EXPECT_EQ(BatterySaverModeStateChanged::OFF, + itBase->second[0].currentState.getValues()[0].mValue.int_value); + // Value for key {{}, OFF} + ASSERT_EQ(3UL, valueProducer->mCurrentSlicedBucket.size()); + it = valueProducer->mCurrentSlicedBucket.begin(); + EXPECT_EQ(0, it->first.getDimensionKeyInWhat().getValues().size()); + ASSERT_EQ(1, it->first.getStateValuesKey().getValues().size()); + EXPECT_EQ(BatterySaverModeStateChanged::OFF, + it->first.getStateValuesKey().getValues()[0].mValue.int_value); + EXPECT_TRUE(it->second[0].hasValue); + EXPECT_EQ(4, it->second[0].value.long_value); + + // Start dump report and check output. + ProtoOutputStream output; + std::set<string> strSet; + valueProducer->onDumpReport(bucket2StartTimeNs + 50 * NS_PER_SEC, + true /* include recent buckets */, true, NO_TIME_CONSTRAINTS, + &strSet, &output); + + StatsLogReport report = outputStreamToProto(&output); + EXPECT_TRUE(report.has_value_metrics()); + ASSERT_EQ(2, report.value_metrics().data_size()); + + ValueMetricData data = report.value_metrics().data(0); + EXPECT_EQ(util::BATTERY_SAVER_MODE_STATE_CHANGED, data.slice_by_state(0).atom_id()); + EXPECT_TRUE(data.slice_by_state(0).has_value()); + EXPECT_EQ(BatterySaverModeStateChanged::ON, data.slice_by_state(0).value()); + ASSERT_EQ(1, data.bucket_info_size()); + EXPECT_EQ(2, data.bucket_info(0).values(0).value_long()); + + data = report.value_metrics().data(1); + EXPECT_EQ(util::BATTERY_SAVER_MODE_STATE_CHANGED, data.slice_by_state(0).atom_id()); + EXPECT_TRUE(data.slice_by_state(0).has_value()); + EXPECT_EQ(BatterySaverModeStateChanged::OFF, data.slice_by_state(0).value()); + ASSERT_EQ(2, data.bucket_info_size()); + EXPECT_EQ(6, data.bucket_info(0).values(0).value_long()); + EXPECT_EQ(4, data.bucket_info(1).values(0).value_long()); +} + +/* + * Test bucket splits when condition is unknown. + */ +TEST(ValueMetricProducerTest, TestForcedBucketSplitWhenConditionUnknownSkipsBucket) { + ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); + + sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); + + sp<ValueMetricProducer> valueProducer = + ValueMetricProducerTestHelper::createValueProducerWithCondition( + pullerManager, metric, + ConditionState::kUnknown); + + // App update event. + int64_t appUpdateTimeNs = bucketStartTimeNs + 1000; + valueProducer->notifyAppUpgrade(appUpdateTimeNs); + + // Check dump report. + ProtoOutputStream output; + std::set<string> strSet; + int64_t dumpReportTimeNs = bucketStartTimeNs + 10000000000; // 10 seconds + valueProducer->onDumpReport(dumpReportTimeNs, false /* include current buckets */, true, + NO_TIME_CONSTRAINTS /* dumpLatency */, &strSet, &output); + + StatsLogReport report = outputStreamToProto(&output); + EXPECT_TRUE(report.has_value_metrics()); + ASSERT_EQ(0, report.value_metrics().data_size()); + ASSERT_EQ(1, report.value_metrics().skipped_size()); + + EXPECT_EQ(NanoToMillis(bucketStartTimeNs), + report.value_metrics().skipped(0).start_bucket_elapsed_millis()); + EXPECT_EQ(NanoToMillis(appUpdateTimeNs), + report.value_metrics().skipped(0).end_bucket_elapsed_millis()); + ASSERT_EQ(1, report.value_metrics().skipped(0).drop_event_size()); + + auto dropEvent = report.value_metrics().skipped(0).drop_event(0); + EXPECT_EQ(BucketDropReason::NO_DATA, dropEvent.drop_reason()); + EXPECT_EQ(NanoToMillis(appUpdateTimeNs), dropEvent.drop_time_millis()); +} + } // namespace statsd } // namespace os } // namespace android diff --git a/cmds/statsd/tests/statsd_test_util.cpp b/cmds/statsd/tests/statsd_test_util.cpp index 06e29d4b5de1..cee83725d075 100644 --- a/cmds/statsd/tests/statsd_test_util.cpp +++ b/cmds/statsd/tests/statsd_test_util.cpp @@ -663,6 +663,8 @@ std::unique_ptr<LogEvent> CreateBatterySaverOnEvent(uint64_t timestampNs) { AStatsEvent_setAtomId(statsEvent, util::BATTERY_SAVER_MODE_STATE_CHANGED); AStatsEvent_overwriteTimestamp(statsEvent, timestampNs); AStatsEvent_writeInt32(statsEvent, BatterySaverModeStateChanged::ON); + AStatsEvent_addBoolAnnotation(statsEvent, util::ANNOTATION_ID_EXCLUSIVE_STATE, true); + AStatsEvent_addBoolAnnotation(statsEvent, util::ANNOTATION_ID_STATE_NESTED, false); std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0); parseStatsEventToLogEvent(statsEvent, logEvent.get()); @@ -674,6 +676,8 @@ std::unique_ptr<LogEvent> CreateBatterySaverOffEvent(uint64_t timestampNs) { AStatsEvent_setAtomId(statsEvent, util::BATTERY_SAVER_MODE_STATE_CHANGED); AStatsEvent_overwriteTimestamp(statsEvent, timestampNs); AStatsEvent_writeInt32(statsEvent, BatterySaverModeStateChanged::OFF); + AStatsEvent_addBoolAnnotation(statsEvent, util::ANNOTATION_ID_EXCLUSIVE_STATE, true); + AStatsEvent_addBoolAnnotation(statsEvent, util::ANNOTATION_ID_STATE_NESTED, false); std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0); parseStatsEventToLogEvent(statsEvent, logEvent.get()); diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index 6c10682adc0e..22a63d9b486b 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -5151,6 +5151,10 @@ public class Activity extends ContextThemeWrapper * the signature of the app declaring the permissions. * </p> * <p> + * Call {@link #shouldShowRequestPermissionRationale(String)} before calling this API to + * check if the system recommends to show a rationale UI before asking for a permission. + * </p> + * <p> * If your app does not have the requested permissions the user will be presented * with UI for accepting them. After the user has accepted or rejected the * requested permissions you will receive a callback on {@link @@ -5240,20 +5244,10 @@ public class Activity extends ContextThemeWrapper } /** - * Gets whether you should show UI with rationale for requesting a permission. - * You should do this only if you do not have the permission and the context in - * which the permission is requested does not clearly communicate to the user - * what would be the benefit from granting this permission. - * <p> - * For example, if you write a camera app, requesting the camera permission - * would be expected by the user and no rationale for why it is requested is - * needed. If however, the app needs location for tagging photos then a non-tech - * savvy user may wonder how location is related to taking photos. In this case - * you may choose to show UI with rationale of requesting this permission. - * </p> + * Gets whether you should show UI with rationale before requesting a permission. * * @param permission A permission your app wants to request. - * @return Whether you can show permission rationale UI. + * @return Whether you should show permission rationale UI. * * @see #checkSelfPermission(String) * @see #requestPermissions(String[], int) diff --git a/core/java/android/app/ActivityView.java b/core/java/android/app/ActivityView.java index 635ed138cc65..d650bbcdfa33 100644 --- a/core/java/android/app/ActivityView.java +++ b/core/java/android/app/ActivityView.java @@ -102,6 +102,14 @@ public class ActivityView extends ViewGroup implements android.window.TaskEmbedd public ActivityView( @NonNull Context context, @NonNull AttributeSet attrs, int defStyle, boolean singleTaskInstance, boolean usePublicVirtualDisplay) { + this(context, attrs, defStyle, singleTaskInstance, usePublicVirtualDisplay, false); + } + + /** @hide */ + public ActivityView( + @NonNull Context context, @NonNull AttributeSet attrs, int defStyle, + boolean singleTaskInstance, boolean usePublicVirtualDisplay, + boolean disableSurfaceViewBackgroundLayer) { super(context, attrs, defStyle); if (useTaskOrganizer()) { mTaskEmbedder = new TaskOrganizerTaskEmbedder(context, this); @@ -109,7 +117,7 @@ public class ActivityView extends ViewGroup implements android.window.TaskEmbedd mTaskEmbedder = new VirtualDisplayTaskEmbedder(context, this, singleTaskInstance, usePublicVirtualDisplay); } - mSurfaceView = new SurfaceView(context); + mSurfaceView = new SurfaceView(context, null, 0, 0, disableSurfaceViewBackgroundLayer); // Since ActivityView#getAlpha has been overridden, we should use parent class's alpha // as master to synchronize surface view's alpha value. mSurfaceView.setAlpha(super.getAlpha()); diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java index b058dcd714dd..ddc57474a027 100644 --- a/core/java/android/app/AppOpsManager.java +++ b/core/java/android/app/AppOpsManager.java @@ -182,6 +182,8 @@ public class AppOpsManager { @EnabledAfter(targetSdkVersion = Build.VERSION_CODES.Q) public static final long CALL_BACK_ON_CHANGED_LISTENER_WITH_SWITCHED_OP_CHANGE = 148180766L; + private static final int MAX_UNFORWARDED_OPS = 10; + final Context mContext; @UnsupportedAppUsage @@ -217,6 +219,17 @@ public class AppOpsManager { private static @Nullable OnOpNotedCallback sOnOpNotedCallback; /** + * Sync note-ops collected from {@link #readAndLogNotedAppops(Parcel)} that have not been + * delivered to a callback yet. + * + * Similar to {@link com.android.server.appop.AppOpsService#mUnforwardedAsyncNotedOps} for + * {@link COLLECT_ASYNC}. Used in situation when AppOpsManager asks to collect stacktrace with + * {@link #sMessageCollector}, which forces {@link COLLECT_SYNC} mode. + */ + @GuardedBy("sLock") + private static ArrayList<SyncNotedAppOp> sUnforwardedOps = new ArrayList<>(); + + /** * Additional collector that collect accesses and forwards a few of them them via * {@link IAppOpsService#reportRuntimeAppOpAccessMessageAndGetConfig}. */ @@ -8163,6 +8176,11 @@ public class AppOpsManager { code = notedAppOps.nextSetBit(code + 1)) { if (sOnOpNotedCallback != null) { sOnOpNotedCallback.onNoted(new SyncNotedAppOp(code, attributionTag)); + } else { + sUnforwardedOps.add(new SyncNotedAppOp(code, attributionTag)); + if (sUnforwardedOps.size() > MAX_UNFORWARDED_OPS) { + sUnforwardedOps.remove(0); + } } } } @@ -8229,6 +8247,17 @@ public class AppOpsManager { } } } + synchronized (this) { + int numMissedSyncOps = sUnforwardedOps.size(); + for (int i = 0; i < numMissedSyncOps; i++) { + final SyncNotedAppOp syncNotedAppOp = sUnforwardedOps.get(i); + if (sOnOpNotedCallback != null) { + sOnOpNotedCallback.getAsyncNotedExecutor().execute( + () -> sOnOpNotedCallback.onNoted(syncNotedAppOp)); + } + } + sUnforwardedOps.clear(); + } } } } @@ -8577,6 +8606,25 @@ public class AppOpsManager { } /** + * Reboots the ops history. + * + * @param offlineDurationMillis The duration to wait between + * tearing down and initializing the history. Must be greater + * than or equal to zero. + * + * @hide + */ + @TestApi + @RequiresPermission(Manifest.permission.MANAGE_APPOPS) + public void rebootHistory(long offlineDurationMillis) { + try { + mService.rebootHistory(offlineDurationMillis); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** * Pulls current AppOps access report and picks package and op to watch for next access report * Returns null if no reports were collected since last call. There is no guarantee of report * collection, hence this method should be called periodically even if no report was collected diff --git a/core/java/android/app/Fragment.java b/core/java/android/app/Fragment.java index c6a0de458df0..e4e5ba37ddbf 100644 --- a/core/java/android/app/Fragment.java +++ b/core/java/android/app/Fragment.java @@ -1179,6 +1179,10 @@ public class Fragment implements ComponentCallbacks2, OnCreateContextMenuListene * the signature of the app declaring the permissions. * </p> * <p> + * Call {@link #shouldShowRequestPermissionRationale(String)} before calling this API + * to check if the system recommends to show a rationale UI before asking for a permission. + * </p> + * <p> * If your app does not have the requested permissions the user will be presented * with UI for accepting them. After the user has accepted or rejected the * requested permissions you will receive a callback on {@link @@ -1213,29 +1217,6 @@ public class Fragment implements ComponentCallbacks2, OnCreateContextMenuListene * <code>true</code> because in this case the activity would not receive * result callbacks including {@link #onRequestPermissionsResult(int, String[], int[])}. * </p> - * <p> - * A sample permissions request looks like this: - * </p> - * <code><pre><p> - * private void showContacts() { - * if (getActivity().checkSelfPermission(Manifest.permission.READ_CONTACTS) - * != PackageManager.PERMISSION_GRANTED) { - * requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, - * PERMISSIONS_REQUEST_READ_CONTACTS); - * } else { - * doShowContacts(); - * } - * } - * - * {@literal @}Override - * public void onRequestPermissionsResult(int requestCode, String[] permissions, - * int[] grantResults) { - * if (requestCode == PERMISSIONS_REQUEST_READ_CONTACTS - * && grantResults[0] == PackageManager.PERMISSION_GRANTED) { - * doShowContacts(); - * } - * } - * </code></pre></p> * * @param permissions The requested permissions. Must me non-null and not empty. * @param requestCode Application specific request code to match with a result @@ -1275,20 +1256,10 @@ public class Fragment implements ComponentCallbacks2, OnCreateContextMenuListene } /** - * Gets whether you should show UI with rationale for requesting a permission. - * You should do this only if you do not have the permission and the context in - * which the permission is requested does not clearly communicate to the user - * what would be the benefit from granting this permission. - * <p> - * For example, if you write a camera app, requesting the camera permission - * would be expected by the user and no rationale for why it is requested is - * needed. If however, the app needs location for tagging photos then a non-tech - * savvy user may wonder how location is related to taking photos. In this case - * you may choose to show UI with rationale of requesting this permission. - * </p> + * Gets whether you should show UI with rationale before requesting a permission. * * @param permission A permission your app wants to request. - * @return Whether you can show permission rationale UI. + * @return Whether you should show permission rationale UI. * * @see Context#checkSelfPermission(String) * @see #requestPermissions(String[], int) diff --git a/core/java/android/app/ITaskStackListener.aidl b/core/java/android/app/ITaskStackListener.aidl index b68639eb9ac6..aec9f3e98960 100644 --- a/core/java/android/app/ITaskStackListener.aidl +++ b/core/java/android/app/ITaskStackListener.aidl @@ -224,6 +224,8 @@ oneway interface ITaskStackListener { * * forced rotation * * rotation settings set through adb command line * * rotation that occurs when rotation tile is toggled in quick settings + * + * @param displayId id of the display where activity will rotate */ - void onActivityRotation(); + void onActivityRotation(int displayId); } diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 980fdb87f3fb..f881616fd35a 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -7625,7 +7625,6 @@ public class Notification implements Parcelable } boolean isConversationLayout = mConversationType != CONVERSATION_TYPE_LEGACY; boolean isImportantConversation = mConversationType == CONVERSATION_TYPE_IMPORTANT; - Icon conversationIcon = mShortcutIcon; Icon largeIcon = mBuilder.mN.mLargeIcon; TemplateBindResult bindResult = new TemplateBindResult(); StandardTemplateParams p = mBuilder.mParams.reset() @@ -7671,7 +7670,7 @@ public class Notification implements Parcelable "setConversationTitle", conversationTitle); if (isConversationLayout) { contentView.setIcon(R.id.status_bar_latest_event_content, - "setConversationIcon", conversationIcon); + "setShortcutIcon", mShortcutIcon); contentView.setBoolean(R.id.status_bar_latest_event_content, "setIsImportantConversation", isImportantConversation); } diff --git a/core/java/android/app/ResourcesManager.java b/core/java/android/app/ResourcesManager.java index 1aae04db32d0..4cba6ea74955 100644 --- a/core/java/android/app/ResourcesManager.java +++ b/core/java/android/app/ResourcesManager.java @@ -52,10 +52,13 @@ import com.android.internal.util.IndentingPrintWriter; import java.io.IOException; import java.io.PrintWriter; +import java.lang.ref.Reference; +import java.lang.ref.ReferenceQueue; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.HashSet; import java.util.List; import java.util.Objects; import java.util.WeakHashMap; @@ -70,12 +73,6 @@ public class ResourcesManager { private static ResourcesManager sResourcesManager; /** - * Predicate that returns true if a WeakReference is gc'ed. - */ - private static final Predicate<WeakReference<Resources>> sEmptyReferencePredicate = - weakRef -> weakRef == null || weakRef.get() == null; - - /** * The global compatibility settings. */ private CompatibilityInfo mResCompatibilityInfo; @@ -100,6 +97,7 @@ public class ResourcesManager { */ @UnsupportedAppUsage private final ArrayList<WeakReference<Resources>> mResourceReferences = new ArrayList<>(); + private final ReferenceQueue<Resources> mResourcesReferencesQueue = new ReferenceQueue<>(); private static class ApkKey { public final String path; @@ -155,6 +153,7 @@ public class ResourcesManager { } public final Configuration overrideConfig = new Configuration(); public final ArrayList<WeakReference<Resources>> activityResources = new ArrayList<>(); + final ReferenceQueue<Resources> activityResourcesQueue = new ReferenceQueue<>(); } /** @@ -667,12 +666,15 @@ public class ResourcesManager { @NonNull CompatibilityInfo compatInfo) { final ActivityResources activityResources = getOrCreateActivityResourcesStructLocked( activityToken); + cleanupReferences(activityResources.activityResources, + activityResources.activityResourcesQueue); Resources resources = compatInfo.needsCompatResources() ? new CompatResources(classLoader) : new Resources(classLoader); resources.setImpl(impl); resources.setCallbacks(mUpdateCallbacks); - activityResources.activityResources.add(new WeakReference<>(resources)); + activityResources.activityResources.add( + new WeakReference<>(resources, activityResources.activityResourcesQueue)); if (DEBUG) { Slog.d(TAG, "- creating new ref=" + resources); Slog.d(TAG, "- setting ref=" + resources + " with impl=" + impl); @@ -682,11 +684,13 @@ public class ResourcesManager { private @NonNull Resources createResourcesLocked(@NonNull ClassLoader classLoader, @NonNull ResourcesImpl impl, @NonNull CompatibilityInfo compatInfo) { + cleanupReferences(mResourceReferences, mResourcesReferencesQueue); + Resources resources = compatInfo.needsCompatResources() ? new CompatResources(classLoader) : new Resources(classLoader); resources.setImpl(impl); resources.setCallbacks(mUpdateCallbacks); - mResourceReferences.add(new WeakReference<>(resources)); + mResourceReferences.add(new WeakReference<>(resources, mResourcesReferencesQueue)); if (DEBUG) { Slog.d(TAG, "- creating new ref=" + resources); Slog.d(TAG, "- setting ref=" + resources + " with impl=" + impl); @@ -752,7 +756,6 @@ public class ResourcesManager { updateResourcesForActivity(token, overrideConfig, displayId, false /* movedToDifferentDisplay */); - cleanupReferences(token); rebaseKeyForActivity(token, key); synchronized (this) { @@ -778,10 +781,6 @@ public class ResourcesManager { final ActivityResources activityResources = getOrCreateActivityResourcesStructLocked(activityToken); - // Clean up any dead references so they don't pile up. - ArrayUtils.unstableRemoveIf(activityResources.activityResources, - sEmptyReferencePredicate); - // Rebase the key's override config on top of the Activity's base override. if (key.hasOverrideConfiguration() && !activityResources.overrideConfig.equals(Configuration.EMPTY)) { @@ -794,21 +793,21 @@ public class ResourcesManager { /** * Check WeakReferences and remove any dead references so they don't pile up. - * @param activityToken optional token to clean up Activity resources */ - private void cleanupReferences(IBinder activityToken) { - synchronized (this) { - if (activityToken != null) { - ActivityResources activityResources = mActivityResourceReferences.get( - activityToken); - if (activityResources != null) { - ArrayUtils.unstableRemoveIf(activityResources.activityResources, - sEmptyReferencePredicate); - } - } else { - ArrayUtils.unstableRemoveIf(mResourceReferences, sEmptyReferencePredicate); - } + private static <T> void cleanupReferences(ArrayList<WeakReference<T>> references, + ReferenceQueue<T> referenceQueue) { + Reference<? extends T> enduedRef = referenceQueue.poll(); + if (enduedRef == null) { + return; } + + final HashSet<Reference<? extends T>> deadReferences = new HashSet<>(); + for (; enduedRef != null; enduedRef = referenceQueue.poll()) { + deadReferences.add(enduedRef); + } + + ArrayUtils.unstableRemoveIf(references, + (ref) -> ref == null || deadReferences.contains(ref)); } /** @@ -896,8 +895,6 @@ public class ResourcesManager { loaders == null ? null : loaders.toArray(new ResourcesLoader[0])); classLoader = classLoader != null ? classLoader : ClassLoader.getSystemClassLoader(); - cleanupReferences(activityToken); - if (activityToken != null) { rebaseKeyForActivity(activityToken, key); } diff --git a/core/java/android/app/TaskStackListener.java b/core/java/android/app/TaskStackListener.java index 843d1c7414f8..f137d6858a68 100644 --- a/core/java/android/app/TaskStackListener.java +++ b/core/java/android/app/TaskStackListener.java @@ -201,6 +201,6 @@ public abstract class TaskStackListener extends ITaskStackListener.Stub { } @Override - public void onActivityRotation() { + public void onActivityRotation(int displayId) { } } diff --git a/core/java/android/content/pm/parsing/component/ParsedActivityUtils.java b/core/java/android/content/pm/parsing/component/ParsedActivityUtils.java index f64560a14832..fb8fd74545c7 100644 --- a/core/java/android/content/pm/parsing/component/ParsedActivityUtils.java +++ b/core/java/android/content/pm/parsing/component/ParsedActivityUtils.java @@ -302,7 +302,14 @@ public class ParsedActivityUtils { } String permission = array.getNonConfigurationString(permissionAttr, 0); - activity.setPermission(permission != null ? permission : pkg.getPermission()); + if (isAlias) { + // An alias will override permissions to allow referencing an Activity through its alias + // without needing the original permission. If an alias needs the same permission, + // it must be re-declared. + activity.setPermission(permission); + } else { + activity.setPermission(permission != null ? permission : pkg.getPermission()); + } final boolean setExported = array.hasValue(exportedAttr); if (setExported) { diff --git a/core/java/android/content/pm/parsing/component/ParsedComponentUtils.java b/core/java/android/content/pm/parsing/component/ParsedComponentUtils.java index b37b61757053..6811e06fbe7e 100644 --- a/core/java/android/content/pm/parsing/component/ParsedComponentUtils.java +++ b/core/java/android/content/pm/parsing/component/ParsedComponentUtils.java @@ -20,7 +20,10 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.content.pm.PackageManager; import android.content.pm.parsing.ParsingPackage; +import android.content.pm.parsing.ParsingPackageUtils; import android.content.pm.parsing.ParsingUtils; +import android.content.pm.parsing.result.ParseInput; +import android.content.pm.parsing.result.ParseResult; import android.content.res.Resources; import android.content.res.TypedArray; import android.content.res.XmlResourceParser; @@ -29,9 +32,6 @@ import android.text.TextUtils; import android.util.TypedValue; import com.android.internal.annotations.VisibleForTesting; -import android.content.pm.parsing.ParsingPackageUtils; -import android.content.pm.parsing.result.ParseInput; -import android.content.pm.parsing.result.ParseResult; /** @hide */ class ParsedComponentUtils { @@ -60,16 +60,27 @@ class ParsedComponentUtils { component.setName(className); component.setPackageName(packageName); - if (useRoundIcon) { - component.icon = array.getResourceId(roundIconAttr, 0); + int roundIconVal = useRoundIcon ? array.getResourceId(roundIconAttr, 0) : 0; + if (roundIconVal != 0) { + component.icon = roundIconVal; + component.nonLocalizedLabel = null; + } else { + int iconVal = array.getResourceId(iconAttr, 0); + if (iconVal != 0) { + component.icon = iconVal; + component.nonLocalizedLabel = null; + } } - if (component.icon == 0) { - component.icon = array.getResourceId(iconAttr, 0); + int logoVal = array.getResourceId(logoAttr, 0); + if (logoVal != 0) { + component.logo = logoVal; } - component.logo = array.getResourceId(logoAttr, 0); - component.banner = array.getResourceId(bannerAttr, 0); + int bannerVal = array.getResourceId(bannerAttr, 0); + if (bannerVal != 0) { + component.banner = bannerVal; + } if (descriptionAttr != null) { component.descriptionRes = array.getResourceId(descriptionAttr, 0); diff --git a/core/java/android/hardware/hdmi/HdmiClient.java b/core/java/android/hardware/hdmi/HdmiClient.java index bff8c39e8c56..a921215c6133 100644 --- a/core/java/android/hardware/hdmi/HdmiClient.java +++ b/core/java/android/hardware/hdmi/HdmiClient.java @@ -1,6 +1,7 @@ package android.hardware.hdmi; import android.annotation.NonNull; +import android.annotation.SuppressLint; import android.annotation.SystemApi; import android.hardware.hdmi.HdmiControlManager.VendorCommandListener; import android.os.RemoteException; @@ -84,7 +85,8 @@ public abstract class HdmiClient { * @param hasVendorId {@code true} if the command type will be <Vendor Command With ID>. * {@code false} if the command will be <Vendor Command> */ - public void sendVendorCommand(int targetAddress, byte[] params, boolean hasVendorId) { + public void sendVendorCommand(int targetAddress, + @SuppressLint("MissingNullability") byte[] params, boolean hasVendorId) { try { mService.sendVendorCommand(getDeviceType(), targetAddress, params, hasVendorId); } catch (RemoteException e) { diff --git a/core/java/android/hardware/hdmi/HdmiControlManager.java b/core/java/android/hardware/hdmi/HdmiControlManager.java index 6bc962b67576..1ce9b9c71c0e 100644 --- a/core/java/android/hardware/hdmi/HdmiControlManager.java +++ b/core/java/android/hardware/hdmi/HdmiControlManager.java @@ -18,6 +18,7 @@ package android.hardware.hdmi; import static com.android.internal.os.RoSystemProperties.PROPERTY_HDMI_IS_DEVICE_HDMI_CEC_SWITCH; +import android.annotation.CallbackExecutor; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; @@ -28,8 +29,10 @@ import android.annotation.SdkConstant.SdkConstantType; import android.annotation.SuppressLint; import android.annotation.SystemApi; import android.annotation.SystemService; +import android.annotation.TestApi; import android.content.Context; import android.content.pm.PackageManager; +import android.os.Binder; import android.os.RemoteException; import android.os.SystemProperties; import android.util.ArrayMap; @@ -40,6 +43,7 @@ import com.android.internal.annotations.GuardedBy; import java.util.ArrayList; import java.util.List; import java.util.Objects; +import java.util.concurrent.Executor; /** * The {@link HdmiControlManager} class is used to send HDMI control messages @@ -54,6 +58,7 @@ import java.util.Objects; * @hide */ @SystemApi +@TestApi @SystemService(Context.HDMI_CONTROL_SERVICE) @RequiresFeature(PackageManager.FEATURE_HDMI_CEC) public final class HdmiControlManager { @@ -136,6 +141,8 @@ public final class HdmiControlManager { public static final int POWER_STATUS_TRANSIENT_TO_ON = 2; public static final int POWER_STATUS_TRANSIENT_TO_STANDBY = 3; + /** @hide */ + @SystemApi @IntDef ({ RESULT_SUCCESS, RESULT_TIMEOUT, @@ -397,8 +404,11 @@ public final class HdmiControlManager { * See {@link HdmiDeviceInfo#DEVICE_PLAYBACK} * See {@link HdmiDeviceInfo#DEVICE_TV} * See {@link HdmiDeviceInfo#DEVICE_AUDIO_SYSTEM} + * + * @hide */ @Nullable + @SystemApi @SuppressLint("Doclava125") public HdmiClient getClient(int type) { if (mService == null) { @@ -427,8 +437,11 @@ public final class HdmiControlManager { * system if the system is configured to host more than one type of HDMI-CEC logical devices. * * @return {@link HdmiPlaybackClient} instance. {@code null} on failure. + * + * @hide */ @Nullable + @SystemApi @SuppressLint("Doclava125") public HdmiPlaybackClient getPlaybackClient() { return (HdmiPlaybackClient) getClient(HdmiDeviceInfo.DEVICE_PLAYBACK); @@ -442,8 +455,11 @@ public final class HdmiControlManager { * system if the system is configured to host more than one type of HDMI-CEC logical devices. * * @return {@link HdmiTvClient} instance. {@code null} on failure. + * + * @hide */ @Nullable + @SystemApi @SuppressLint("Doclava125") public HdmiTvClient getTvClient() { return (HdmiTvClient) getClient(HdmiDeviceInfo.DEVICE_TV); @@ -475,10 +491,8 @@ public final class HdmiControlManager { * system if the system is configured to host more than one type of HDMI-CEC logical device. * * @return {@link HdmiSwitchClient} instance. {@code null} on failure. - * @hide */ @Nullable - @SystemApi @SuppressLint("Doclava125") public HdmiSwitchClient getSwitchClient() { return (HdmiSwitchClient) getClient(HdmiDeviceInfo.DEVICE_PURE_CEC_SWITCH); @@ -787,7 +801,10 @@ public final class HdmiControlManager { /** * Listener used to get hotplug event from HDMI port. + * + * @hide */ + @SystemApi public interface HotplugEventListener { void onReceived(HdmiHotplugEvent event); } @@ -818,8 +835,29 @@ public final class HdmiControlManager { mHdmiControlStatusChangeListeners = new ArrayMap<>(); /** + * Listener used to get the status of the HDMI CEC volume control feature (enabled/disabled). + * @hide + */ + public interface HdmiCecVolumeControlFeatureListener { + /** + * Called when the HDMI Control (CEC) volume control feature is enabled/disabled. + * + * @param enabled status of HDMI CEC volume control feature + * @see {@link HdmiControlManager#setHdmiCecVolumeControlEnabled(boolean)} ()} + **/ + void onHdmiCecVolumeControlFeature(boolean enabled); + } + + private final ArrayMap<HdmiCecVolumeControlFeatureListener, + IHdmiCecVolumeControlFeatureListener> + mHdmiCecVolumeControlFeatureListeners = new ArrayMap<>(); + + /** * Listener used to get vendor-specific commands. + * + * @hide */ + @SystemApi public interface VendorCommandListener { /** * Called when a vendor command is received. @@ -858,7 +896,10 @@ public final class HdmiControlManager { * * @param listener {@link HotplugEventListener} instance * @see HdmiControlManager#removeHotplugEventListener(HotplugEventListener) + * + * @hide */ + @SystemApi @RequiresPermission(android.Manifest.permission.HDMI_CEC) public void addHotplugEventListener(HotplugEventListener listener) { if (mService == null) { @@ -882,7 +923,10 @@ public final class HdmiControlManager { * Removes a listener to stop getting informed of {@link HdmiHotplugEvent}. * * @param listener {@link HotplugEventListener} instance to be removed + * + * @hide */ + @SystemApi @RequiresPermission(android.Manifest.permission.HDMI_CEC) public void removeHotplugEventListener(HotplugEventListener listener) { if (mService == null) { @@ -979,4 +1023,76 @@ public final class HdmiControlManager { }; } + /** + * Adds a listener to get informed of changes to the state of the HDMI CEC volume control + * feature. + * + * Upon adding a listener, the current state of the HDMI CEC volume control feature will be + * sent immediately. + * + * <p>To stop getting the notification, + * use {@link #removeHdmiCecVolumeControlFeatureListener(HdmiCecVolumeControlFeatureListener)}. + * + * @param listener {@link HdmiCecVolumeControlFeatureListener} instance + * @hide + * @see #removeHdmiCecVolumeControlFeatureListener(HdmiCecVolumeControlFeatureListener) + */ + @RequiresPermission(android.Manifest.permission.HDMI_CEC) + public void addHdmiCecVolumeControlFeatureListener(@NonNull @CallbackExecutor Executor executor, + @NonNull HdmiCecVolumeControlFeatureListener listener) { + if (mService == null) { + Log.e(TAG, "HdmiControlService is not available"); + return; + } + if (mHdmiCecVolumeControlFeatureListeners.containsKey(listener)) { + Log.e(TAG, "listener is already registered"); + return; + } + IHdmiCecVolumeControlFeatureListener wrappedListener = + createHdmiCecVolumeControlFeatureListenerWrapper(executor, listener); + mHdmiCecVolumeControlFeatureListeners.put(listener, wrappedListener); + try { + mService.addHdmiCecVolumeControlFeatureListener(wrappedListener); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** + * Removes a listener to stop getting informed of changes to the state of the HDMI CEC volume + * control feature. + * + * @param listener {@link HdmiCecVolumeControlFeatureListener} instance to be removed + * @hide + */ + @RequiresPermission(android.Manifest.permission.HDMI_CEC) + public void removeHdmiCecVolumeControlFeatureListener( + HdmiCecVolumeControlFeatureListener listener) { + if (mService == null) { + Log.e(TAG, "HdmiControlService is not available"); + return; + } + IHdmiCecVolumeControlFeatureListener wrappedListener = + mHdmiCecVolumeControlFeatureListeners.remove(listener); + if (wrappedListener == null) { + Log.e(TAG, "tried to remove not-registered listener"); + return; + } + try { + mService.removeHdmiCecVolumeControlFeatureListener(wrappedListener); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + private IHdmiCecVolumeControlFeatureListener createHdmiCecVolumeControlFeatureListenerWrapper( + Executor executor, final HdmiCecVolumeControlFeatureListener listener) { + return new android.hardware.hdmi.IHdmiCecVolumeControlFeatureListener.Stub() { + @Override + public void onHdmiCecVolumeControlFeature(boolean enabled) { + Binder.clearCallingIdentity(); + executor.execute(() -> listener.onHdmiCecVolumeControlFeature(enabled)); + } + }; + } } diff --git a/core/java/android/hardware/hdmi/HdmiControlServiceWrapper.java b/core/java/android/hardware/hdmi/HdmiControlServiceWrapper.java new file mode 100644 index 000000000000..02896351ea3a --- /dev/null +++ b/core/java/android/hardware/hdmi/HdmiControlServiceWrapper.java @@ -0,0 +1,469 @@ +/* + * Copyright 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.hardware.hdmi; + +import android.annotation.BinderThread; +import android.annotation.NonNull; +import android.annotation.TestApi; + +import java.util.List; + +/** + * A wrapper of the Binder interface that clients running in the application process + * will use to perform HDMI-CEC features by communicating with other devices + * on the bus. + * + * @hide + */ +@TestApi +public final class HdmiControlServiceWrapper { + + /** Pure CEC switch device type. */ + public static final int DEVICE_PURE_CEC_SWITCH = HdmiDeviceInfo.DEVICE_PURE_CEC_SWITCH; + + private List<HdmiPortInfo> mInfoList = null; + private int[] mTypes = null; + + /** + * Create a new HdmiControlManager with the current HdmiControlService wrapper + * + * @return the created HdmiControlManager + */ + @NonNull + public HdmiControlManager createHdmiControlManager() { + return new HdmiControlManager(mInterface); + } + + private final IHdmiControlService mInterface = new IHdmiControlService.Stub() { + + @Override + public int[] getSupportedTypes() { + return HdmiControlServiceWrapper.this.getSupportedTypes(); + } + + @Override + public HdmiDeviceInfo getActiveSource() { + return HdmiControlServiceWrapper.this.getActiveSource(); + } + + @Override + public void oneTouchPlay(IHdmiControlCallback callback) { + HdmiControlServiceWrapper.this.oneTouchPlay(callback); + } + + @Override + public void queryDisplayStatus(IHdmiControlCallback callback) { + HdmiControlServiceWrapper.this.queryDisplayStatus(callback); + } + + @Override + public void addHdmiControlStatusChangeListener(IHdmiControlStatusChangeListener listener) { + HdmiControlServiceWrapper.this.addHdmiControlStatusChangeListener(listener); + } + + @Override + public void removeHdmiControlStatusChangeListener( + IHdmiControlStatusChangeListener listener) { + HdmiControlServiceWrapper.this.removeHdmiControlStatusChangeListener(listener); + } + + @Override + public void addHotplugEventListener(IHdmiHotplugEventListener listener) { + HdmiControlServiceWrapper.this.addHotplugEventListener(listener); + } + + @Override + public void removeHotplugEventListener(IHdmiHotplugEventListener listener) { + HdmiControlServiceWrapper.this.removeHotplugEventListener(listener); + } + + @Override + public void addDeviceEventListener(IHdmiDeviceEventListener listener) { + HdmiControlServiceWrapper.this.addDeviceEventListener(listener); + } + + @Override + public void deviceSelect(int deviceId, IHdmiControlCallback callback) { + HdmiControlServiceWrapper.this.deviceSelect(deviceId, callback); + } + + @Override + public void portSelect(int portId, IHdmiControlCallback callback) { + HdmiControlServiceWrapper.this.portSelect(portId, callback); + } + + @Override + public void sendKeyEvent(int deviceType, int keyCode, boolean isPressed) { + HdmiControlServiceWrapper.this.sendKeyEvent(deviceType, keyCode, isPressed); + } + + @Override + public void sendVolumeKeyEvent(int deviceType, int keyCode, boolean isPressed) { + HdmiControlServiceWrapper.this.sendVolumeKeyEvent(deviceType, keyCode, isPressed); + } + + @Override + public List<HdmiPortInfo> getPortInfo() { + return HdmiControlServiceWrapper.this.getPortInfo(); + } + + @Override + public boolean canChangeSystemAudioMode() { + return HdmiControlServiceWrapper.this.canChangeSystemAudioMode(); + } + + @Override + public boolean getSystemAudioMode() { + return HdmiControlServiceWrapper.this.getSystemAudioMode(); + } + + @Override + public int getPhysicalAddress() { + return HdmiControlServiceWrapper.this.getPhysicalAddress(); + } + + @Override + public void setSystemAudioMode(boolean enabled, IHdmiControlCallback callback) { + HdmiControlServiceWrapper.this.setSystemAudioMode(enabled, callback); + } + + @Override + public void addSystemAudioModeChangeListener(IHdmiSystemAudioModeChangeListener listener) { + HdmiControlServiceWrapper.this.addSystemAudioModeChangeListener(listener); + } + + @Override + public void removeSystemAudioModeChangeListener( + IHdmiSystemAudioModeChangeListener listener) { + HdmiControlServiceWrapper.this.removeSystemAudioModeChangeListener(listener); + } + + @Override + public void setArcMode(boolean enabled) { + HdmiControlServiceWrapper.this.setArcMode(enabled); + } + + @Override + public void setProhibitMode(boolean enabled) { + HdmiControlServiceWrapper.this.setProhibitMode(enabled); + } + + @Override + public void setSystemAudioVolume(int oldIndex, int newIndex, int maxIndex) { + HdmiControlServiceWrapper.this.setSystemAudioVolume(oldIndex, newIndex, maxIndex); + } + + @Override + public void setSystemAudioMute(boolean mute) { + HdmiControlServiceWrapper.this.setSystemAudioMute(mute); + } + + @Override + public void setInputChangeListener(IHdmiInputChangeListener listener) { + HdmiControlServiceWrapper.this.setInputChangeListener(listener); + } + + @Override + public List<HdmiDeviceInfo> getInputDevices() { + return HdmiControlServiceWrapper.this.getInputDevices(); + } + + @Override + public List<HdmiDeviceInfo> getDeviceList() { + return HdmiControlServiceWrapper.this.getDeviceList(); + } + + @Override + public void powerOffRemoteDevice(int logicalAddress, int powerStatus) { + HdmiControlServiceWrapper.this.powerOffRemoteDevice(logicalAddress, powerStatus); + } + + @Override + public void powerOnRemoteDevice(int logicalAddress, int powerStatus) { + HdmiControlServiceWrapper.this.powerOnRemoteDevice(logicalAddress, powerStatus); + } + + @Override + public void askRemoteDeviceToBecomeActiveSource(int physicalAddress) { + HdmiControlServiceWrapper.this.askRemoteDeviceToBecomeActiveSource(physicalAddress); + } + + @Override + public void sendVendorCommand(int deviceType, int targetAddress, byte[] params, + boolean hasVendorId) { + HdmiControlServiceWrapper.this.sendVendorCommand( + deviceType, targetAddress, params, hasVendorId); + } + + @Override + public void addVendorCommandListener(IHdmiVendorCommandListener listener, int deviceType) { + HdmiControlServiceWrapper.this.addVendorCommandListener(listener, deviceType); + } + + @Override + public void sendStandby(int deviceType, int deviceId) { + HdmiControlServiceWrapper.this.sendStandby(deviceType, deviceId); + } + + @Override + public void setHdmiRecordListener(IHdmiRecordListener callback) { + HdmiControlServiceWrapper.this.setHdmiRecordListener(callback); + } + + @Override + public void startOneTouchRecord(int recorderAddress, byte[] recordSource) { + HdmiControlServiceWrapper.this.startOneTouchRecord(recorderAddress, recordSource); + } + + @Override + public void stopOneTouchRecord(int recorderAddress) { + HdmiControlServiceWrapper.this.stopOneTouchRecord(recorderAddress); + } + + @Override + public void startTimerRecording(int recorderAddress, int sourceType, byte[] recordSource) { + HdmiControlServiceWrapper.this.startTimerRecording( + recorderAddress, sourceType, recordSource); + } + + @Override + public void clearTimerRecording(int recorderAddress, int sourceType, byte[] recordSource) { + HdmiControlServiceWrapper.this.clearTimerRecording( + recorderAddress, sourceType, recordSource); + } + + @Override + public void sendMhlVendorCommand(int portId, int offset, int length, byte[] data) { + HdmiControlServiceWrapper.this.sendMhlVendorCommand(portId, offset, length, data); + } + + @Override + public void addHdmiMhlVendorCommandListener(IHdmiMhlVendorCommandListener listener) { + HdmiControlServiceWrapper.this.addHdmiMhlVendorCommandListener(listener); + } + + @Override + public void setStandbyMode(boolean isStandbyModeOn) { + HdmiControlServiceWrapper.this.setStandbyMode(isStandbyModeOn); + } + + @Override + public void setHdmiCecVolumeControlEnabled(boolean isHdmiCecVolumeControlEnabled) { + HdmiControlServiceWrapper.this.setHdmiCecVolumeControlEnabled( + isHdmiCecVolumeControlEnabled); + } + + @Override + public boolean isHdmiCecVolumeControlEnabled() { + return HdmiControlServiceWrapper.this.isHdmiCecVolumeControlEnabled(); + } + + @Override + public void reportAudioStatus(int deviceType, int volume, int maxVolume, boolean isMute) { + HdmiControlServiceWrapper.this.reportAudioStatus(deviceType, volume, maxVolume, isMute); + } + + @Override + public void setSystemAudioModeOnForAudioOnlySource() { + HdmiControlServiceWrapper.this.setSystemAudioModeOnForAudioOnlySource(); + } + + @Override + public void addHdmiCecVolumeControlFeatureListener( + IHdmiCecVolumeControlFeatureListener listener) { + HdmiControlServiceWrapper.this.addHdmiCecVolumeControlFeatureListener(listener); + } + + @Override + public void removeHdmiCecVolumeControlFeatureListener( + IHdmiCecVolumeControlFeatureListener listener) { + HdmiControlServiceWrapper.this.removeHdmiCecVolumeControlFeatureListener(listener); + } + }; + + @BinderThread + public void setPortInfo(@NonNull List<HdmiPortInfo> infoList) { + mInfoList = infoList; + } + + @BinderThread + public void setDeviceTypes(@NonNull int[] types) { + mTypes = types; + } + + /** @hide */ + public List<HdmiPortInfo> getPortInfo() { + return mInfoList; + } + + /** @hide */ + public int[] getSupportedTypes() { + return mTypes; + } + + /** @hide */ + public HdmiDeviceInfo getActiveSource() { + return null; + } + + /** @hide */ + public void oneTouchPlay(IHdmiControlCallback callback) {} + + /** @hide */ + public void queryDisplayStatus(IHdmiControlCallback callback) {} + + /** @hide */ + public void addHdmiControlStatusChangeListener(IHdmiControlStatusChangeListener listener) {} + + /** @hide */ + public void removeHdmiControlStatusChangeListener(IHdmiControlStatusChangeListener listener) {} + + /** @hide */ + public void addHotplugEventListener(IHdmiHotplugEventListener listener) {} + + /** @hide */ + public void removeHotplugEventListener(IHdmiHotplugEventListener listener) {} + + /** @hide */ + public void addDeviceEventListener(IHdmiDeviceEventListener listener) {} + + /** @hide */ + public void deviceSelect(int deviceId, IHdmiControlCallback callback) {} + + /** @hide */ + public void portSelect(int portId, IHdmiControlCallback callback) {} + + /** @hide */ + public void sendKeyEvent(int deviceType, int keyCode, boolean isPressed) {} + + /** @hide */ + public void sendVolumeKeyEvent(int deviceType, int keyCode, boolean isPressed) {} + + /** @hide */ + public boolean canChangeSystemAudioMode() { + return true; + } + + /** @hide */ + public boolean getSystemAudioMode() { + return true; + } + + /** @hide */ + public int getPhysicalAddress() { + return 0xffff; + } + + /** @hide */ + public void setSystemAudioMode(boolean enabled, IHdmiControlCallback callback) {} + + /** @hide */ + public void addSystemAudioModeChangeListener(IHdmiSystemAudioModeChangeListener listener) {} + + /** @hide */ + public void removeSystemAudioModeChangeListener(IHdmiSystemAudioModeChangeListener listener) {} + + /** @hide */ + public void setArcMode(boolean enabled) {} + + /** @hide */ + public void setProhibitMode(boolean enabled) {} + + /** @hide */ + public void setSystemAudioVolume(int oldIndex, int newIndex, int maxIndex) {} + + /** @hide */ + public void setSystemAudioMute(boolean mute) {} + + /** @hide */ + public void setInputChangeListener(IHdmiInputChangeListener listener) {} + + /** @hide */ + public List<HdmiDeviceInfo> getInputDevices() { + return null; + } + + /** @hide */ + public List<HdmiDeviceInfo> getDeviceList() { + return null; + } + + /** @hide */ + public void powerOffRemoteDevice(int logicalAddress, int powerStatus) {} + + /** @hide */ + public void powerOnRemoteDevice(int logicalAddress, int powerStatus) {} + + /** @hide */ + public void askRemoteDeviceToBecomeActiveSource(int physicalAddress) {} + + /** @hide */ + public void sendVendorCommand(int deviceType, int targetAddress, byte[] params, + boolean hasVendorId) {} + + /** @hide */ + public void addVendorCommandListener(IHdmiVendorCommandListener listener, int deviceType) {} + + /** @hide */ + public void sendStandby(int deviceType, int deviceId) {} + + /** @hide */ + public void setHdmiRecordListener(IHdmiRecordListener callback) {} + + /** @hide */ + public void startOneTouchRecord(int recorderAddress, byte[] recordSource) {} + + /** @hide */ + public void stopOneTouchRecord(int recorderAddress) {} + + /** @hide */ + public void startTimerRecording(int recorderAddress, int sourceType, byte[] recordSource) {} + + /** @hide */ + public void clearTimerRecording(int recorderAddress, int sourceType, byte[] recordSource) {} + + /** @hide */ + public void sendMhlVendorCommand(int portId, int offset, int length, byte[] data) {} + + /** @hide */ + public void addHdmiMhlVendorCommandListener(IHdmiMhlVendorCommandListener listener) {} + + /** @hide */ + public void setStandbyMode(boolean isStandbyModeOn) {} + + /** @hide */ + public void setHdmiCecVolumeControlEnabled(boolean isHdmiCecVolumeControlEnabled) {} + + /** @hide */ + public boolean isHdmiCecVolumeControlEnabled() { + return true; + } + + /** @hide */ + public void reportAudioStatus(int deviceType, int volume, int maxVolume, boolean isMute) {} + + /** @hide */ + public void setSystemAudioModeOnForAudioOnlySource() {} + + /** @hide */ + public void addHdmiCecVolumeControlFeatureListener( + IHdmiCecVolumeControlFeatureListener listener) {} + + /** @hide */ + public void removeHdmiCecVolumeControlFeatureListener( + IHdmiCecVolumeControlFeatureListener listener) {} +} diff --git a/core/java/android/hardware/hdmi/HdmiPortInfo.java b/core/java/android/hardware/hdmi/HdmiPortInfo.java index 2623458aff5b..52c3628f358b 100644 --- a/core/java/android/hardware/hdmi/HdmiPortInfo.java +++ b/core/java/android/hardware/hdmi/HdmiPortInfo.java @@ -18,6 +18,7 @@ package android.hardware.hdmi; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; +import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; @@ -28,6 +29,7 @@ import android.os.Parcelable; * @hide */ @SystemApi +@TestApi public final class HdmiPortInfo implements Parcelable { /** HDMI port type: Input */ public static final int PORT_INPUT = 0; @@ -153,7 +155,9 @@ public final class HdmiPortInfo implements Parcelable { * @param dest The Parcel in which the object should be written. * @param flags Additional flags about how the object should be written. * May be 0 or {@link Parcelable#PARCELABLE_WRITE_RETURN_VALUE}. + * @hide */ + @SystemApi @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(mId); @@ -187,4 +191,9 @@ public final class HdmiPortInfo implements Parcelable { && mCecSupported == other.mCecSupported && mArcSupported == other.mArcSupported && mMhlSupported == other.mMhlSupported; } + + @Override + public int hashCode() { + return mId; + } } diff --git a/core/java/android/hardware/hdmi/HdmiSwitchClient.java b/core/java/android/hardware/hdmi/HdmiSwitchClient.java index 7833653e41b0..913edfd0ebf4 100644 --- a/core/java/android/hardware/hdmi/HdmiSwitchClient.java +++ b/core/java/android/hardware/hdmi/HdmiSwitchClient.java @@ -18,6 +18,7 @@ package android.hardware.hdmi; import android.annotation.CallbackExecutor; import android.annotation.NonNull; import android.annotation.SystemApi; +import android.annotation.TestApi; import android.hardware.hdmi.HdmiControlManager.ControlCallbackResult; import android.os.Binder; import android.os.RemoteException; @@ -38,6 +39,7 @@ import java.util.concurrent.Executor; * @hide */ @SystemApi +@TestApi public class HdmiSwitchClient extends HdmiClient { private static final String TAG = "HdmiSwitchClient"; @@ -187,11 +189,8 @@ public class HdmiSwitchClient extends HdmiClient { * <p>This returns an empty list when the current device does not have HDMI input. * * @return a list of {@link HdmiPortInfo} - * - * @hide */ @NonNull - @SystemApi public List<HdmiPortInfo> getPortInfo() { try { return mService.getPortInfo(); diff --git a/core/java/android/hardware/hdmi/IHdmiCecVolumeControlFeatureListener.aidl b/core/java/android/hardware/hdmi/IHdmiCecVolumeControlFeatureListener.aidl new file mode 100644 index 000000000000..873438bb1d20 --- /dev/null +++ b/core/java/android/hardware/hdmi/IHdmiCecVolumeControlFeatureListener.aidl @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.hardware.hdmi; + +/** + * Listener used to get the status of the HDMI CEC volume control feature (enabled/disabled). + * @hide + */ +oneway interface IHdmiCecVolumeControlFeatureListener { + + /** + * Called when the HDMI Control (CEC) volume control feature is enabled/disabled. + * + * @param enabled status of HDMI CEC volume control feature + * @see {@link HdmiControlManager#setHdmiCecVolumeControlEnabled(boolean)} ()} + **/ + void onHdmiCecVolumeControlFeature(boolean enabled); +} diff --git a/core/java/android/hardware/hdmi/IHdmiControlService.aidl b/core/java/android/hardware/hdmi/IHdmiControlService.aidl index 3582a927ff46..4c724ef62ea9 100644 --- a/core/java/android/hardware/hdmi/IHdmiControlService.aidl +++ b/core/java/android/hardware/hdmi/IHdmiControlService.aidl @@ -18,6 +18,7 @@ package android.hardware.hdmi; import android.hardware.hdmi.HdmiDeviceInfo; import android.hardware.hdmi.HdmiPortInfo; +import android.hardware.hdmi.IHdmiCecVolumeControlFeatureListener; import android.hardware.hdmi.IHdmiControlCallback; import android.hardware.hdmi.IHdmiControlStatusChangeListener; import android.hardware.hdmi.IHdmiDeviceEventListener; @@ -44,6 +45,8 @@ interface IHdmiControlService { void queryDisplayStatus(IHdmiControlCallback callback); void addHdmiControlStatusChangeListener(IHdmiControlStatusChangeListener listener); void removeHdmiControlStatusChangeListener(IHdmiControlStatusChangeListener listener); + void addHdmiCecVolumeControlFeatureListener(IHdmiCecVolumeControlFeatureListener listener); + void removeHdmiCecVolumeControlFeatureListener(IHdmiCecVolumeControlFeatureListener listener); void addHotplugEventListener(IHdmiHotplugEventListener listener); void removeHotplugEventListener(IHdmiHotplugEventListener listener); void addDeviceEventListener(IHdmiDeviceEventListener listener); diff --git a/core/java/android/inputmethodservice/AbstractInputMethodService.java b/core/java/android/inputmethodservice/AbstractInputMethodService.java index b0fca006d1e2..d7ca63a54987 100644 --- a/core/java/android/inputmethodservice/AbstractInputMethodService.java +++ b/core/java/android/inputmethodservice/AbstractInputMethodService.java @@ -260,4 +260,10 @@ public abstract class AbstractInputMethodService extends Service */ public void notifyUserActionIfNecessary() { } + + /** @hide */ + @Override + public final boolean isUiContext() { + return true; + } } diff --git a/core/java/android/net/NetworkRequest.java b/core/java/android/net/NetworkRequest.java index a6bd74a5870d..473e6c5a7287 100644 --- a/core/java/android/net/NetworkRequest.java +++ b/core/java/android/net/NetworkRequest.java @@ -468,8 +468,8 @@ public class NetworkRequest implements Parcelable { } /** - * Returns true iff. the capabilities requested in this NetworkRequest are satisfied by the - * provided {@link NetworkCapabilities}. + * Returns true if and only if the capabilities requested in this NetworkRequest are satisfied + * by the provided {@link NetworkCapabilities}. * * @param nc Capabilities that should satisfy this NetworkRequest. null capabilities do not * satisfy any request. diff --git a/core/java/android/os/StrictMode.java b/core/java/android/os/StrictMode.java index 02b822a99f2a..772845d4e683 100644 --- a/core/java/android/os/StrictMode.java +++ b/core/java/android/os/StrictMode.java @@ -817,6 +817,9 @@ public final class StrictMode { /** @hide */ public @NonNull Builder permitActivityLeaks() { + synchronized (StrictMode.class) { + sExpectedActivityInstanceCount.clear(); + } return disable(DETECT_VM_ACTIVITY_LEAKS); } @@ -2586,8 +2589,10 @@ public final class StrictMode { return; } + // Use the instance count from InstanceTracker as initial value. Integer expected = sExpectedActivityInstanceCount.get(klass); - Integer newExpected = expected == null ? 1 : expected + 1; + Integer newExpected = + expected == null ? InstanceTracker.getInstanceCount(klass) + 1 : expected + 1; sExpectedActivityInstanceCount.put(klass, newExpected); } } diff --git a/core/java/android/os/ZygoteProcess.java b/core/java/android/os/ZygoteProcess.java index a4c99c006d80..39038f555044 100644 --- a/core/java/android/os/ZygoteProcess.java +++ b/core/java/android/os/ZygoteProcess.java @@ -1318,15 +1318,15 @@ public class ZygoteProcess { Process.ProcessStartResult result; try { - // As app zygote is for generating isolated process, at the end it can't access - // apps data, so doesn't need to its data info. + // We will bind mount app data dirs so app zygote can't access /data/data, while + // we don't need to bind mount storage dirs as /storage won't be mounted. result = startViaZygote(processClass, niceName, uid, gid, gids, runtimeFlags, 0 /* mountExternal */, 0 /* targetSdkVersion */, seInfo, abi, instructionSet, null /* appDataDir */, null /* invokeWith */, true /* startChildZygote */, null /* packageName */, ZYGOTE_POLICY_FLAG_SYSTEM_PROCESS /* zygotePolicyFlags */, false /* isTopApp */, null /* disabledCompatChanges */, null /* pkgDataInfoMap */, - null /* whitelistedDataInfoMap */, false /* bindMountAppsData*/, + null /* whitelistedDataInfoMap */, true /* bindMountAppsData*/, /* bindMountAppStorageDirs */ false, extraArgs); } catch (ZygoteStartFailedEx ex) { diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java index 4ca48cb3e57c..e8806a03d00e 100644 --- a/core/java/android/os/storage/StorageManager.java +++ b/core/java/android/os/storage/StorageManager.java @@ -1365,6 +1365,7 @@ public class StorageManager { String[] packageNames = ActivityThread.getPackageManager().getPackagesForUid( android.os.Process.myUid()); if (packageNames == null || packageNames.length <= 0) { + Log.w(TAG, "Missing package names; no storage volumes available"); return new StorageVolume[0]; } packageName = packageNames[0]; @@ -1372,6 +1373,7 @@ public class StorageManager { final int uid = ActivityThread.getPackageManager().getPackageUid(packageName, PackageManager.MATCH_DEBUG_TRIAGED_MISSING, userId); if (uid <= 0) { + Log.w(TAG, "Missing UID; no storage volumes available"); return new StorageVolume[0]; } return storageManager.getVolumeList(uid, packageName, flags); diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 52764d568f29..e10fceaa5bc7 100755 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -14254,15 +14254,6 @@ public final class Settings { public static final String KERNEL_CPU_THREAD_READER = "kernel_cpu_thread_reader"; /** - * Persistent user id that is last logged in to. - * - * They map to user ids, for example, 10, 11, 12. - * - * @hide - */ - public static final String LAST_ACTIVE_USER_ID = "last_active_persistent_user_id"; - - /** * Whether we've enabled native flags health check on this device. Takes effect on * reboot. The value "1" enables native flags health check; otherwise it's disabled. * @hide diff --git a/core/java/android/service/controls/Control.java b/core/java/android/service/controls/Control.java index d01bc2524332..8383072a48e3 100644 --- a/core/java/android/service/controls/Control.java +++ b/core/java/android/service/controls/Control.java @@ -73,25 +73,37 @@ public final class Control implements Parcelable { }) public @interface Status {}; + /** + * Reserved for use with the {@link StatelessBuilder}, and while loading. When state is + * requested via {@link ControlsProviderService#createPublisherFor}, use other status codes + * to indicate the proper device state. + */ public static final int STATUS_UNKNOWN = 0; /** - * The device corresponding to the {@link Control} is responding correctly. + * Used to indicate that the state of the device was successfully retrieved. This includes + * all scenarios where the device may have a warning for the user, such as "Lock jammed", + * or "Vacuum stuck". Any information for the user should be set through + * {@link StatefulBuilder#setStatusText}. */ public static final int STATUS_OK = 1; /** - * The device corresponding to the {@link Control} cannot be found or was removed. + * The device corresponding to the {@link Control} cannot be found or was removed. The user + * will be alerted and directed to the application to resolve. */ public static final int STATUS_NOT_FOUND = 2; /** - * The device corresponding to the {@link Control} is in an error state. + * Used to indicate that there was a temporary error while loading the device state. A default + * error message will be displayed in place of any custom text that was set through + * {@link StatefulBuilder#setStatusText}. */ public static final int STATUS_ERROR = 3; /** - * The {@link Control} is currently disabled. + * The {@link Control} is currently disabled. A default error message will be displayed in + * place of any custom text that was set through {@link StatefulBuilder#setStatusText}. */ public static final int STATUS_DISABLED = 4; diff --git a/core/java/android/telephony/PhoneStateListener.java b/core/java/android/telephony/PhoneStateListener.java index e4fbf9f0e187..9b293eb463e5 100644 --- a/core/java/android/telephony/PhoneStateListener.java +++ b/core/java/android/telephony/PhoneStateListener.java @@ -340,6 +340,10 @@ public class PhoneStateListener { /** * Listen for display info changed event. * + * Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE + * READ_PHONE_STATE} or that the calling app has carrier privileges (see + * {@link TelephonyManager#hasCarrierPrivileges}). + * * @see #onDisplayInfoChanged */ public static final int LISTEN_DISPLAY_INFO_CHANGED = 0x00100000; diff --git a/core/java/android/view/GestureDetector.java b/core/java/android/view/GestureDetector.java index f6c72c4eefbc..55c527ba6fa6 100644 --- a/core/java/android/view/GestureDetector.java +++ b/core/java/android/view/GestureDetector.java @@ -16,6 +16,8 @@ package android.view; +import static android.os.StrictMode.vmIncorrectContextUseEnabled; + import static com.android.internal.util.FrameworkStatsLog.TOUCH_GESTURE_CLASSIFIED__CLASSIFICATION__DEEP_PRESS; import static com.android.internal.util.FrameworkStatsLog.TOUCH_GESTURE_CLASSIFIED__CLASSIFICATION__DOUBLE_TAP; import static com.android.internal.util.FrameworkStatsLog.TOUCH_GESTURE_CLASSIFIED__CLASSIFICATION__LONG_PRESS; @@ -26,9 +28,12 @@ import static com.android.internal.util.FrameworkStatsLog.TOUCH_GESTURE_CLASSIFI import android.compat.annotation.UnsupportedAppUsage; import android.content.Context; import android.os.Build; +import android.os.Bundle; import android.os.Handler; import android.os.Message; +import android.os.StrictMode; import android.os.SystemClock; +import android.util.Log; import com.android.internal.util.FrameworkStatsLog; @@ -228,6 +233,7 @@ public class GestureDetector { } } + private static final String TAG = GestureDetector.class.getSimpleName(); @UnsupportedAppUsage private int mTouchSlopSquare; private int mDoubleTapTouchSlopSquare; @@ -378,7 +384,8 @@ public class GestureDetector { * You may only use this constructor from a {@link android.os.Looper} thread. * @see android.os.Handler#Handler() * - * @param context the application's context + * @param context An {@link android.app.Activity} or a {@link Context} created from + * {@link Context#createWindowContext(int, Bundle)} * @param listener the listener invoked for all the callbacks, this must * not be null. If the listener implements the {@link OnDoubleTapListener} or * {@link OnContextClickListener} then it will also be set as the listener for @@ -395,7 +402,8 @@ public class GestureDetector { * thread associated with the supplied {@link android.os.Handler}. * @see android.os.Handler#Handler() * - * @param context the application's context + * @param context An {@link android.app.Activity} or a {@link Context} created from + * {@link Context#createWindowContext(int, Bundle)} * @param listener the listener invoked for all the callbacks, this must * not be null. If the listener implements the {@link OnDoubleTapListener} or * {@link OnContextClickListener} then it will also be set as the listener for @@ -425,7 +433,8 @@ public class GestureDetector { * thread associated with the supplied {@link android.os.Handler}. * @see android.os.Handler#Handler() * - * @param context the application's context + * @param context An {@link android.app.Activity} or a {@link Context} created from + * {@link Context#createWindowContext(int, Bundle)} * @param listener the listener invoked for all the callbacks, this must * not be null. * @param handler the handler to use for running deferred listener events. @@ -456,6 +465,17 @@ public class GestureDetector { mMaximumFlingVelocity = ViewConfiguration.getMaximumFlingVelocity(); mAmbiguousGestureMultiplier = ViewConfiguration.getAmbiguousGestureMultiplier(); } else { + if (!context.isUiContext() && vmIncorrectContextUseEnabled()) { + final String errorMessage = + "Tried to access UI constants from a non-visual Context."; + final String message = "GestureDetector must be accessed from Activity or other " + + "visual Context. Use an Activity or a Context created with " + + "Context#createWindowContext(int, Bundle), which are adjusted to the " + + "configuration and visual bounds of an area on screen."; + final Exception exception = new IllegalArgumentException(errorMessage); + StrictMode.onIncorrectContextUsed(message, exception); + Log.e(TAG, errorMessage + message, exception); + } final ViewConfiguration configuration = ViewConfiguration.get(context); touchSlop = configuration.getScaledTouchSlop(); doubleTapTouchSlop = configuration.getScaledDoubleTapTouchSlop(); diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java index a954f3631a01..57f91ed3c0ae 100644 --- a/core/java/android/view/SurfaceView.java +++ b/core/java/android/view/SurfaceView.java @@ -134,6 +134,7 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall // we need to preserve the old one until the new one has drawn. SurfaceControl mDeferredDestroySurfaceControl; SurfaceControl mBackgroundControl; + private boolean mDisableBackgroundLayer = false; /** * We use this lock in SOME cases when reading or writing SurfaceControl, @@ -245,10 +246,17 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall } public SurfaceView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + this(context, attrs, defStyleAttr, defStyleRes, false); + } + + /** @hide */ + public SurfaceView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, + int defStyleRes, boolean disableBackgroundLayer) { super(context, attrs, defStyleAttr, defStyleRes); mRenderNode.addPositionUpdateListener(mPositionListener); setWillNotDraw(true); + mDisableBackgroundLayer = disableBackgroundLayer; } /** @@ -839,7 +847,8 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall if (mBackgroundControl == null) { return; } - if ((mSubLayer < 0) && ((mSurfaceFlags & SurfaceControl.OPAQUE) != 0)) { + if ((mSubLayer < 0) && ((mSurfaceFlags & SurfaceControl.OPAQUE) != 0) + && !mDisableBackgroundLayer) { t.show(mBackgroundControl); } else { t.hide(mBackgroundControl); diff --git a/core/java/android/view/textclassifier/TEST_MAPPING b/core/java/android/view/textclassifier/TEST_MAPPING index 01a6edecf21e..2f9e737dc213 100644 --- a/core/java/android/view/textclassifier/TEST_MAPPING +++ b/core/java/android/view/textclassifier/TEST_MAPPING @@ -10,6 +10,22 @@ "exclude-annotation": "androidx.test.filters.FlakyTest" } ] + }, + { + "name": "CtsTextClassifierTestCases", + "options": [ + { + "exclude-annotation": "androidx.test.filters.FlakyTest" + } + ] + }, + { + "name": "TextClassifierServiceTest", + "options": [ + { + "exclude-annotation": "androidx.test.filters.FlakyTest" + } + ] } ] } diff --git a/core/java/android/window/VirtualDisplayTaskEmbedder.java b/core/java/android/window/VirtualDisplayTaskEmbedder.java index d2614da31ff9..9ccb4c172158 100644 --- a/core/java/android/window/VirtualDisplayTaskEmbedder.java +++ b/core/java/android/window/VirtualDisplayTaskEmbedder.java @@ -365,8 +365,8 @@ public class VirtualDisplayTaskEmbedder extends TaskEmbedder { // Found the topmost stack on target display. Now check if the topmost task's // description changed. if (taskInfo.taskId == stackInfo.taskIds[stackInfo.taskIds.length - 1]) { - mHost.onTaskBackgroundColorChanged(VirtualDisplayTaskEmbedder.this, - taskInfo.taskDescription.getBackgroundColor()); + mHost.post(()-> mHost.onTaskBackgroundColorChanged(VirtualDisplayTaskEmbedder.this, + taskInfo.taskDescription.getBackgroundColor())); } } diff --git a/core/java/com/android/internal/accessibility/dialog/AccessibilityShortcutChooserActivity.java b/core/java/com/android/internal/accessibility/dialog/AccessibilityShortcutChooserActivity.java index 1b7517840650..508deacb49d7 100644 --- a/core/java/com/android/internal/accessibility/dialog/AccessibilityShortcutChooserActivity.java +++ b/core/java/com/android/internal/accessibility/dialog/AccessibilityShortcutChooserActivity.java @@ -23,6 +23,7 @@ import static com.android.internal.accessibility.common.ShortcutConstants.Shortc import static com.android.internal.accessibility.dialog.AccessibilityTargetHelper.createEnableDialogContentView; import static com.android.internal.accessibility.dialog.AccessibilityTargetHelper.getInstalledTargets; import static com.android.internal.accessibility.dialog.AccessibilityTargetHelper.getTargets; +import static com.android.internal.accessibility.util.AccessibilityUtils.isUserSetupCompleted; import android.annotation.Nullable; import android.app.Activity; @@ -61,18 +62,8 @@ public class AccessibilityShortcutChooserActivity extends Activity { } mTargets.addAll(getTargets(this, mShortcutType)); - - final String selectDialogTitle = - getString(R.string.accessibility_select_shortcut_menu_title); mTargetAdapter = new ShortcutTargetAdapter(mTargets); - mMenuDialog = new AlertDialog.Builder(this) - .setTitle(selectDialogTitle) - .setAdapter(mTargetAdapter, /* listener= */ null) - .setPositiveButton( - getString(R.string.edit_accessibility_shortcut_menu_button), - /* listener= */ null) - .setOnDismissListener(dialog -> finish()) - .create(); + mMenuDialog = createMenuDialog(); mMenuDialog.setOnShowListener(dialog -> updateDialogListeners()); mMenuDialog.show(); } @@ -154,4 +145,22 @@ public class AccessibilityShortcutChooserActivity extends Activity { mMenuDialog.getListView().setOnItemClickListener( isEditMenuMode ? this::onTargetChecked : this::onTargetSelected); } + + private AlertDialog createMenuDialog() { + final String dialogTitle = + getString(R.string.accessibility_select_shortcut_menu_title); + + final AlertDialog.Builder builder = new AlertDialog.Builder(this) + .setTitle(dialogTitle) + .setAdapter(mTargetAdapter, /* listener= */ null) + .setOnDismissListener(dialog -> finish()); + + if (isUserSetupCompleted(this)) { + final String positiveButtonText = + getString(R.string.edit_accessibility_shortcut_menu_button); + builder.setPositiveButton(positiveButtonText, /* listener= */ null); + } + + return builder.create(); + } } diff --git a/core/java/com/android/internal/accessibility/util/AccessibilityUtils.java b/core/java/com/android/internal/accessibility/util/AccessibilityUtils.java index 9ee0b0ea1891..4b4e20f9181b 100644 --- a/core/java/com/android/internal/accessibility/util/AccessibilityUtils.java +++ b/core/java/com/android/internal/accessibility/util/AccessibilityUtils.java @@ -156,4 +156,16 @@ public final class AccessibilityUtils { return false; } + + /** + * Indicates whether the current user has completed setup via the setup wizard. + * {@link android.provider.Settings.Secure#USER_SETUP_COMPLETE} + * + * @return {@code true} if the setup is completed. + */ + public static boolean isUserSetupCompleted(Context context) { + return Settings.Secure.getIntForUser(context.getContentResolver(), + Settings.Secure.USER_SETUP_COMPLETE, /* def= */ 0, UserHandle.USER_CURRENT) + != /* false */ 0; + } } diff --git a/core/java/com/android/internal/app/ChooserActivity.java b/core/java/com/android/internal/app/ChooserActivity.java index 049a76c89815..b36c71f6c7a8 100644 --- a/core/java/com/android/internal/app/ChooserActivity.java +++ b/core/java/com/android/internal/app/ChooserActivity.java @@ -793,7 +793,6 @@ public class ChooserActivity extends ResolverActivity implements private AppPredictor.Callback createAppPredictorCallback( ChooserListAdapter chooserListAdapter) { return resultList -> { - //TODO(arangelov) Take care of edge case when callback called after swiping tabs if (isFinishing() || isDestroyed()) { return; } @@ -802,8 +801,6 @@ public class ChooserActivity extends ResolverActivity implements } if (resultList.isEmpty()) { // APS may be disabled, so try querying targets ourselves. - //TODO(arangelov) queryDirectShareTargets indirectly uses mIntents. - // Investigate implications for work tab. queryDirectShareTargets(chooserListAdapter, true); return; } @@ -1809,7 +1806,8 @@ public class ChooserActivity extends ResolverActivity implements } } - void queryTargetServices(ChooserListAdapter adapter) { + @VisibleForTesting + protected void queryTargetServices(ChooserListAdapter adapter) { mQueriedTargetServicesTimeMs = System.currentTimeMillis(); Context selectedProfileContext = createContextAsUser( @@ -1962,7 +1960,8 @@ public class ChooserActivity extends ResolverActivity implements return driList; } - private void queryDirectShareTargets( + @VisibleForTesting + protected void queryDirectShareTargets( ChooserListAdapter adapter, boolean skipAppPredictionService) { mQueriedSharingShortcutsTimeMs = System.currentTimeMillis(); UserHandle userHandle = adapter.getUserHandle(); @@ -1974,7 +1973,6 @@ public class ChooserActivity extends ResolverActivity implements } } // Default to just querying ShortcutManager if AppPredictor not present. - //TODO(arangelov) we're using mIntents here, investicate possible implications on work tab final IntentFilter filter = getTargetIntentFilter(); if (filter == null) { return; @@ -2654,6 +2652,7 @@ public class ChooserActivity extends ResolverActivity implements if (recyclerView.getVisibility() == View.VISIBLE) { int directShareHeight = 0; rowsToShow = Math.min(4, rowsToShow); + boolean shouldShowExtraRow = shouldShowExtraRow(rowsToShow); mLastNumberOfChildren = recyclerView.getChildCount(); for (int i = 0, childCount = recyclerView.getChildCount(); i < childCount && rowsToShow > 0; i++) { @@ -2664,6 +2663,9 @@ public class ChooserActivity extends ResolverActivity implements } int height = child.getHeight(); offset += height; + if (shouldShowExtraRow) { + offset += height; + } if (gridAdapter.getTargetType( recyclerView.getChildAdapterPosition(child)) @@ -2699,6 +2701,18 @@ public class ChooserActivity extends ResolverActivity implements } /** + * If we have a tabbed view and are showing 1 row in the current profile and an empty + * state screen in the other profile, to prevent cropping of the empty state screen we show + * a second row in the current profile. + */ + private boolean shouldShowExtraRow(int rowsToShow) { + return shouldShowTabs() + && rowsToShow == 1 + && mChooserMultiProfilePagerAdapter.shouldShowEmptyStateScreen( + mChooserMultiProfilePagerAdapter.getInactiveListAdapter()); + } + + /** * Returns {@link #PROFILE_PERSONAL}, {@link #PROFILE_WORK}, or -1 if the given user handle * does not match either the personal or work user handle. **/ diff --git a/core/java/com/android/internal/app/ChooserTargetActionsDialogFragment.java b/core/java/com/android/internal/app/ChooserTargetActionsDialogFragment.java index 3991a7674f38..21063d5d5857 100644 --- a/core/java/com/android/internal/app/ChooserTargetActionsDialogFragment.java +++ b/core/java/com/android/internal/app/ChooserTargetActionsDialogFragment.java @@ -26,7 +26,6 @@ import static java.util.stream.Collectors.toList; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityManager; -import android.app.AlertDialog.Builder; import android.app.Dialog; import android.app.DialogFragment; import android.content.ComponentName; @@ -34,21 +33,25 @@ import android.content.DialogInterface; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.content.res.Configuration; +import android.graphics.Color; +import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.UserHandle; import android.util.Pair; +import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.TextView; import com.android.internal.R; import com.android.internal.app.chooser.DisplayResolveInfo; +import com.android.internal.widget.RecyclerView; import java.util.ArrayList; import java.util.List; +import java.util.Optional; /** * Shows a dialog with actions to take on a chooser target. @@ -68,47 +71,86 @@ public class ChooserTargetActionsDialogFragment extends DialogFragment mTargetInfos = targets; } - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { + /** + * Recreate the layout from scratch to match new Sharesheet redlines + */ + public View onCreateView(LayoutInflater inflater, + @Nullable ViewGroup container, + Bundle savedInstanceState) { + + // Make the background transparent to show dialog rounding + Optional.of(getDialog()).map(Dialog::getWindow) + .ifPresent(window -> { + window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); + }); // Fetch UI details from target info - List<Pair<CharSequence, Drawable>> items = mTargetInfos.stream().map(dri -> { - return new Pair<>(getItemLabel(dri), getItemIcon(dri)); + List<Pair<Drawable, CharSequence>> items = mTargetInfos.stream().map(dri -> { + return new Pair<>(getItemIcon(dri), getItemLabel(dri)); }).collect(toList()); + View v = inflater.inflate(R.layout.chooser_dialog, container, false); + + TextView title = v.findViewById(R.id.title); + ImageView icon = v.findViewById(R.id.icon); + RecyclerView rv = v.findViewById(R.id.listContainer); + final ResolveInfoPresentationGetter pg = getProvidingAppPresentationGetter(); - return new Builder(getContext()) - .setTitle(pg.getLabel()) - .setIcon(pg.getIcon(mUserHandle)) - .setCancelable(true) - .setAdapter(getAdapterForContent(items), this) - .create(); + title.setText(pg.getLabel()); + icon.setImageDrawable(pg.getIcon(mUserHandle)); + rv.setAdapter(new VHAdapter(items)); + + return v; + } + + class VHAdapter extends RecyclerView.Adapter<VH> { + + List<Pair<Drawable, CharSequence>> mItems; + + VHAdapter(List<Pair<Drawable, CharSequence>> items) { + mItems = items; + } + + @NonNull + @Override + public VH onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + return new VH(LayoutInflater.from(parent.getContext()).inflate( + R.layout.chooser_dialog_item, parent, false)); + } + + @Override + public void onBindViewHolder(@NonNull VH holder, int position) { + holder.bind(mItems.get(position), position); + } + + @Override + public int getItemCount() { + return mItems.size(); + } } - protected ArrayAdapter<Pair<CharSequence, Drawable>> getAdapterForContent( - List<Pair<CharSequence, Drawable>> items) { - return new ArrayAdapter<Pair<CharSequence, Drawable>>(getContext(), - R.layout.chooser_dialog_item, R.id.text, items) { - @Override - public View getView(int position, View convertView, ViewGroup parent) { - View v = super.getView(position, convertView, parent); // super recycles views - TextView label = v.findViewById(R.id.text); - ImageView icon = v.findViewById(R.id.icon); - - Pair<CharSequence, Drawable> pair = getItem(position); - label.setText(pair.first); - - // Hide icon view if one isn't available - if (pair.second == null) { - icon.setVisibility(View.GONE); - } else { - icon.setImageDrawable(pair.second); - icon.setVisibility(View.VISIBLE); - } - - return v; + class VH extends RecyclerView.ViewHolder { + TextView mLabel; + ImageView mIcon; + + VH(@NonNull View itemView) { + super(itemView); + mLabel = itemView.findViewById(R.id.text); + mIcon = itemView.findViewById(R.id.icon); + } + + public void bind(Pair<Drawable, CharSequence> item, int position) { + mLabel.setText(item.second); + + if (item.first == null) { + mIcon.setVisibility(View.GONE); + } else { + mIcon.setVisibility(View.VISIBLE); + mIcon.setImageDrawable(item.first); } - }; + + itemView.setOnClickListener(v -> onClick(getDialog(), position)); + } } @Override diff --git a/core/java/com/android/internal/app/IAppOpsService.aidl b/core/java/com/android/internal/app/IAppOpsService.aidl index 06c21ab8832d..e614a0eb996b 100644 --- a/core/java/com/android/internal/app/IAppOpsService.aidl +++ b/core/java/com/android/internal/app/IAppOpsService.aidl @@ -76,6 +76,7 @@ interface IAppOpsService { void addHistoricalOps(in AppOpsManager.HistoricalOps ops); void resetHistoryParameters(); void clearHistory(); + void rebootHistory(long offlineDurationMillis); List<AppOpsManager.PackageOps> getUidOps(int uid, in int[] ops); void setUidMode(int code, int uid, int mode); @UnsupportedAppUsage diff --git a/core/java/com/android/internal/app/IVoiceInteractionManagerService.aidl b/core/java/com/android/internal/app/IVoiceInteractionManagerService.aidl index 71ee8af8b11a..15ba8e8c11f7 100644 --- a/core/java/com/android/internal/app/IVoiceInteractionManagerService.aidl +++ b/core/java/com/android/internal/app/IVoiceInteractionManagerService.aidl @@ -265,4 +265,16 @@ interface IVoiceInteractionManagerService { void performDirectAction(in IBinder token, String actionId, in Bundle arguments, int taskId, IBinder assistToken, in RemoteCallback cancellationCallback, in RemoteCallback resultCallback); + + /** + * Temporarily disables voice interaction (for example, on Automotive when the display is off). + * + * It will shutdown the service, and only re-enable it after it's called again (or after a + * system restart). + * + * NOTE: it's only effective when the service itself is available / enabled in the device, so + * calling setDisable(false) would be a no-op when it isn't. + */ + void setDisabled(boolean disabled); + } diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java index f8eec57bbd6b..daacd459a1a7 100644 --- a/core/java/com/android/internal/app/ResolverActivity.java +++ b/core/java/com/android/internal/app/ResolverActivity.java @@ -159,9 +159,6 @@ public class ResolverActivity extends Activity implements protected static final String METRICS_CATEGORY_RESOLVER = "intent_resolver"; protected static final String METRICS_CATEGORY_CHOOSER = "intent_chooser"; - /** - * TODO(arangelov): Remove a couple of weeks after work/personal tabs are finalized. - */ @VisibleForTesting public static boolean ENABLE_TABBED_VIEW = true; private static final String TAB_TAG_PERSONAL = "personal"; @@ -1819,6 +1816,12 @@ public class ResolverActivity extends Activity implements ResolverListAdapter activeListAdapter = mMultiProfilePagerAdapter.getActiveListAdapter(); View buttonBarDivider = findViewById(R.id.resolver_button_bar_divider); + if (!useLayoutWithDefault()) { + int inset = mSystemWindowInsets != null ? mSystemWindowInsets.bottom : 0; + buttonLayout.setPadding(buttonLayout.getPaddingLeft(), buttonLayout.getPaddingTop(), + buttonLayout.getPaddingRight(), getResources().getDimensionPixelSize( + R.dimen.resolver_button_bar_spacing) + inset); + } if (activeListAdapter.isTabLoaded() && mMultiProfilePagerAdapter.shouldShowEmptyStateScreen(activeListAdapter) && !useLayoutWithDefault()) { @@ -1835,12 +1838,6 @@ public class ResolverActivity extends Activity implements buttonLayout.setVisibility(View.VISIBLE); setButtonBarIgnoreOffset(/* ignoreOffset */ true); - if (!useLayoutWithDefault()) { - int inset = mSystemWindowInsets != null ? mSystemWindowInsets.bottom : 0; - buttonLayout.setPadding(buttonLayout.getPaddingLeft(), buttonLayout.getPaddingTop(), - buttonLayout.getPaddingRight(), getResources().getDimensionPixelSize( - R.dimen.resolver_button_bar_spacing) + inset); - } mOnceButton = (Button) buttonLayout.findViewById(R.id.button_once); mAlwaysButton = (Button) buttonLayout.findViewById(R.id.button_always); diff --git a/core/java/com/android/internal/app/ResolverListAdapter.java b/core/java/com/android/internal/app/ResolverListAdapter.java index 97f43d27a9ce..b1e8ed1f943e 100644 --- a/core/java/com/android/internal/app/ResolverListAdapter.java +++ b/core/java/com/android/internal/app/ResolverListAdapter.java @@ -423,7 +423,6 @@ public class ResolverListAdapter extends BaseAdapter { // We assume that at this point we've already filtered out the only intent for a different // targetUserId which we're going to use. private void addResolveInfo(DisplayResolveInfo dri) { - // TODO(arangelov): Is that UserHandle.USER_CURRENT check okay? if (dri != null && dri.getResolveInfo() != null && dri.getResolveInfo().targetUserId == UserHandle.USER_CURRENT) { if (shouldAddResolveInfo(dri)) { diff --git a/core/java/com/android/internal/app/procstats/ProcessState.java b/core/java/com/android/internal/app/procstats/ProcessState.java index b8142607ebd7..ab58fc0eeafc 100644 --- a/core/java/com/android/internal/app/procstats/ProcessState.java +++ b/core/java/com/android/internal/app/procstats/ProcessState.java @@ -49,12 +49,14 @@ import android.os.SystemClock; import android.os.UserHandle; import android.service.procstats.ProcessStatsProto; import android.service.procstats.ProcessStatsStateProto; +import android.text.TextUtils; import android.util.ArrayMap; import android.util.ArraySet; import android.util.DebugUtils; import android.util.Log; import android.util.LongSparseArray; import android.util.Slog; +import android.util.SparseArray; import android.util.SparseLongArray; import android.util.TimeUtils; import android.util.proto.ProtoOutputStream; @@ -1420,10 +1422,38 @@ public final class ProcessState { proto.end(token); } + /** + * Assume the atom already includes a UID field, write the process name only if + * it's different from the package name; and only write the suffix if possible. + */ + static void writeCompressedProcessName(final ProtoOutputStream proto, final long fieldId, + final String procName, final String packageName, final boolean sharedUid) { + if (sharedUid) { + // This UID has multiple packages running, write the full process name here + proto.write(fieldId, procName); + return; + } + if (TextUtils.equals(procName, packageName)) { + // Same name, don't bother to write the process name here. + return; + } + if (procName.startsWith(packageName)) { + final int pkgLength = packageName.length(); + if (procName.charAt(pkgLength) == ':') { + // Only write the suffix starting with ':' + proto.write(fieldId, procName.substring(pkgLength)); + return; + } + } + // Write the full process name + proto.write(fieldId, procName); + } + /** Similar to {@code #dumpDebug}, but with a reduced/aggregated subset of states. */ public void dumpAggregatedProtoForStatsd(ProtoOutputStream proto, long fieldId, String procName, int uid, long now, - final ProcessMap<ArraySet<PackageState>> procToPkgMap) { + final ProcessMap<ArraySet<PackageState>> procToPkgMap, + final SparseArray<ArraySet<String>> uidToPkgMap) { // Group proc stats by aggregated type (only screen state + process state) SparseLongArray durationByState = new SparseLongArray(); boolean didCurState = false; @@ -1503,7 +1533,8 @@ public final class ProcessState { // build the output final long token = proto.start(fieldId); - proto.write(ProcessStatsProto.PROCESS, procName); + writeCompressedProcessName(proto, ProcessStatsProto.PROCESS, procName, mPackage, + mMultiPackage || (uidToPkgMap.get(mUid).size() > 1)); proto.write(ProcessStatsProto.UID, uid); for (int i = 0; i < durationByState.size(); i++) { @@ -1528,7 +1559,7 @@ public final class ProcessState { } mStats.dumpFilteredAssociationStatesProtoForProc(proto, ProcessStatsProto.ASSOCS, - now, this, procToPkgMap); + now, this, procToPkgMap, uidToPkgMap); proto.end(token); } } diff --git a/core/java/com/android/internal/app/procstats/ProcessStats.java b/core/java/com/android/internal/app/procstats/ProcessStats.java index 928ba35595d3..7455ad009873 100644 --- a/core/java/com/android/internal/app/procstats/ProcessStats.java +++ b/core/java/com/android/internal/app/procstats/ProcessStats.java @@ -2235,8 +2235,9 @@ public final class ProcessStats implements Parcelable { public void dumpAggregatedProtoForStatsd(ProtoOutputStream proto) { dumpProtoPreamble(proto); final ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap(); - final ProcessMap<ArraySet<PackageState>> procToPkgMap = - collectProcessPackageMaps(null, false); + final ProcessMap<ArraySet<PackageState>> procToPkgMap = new ProcessMap<>(); + final SparseArray<ArraySet<String>> uidToPkgMap = new SparseArray<>(); + collectProcessPackageMaps(null, false, procToPkgMap, uidToPkgMap); for (int ip = 0; ip < procMap.size(); ip++) { final String procName = procMap.keyAt(ip); final SparseArray<ProcessState> uids = procMap.valueAt(ip); @@ -2245,7 +2246,8 @@ public final class ProcessStats implements Parcelable { final ProcessState procState = uids.valueAt(iu); procState.dumpAggregatedProtoForStatsd(proto, ProcessStatsSectionProto.PROCESS_STATS, - procName, uid, mTimePeriodEndRealtime, procToPkgMap); + procName, uid, mTimePeriodEndRealtime, + procToPkgMap, uidToPkgMap); } } } @@ -2279,10 +2281,9 @@ public final class ProcessStats implements Parcelable { /** * Walk through the known processes and build up the process -> packages map if necessary. */ - public ProcessMap<ArraySet<PackageState>> collectProcessPackageMaps( - String reqPackage, boolean activeOnly) { - final ProcessMap<ArraySet<PackageState>> map = new ProcessMap<>(); - + private void collectProcessPackageMaps(String reqPackage, boolean activeOnly, + final ProcessMap<ArraySet<PackageState>> procToPkgMap, + final SparseArray<ArraySet<String>> uidToPkgMap) { final ArrayMap<String, SparseArray<LongSparseArray<PackageState>>> pkgMap = mPackages.getMap(); for (int ip = pkgMap.size() - 1; ip >= 0; ip--) { @@ -2304,17 +2305,22 @@ public final class ProcessStats implements Parcelable { final String name = proc.getName(); final int uid = proc.getUid(); - ArraySet<PackageState> pkgStates = map.get(name, uid); + ArraySet<PackageState> pkgStates = procToPkgMap.get(name, uid); if (pkgStates == null) { pkgStates = new ArraySet<>(); - map.put(name, uid, pkgStates); + procToPkgMap.put(name, uid, pkgStates); } pkgStates.add(state); + ArraySet<String> packages = uidToPkgMap.get(uid); + if (packages == null) { + packages = new ArraySet<>(); + uidToPkgMap.put(uid, packages); + } + packages.add(state.mPackageName); } } } } - return map; } /** @@ -2329,10 +2335,12 @@ public final class ProcessStats implements Parcelable { * @param now The timestamp when the dump was initiated. * @param procState The target process where its association states should be dumped. * @param proc2Pkg The map between process to packages running within it. + * @param uidToPkgMap The map between UID to packages with this UID */ public void dumpFilteredAssociationStatesProtoForProc(ProtoOutputStream proto, long fieldId, long now, ProcessState procState, - final ProcessMap<ArraySet<PackageState>> proc2Pkg) { + final ProcessMap<ArraySet<PackageState>> proc2Pkg, + final SparseArray<ArraySet<String>> uidToPkgMap) { if (procState.isMultiPackage() && procState.getCommonProcess() != procState) { // It's a per-package process state, don't bother to write into statsd return; @@ -2395,8 +2403,11 @@ public final class ProcessStats implements Parcelable { final SourceKey key = assocVals.keyAt(i); final long[] vals = assocVals.valueAt(i); final long token = proto.start(fieldId); - proto.write(ProcessStatsAssociationProto.ASSOC_PROCESS_NAME, key.mProcess); - proto.write(ProcessStatsAssociationProto.ASSOC_PACKAGE_NAME, key.mPackage); + ProcessState.writeCompressedProcessName(proto, + ProcessStatsAssociationProto.ASSOC_PROCESS_NAME, + key.mProcess, key.mPackage, + uidToPkgMap.get(key.mUid).size() > 1); + proto.write(ProcessStatsAssociationProto.ASSOC_UID, key.mUid); proto.write(ProcessStatsAssociationProto.TOTAL_COUNT, (int) vals[1]); proto.write(ProcessStatsAssociationProto.TOTAL_DURATION_SECS, (int) (vals[0] / 1000)); diff --git a/core/java/com/android/internal/util/ScreenshotHelper.java b/core/java/com/android/internal/util/ScreenshotHelper.java index adc7ba30c157..d0052ab01331 100644 --- a/core/java/com/android/internal/util/ScreenshotHelper.java +++ b/core/java/com/android/internal/util/ScreenshotHelper.java @@ -351,8 +351,11 @@ public class ScreenshotHelper { mContext.unbindService(mScreenshotConnection); mScreenshotConnection = null; mScreenshotService = null; - handler.removeCallbacks(mScreenshotTimeout); - notifyScreenshotError(); + // only log an error if we're still within the timeout period + if (handler.hasCallbacks(mScreenshotTimeout)) { + handler.removeCallbacks(mScreenshotTimeout); + notifyScreenshotError(); + } } } } diff --git a/core/java/com/android/internal/widget/ConversationLayout.java b/core/java/com/android/internal/widget/ConversationLayout.java index c75f72bdc765..1f2ae5f96449 100644 --- a/core/java/com/android/internal/widget/ConversationLayout.java +++ b/core/java/com/android/internal/widget/ConversationLayout.java @@ -161,6 +161,7 @@ public class ConversationLayout extends FrameLayout private Rect mAppOpsTouchRect = new Rect(); private float mMinTouchSize; private Icon mConversationIcon; + private Icon mShortcutIcon; private View mAppNameDivider; public ConversationLayout(@NonNull Context context) { @@ -465,10 +466,9 @@ public class ConversationLayout extends FrameLayout private void updateConversationLayout() { // Set avatar and name CharSequence conversationText = mConversationTitle; + mConversationIcon = mShortcutIcon; if (mIsOneToOne) { // Let's resolve the icon / text from the last sender - mConversationIconView.setVisibility(VISIBLE); - mConversationFacePile.setVisibility(GONE); CharSequence userKey = getKey(mUser); for (int i = mGroups.size() - 1; i >= 0; i--) { MessagingGroup messagingGroup = mGroups.get(i); @@ -490,22 +490,21 @@ public class ConversationLayout extends FrameLayout break; } } + } + if (mConversationIcon == null) { + mConversationIcon = mLargeIcon; + } + if (mIsOneToOne || mConversationIcon != null) { + mConversationIconView.setVisibility(VISIBLE); + mConversationFacePile.setVisibility(GONE); + mConversationIconView.setImageIcon(mConversationIcon); } else { - if (mConversationIcon == null && mLargeIcon != null) { - mConversationIcon = mLargeIcon; - } - if (mConversationIcon != null) { - mConversationIconView.setVisibility(VISIBLE); - mConversationFacePile.setVisibility(GONE); - mConversationIconView.setImageIcon(mConversationIcon); - } else { - mConversationIconView.setVisibility(GONE); - // This will also inflate it! - mConversationFacePile.setVisibility(VISIBLE); - // rebind the value to the inflated view instead of the stub - mConversationFacePile = findViewById(R.id.conversation_face_pile); - bindFacePile(); - } + mConversationIconView.setVisibility(GONE); + // This will also inflate it! + mConversationFacePile.setVisibility(VISIBLE); + // rebind the value to the inflated view instead of the stub + mConversationFacePile = findViewById(R.id.conversation_face_pile); + bindFacePile(); } if (TextUtils.isEmpty(conversationText)) { conversationText = mIsOneToOne ? mFallbackChatName : mFallbackGroupChatName; @@ -712,7 +711,7 @@ public class ConversationLayout extends FrameLayout } @RemotableViewMethod - public void setConversationIcon(Icon conversationIcon) { + public void setShortcutIcon(Icon conversationIcon) { mConversationIcon = conversationIcon; } @@ -1223,7 +1222,6 @@ public class ConversationLayout extends FrameLayout mExpandButtonContainer.setVisibility(VISIBLE); mExpandButtonInnerContainer.setOnClickListener(onClickListener); } else { - // TODO: handle content paddings to end of layout mExpandButtonContainer.setVisibility(GONE); } updateContentEndPaddings(); diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp index 3d8cae8e74d0..9eede83e21e5 100644 --- a/core/jni/com_android_internal_os_Zygote.cpp +++ b/core/jni/com_android_internal_os_Zygote.cpp @@ -1359,7 +1359,13 @@ static void isolateAppData(JNIEnv* env, const std::vector<std::string>& merged_d } closedir(dir); - bool legacySymlinkCreated = false; + // Prepare default dirs for user 0 as user 0 always exists. + int result = symlink("/data/data", "/data/user/0"); + if (result != 0) { + fail_fn(CREATE_ERROR("Failed to create symlink /data/user/0 %s", strerror(errno))); + } + PrepareDirIfNotPresent("/data/user_de/0", DEFAULT_DATA_DIR_PERMISSION, + AID_ROOT, AID_ROOT, fail_fn); for (int i = 0; i < size; i += 3) { std::string const & packageName = merged_data_info_list[i]; @@ -1400,17 +1406,8 @@ static void isolateAppData(JNIEnv* env, const std::vector<std::string>& merged_d char internalDeUserPath[PATH_MAX]; snprintf(internalCeUserPath, PATH_MAX, "/data/user/%d", userId); snprintf(internalDeUserPath, PATH_MAX, "/data/user_de/%d", userId); - // If it's user 0, create a symlink /data/user/0 -> /data/data, - // otherwise create /data/user/$USER + // If it's not user 0, create /data/user/$USER. if (userId == 0) { - if (!legacySymlinkCreated) { - legacySymlinkCreated = true; - int result = symlink(internalLegacyCePath, internalCeUserPath); - if (result != 0) { - fail_fn(CREATE_ERROR("Failed to create symlink %s %s", internalCeUserPath, - strerror(errno))); - } - } actualCePath = internalLegacyCePath; } else { PrepareDirIfNotPresent(internalCeUserPath, DEFAULT_DATA_DIR_PERMISSION, @@ -1587,10 +1584,6 @@ static void BindMountStorageDirs(JNIEnv* env, jobjectArray pkg_data_info_list, // Fuse is ready, so we can start using fuse path. int size = (pkg_data_info_list != nullptr) ? env->GetArrayLength(pkg_data_info_list) : 0; - if (size == 0) { - fail_fn(CREATE_ERROR("Data package list cannot be empty")); - } - // Create tmpfs on Android/obb and Android/data so these 2 dirs won't enter fuse anymore. std::string androidObbDir = StringPrintf("/storage/emulated/%d/Android/obb", user_id); MountAppDataTmpFs(androidObbDir, fail_fn); @@ -1744,6 +1737,8 @@ static void SpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArray gids, heap_tagging_level = M_HEAP_TAGGING_LEVEL_NONE; } android_mallopt(M_SET_HEAP_TAGGING_LEVEL, &heap_tagging_level, sizeof(heap_tagging_level)); + // Now that we've used the flag, clear it so that we don't pass unknown flags to the ART runtime. + runtime_flags &= ~RuntimeFlags::MEMORY_TAG_LEVEL_MASK; bool forceEnableGwpAsan = false; switch (runtime_flags & RuntimeFlags::GWP_ASAN_LEVEL_MASK) { @@ -1756,6 +1751,8 @@ static void SpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArray gids, case RuntimeFlags::GWP_ASAN_LEVEL_LOTTERY: android_mallopt(M_INITIALIZE_GWP_ASAN, &forceEnableGwpAsan, sizeof(forceEnableGwpAsan)); } + // Now that we've used the flag, clear it so that we don't pass unknown flags to the ART runtime. + runtime_flags &= ~RuntimeFlags::GWP_ASAN_LEVEL_MASK; if (NeedsNoRandomizeWorkaround()) { // Work around ARM kernel ASLR lossage (http://b/5817320). diff --git a/core/proto/android/service/procstats.proto b/core/proto/android/service/procstats.proto index dd830a85edc9..7a4c0706e119 100644 --- a/core/proto/android/service/procstats.proto +++ b/core/proto/android/service/procstats.proto @@ -179,13 +179,16 @@ message ProcessStatsProto { repeated ProcessStatsAssociationProto assocs = 7; } -// Next Tag: 5 +// Next Tag: 6 message ProcessStatsAssociationProto { // Procss Name of the associated process/package optional string assoc_process_name = 1; // Package Name of the associated process/package - optional string assoc_package_name = 2; + optional string assoc_package_name = 2 [deprecated = true]; + + // UID of the associated process/package + optional int32 assoc_uid = 5; // Total count of the times this association appeared. optional int32 total_count = 3; diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 464a47002b17..f71d4063b847 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -3158,7 +3158,7 @@ @hide --> <permission android:name="android.permission.HIDE_NON_SYSTEM_OVERLAY_WINDOWS" - android:protectionLevel="signature|installer" /> + android:protectionLevel="signature|preinstalled" /> <!-- @SystemApi Allows an application to manage (create, destroy, Z-order) application tokens in the window manager. @@ -5228,7 +5228,7 @@ </activity> <activity android:name="com.android.internal.app.SuspendedAppActivity" - android:theme="@style/Theme.Dialog.Confirmation" + android:theme="@style/Theme.DeviceDefault.Dialog.Alert.DayNight" android:excludeFromRecents="true" android:process=":ui"> </activity> diff --git a/core/res/res/drawable/chooser_dialog_background.xml b/core/res/res/drawable/chooser_dialog_background.xml new file mode 100644 index 000000000000..b914d63187e7 --- /dev/null +++ b/core/res/res/drawable/chooser_dialog_background.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2020 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> + +<shape android:shape="rectangle" xmlns:android="http://schemas.android.com/apk/res/android"> + <corners android:radius="?attr/dialogCornerRadius" /> + <solid android:color="?attr/colorBackgroundFloating" /> +</shape>
\ No newline at end of file diff --git a/core/res/res/layout/chooser_dialog.xml b/core/res/res/layout/chooser_dialog.xml new file mode 100644 index 000000000000..824136cd970a --- /dev/null +++ b/core/res/res/layout/chooser_dialog.xml @@ -0,0 +1,60 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2020 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> + +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:background="@drawable/chooser_dialog_background" + android:orientation="vertical" + android:paddingBottom="8dp" + android:paddingTop="8dp" + android:layout_width="240dp" + android:layout_height="wrap_content"> + + <LinearLayout + android:gravity="start|center_vertical" + android:paddingStart="16dp" + android:paddingEnd="16dp" + android:minHeight="56dp" + android:layout_width="match_parent" + android:layout_height="wrap_content"> + + <ImageView android:id="@+id/icon" + android:layout_marginEnd="16dp" + android:layout_width="24dp" + android:layout_height="24dp"/> + + <TextView android:id="@+id/title" + android:textSize="16sp" + android:textColor="?android:attr/textColorPrimary" + android:textAppearance="@android:style/TextAppearance.DeviceDefault.WindowTitle" + android:text="App name" + android:lines="1" + android:ellipsize="end" + android:layout_width="wrap_content" + android:layout_height="wrap_content"/> + + </LinearLayout> + + <com.android.internal.widget.RecyclerView + xmlns:app="http://schemas.android.com/apk/res-auto" + app:layoutManager="com.android.internal.widget.LinearLayoutManager" + android:id="@+id/listContainer" + android:overScrollMode="never" + android:layout_width="match_parent" + android:layout_height="wrap_content"/> + +</LinearLayout>
\ No newline at end of file diff --git a/core/res/res/layout/chooser_dialog_item.xml b/core/res/res/layout/chooser_dialog_item.xml index 1d6369793bfb..4a88bb02372e 100644 --- a/core/res/res/layout/chooser_dialog_item.xml +++ b/core/res/res/layout/chooser_dialog_item.xml @@ -16,27 +16,28 @@ --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:background="?android:attr/selectableItemBackground" + android:clickable="true" + android:paddingStart="16dp" + android:paddingEnd="16dp" android:orientation="horizontal" android:gravity="start|center_vertical" - android:paddingStart="?attr/dialogPreferredPadding" - android:paddingEnd="?attr/dialogPreferredPadding" - android:minHeight="48dp" + android:minHeight="56dp" android:layout_width="match_parent" - android:layout_height="match_parent"> + android:layout_height="wrap_content"> - <!-- Icon and text aligns with aligns with alert_dialog_title_material --> <ImageView android:id="@+id/icon" - android:tint="?android:attr/textColorAlertDialogListItem" - android:padding="4dp" - android:layout_marginEnd="8dp" - android:layout_width="32dp" - android:layout_height="32dp"/> + android:alpha="0.54" + android:tint="?android:attr/textColorPrimary" + android:layout_marginEnd="16dp" + android:layout_width="24dp" + android:layout_height="24dp"/> - <!-- Using text style from select_dialog_item_material --> <TextView android:id="@+id/text" - android:textAppearance="?android:attr/textAppearanceListItemSmall" - android:textColor="?android:attr/textColorAlertDialogListItem" - android:lines="1" + android:textAppearance="?android:attr/textAppearanceSmall" + android:textColor="?android:attr/textColorPrimary" + android:textSize="16sp" + android:maxLines="2" android:ellipsize="end" android:layout_width="wrap_content" android:layout_height="wrap_content"/> diff --git a/core/res/res/layout/notification_material_action_list.xml b/core/res/res/layout/notification_material_action_list.xml index ec54091e5a20..3615b9e2f9cb 100644 --- a/core/res/res/layout/notification_material_action_list.xml +++ b/core/res/res/layout/notification_material_action_list.xml @@ -22,10 +22,11 @@ android:layout_gravity="bottom"> <LinearLayout + android:id="@+id/actions_container_layout" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" - android:paddingEnd="12dp" + android:paddingEnd="@dimen/bubble_gone_padding_end" > <com.android.internal.widget.NotificationActionListLayout diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index 6ea49596325d..8a68217d966a 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"Druk is gedeaktiveer deur <xliff:g id="OWNER_APP">%s</xliff:g>."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Skakel jou werkprofiel aan"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Jou persoonlike programme word geblokkeer totdat jy jou werkprofiel aanskakel"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Persoonlike programme sal op <xliff:g id="DATE">%1$s</xliff:g> om <xliff:g id="TIME">%2$s</xliff:g> geblokkeer word. Jou IT-admin laat nie toe dat jou werkprofiel langer as <xliff:g id="NUMBER">%3$d</xliff:g> dae af bly nie."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Skakel aan"</string> <string name="me" msgid="6207584824693813140">"Ek"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Tablet-opsies"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Android TV-opsies"</string> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index 8291ad70c8bd..a05cfbfc99fd 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"ማተም በ<xliff:g id="OWNER_APP">%s</xliff:g> ተሰናክሏል።"</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"የስራ መገለጫዎን ያብሩት"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"የስራ መገለጫዎን እስኪያበሩት ድረስ የግል መተግበሪያዎችዎ ታግደዋል"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"የግል መተግበሪያዎች <xliff:g id="DATE">%1$s</xliff:g> <xliff:g id="TIME">%2$s</xliff:g> ላይ ይታገዳሉ። የእርስዎ የአይቲ አስተዳዳሪ የሥራ መገለጫዎ ከ<xliff:g id="NUMBER">%3$d</xliff:g> ቀኖች በላይ ጠፍቶ እንዲቆይ አይፈቅዱም።"</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"አብራ"</string> <string name="me" msgid="6207584824693813140">"እኔ"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"የጡባዊ አማራጮች"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Android TV አማራጮች"</string> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index cae96722a907..02a0eb476505 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -210,10 +210,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"تم إيقاف الطباعة بواسطة <xliff:g id="OWNER_APP">%s</xliff:g>."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"تفعيل الملف الشخصي للعمل"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"تم حظر تطبيقاتك الشخصية إلى أن تفعِّل ملفك الشخصي للعمل."</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"سيتم حظر التطبيقات الشخصية في <xliff:g id="DATE">%1$s</xliff:g> في <xliff:g id="TIME">%2$s</xliff:g>. لا يسمح مشرف تكنولوجيا المعلومات في مؤسستك بإيقاف الملف الشخصي للعمل أكثر من <xliff:g id="NUMBER">%3$d</xliff:g> يوم."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"تفعيل"</string> <string name="me" msgid="6207584824693813140">"أنا"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"خيارات الجهاز اللوحي"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"خيارات Android TV"</string> @@ -2190,7 +2188,7 @@ <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"محادثة جماعية"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> <string name="resolver_personal_tab" msgid="2051260504014442073">"شخصي"</string> - <string name="resolver_work_tab" msgid="2690019516263167035">"عمل"</string> + <string name="resolver_work_tab" msgid="2690019516263167035">"للعمل"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"عرض المحتوى الشخصي"</string> <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"عرض محتوى العمل"</string> <string name="resolver_cant_share_with_work_apps" msgid="637686613606502219">"تتعذّر مشاركة هذا المحتوى باستخدام تطبيقات العمل"</string> @@ -2201,9 +2199,9 @@ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="2959282422751315171">"لا يسمح لك مشرف تكنولوجيا المعلومات بمشاركة هذا المحتوى باستخدام التطبيقات في ملفك الشخصي."</string> <string name="resolver_cant_access_personal_apps" msgid="648291604475669395">"يتعذّر فتح هذا المحتوى باستخدام التطبيقات الشخصية"</string> <string name="resolver_cant_access_personal_apps_explanation" msgid="2298773629302296519">"لا يسمح لك مشرف تكنولوجيا المعلومات بفتح هذا المحتوى باستخدام التطبيقات في ملفك الشخصي."</string> - <string name="resolver_turn_on_work_apps" msgid="884910835250037247">"تم إيقاف الملف الشخصي للعمل مؤقتًا."</string> + <string name="resolver_turn_on_work_apps" msgid="884910835250037247">"الملف الشخصي للعمل متوقف مؤقتًا."</string> <string name="resolver_switch_on_work" msgid="2873009160846966379">"تفعيل"</string> - <string name="resolver_no_work_apps_available_share" msgid="7933949011797699505">"لا يمكن لتطبيقات العمل أن تدعم هذا المحتوى."</string> + <string name="resolver_no_work_apps_available_share" msgid="7933949011797699505">"لا يمكن لتطبيقات العمل أن تتوافق مع هذا المحتوى."</string> <string name="resolver_no_work_apps_available_resolve" msgid="1244844292366099399">"لا يمكن لتطبيقات العمل أن تفتح هذا المحتوى."</string> <string name="resolver_no_personal_apps_available_share" msgid="5639102815174748732">"لا يمكن للتطبيقات الشخصية أن تدعم هذا المحتوى."</string> <string name="resolver_no_personal_apps_available_resolve" msgid="5120671970531446978">"لا يمكن للتطبيقات الشخصية أن تفتح هذا المحتوى."</string> diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml index 43feb19fcfdc..5ac3aaeb9c6c 100644 --- a/core/res/res/values-as/strings.xml +++ b/core/res/res/values-as/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"প্ৰিণ্ট কৰা কাৰ্য <xliff:g id="OWNER_APP">%s</xliff:g>এ অক্ষম কৰি ৰাখিছে।"</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"কৰ্মস্থানৰ প্ৰ’ফাইলটো অন কৰক"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"আপুনি নিজৰ কৰ্মস্থানৰ প্ৰ’ফাইলটো অন নকৰালৈকে আপোনাৰ ব্যক্তিগত এপ্সমূহ অৱৰোধ কৰা থাকে"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"<xliff:g id="DATE">%1$s</xliff:g> তাৰিখে <xliff:g id="TIME">%2$s</xliff:g> বজাত ব্যক্তিগত এপ্সমূহ অৱৰোধ কৰা হ’ব। আপোনাৰ আইটি প্ৰশাসকে আপোনাৰ কৰ্মস্থানৰ প্ৰ’ফাইলটো <xliff:g id="NUMBER">%3$d</xliff:g> দিনতকৈ বেছি সময়ৰ বাবে অফ কৰি ৰাখিবলৈ অনুমতি নিদিয়ে।"</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"অন কৰক"</string> <string name="me" msgid="6207584824693813140">"মই"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"টে\'বলেটৰ বিকল্পসমূহ"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Android TVৰ বিকল্পসমূহ"</string> diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml index d8d0c2d29d12..106f7040c1a4 100644 --- a/core/res/res/values-az/strings.xml +++ b/core/res/res/values-az/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"Çap <xliff:g id="OWNER_APP">%s</xliff:g> tərəfindən deaktiv edildi."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"İş profilinizi aktiv edin"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"İş profilinizi aktiv edənədək şəxsi tətbiqləriniz bloklanır"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Şəxsi tətbiqlər bu tarixdə bloklanacaq: <xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>. İT admini iş profilinizin <xliff:g id="NUMBER">%3$d</xliff:g> gündən çox deaktiv qalmasına icazə vermir."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Aktiv edin"</string> <string name="me" msgid="6207584824693813140">"Mən"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Planşet seçimləri"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Android TV seçimləri"</string> diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml index 94439cbb875e..c2d501355d5f 100644 --- a/core/res/res/values-b+sr+Latn/strings.xml +++ b/core/res/res/values-b+sr+Latn/strings.xml @@ -204,10 +204,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"Štampanje je onemogućila aplikacija <xliff:g id="OWNER_APP">%s</xliff:g>."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Uključite poslovni profil"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Lične aplikacije su blokirane dok ne uključite poslovni profil"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Lične aplikacije će biti blokirane: <xliff:g id="DATE">%1$s</xliff:g> u <xliff:g id="TIME">%2$s</xliff:g>. IT administrator ne dozvoljava da poslovni profil bude isključen duže od <xliff:g id="NUMBER">%3$d</xliff:g> dana."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Uključi"</string> <string name="me" msgid="6207584824693813140">"Ja"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Opcije za tablet"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Opcije Android TV-a"</string> @@ -1151,7 +1149,7 @@ <string name="whichViewApplicationNamed" msgid="415164730629690105">"Otvorite pomoću aplikacije %1$s"</string> <string name="whichViewApplicationLabel" msgid="7367556735684742409">"Otvori"</string> <string name="whichOpenHostLinksWith" msgid="7645631470199397485">"Otvarajte <xliff:g id="HOST">%1$s</xliff:g> linkove pomoću"</string> - <string name="whichOpenLinksWith" msgid="1120936181362907258">"Otvaratej linkove pomoću"</string> + <string name="whichOpenLinksWith" msgid="1120936181362907258">"Otvaraj linkove pomoću"</string> <string name="whichOpenLinksWithApp" msgid="6917864367861910086">"Otvarajte linkove pomoću aplikacije <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> <string name="whichOpenHostLinksWithApp" msgid="2401668560768463004">"Otvarajte <xliff:g id="HOST">%1$s</xliff:g> linkove pomoću aplikacije <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="7805857277166106236">"Dozvoli pristup"</string> @@ -2101,7 +2099,7 @@ <string name="resolver_cant_access_personal_apps_explanation" msgid="2298773629302296519">"IT administrator vam ne dozvoljava da otvorite ovaj sadržaj pomoću aplikacija na ličnom profilu"</string> <string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Poslovni profil je pauziran"</string> <string name="resolver_switch_on_work" msgid="2873009160846966379">"Uključi"</string> - <string name="resolver_no_work_apps_available_share" msgid="7933949011797699505">"Nijedna aplikacija za posao ne može da podržava ovaj sadržaj"</string> + <string name="resolver_no_work_apps_available_share" msgid="7933949011797699505">"Nijedna aplikacija za posao ne podržava ovaj sadržaj"</string> <string name="resolver_no_work_apps_available_resolve" msgid="1244844292366099399">"Nijedna aplikacija za posao ne može da otvori ovaj sadržaj"</string> <string name="resolver_no_personal_apps_available_share" msgid="5639102815174748732">"Nijedna lična aplikacija ne može da podržava ovaj sadržaj"</string> <string name="resolver_no_personal_apps_available_resolve" msgid="5120671970531446978">"Nijedna lična aplikacija ne može da otvori ovaj sadržaj"</string> diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml index 158602318221..2bdd4f7ad230 100644 --- a/core/res/res/values-be/strings.xml +++ b/core/res/res/values-be/strings.xml @@ -206,10 +206,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"Друк адключаны ўладальнікам праграмы <xliff:g id="OWNER_APP">%s</xliff:g>."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Уключыце працоўны профіль"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Вашы асабістыя праграмы будуць заблакіраваны, пакуль вы не ўключыце працоўны профіль"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Асабістыя праграмы будуць заблакіраваны ў <xliff:g id="TIME">%2$s</xliff:g> <xliff:g id="DATE">%1$s</xliff:g>. Ваш ІТ-адміністратар не дазволіў выключаць працоўны профіль больш чым на <xliff:g id="NUMBER">%3$d</xliff:g> сут."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Уключыць"</string> <string name="me" msgid="6207584824693813140">"Я"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Параметры планшэта"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Параметры Android TV"</string> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index a337d01b805f..a574fec312b6 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"Отпечатването е деактивиранo от <xliff:g id="OWNER_APP">%s</xliff:g>."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Служ. потр. профил: Включване"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Личните ви приложения са блокирани, докато не включите служебния си потребителски профил"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Личните приложения ще бъдат блокирани на <xliff:g id="DATE">%1$s</xliff:g> в <xliff:g id="TIME">%2$s</xliff:g>. Системният ви администратор не разрешава служебният ви потребителски профил да бъде изключен за повече от <xliff:g id="NUMBER">%3$d</xliff:g> дни."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Включване"</string> <string name="me" msgid="6207584824693813140">"Аз"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Опции за таблета"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Опции за Android TV"</string> diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml index 18992c9e5d1e..98c778cbd759 100644 --- a/core/res/res/values-bn/strings.xml +++ b/core/res/res/values-bn/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"<xliff:g id="OWNER_APP">%s</xliff:g> প্রিন্টিং বন্ধ রেখেছে।"</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"অফিসের প্রোফাইল চালু করুন"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"আপনার অফিসের প্রোফাইল চালু না করা পর্যন্ত আপনার ব্যক্তিগত অ্যাপ ব্লক থাকে"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"ব্যক্তিগত অ্যাপ <xliff:g id="DATE">%1$s</xliff:g>-এ <xliff:g id="TIME">%2$s</xliff:g>টার সময় ব্লক করা হবে। আপনার আইটি অ্যাডমিন আপনার অফিস প্রোফাইল <xliff:g id="NUMBER">%3$d</xliff:g> দিনের বেশি পজ করে রাখার অনুমতি দেয় না।"</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"চালু করুন"</string> <string name="me" msgid="6207584824693813140">"আমাকে"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"ট্যাবলেট বিকল্পগুলি"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Android TV-র বিকল্প"</string> @@ -2065,9 +2063,9 @@ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="2959282422751315171">"আইটি অ্যাডমিন আপনার ব্যক্তিগত প্রোফাইল ব্যবহার করে অ্যাপের মাধ্যমে এই কন্টেন্ট শেয়ার করার অনুমতি দেয় না"</string> <string name="resolver_cant_access_personal_apps" msgid="648291604475669395">"ব্যক্তিগত অ্যাপের মাধ্যমে খোলা যাবে না"</string> <string name="resolver_cant_access_personal_apps_explanation" msgid="2298773629302296519">"আইটি অ্যাডমিন আপনার ব্যক্তিগত প্রোফাইল ব্যবহার করে অ্যাপের মাধ্যমে এই কন্টেন্ট খোলার অনুমতি দেয় না"</string> - <string name="resolver_turn_on_work_apps" msgid="884910835250037247">"কাজের প্রোফাইল পজ করা আছে"</string> + <string name="resolver_turn_on_work_apps" msgid="884910835250037247">"অফিস প্রোফাইল বন্ধ করা আছে"</string> <string name="resolver_switch_on_work" msgid="2873009160846966379">"চালু করুন"</string> - <string name="resolver_no_work_apps_available_share" msgid="7933949011797699505">"এই ধরনের কন্টেন্ট অফিসের অ্যাপের মাধ্যমে খুলে দেখা যাবে না"</string> + <string name="resolver_no_work_apps_available_share" msgid="7933949011797699505">"এই ধরনের কন্টেন্ট অফিস অ্যাপের মাধ্যমে খোলা যাবে না"</string> <string name="resolver_no_work_apps_available_resolve" msgid="1244844292366099399">"এই ধরনের কন্টেন্ট অফিসের অ্যাপের মাধ্যমে খুলে দেখা যাবে না"</string> <string name="resolver_no_personal_apps_available_share" msgid="5639102815174748732">"এই ধরনের কন্টেন্ট ব্যক্তিগত অ্যাপের মাধ্যমে খোলা বা দেখা যাবে না"</string> <string name="resolver_no_personal_apps_available_resolve" msgid="5120671970531446978">"এই ধরনের কন্টেন্ট ব্যক্তিগত অ্যাপের মাধ্যমে খোলা যাবে না"</string> diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml index 7e8fe5342d36..8c0459103696 100644 --- a/core/res/res/values-bs/strings.xml +++ b/core/res/res/values-bs/strings.xml @@ -204,10 +204,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"Štampanje je onemogućila aplikacija <xliff:g id="OWNER_APP">%s</xliff:g>."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Uključite radni profil"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Vaše lične aplikacije će biti blokirane dok ne uključite radni profil"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Lične aplikacije će biti blokirane <xliff:g id="DATE">%1$s</xliff:g> u <xliff:g id="TIME">%2$s</xliff:g>. Vaš IT administrator ne dozvoljava da radni profil bude isključen duže od <xliff:g id="NUMBER">%3$d</xliff:g> dana."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Uključi"</string> <string name="me" msgid="6207584824693813140">"Ja"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Opcije tableta"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Opcije Android TV uređaja"</string> @@ -216,7 +214,7 @@ <string name="turn_on_radio" msgid="2961717788170634233">"Uključi bežičnu vezu"</string> <string name="turn_off_radio" msgid="7222573978109933360">"Isključi bežičnu vezu"</string> <string name="screen_lock" msgid="2072642720826409809">"Zaključavanje ekrana"</string> - <string name="power_off" msgid="4111692782492232778">"Isključi telefon"</string> + <string name="power_off" msgid="4111692782492232778">"Isključi"</string> <string name="silent_mode_silent" msgid="5079789070221150912">"Zvuk zvona isključen"</string> <string name="silent_mode_vibrate" msgid="8821830448369552678">"Zvuk zvona na vibraciji"</string> <string name="silent_mode_ring" msgid="6039011004781526678">"Zvuk zvona uključen"</string> @@ -240,7 +238,7 @@ <string name="global_actions" product="tv" msgid="3871763739487450369">"Opcije Android TV uređaja"</string> <string name="global_actions" product="default" msgid="6410072189971495460">"Opcije telefona"</string> <string name="global_action_lock" msgid="6949357274257655383">"Zaključavanje ekrana"</string> - <string name="global_action_power_off" msgid="4404936470711393203">"Isključi telefon"</string> + <string name="global_action_power_off" msgid="4404936470711393203">"Isključi"</string> <string name="global_action_power_options" msgid="1185286119330160073">"Napajanje"</string> <string name="global_action_restart" msgid="4678451019561687074">"Ponovo pokreni"</string> <string name="global_action_emergency" msgid="1387617624177105088">"Hitno"</string> @@ -1150,10 +1148,10 @@ <string name="whichViewApplication" msgid="5733194231473132945">"Otvori koristeći"</string> <string name="whichViewApplicationNamed" msgid="415164730629690105">"Otvori koristeći %1$s"</string> <string name="whichViewApplicationLabel" msgid="7367556735684742409">"Otvori"</string> - <string name="whichOpenHostLinksWith" msgid="7645631470199397485">"Otvaranje <xliff:g id="HOST">%1$s</xliff:g> linkova pomoću"</string> - <string name="whichOpenLinksWith" msgid="1120936181362907258">"Otvaranje linkova pomoću"</string> - <string name="whichOpenLinksWithApp" msgid="6917864367861910086">"Otvaranje linkova pomoću aplikacije <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> - <string name="whichOpenHostLinksWithApp" msgid="2401668560768463004">"Otvaranje <xliff:g id="HOST">%1$s</xliff:g> linkova pomoću aplikacije <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <string name="whichOpenHostLinksWith" msgid="7645631470199397485">"Otvaranje <xliff:g id="HOST">%1$s</xliff:g> linkova pomoću preglednika/aplikacije"</string> + <string name="whichOpenLinksWith" msgid="1120936181362907258">"Otvaranje linkova pomoću preglednika"</string> + <string name="whichOpenLinksWithApp" msgid="6917864367861910086">"Otvaranje linkova pomoću preglednika <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="2401668560768463004">"Otvaranje <xliff:g id="HOST">%1$s</xliff:g> linkova pomoću preglednika <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="7805857277166106236">"Dozvoli pristup"</string> <string name="whichEditApplication" msgid="6191568491456092812">"Uredi koristeći"</string> <string name="whichEditApplicationNamed" msgid="8096494987978521514">"Uredi koristeći %1$s"</string> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index d048a7f8d4a5..fc9471f5d449 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"<xliff:g id="OWNER_APP">%s</xliff:g> ha desactivat la impressió."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Activa el perfil de treball"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Les teves aplicacions personals estan bloquejades fins que activis el perfil de treball"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Les aplicacions personals es bloquejaran el dia <xliff:g id="DATE">%1$s</xliff:g> a les <xliff:g id="TIME">%2$s</xliff:g>. L\'administrador de TI no permet desactivar el teu perfil de treball durant més de: <xliff:g id="NUMBER">%3$d</xliff:g> dies."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Activa"</string> <string name="me" msgid="6207584824693813140">"Mi"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Opcions de la tauleta"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Opcions d\'Android TV"</string> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index a0c5ff0ae8c6..90ee8f25d2bf 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -206,10 +206,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"Aplikace <xliff:g id="OWNER_APP">%s</xliff:g> tisk zakazuje."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Zapněte pracovní profil"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Vaše osobní aplikace jsou zablokovány, dokud nezapnete pracovní profil"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Osobní aplikace budou zablokovány <xliff:g id="DATE">%1$s</xliff:g> v <xliff:g id="TIME">%2$s</xliff:g>. Administrátor IT nepovoluje vypnutí pracovního profilu na déle než tento počet dní: <xliff:g id="NUMBER">%3$d</xliff:g>."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Zapnout"</string> <string name="me" msgid="6207584824693813140">"Já"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Možnosti tabletu"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Možnosti zařízení Android TV"</string> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index d240f30d6b28..16cae27eb2fa 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"Udskrivning er deaktiveret af <xliff:g id="OWNER_APP">%s</xliff:g>."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Aktivér din arbejdsprofil"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Dine personlige apps er blokeret, indtil du aktiverer din arbejdsprofil"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Personlige apps bliver blokeret <xliff:g id="DATE">%1$s</xliff:g> kl. <xliff:g id="TIME">%2$s</xliff:g>. Din it-administrator tillader ikke, at din arbejdsprofil deaktiveres i mere end <xliff:g id="NUMBER">%3$d</xliff:g> dage."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Aktivér"</string> <string name="me" msgid="6207584824693813140">"Mig"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Valgmuligheder for tabletcomputeren"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Valgmuligheder for Android TV"</string> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 0e425afd207a..2763acad2672 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"Drucken wurde von <xliff:g id="OWNER_APP">%s</xliff:g> deaktiviert."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Arbeitsprofil aktivieren"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Deine privaten Apps werden blockiert, bis du dein Arbeitsprofil aktivierst"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Private Apps werden am <xliff:g id="DATE">%1$s</xliff:g> um <xliff:g id="TIME">%2$s</xliff:g> blockiert. Dein IT-Administrator hat festgelegt, dass dein Arbeitsprofil nicht länger als <xliff:g id="NUMBER">%3$d</xliff:g> Tage pausiert werden darf."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Aktivieren"</string> <string name="me" msgid="6207584824693813140">"Eigene"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Tablet-Optionen"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Android TV-Optionen"</string> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index afeceb775524..dd19b2769f72 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"Η εκτύπωση απενεργοποιήθηκε από τον χρήστη <xliff:g id="OWNER_APP">%s</xliff:g>."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Ενεργοπ. το προφίλ εργασίας"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Οι προσωπικές σας εφαρμογές αποκλείονται μέχρι να ενεργοποιήσετε το προφίλ εργασίας σας."</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Οι προσωπικές εφαρμογές θα αποκλειστούν στις <xliff:g id="DATE">%1$s</xliff:g> και ώρα <xliff:g id="TIME">%2$s</xliff:g>. Ο διαχειριστής IT δεν επιτρέπει το προφίλ εργασίας να παραμένει απενεργοποιημένο για περισσότερες από <xliff:g id="NUMBER">%3$d</xliff:g> ημέρες."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Ενεργοποίηση"</string> <string name="me" msgid="6207584824693813140">"Για εμένα"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Επιλογές tablet"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Επιλογές Android TV"</string> @@ -2057,7 +2055,7 @@ <string name="resolver_work_tab" msgid="2690019516263167035">"Εργασία"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Προσωπική προβολή"</string> <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Προβολή εργασίας"</string> - <string name="resolver_cant_share_with_work_apps" msgid="637686613606502219">"Δεν είναι δυνατή η κοινοποίηση αυτού του περιεχομένου με εφαρμογές εργασιών"</string> + <string name="resolver_cant_share_with_work_apps" msgid="637686613606502219">"Δεν είναι δυνατή η κοινοποίηση αυτού του περιεχομένου με εφαρμογές εργασίας"</string> <string name="resolver_cant_share_with_work_apps_explanation" msgid="3332302070341130545">"Ο διαχειριστής IT δεν σας επιτρέπει να κοινοποιήσετε αυτό το περιεχόμενο με εφαρμογές στο προφίλ εργασίας σας."</string> <string name="resolver_cant_access_work_apps" msgid="2455757966397563223">"Δεν είναι δυνατό το άνοιγμα με εφαρμογές εργασίας"</string> <string name="resolver_cant_access_work_apps_explanation" msgid="3626983885525445790">"Ο διαχειριστής IT δεν σας επιτρέπει να ανοίξετε αυτό το περιεχόμενο με εφαρμογές στο προφίλ εργασίας σας."</string> @@ -2067,8 +2065,8 @@ <string name="resolver_cant_access_personal_apps_explanation" msgid="2298773629302296519">"Ο διαχειριστής IT δεν σας επιτρέπει να ανοίξετε αυτό το περιεχόμενο με εφαρμογές στο προσωπικό προφίλ σας."</string> <string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Το προφίλ εργασίας σας έχει τεθεί σε παύση."</string> <string name="resolver_switch_on_work" msgid="2873009160846966379">"Ενεργοποίηση"</string> - <string name="resolver_no_work_apps_available_share" msgid="7933949011797699505">"Καμία εφαρμογή εργασιών δεν μπορεί να υποστηρίξει αυτό το περιεχόμενο."</string> - <string name="resolver_no_work_apps_available_resolve" msgid="1244844292366099399">"Καμία εφαρμογή εργασιών δεν μπορεί να ανοίξει αυτό το περιεχόμενο."</string> + <string name="resolver_no_work_apps_available_share" msgid="7933949011797699505">"Καμία εφαρμογή εργασίας δεν μπορεί να υποστηρίξει αυτό το περιεχόμενο."</string> + <string name="resolver_no_work_apps_available_resolve" msgid="1244844292366099399">"Καμία εφαρμογή εργασίας δεν μπορεί να ανοίξει αυτό το περιεχόμενο."</string> <string name="resolver_no_personal_apps_available_share" msgid="5639102815174748732">"Καμία προσωπική εφαρμογή δεν μπορεί να υποστηρίξει αυτό το περιεχόμενο."</string> <string name="resolver_no_personal_apps_available_resolve" msgid="5120671970531446978">"Καμία προσωπική εφαρμογή δεν μπορεί να ανοίξει αυτό το περιεχόμενο."</string> <string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN ξεκλειδώματος δικτύου κάρτας SIM"</string> diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml index 3416e2d53ba6..359052488f52 100644 --- a/core/res/res/values-en-rAU/strings.xml +++ b/core/res/res/values-en-rAU/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"Printing disabled by <xliff:g id="OWNER_APP">%s</xliff:g>."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Turn on your work profile"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Your personal apps are blocked until you turn on your work profile"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Personal apps will be blocked on <xliff:g id="DATE">%1$s</xliff:g> at <xliff:g id="TIME">%2$s</xliff:g>. Your IT admin doesn’t allow your work profile to stay off for more than <xliff:g id="NUMBER">%3$d</xliff:g> days."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Turn on"</string> <string name="me" msgid="6207584824693813140">"Me"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Tablet options"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Android TV options"</string> diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml index 4d04a3e0d826..baf246cad231 100644 --- a/core/res/res/values-en-rCA/strings.xml +++ b/core/res/res/values-en-rCA/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"Printing disabled by <xliff:g id="OWNER_APP">%s</xliff:g>."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Turn on your work profile"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Your personal apps are blocked until you turn on your work profile"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Personal apps will be blocked on <xliff:g id="DATE">%1$s</xliff:g> at <xliff:g id="TIME">%2$s</xliff:g>. Your IT admin doesn’t allow your work profile to stay off for more than <xliff:g id="NUMBER">%3$d</xliff:g> days."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Turn on"</string> <string name="me" msgid="6207584824693813140">"Me"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Tablet options"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Android TV options"</string> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index 3416e2d53ba6..359052488f52 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"Printing disabled by <xliff:g id="OWNER_APP">%s</xliff:g>."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Turn on your work profile"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Your personal apps are blocked until you turn on your work profile"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Personal apps will be blocked on <xliff:g id="DATE">%1$s</xliff:g> at <xliff:g id="TIME">%2$s</xliff:g>. Your IT admin doesn’t allow your work profile to stay off for more than <xliff:g id="NUMBER">%3$d</xliff:g> days."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Turn on"</string> <string name="me" msgid="6207584824693813140">"Me"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Tablet options"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Android TV options"</string> diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml index 3416e2d53ba6..359052488f52 100644 --- a/core/res/res/values-en-rIN/strings.xml +++ b/core/res/res/values-en-rIN/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"Printing disabled by <xliff:g id="OWNER_APP">%s</xliff:g>."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Turn on your work profile"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Your personal apps are blocked until you turn on your work profile"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Personal apps will be blocked on <xliff:g id="DATE">%1$s</xliff:g> at <xliff:g id="TIME">%2$s</xliff:g>. Your IT admin doesn’t allow your work profile to stay off for more than <xliff:g id="NUMBER">%3$d</xliff:g> days."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Turn on"</string> <string name="me" msgid="6207584824693813140">"Me"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Tablet options"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Android TV options"</string> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 7f511aec6feb..005dd5d5f6de 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"<xliff:g id="OWNER_APP">%s</xliff:g> inhabilitó la impresión."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Activa tu perfil de trabajo"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Las apps personales estarán bloqueadas hasta que actives tu perfil de trabajo"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Se bloquearán las apps personales el <xliff:g id="DATE">%1$s</xliff:g> a la(s) <xliff:g id="TIME">%2$s</xliff:g>. Tu administrador de TI no permite que mantengas tu perfil de trabajo desactivado durante más de <xliff:g id="NUMBER">%3$d</xliff:g> días."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Activar"</string> <string name="me" msgid="6207584824693813140">"Yo"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Opciones de tablet"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Opciones de Android TV"</string> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index 657649316bfe..e18fc11bc7c3 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"<xliff:g id="OWNER_APP">%s</xliff:g> ha inhabilitado la impresión."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Activa tu perfil de trabajo"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Tus aplicaciones personales estarán bloqueadas hasta que actives tu perfil de trabajo"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Las aplicaciones personales se bloquearán el <xliff:g id="DATE">%1$s</xliff:g> a las <xliff:g id="TIME">%2$s</xliff:g>. Tu administrador de TI no permite que tu perfil de trabajo esté más de <xliff:g id="NUMBER">%3$d</xliff:g> días desactivado."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Activar"</string> <string name="me" msgid="6207584824693813140">"Yo"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Opciones del tablet"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Opciones de Android TV"</string> @@ -2057,10 +2055,10 @@ <string name="resolver_work_tab" msgid="2690019516263167035">"Trabajo"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Ver contenido personal"</string> <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Ver contenido de trabajo"</string> - <string name="resolver_cant_share_with_work_apps" msgid="637686613606502219">"No se puede compartir con una aplicación de trabajo"</string> - <string name="resolver_cant_share_with_work_apps_explanation" msgid="3332302070341130545">"Tu administrador de TI no te permite compartir este contenido con ninguna aplicación de tu perfil de trabajo"</string> + <string name="resolver_cant_share_with_work_apps" msgid="637686613606502219">"No se puede compartir con aplicaciones de trabajo"</string> + <string name="resolver_cant_share_with_work_apps_explanation" msgid="3332302070341130545">"Tu administrador de TI no te permite compartir este contenido con aplicaciones de tu perfil de trabajo"</string> <string name="resolver_cant_access_work_apps" msgid="2455757966397563223">"No se puede abrir con una aplicación de trabajo"</string> - <string name="resolver_cant_access_work_apps_explanation" msgid="3626983885525445790">"Tu administrador de TI no te permite abrir este contenido con ninguna aplicación de tu perfil de trabajo"</string> + <string name="resolver_cant_access_work_apps_explanation" msgid="3626983885525445790">"Tu administrador de TI no te permite abrir este contenido con aplicaciones de tu perfil de trabajo"</string> <string name="resolver_cant_share_with_personal_apps" msgid="3079139799233316203">"No se puede compartir con una aplicación personal"</string> <string name="resolver_cant_share_with_personal_apps_explanation" msgid="2959282422751315171">"Tu administrador de TI no te permite compartir este contenido con ninguna aplicación de tu perfil personal"</string> <string name="resolver_cant_access_personal_apps" msgid="648291604475669395">"No se puede abrir con una aplicación personal"</string> diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml index 8b99b44f64db..56887d822483 100644 --- a/core/res/res/values-et/strings.xml +++ b/core/res/res/values-et/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"Rakendus <xliff:g id="OWNER_APP">%s</xliff:g> on printimise keelanud."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Lülitage oma tööprofiil sisse"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Teie isiklikud rakendused on blokeeritud, kuni lülitate oma tööprofiili sisse"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Isiklikud rakendused blokeeritakse <xliff:g id="DATE">%1$s</xliff:g> kell <xliff:g id="TIME">%2$s</xliff:g>. IT-administraator ei luba teie tööprofiili üle <xliff:g id="NUMBER">%3$d</xliff:g> päeva väljalülitatuna hoida."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Lülita sisse"</string> <string name="me" msgid="6207584824693813140">"Mina"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Tahvelarvuti valikud"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Android TV valikud"</string> diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index 5d0b90cea7d5..9f927c3015d5 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"<xliff:g id="OWNER_APP">%s</xliff:g> aplikazioak desgaitu egin du inprimatzeko aukera."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Aktibatu laneko profila"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Aplikazio pertsonalak blokeatuta egongo dira laneko profila aktibatzen duzun arte"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Aplikazio pertsonalak egun eta ordu honetan blokeatuko dira: <xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>. IKT saileko administratzaileak ez dizu ematen baimenik laneko profila <xliff:g id="NUMBER">%3$d</xliff:g> egunez baino gehiagoz desaktibatuta edukitzeko."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Aktibatu"</string> <string name="me" msgid="6207584824693813140">"Ni"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Tabletaren aukerak"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Android TV gailuaren aukerak"</string> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index 29ac9e7fc1d3..2287160a70d2 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"<xliff:g id="OWNER_APP">%s</xliff:g> چاپ کردن را غیرفعال کرده است."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"نمایه کاریتان را روشن کنید"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"تا زمانیکه نمایه کاریتان را روشن نکنید، برنامههای شخصیتان مسدودند"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"برنامههای شخصی در تاریخ <xliff:g id="DATE">%1$s</xliff:g> ساعت <xliff:g id="TIME">%2$s</xliff:g> مسدود خواهند شد. سرپرست فناوری اطلاعات اجازه نمیدهد نمایه کاری شما بیشتر از <xliff:g id="NUMBER">%3$d</xliff:g> روز خاموش بماند."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"روشن کردن"</string> <string name="me" msgid="6207584824693813140">"من"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"گزینههای رایانهٔ لوحی"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"گزینههای Android TV"</string> @@ -556,7 +554,7 @@ <string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"چهره احراز هویت شد، لطفاً تأیید را فشار دهید"</string> <string name="fingerprint_error_hw_not_available" msgid="4571700896929561202">"سختافزار اثرانگشت در دسترس نیست."</string> <string name="fingerprint_error_no_space" msgid="6126456006769817485">"ذخیره اثر انگشت ممکن نیست. لطفاً یک اثر انگشت موجود را حذف کنید."</string> - <string name="fingerprint_error_timeout" msgid="2946635815726054226">"مهلت زمانی ثبت اثر انگشت به پایان رسید. دوباره امتحان کنید."</string> + <string name="fingerprint_error_timeout" msgid="2946635815726054226">"درنگ ثبت اثر انگشت به پایان رسید. دوباره امتحان کنید."</string> <string name="fingerprint_error_canceled" msgid="540026881380070750">"عملکرد اثر انگشت لغو شد."</string> <string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"کاربر عملیات اثر انگشت را لغو کرد"</string> <string name="fingerprint_error_lockout" msgid="7853461265604738671">"تلاشهای زیادی انجام شده است. بعداً دوباره امتحان کنید."</string> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index e785f0097531..f0ce863c5bb8 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"<xliff:g id="OWNER_APP">%s</xliff:g> on poistanut tulostuksen käytöstä."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Laita työprofiilisi päälle"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Henkilökohtaiset sovelluksesi estetään, kunnes laitat työprofiilisi päälle"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Henkilökohtaiset sovellukset estetään <xliff:g id="DATE">%1$s</xliff:g> klo <xliff:g id="TIME">%2$s</xliff:g>. IT-järjestelmänvalvoja ei salli työprofiilisi pysyä pois päältä yli <xliff:g id="NUMBER">%3$d</xliff:g> päivää."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Laita päälle"</string> <string name="me" msgid="6207584824693813140">"Minä"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Tablet-laitteen asetukset"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Android TV ‑vaihtoehdot"</string> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index 804b5c9b00c4..2eba43f5ae7a 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"Impression désactivée par <xliff:g id="OWNER_APP">%s</xliff:g>."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Activer profil professionnel"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Vos applications personnelles sont bloquées jusqu\'à ce que vous activiez votre profil professionnel"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Les applications personnelles seront bloquées le <xliff:g id="DATE">%1$s</xliff:g> à <xliff:g id="TIME">%2$s</xliff:g>. Votre administrateur informatique ne vous autorise pas à laisser votre profil professionnel désactivé pendant plus de <xliff:g id="NUMBER">%3$d</xliff:g> jours."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Activer"</string> <string name="me" msgid="6207584824693813140">"Moi"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Options de la tablette"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Options d\'Android TV"</string> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 410275761404..151f13d5176b 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"Impression désactivée par <xliff:g id="OWNER_APP">%s</xliff:g>."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Activez profil professionnel"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Vos applications personnelles sont bloquées jusqu\'à ce que vous activiez votre profil professionnel"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Les applications personnelles seront bloquées le <xliff:g id="DATE">%1$s</xliff:g> à <xliff:g id="TIME">%2$s</xliff:g>. Votre administrateur informatique ne vous autorise pas à désactiver votre profil professionnel pendant plus de <xliff:g id="NUMBER">%3$d</xliff:g> jours."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Activer"</string> <string name="me" msgid="6207584824693813140">"Moi"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Options de la tablette"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Options Android TV"</string> diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml index bb06173918d7..1a8c129af06f 100644 --- a/core/res/res/values-gl/strings.xml +++ b/core/res/res/values-gl/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"<xliff:g id="OWNER_APP">%s</xliff:g> desactivou a impresión."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Activa o perfil de traballo"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"As túas aplicacións persoais están bloqueadas ata que actives o teu perfil de traballo"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"As aplicacións persoais bloquearanse o <xliff:g id="DATE">%1$s</xliff:g> á seguinte hora: <xliff:g id="TIME">%2$s</xliff:g>. O administrador de TI non permite que o teu perfil de traballo estea desactivado máis de <xliff:g id="NUMBER">%3$d</xliff:g> días."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Activar"</string> <string name="me" msgid="6207584824693813140">"Eu"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Opcións da tableta"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Opcións de Android TV"</string> diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml index ae95949ff3a0..a2317e9e1cad 100644 --- a/core/res/res/values-gu/strings.xml +++ b/core/res/res/values-gu/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"<xliff:g id="OWNER_APP">%s</xliff:g> દ્વારા પ્રિન્ટ કરવાનું બંધ કરાયું છે."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"કાર્યાલયની પ્રોફાઇલ ચાલુ કરો"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"જ્યાં સુધી તમે કાર્યાલયની પ્રોફાઇલ ચાલુ ન કરો ત્યાં સુધી તમારી વ્યક્તિગત ઍપ બ્લૉક કરેલી રહે છે"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"વ્યક્તિગત ઍપને <xliff:g id="DATE">%1$s</xliff:g>ના રોજ <xliff:g id="TIME">%2$s</xliff:g> વાગ્યે બ્લૉક કરવામાં આવશે. તમારા IT વ્યવસ્થાપક તમારી ઑફિસની પ્રોફાઇલને <xliff:g id="NUMBER">%3$d</xliff:g> દિવસ કરતાં વધુ સમય માટે બંધ રાખવાની મંજૂરી આપતા નથી."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"ચાલુ કરો"</string> <string name="me" msgid="6207584824693813140">"હું"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"ટેબ્લેટ વિકલ્પો"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Android TVના વિકલ્પો"</string> @@ -2057,10 +2055,10 @@ <string name="resolver_work_tab" msgid="2690019516263167035">"ઑફિસ"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"વ્યક્તિગત વ્યૂ"</string> <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"ઑફિસ વ્યૂ"</string> - <string name="resolver_cant_share_with_work_apps" msgid="637686613606502219">"આને ઑફિસ માટેની ઍપ સાથે શેર કરી શકતાં નથી"</string> + <string name="resolver_cant_share_with_work_apps" msgid="637686613606502219">"આને ઑફિસ માટેના ઍપ સાથે શેર કરી શકતાં નથી"</string> <string name="resolver_cant_share_with_work_apps_explanation" msgid="3332302070341130545">"તમારા IT વ્યવસ્થાપક તમને તમારી કાર્યાલયની પ્રોફાઇલમાંની ઍપ વડે આ કન્ટેન્ટ શેર કરવાની મંજૂરી આપતા નથી"</string> <string name="resolver_cant_access_work_apps" msgid="2455757966397563223">"ઑફિસ માટેની ઍપ વડે આને ખોલી શકતાં નથી"</string> - <string name="resolver_cant_access_work_apps_explanation" msgid="3626983885525445790">"તમારા IT વ્યવસ્થાપક તમને તમારી કાર્યાલયની પ્રોફાઇલમાંની ઍપ વડે આ કન્ટેન્ટ ખોલવાની મંજૂરી આપતા નથી"</string> + <string name="resolver_cant_access_work_apps_explanation" msgid="3626983885525445790">"તમારા IT વ્યવસ્થાપક તમને તમારી ઑફિસની પ્રોફાઇલમાંની ઍપ વડે આ કન્ટેન્ટ ખોલવાની મંજૂરી આપતા નથી"</string> <string name="resolver_cant_share_with_personal_apps" msgid="3079139799233316203">"આને વ્યક્તિગત ઍપ સાથે શેર કરી શકતાં નથી"</string> <string name="resolver_cant_share_with_personal_apps_explanation" msgid="2959282422751315171">"તમારા IT વ્યવસ્થાપક તમને તમારી વ્યક્તિગત પ્રોફાઇલમાંની ઍપ વડે આ કન્ટેન્ટ શેર કરવાની મંજૂરી આપતા નથી"</string> <string name="resolver_cant_access_personal_apps" msgid="648291604475669395">"વ્યક્તિગત ઍપ વડે આને ખોલી શકતાં નથી"</string> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index 6fd163153b0e..0890ae13e421 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"<xliff:g id="OWNER_APP">%s</xliff:g> ने प्रिंटिंग सुविधा बंद कर दी है."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"अपनी वर्क प्रोफ़ाइल चालू करें"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"निजी ऐप्लिकेशन अनब्लॉक करने के लिए, अपनी वर्क प्रोफ़ाइल चालू करें"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"निजी ऐप्लिकेशन <xliff:g id="DATE">%1$s</xliff:g> को <xliff:g id="TIME">%2$s</xliff:g> पर ब्लॉक कर दिए जाएंगे. आपका आईटी एडमिन आपकी वर्क प्रोफ़ाइल को <xliff:g id="NUMBER">%3$d</xliff:g> दिन से ज़्यादा बंद रखने की अनुमति नहीं देता."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"चालू करें"</string> <string name="me" msgid="6207584824693813140">"मैं"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"टैबलेट विकल्प"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Android TV डिवाइस में फ़ोन से जुड़े विकल्प"</string> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index c7ec2be91752..17f40f15bbe3 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -204,10 +204,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"Ispis je onemogućila aplikacija <xliff:g id="OWNER_APP">%s</xliff:g>."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Uključite poslovni profil"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Vaše su osobne aplikacije blokirane dok ne uključite poslovni profil"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Osobne aplikacije blokirat će se <xliff:g id="DATE">%1$s</xliff:g> u <xliff:g id="TIME">%2$s</xliff:g>. Vaš IT administrator ne dopušta da vaš poslovni profil ostane isključen dulje od <xliff:g id="NUMBER">%3$d</xliff:g> dana."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Uključi"</string> <string name="me" msgid="6207584824693813140">"Ja"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Opcije tabletnog uređaja"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Opcije Android TV-a"</string> @@ -1150,7 +1148,7 @@ <string name="whichViewApplication" msgid="5733194231473132945">"Otvaranje pomoću aplikacije"</string> <string name="whichViewApplicationNamed" msgid="415164730629690105">"Otvaranje pomoću aplikacije %1$s"</string> <string name="whichViewApplicationLabel" msgid="7367556735684742409">"Otvori"</string> - <string name="whichOpenHostLinksWith" msgid="7645631470199397485">"Otvaranje veza s <xliff:g id="HOST">%1$s</xliff:g> u aplikaciji"</string> + <string name="whichOpenHostLinksWith" msgid="7645631470199397485">"Otvaranje veza sa stranice <xliff:g id="HOST">%1$s</xliff:g> u aplikaciji"</string> <string name="whichOpenLinksWith" msgid="1120936181362907258">"Otvaranje veza u aplikaciji"</string> <string name="whichOpenLinksWithApp" msgid="6917864367861910086">"Otvaranje veza u aplikaciji <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> <string name="whichOpenHostLinksWithApp" msgid="2401668560768463004">"Otvaranje veza s <xliff:g id="HOST">%1$s</xliff:g> u aplikaciji <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> @@ -2091,14 +2089,14 @@ <string name="resolver_work_tab" msgid="2690019516263167035">"Posao"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Osobni prikaz"</string> <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Poslovni prikaz"</string> - <string name="resolver_cant_share_with_work_apps" msgid="637686613606502219">"To se ne može dijeliti pomoću poslovnih aplikacija"</string> - <string name="resolver_cant_share_with_work_apps_explanation" msgid="3332302070341130545">"Vaš IT administrator ne dopušta vam dijeljenje tog sadržaja pomoću aplikacija s vašeg poslovnog profila"</string> - <string name="resolver_cant_access_work_apps" msgid="2455757966397563223">"To se ne može otvoriti pomoću poslovnih aplikacija"</string> - <string name="resolver_cant_access_work_apps_explanation" msgid="3626983885525445790">"Vaš IT administrator ne dopušta vam otvaranje tog sadržaja pomoću aplikacija s vašeg poslovnog profila"</string> + <string name="resolver_cant_share_with_work_apps" msgid="637686613606502219">"Nije moguće dijeljenje s poslovnim aplikacijama"</string> + <string name="resolver_cant_share_with_work_apps_explanation" msgid="3332302070341130545">"Vaš IT administrator ne dopušta vam dijeljenje tog sadržaja s aplikacijama na vašem poslovnom profilu"</string> + <string name="resolver_cant_access_work_apps" msgid="2455757966397563223">"Nije moguće otvaranje pomoću poslovnih aplikacija"</string> + <string name="resolver_cant_access_work_apps_explanation" msgid="3626983885525445790">"Vaš IT administrator ne dopušta vam otvaranje tog sadržaja pomoću aplikacija na vašem poslovnom profilu"</string> <string name="resolver_cant_share_with_personal_apps" msgid="3079139799233316203">"To se ne može dijeliti pomoću osobnih aplikacija"</string> <string name="resolver_cant_share_with_personal_apps_explanation" msgid="2959282422751315171">"Vaš IT administrator ne dopušta vam dijeljenje tog sadržaja pomoću aplikacija s vašeg osobnog profila"</string> - <string name="resolver_cant_access_personal_apps" msgid="648291604475669395">"To se ne može otvoriti pomoću osobnih aplikacija"</string> - <string name="resolver_cant_access_personal_apps_explanation" msgid="2298773629302296519">"Vaš IT administrator ne dopušta vam otvaranje tog sadržaja pomoću aplikacija s vašeg osobnog profila"</string> + <string name="resolver_cant_access_personal_apps" msgid="648291604475669395">"Nije moguće otvaranje pomoću osobnih aplikacija"</string> + <string name="resolver_cant_access_personal_apps_explanation" msgid="2298773629302296519">"Vaš IT administrator ne dopušta vam otvaranje tog sadržaja pomoću aplikacija na vašem osobnom profilu"</string> <string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Poslovni je profil pauziran"</string> <string name="resolver_switch_on_work" msgid="2873009160846966379">"Uključi"</string> <string name="resolver_no_work_apps_available_share" msgid="7933949011797699505">"Nijedna poslovna aplikacija ne može podržati taj sadržaj"</string> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index 29bb05250ece..302dc6925085 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"A(z) <xliff:g id="OWNER_APP">%s</xliff:g> letiltotta a nyomtatást."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Munkaprofil bekapcsolása"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"A személyes alkalmazások le lesznek tiltva, amíg be nem kapcsolja a munkaprofilt"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"A rendszer a következő időpontban letiltja a személyes alkalmazásokat: <xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>. Rendszergazdája nem engedélyezi, hogy a munkaprofil <xliff:g id="NUMBER">%3$d</xliff:g> napnál tovább kikapcsolva legyen."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Bekapcsolás"</string> <string name="me" msgid="6207584824693813140">"Saját"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Táblagép beállításai"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Android TV beállításai"</string> diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml index ad5ae22a0f38..1fb9a62025bb 100644 --- a/core/res/res/values-hy/strings.xml +++ b/core/res/res/values-hy/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"Տպումն անջատված է <xliff:g id="OWNER_APP">%s</xliff:g> հավելվածի կողմից։"</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Միացրեք աշխատանքային պորֆիլը"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Անձնական հավելվածներն արգելափակված կլինեն, մինչև չմիացնեք ձեր աշխատանքային պրոֆիլը"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Անձնական հավելվածները <xliff:g id="DATE">%1$s</xliff:g>-ին ժամը <xliff:g id="TIME">%2$s</xliff:g> կարգելափակվեն։ Ձեր ՏՏ ադմինիստրատորը չի թույլատրում, որ ձեր աշխատանքային պրոֆիլը <xliff:g id="NUMBER">%3$d</xliff:g> օրից ավել անջատված մնա։"</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Միացնել"</string> <string name="me" msgid="6207584824693813140">"Իմ"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Պլանշետի ընտրանքները"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Android TV-ի կարգավորումներ"</string> @@ -1131,7 +1129,7 @@ <string name="whichViewApplicationNamed" msgid="415164730629690105">"Բացել հավելվածով՝ %1$s"</string> <string name="whichViewApplicationLabel" msgid="7367556735684742409">"Բացել"</string> <string name="whichOpenHostLinksWith" msgid="7645631470199397485">"<xliff:g id="HOST">%1$s</xliff:g> տեսակի հղումները բացել…"</string> - <string name="whichOpenLinksWith" msgid="1120936181362907258">"Հղումները բացել…"</string> + <string name="whichOpenLinksWith" msgid="1120936181362907258">"Հղումները բացել այս հավելվածով…"</string> <string name="whichOpenLinksWithApp" msgid="6917864367861910086">"Հղումները բացել <xliff:g id="APPLICATION">%1$s</xliff:g> դիտարկիչում"</string> <string name="whichOpenHostLinksWithApp" msgid="2401668560768463004">"<xliff:g id="HOST">%1$s</xliff:g> տեսակի հղումները բացել <xliff:g id="APPLICATION">%2$s</xliff:g> դիտարկիչում"</string> <string name="whichGiveAccessToApplicationLabel" msgid="7805857277166106236">"Թույլատրել"</string> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index f031ed8e5ea2..9fbd73ea1269 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"Fitur pencetakan dinonaktifkan oleh <xliff:g id="OWNER_APP">%s</xliff:g>."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Aktifkan profil kerja Anda"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Aplikasi pribadi Anda diblokir hingga Anda mengaktifkan profil kerja Anda"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Aplikasi pribadi akan diblokir pada tanggal <xliff:g id="DATE">%1$s</xliff:g> pukul <xliff:g id="TIME">%2$s</xliff:g>. Admin IT tidak mengizinkan profil kerja Anda nonaktif selama lebih dari <xliff:g id="NUMBER">%3$d</xliff:g> hari."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Aktifkan"</string> <string name="me" msgid="6207584824693813140">"Saya"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Opsi tablet"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Opsi Android TV"</string> @@ -1901,7 +1899,7 @@ <string name="profile_encrypted_title" msgid="9001208667521266472">"Beberapa fitur tidak dapat digunakan"</string> <string name="profile_encrypted_detail" msgid="5279730442756849055">"Profil kerja terkunci"</string> <string name="profile_encrypted_message" msgid="1128512616293157802">"Ketuk untuk membuka kunci profil kerja"</string> - <string name="usb_mtp_launch_notification_title" msgid="774319638256707227">"Tersambung ke <xliff:g id="PRODUCT_NAME">%1$s</xliff:g>"</string> + <string name="usb_mtp_launch_notification_title" msgid="774319638256707227">"Terhubung ke <xliff:g id="PRODUCT_NAME">%1$s</xliff:g>"</string> <string name="usb_mtp_launch_notification_description" msgid="6942535713629852684">"Ketuk untuk melihat file"</string> <string name="pin_target" msgid="8036028973110156895">"Pasang pin"</string> <string name="pin_specific_target" msgid="7824671240625957415">"Pasang pin <xliff:g id="LABEL">%1$s</xliff:g>"</string> diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml index c16e1d11608d..82d6206ab625 100644 --- a/core/res/res/values-is/strings.xml +++ b/core/res/res/values-is/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"<xliff:g id="OWNER_APP">%s</xliff:g> lokaði á prentun."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Kveiktu á vinnusniði"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Lokað er á forrit til einkanota þar til þú kveikir á vinnusniði"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Lokað verður á forrit til einkanota <xliff:g id="DATE">%1$s</xliff:g> kl. <xliff:g id="TIME">%2$s</xliff:g>. Kerfisstjórinn þinn leyfir ekki að slökkt sé á vinnusniðinu í meira en <xliff:g id="NUMBER">%3$d</xliff:g> daga."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Kveikja"</string> <string name="me" msgid="6207584824693813140">"Ég"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Valkostir spjaldtölvu"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Valkostir Android TV"</string> @@ -2032,7 +2030,7 @@ <item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> skrá</item> <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> skrá</item> </plurals> - <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Engar tillögur um einstaklinga til að deila með"</string> + <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Engar tillögur um fólk til að deila með"</string> <string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Forritalisti"</string> <string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Þetta forrit hefur ekki fengið heimild fyrir upptöku en gæti tekið upp hljóð í gegnum þetta USB-tæki."</string> <string name="accessibility_system_action_home_label" msgid="3234748160850301870">"Heim"</string> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 61983db358c3..b6a850d10fef 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"Stampa disattivata da <xliff:g id="OWNER_APP">%s</xliff:g>."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Attiva il profilo di lavoro"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Le tue app personali sono bloccate fino all\'attivazione del tuo profilo di lavoro"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Le app personali verranno bloccate il giorno <xliff:g id="DATE">%1$s</xliff:g> alle ore <xliff:g id="TIME">%2$s</xliff:g>. L\'amministratore IT non consente di mantenere disattivato il profilo di lavoro per più di <xliff:g id="NUMBER">%3$d</xliff:g> giorni."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Attiva"</string> <string name="me" msgid="6207584824693813140">"Io"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Opzioni tablet"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Opzioni Android TV"</string> @@ -2057,10 +2055,10 @@ <string name="resolver_work_tab" msgid="2690019516263167035">"Lavoro"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Visualizzazione personale"</string> <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Visualizzazione di lavoro"</string> - <string name="resolver_cant_share_with_work_apps" msgid="637686613606502219">"Impossibile condividere questi contenuti con app di lavoro"</string> - <string name="resolver_cant_share_with_work_apps_explanation" msgid="3332302070341130545">"L\'amministratore IT non ti consente di condividere questi contenuti con app nel tuo profilo di lavoro"</string> - <string name="resolver_cant_access_work_apps" msgid="2455757966397563223">"Impossibile aprire questi contenuti con app di lavoro"</string> - <string name="resolver_cant_access_work_apps_explanation" msgid="3626983885525445790">"L\'amministratore IT non ti consente di aprire questi contenuti con app nel tuo profilo di lavoro"</string> + <string name="resolver_cant_share_with_work_apps" msgid="637686613606502219">"Impossibile condividere questi contenuti con le app di lavoro"</string> + <string name="resolver_cant_share_with_work_apps_explanation" msgid="3332302070341130545">"L\'amministratore IT non ti consente di condividere questi contenuti con le app nel tuo profilo di lavoro"</string> + <string name="resolver_cant_access_work_apps" msgid="2455757966397563223">"Impossibile aprire questi contenuti con le app di lavoro"</string> + <string name="resolver_cant_access_work_apps_explanation" msgid="3626983885525445790">"L\'amministratore IT non ti consente di aprire questi contenuti con le app nel tuo profilo di lavoro"</string> <string name="resolver_cant_share_with_personal_apps" msgid="3079139799233316203">"Impossibile condividere questi contenuti con app personali"</string> <string name="resolver_cant_share_with_personal_apps_explanation" msgid="2959282422751315171">"L\'amministratore IT non ti consente di condividere questi contenuti con app nel tuo profilo personale"</string> <string name="resolver_cant_access_personal_apps" msgid="648291604475669395">"Impossibile aprire questi contenuti con app personali"</string> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index 92bde45559d8..10d3f4383069 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -206,10 +206,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"ההדפסה הושבתה על ידי <xliff:g id="OWNER_APP">%s</xliff:g>."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"הפעלה של פרופיל העבודה שלך"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"האפליקציות שלך לשימוש אישי יהיו חסומות עד להפעלת פרופיל העבודה"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"אפליקציות לשימוש אישי ייחסמו ב-<xliff:g id="DATE">%1$s</xliff:g> בשעה <xliff:g id="TIME">%2$s</xliff:g>. מנהל ה-IT לא מתיר השבתה של יותר מ-<xliff:g id="NUMBER">%3$d</xliff:g> ימים של פרופיל העבודה."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"הפעלה"</string> <string name="me" msgid="6207584824693813140">"אני"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"אפשרויות טאבלט"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"אפשרויות Android TV"</string> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index 540f01f5e1b1..7f27e648b4d7 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"「<xliff:g id="OWNER_APP">%s</xliff:g>」により印刷は無効にされています。"</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"仕事用プロファイルを ON にする"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"個人用アプリは、仕事用プロファイルを ON にしない限りブロックされます"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"個人用アプリは、<xliff:g id="DATE">%1$s</xliff:g> <xliff:g id="TIME">%2$s</xliff:g> にブロックされます。仕事用プロファイルを <xliff:g id="NUMBER">%3$d</xliff:g> 日を超えて OFF にすることは、IT 管理者から許可されていません。"</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"ON にする"</string> <string name="me" msgid="6207584824693813140">"自分"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"タブレットオプション"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Android TV のオプション"</string> @@ -1550,7 +1548,7 @@ <string name="launchBrowserDefault" msgid="6328349989932924119">"ブラウザを起動しますか?"</string> <string name="SetupCallDefault" msgid="5581740063237175247">"通話を受けますか?"</string> <string name="activity_resolver_use_always" msgid="5575222334666843269">"常時"</string> - <string name="activity_resolver_use_once" msgid="948462794469672658">"1回のみ"</string> + <string name="activity_resolver_use_once" msgid="948462794469672658">"1 回のみ"</string> <string name="activity_resolver_work_profiles_support" msgid="4071345609235361269">"%1$sは仕事用プロファイルをサポートしていません"</string> <string name="default_audio_route_name" product="tablet" msgid="367936735632195517">"タブレット"</string> <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"テレビ"</string> diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml index 41d42e7733b5..ed31a1cd3bed 100644 --- a/core/res/res/values-ka/strings.xml +++ b/core/res/res/values-ka/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"ბეჭდვა გათიშულია <xliff:g id="OWNER_APP">%s</xliff:g>-ის მიერ."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"ჩართეთ სამსახურის პროფილი"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"თქვენი პირადი აპები დაბლოკილი იქნება, სანამ სამსახურის პროფილს არ ჩართავთ"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"პირადი აპები დაიბლოკება: <xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>. თქვენი IT ადმინისტრატორი თქვენს სამსახურის პროფილს არ აძლევს უფლებას, გამორთული იყოს <xliff:g id="NUMBER">%3$d</xliff:g> დღეზე მეტ ხანს."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"ჩართვა"</string> <string name="me" msgid="6207584824693813140">"მე"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"ტაბლეტის პარამეტრები"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Android TV ვარიანტები"</string> diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml index 7cee31ab6ea7..07579ad0ae0f 100644 --- a/core/res/res/values-kk/strings.xml +++ b/core/res/res/values-kk/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"Басып шығаруды <xliff:g id="OWNER_APP">%s</xliff:g> өшірді."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Жұмыс профиліңізді қосыңыз"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Жұмыс профиліңізді қоспайынша, жеке қолданбалар бөгеледі."</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Жеке қолданбалардың бөгелетін уақыты: <xliff:g id="DATE">%1$s</xliff:g>, сағат <xliff:g id="TIME">%2$s</xliff:g>. Әкімші жұмыс профилін <xliff:g id="NUMBER">%3$d</xliff:g> күннен аса мерзімге өшіруге рұқсат бермейді."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Қосу"</string> <string name="me" msgid="6207584824693813140">"Мен"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Планшет опциялары"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Android TV опциялары"</string> diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml index 5161fdc65446..4fd0338b1f63 100644 --- a/core/res/res/values-km/strings.xml +++ b/core/res/res/values-km/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"ការបោះពុម្ពត្រូវបានបិទដោយ <xliff:g id="OWNER_APP">%s</xliff:g> ។"</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"បើកកម្រងព័ត៌មានការងាររបស់អ្នក"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"កម្មវិធីផ្ទាល់ខ្លួនរបស់អ្នកត្រូវបានទប់ស្កាត់ រហូតទាល់តែអ្នកបើកកម្រងព័ត៌មានការងាររបស់អ្នក"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"កម្មវិធីផ្ទាល់ខ្លួននឹងត្រូវបានទប់ស្កាត់នៅថ្ងៃទី <xliff:g id="DATE">%1$s</xliff:g> នៅម៉ោង <xliff:g id="TIME">%2$s</xliff:g>។ អ្នកគ្រប់គ្រងផ្នែកព័ត៌មានវិទ្យារបស់អ្នកមិនអនុញ្ញាតឱ្យបន្តបិទកម្រងព័ត៌មានការងាររបស់អ្នកលើសពី <xliff:g id="NUMBER">%3$d</xliff:g> ថ្ងៃទេ។"</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"បើក"</string> <string name="me" msgid="6207584824693813140">"ខ្ញុំ"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"ជម្រើសកុំព្យូទ័របន្ទះ"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"ជម្រើស Android TV"</string> @@ -1132,10 +1130,10 @@ <string name="whichViewApplication" msgid="5733194231473132945">"បើកជាមួយ"</string> <string name="whichViewApplicationNamed" msgid="415164730629690105">"បើកជាមួយ %1$s"</string> <string name="whichViewApplicationLabel" msgid="7367556735684742409">"បើក"</string> - <string name="whichOpenHostLinksWith" msgid="7645631470199397485">"បើកតំណ <xliff:g id="HOST">%1$s</xliff:g> ជាមួយ"</string> - <string name="whichOpenLinksWith" msgid="1120936181362907258">"បើកតំណជាមួយ"</string> - <string name="whichOpenLinksWithApp" msgid="6917864367861910086">"បើកតំណជាមួយ <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> - <string name="whichOpenHostLinksWithApp" msgid="2401668560768463004">"បើកតំណ <xliff:g id="HOST">%1$s</xliff:g> ជាមួយ <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <string name="whichOpenHostLinksWith" msgid="7645631470199397485">"បើកតំណ <xliff:g id="HOST">%1$s</xliff:g> ដោយប្រើ"</string> + <string name="whichOpenLinksWith" msgid="1120936181362907258">"បើកតំណដោយប្រើ"</string> + <string name="whichOpenLinksWithApp" msgid="6917864367861910086">"បើកតំណដោយប្រើ <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="2401668560768463004">"បើកតំណ <xliff:g id="HOST">%1$s</xliff:g> ដោយប្រើ <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="7805857277166106236">"ផ្តល់សិទ្ធិចូលប្រើ"</string> <string name="whichEditApplication" msgid="6191568491456092812">"កែសម្រួលជាមួយ"</string> <string name="whichEditApplicationNamed" msgid="8096494987978521514">"កែសម្រួលជាមួយ %1$s"</string> diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml index 25aa3b5eaf94..a1060808172a 100644 --- a/core/res/res/values-kn/strings.xml +++ b/core/res/res/values-kn/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"<xliff:g id="OWNER_APP">%s</xliff:g> ಮೂಲಕ ಪ್ರಿಂಟಿಂಗ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್ ಸಕ್ರಿಯಗೊಳಿಸಿ"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"ನಿಮ್ಮ ಉದ್ಯೋಗದ ಪ್ರೊಫೈಲ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುವವರೆಗೆ ನಿಮ್ಮ ವೈಯಕ್ತಿಕ ಆ್ಯಪ್ಗಳನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗುತ್ತದೆ"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"ವೈಯಕ್ತಿಕ ಆ್ಯಪ್ಗಳನ್ನು <xliff:g id="DATE">%1$s</xliff:g> ರಂದು <xliff:g id="TIME">%2$s</xliff:g> ಸಮಯಕ್ಕೆ ನಿರ್ಬಂಧಿಸಲಾಗುತ್ತದೆ. ನಿಮ್ಮ ಐಟಿ ನಿರ್ವಾಹಕರು ನಿಮ್ಮ ಕೆಲಸದ ಪ್ರೊಫೈಲ್ ಅನ್ನು <xliff:g id="NUMBER">%3$d</xliff:g> ದಿನಗಳಿಗಿಂತ ಹೆಚ್ಚು ಕಾಲ ಉಳಿಯಲು ಅನುಮತಿಸುವುದಿಲ್ಲ."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"ಆನ್"</string> <string name="me" msgid="6207584824693813140">"ನಾನು"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"ಟ್ಯಾಬ್ಲೆಟ್ ಆಯ್ಕೆಗಳು"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Android TV ಆಯ್ಕೆಗಳು"</string> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index 87ed01943aa8..0fe5925e3e25 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"<xliff:g id="OWNER_APP">%s</xliff:g>에 의해 사용 중지되었습니다."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"직장 프로필 사용 설정"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"직장 프로필을 사용 설정할 때까지 개인 앱이 차단됩니다."</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"개인 앱이 <xliff:g id="DATE">%1$s</xliff:g> <xliff:g id="TIME">%2$s</xliff:g>에 차단됩니다. IT 관리자가 <xliff:g id="NUMBER">%3$d</xliff:g>일 넘게 직장 프로필을 중지하도록 허용하지 않습니다."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"사용 설정"</string> <string name="me" msgid="6207584824693813140">"나"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"태블릿 옵션"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Android TV 옵션"</string> @@ -2057,10 +2055,10 @@ <string name="resolver_work_tab" msgid="2690019516263167035">"직장"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"개인 뷰"</string> <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"직장 뷰"</string> - <string name="resolver_cant_share_with_work_apps" msgid="637686613606502219">"직장 앱과 공유할 수 없는 콘텐츠"</string> - <string name="resolver_cant_share_with_work_apps_explanation" msgid="3332302070341130545">"IT 관리자가 직장 프로필의 앱에서 이 콘텐츠를 공유하도록 허용하지 않습니다."</string> - <string name="resolver_cant_access_work_apps" msgid="2455757966397563223">"직장 앱으로 열 수 없는 콘텐츠"</string> - <string name="resolver_cant_access_work_apps_explanation" msgid="3626983885525445790">"IT 관리자가 직장 프로필의 앱에서 이 콘텐츠를 열도록 허용하지 않습니다."</string> + <string name="resolver_cant_share_with_work_apps" msgid="637686613606502219">"직장 앱과 공유할 수 없음"</string> + <string name="resolver_cant_share_with_work_apps_explanation" msgid="3332302070341130545">"IT 관리자가 이 콘텐츠를 직장 프로필의 앱과 공유할 수 있도록 허용하지 않았습니다."</string> + <string name="resolver_cant_access_work_apps" msgid="2455757966397563223">"직장 앱으로 열 수 없음"</string> + <string name="resolver_cant_access_work_apps_explanation" msgid="3626983885525445790">"IT 관리자가 이 콘텐츠를 직장 프로필의 앱에서 열 수 있도록 허용하지 않았습니다."</string> <string name="resolver_cant_share_with_personal_apps" msgid="3079139799233316203">"개인 앱과 공유할 수 없는 콘텐츠"</string> <string name="resolver_cant_share_with_personal_apps_explanation" msgid="2959282422751315171">"IT 관리자가 개인 프로필의 앱에서 이 콘텐츠를 공유하도록 허용하지 않습니다."</string> <string name="resolver_cant_access_personal_apps" msgid="648291604475669395">"개인 앱으로 열 수 없는 콘텐츠"</string> diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml index e3cdec901b26..dbbc14f706c0 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"Басып чыгаруу <xliff:g id="OWNER_APP">%s</xliff:g> тарабынан өчүрүлдү."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Жумуш профилиңизди күйгүзүңүз"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Жумуш профилиңизди күйгүзмөйүнчө жеке колдонмолоруңуз бөгөттөлгөн боюнча калат"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Жеке колдонмолор <xliff:g id="DATE">%1$s</xliff:g> саат <xliff:g id="TIME">%2$s</xliff:g> бөгөттөлөт. IT администраторуңуз жумуш профилиңизди <xliff:g id="NUMBER">%3$d</xliff:g> күндөн ашык убакытка өчүрүүгө уруксат бербейт."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Күйгүзүү"</string> <string name="me" msgid="6207584824693813140">"Мен"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Планшет мүмкүнчүлүктөрү"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Android TV параметрлери"</string> @@ -2057,18 +2055,18 @@ <string name="resolver_work_tab" msgid="2690019516263167035">"Жумуш"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Жеке көрүнүш"</string> <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Жумуш көрүнүшү"</string> - <string name="resolver_cant_share_with_work_apps" msgid="637686613606502219">"Бул мазмунду жумуш колдонмолору аркылуу бөлүшүүгө болбойт"</string> - <string name="resolver_cant_share_with_work_apps_explanation" msgid="3332302070341130545">"IT администраторуңуз бул мазмунду жумуш профилиңиздеги колдонмолор аркылуу бөлүшүүгө тыюу салды"</string> + <string name="resolver_cant_share_with_work_apps" msgid="637686613606502219">"Бул нерсени жумуш колдонмолору аркылуу бөлүшүүгө болбойт"</string> + <string name="resolver_cant_share_with_work_apps_explanation" msgid="3332302070341130545">"IT администраторуңуз бул нерсени жумуш профилиңиздеги колдонмолор аркылуу бөлүшүүгө тыюу салды"</string> <string name="resolver_cant_access_work_apps" msgid="2455757966397563223">"Жумуш колдонмолору менен ачууга болбойт"</string> - <string name="resolver_cant_access_work_apps_explanation" msgid="3626983885525445790">"IT администраторуңуз бул мазмунду жумуш профилиңиздеги колдонмолор менен ачууга тыюу салды"</string> + <string name="resolver_cant_access_work_apps_explanation" msgid="3626983885525445790">"IT администраторуңуз бул нерсени жумуш профилиңиздеги колдонмолор менен ачууга тыюу салды"</string> <string name="resolver_cant_share_with_personal_apps" msgid="3079139799233316203">"Бул мазмунду жеке колдонмолор аркылуу бөлүшүүгө болбойт"</string> - <string name="resolver_cant_share_with_personal_apps_explanation" msgid="2959282422751315171">"IT администраторуңуз бул мазмунду жеке профилиңиздеги колдонмолор аркылуу бөлүшүүгө тыюу салды"</string> + <string name="resolver_cant_share_with_personal_apps_explanation" msgid="2959282422751315171">"IT администраторуңуз бул нерсени жеке профилиңиздеги колдонмолор аркылуу бөлүшүүгө тыюу салды"</string> <string name="resolver_cant_access_personal_apps" msgid="648291604475669395">"Жеке колдонмолор менен ачууга болбойт"</string> - <string name="resolver_cant_access_personal_apps_explanation" msgid="2298773629302296519">"IT администраторуңуз бул мазмунду жеке профилиңиздеги колдонмолор менен ачууга тыюу салды"</string> + <string name="resolver_cant_access_personal_apps_explanation" msgid="2298773629302296519">"IT администраторуңуз бул нерсени жеке профилиңиздеги колдонмолор менен ачууга тыюу салды"</string> <string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Жумуш профили тындырылган"</string> <string name="resolver_switch_on_work" msgid="2873009160846966379">"Күйгүзүү"</string> - <string name="resolver_no_work_apps_available_share" msgid="7933949011797699505">"Жумуш колдонмолору бул мазмунду колдоого алышпайт"</string> - <string name="resolver_no_work_apps_available_resolve" msgid="1244844292366099399">"Жумуш колдонмолору бул мазмунду ача алышпайт"</string> + <string name="resolver_no_work_apps_available_share" msgid="7933949011797699505">"Бул нерсени колдоого ала турган жумуш колдонмолору жок"</string> + <string name="resolver_no_work_apps_available_resolve" msgid="1244844292366099399">"Бул нерсени ача турган жумуш колдонмолору жок"</string> <string name="resolver_no_personal_apps_available_share" msgid="5639102815174748732">"Жеке колдонмолор бул мазмунду колдоого алышпайт"</string> <string name="resolver_no_personal_apps_available_resolve" msgid="5120671970531446978">"Жеке колдонмолор бул мазмунду ача алышпайт"</string> <string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM карта тармагынын кулпусун ачуучу PIN код"</string> diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml index 521c1b175a22..278237954a53 100644 --- a/core/res/res/values-lo/strings.xml +++ b/core/res/res/values-lo/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"ການພິມຖືກປິດໄວ້ໂດຍ <xliff:g id="OWNER_APP">%s</xliff:g>."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"ເປີດໃຊ້ໂປຣໄຟລ໌ບ່ອນເຮັດວຽກ"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"ແອັບສ່ວນຕົວຂອງທ່ານຈະຖືກບລັອກໄວ້ຈົນກວ່າທ່ານຈະເປີດໃຊ້ໂປຣໄຟລ໌ບ່ອນເຮັດວຽກຂອງທ່ານ"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"ແອັບສ່ວນຕົວຈະຖືກບລັອກໃນວັນທີ <xliff:g id="DATE">%1$s</xliff:g> ເວລາ <xliff:g id="TIME">%2$s</xliff:g>. ຜູ້ເບິ່ງແຍງລະບົບໄອທີຂອງທ່ານບໍ່ອະນຸຍາດໃຫ້ປິດໂປຣໄຟລ໌ບ່ອນເຮັດວຽກຂອງທ່ານເກີນ <xliff:g id="NUMBER">%3$d</xliff:g> ມື້."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"ເປີດໃຊ້"</string> <string name="me" msgid="6207584824693813140">"ຂ້າພະເຈົ້າ"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"ໂຕເລືອກແທັບເລັດ"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"ຕົວເລືອກ Android TV"</string> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index c9c7b54489fd..a0137c165a4b 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -206,10 +206,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"Neleidžiama spausdinti (<xliff:g id="OWNER_APP">%s</xliff:g>)."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Įjunkite darbo profilį"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Asmeninės programos bus užblokuotos, kol įjungsite darbo profilį"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Asmeninės programos bus užblokuotos <xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>. IT administratorius neleidžia palikti darbo profilio išjungto ilgiau nei <xliff:g id="NUMBER">%3$d</xliff:g> d."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Įjungti"</string> <string name="me" msgid="6207584824693813140">"Aš"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Planšetinio kompiuterio parinktys"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"„Android TV“ parinktys"</string> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index b34538d6a18c..09942a99be37 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -204,10 +204,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"Drukāšanu atspējoja <xliff:g id="OWNER_APP">%s</xliff:g>."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Darba profila ieslēgšana"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Jūsu personīgās lietotnes būs bloķētas, līdz ieslēgsiet savu darba profilu."</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Personīgās lietotnes tiks bloķētas šādā datumā: <xliff:g id="DATE">%1$s</xliff:g>, plkst. <xliff:g id="TIME">%2$s</xliff:g>. Jūsu IT administrators neatļauj atspējot darba profilu ilgāk par <xliff:g id="NUMBER">%3$d</xliff:g> dienām."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Ieslēgt"</string> <string name="me" msgid="6207584824693813140">"Man"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Planšetdatora opcijas"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Android TV opcijas"</string> diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml index 45e86e1fe928..bfad9e964b93 100644 --- a/core/res/res/values-mk/strings.xml +++ b/core/res/res/values-mk/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"Печатењето е оневозможено од <xliff:g id="OWNER_APP">%s</xliff:g>."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Вклучете го работниот профил"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Вашите лични апликации се блокирани додека да го вклучите работниот профил"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Личните апликации ќе се блокираат на <xliff:g id="DATE">%1$s</xliff:g> во <xliff:g id="TIME">%2$s</xliff:g>. Вашиот IT администратор не дозволува вашиот работен профил да биде исклучен повеќе од <xliff:g id="NUMBER">%3$d</xliff:g> денови."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Вклучи"</string> <string name="me" msgid="6207584824693813140">"Јас"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Опции на таблет"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Опции на Android TV"</string> @@ -1130,10 +1128,10 @@ <string name="whichViewApplication" msgid="5733194231473132945">"Отвори со"</string> <string name="whichViewApplicationNamed" msgid="415164730629690105">"Отвори со %1$s"</string> <string name="whichViewApplicationLabel" msgid="7367556735684742409">"Отвори"</string> - <string name="whichOpenHostLinksWith" msgid="7645631470199397485">"Отворајте врски на <xliff:g id="HOST">%1$s</xliff:g> со"</string> - <string name="whichOpenLinksWith" msgid="1120936181362907258">"Отворајте врски со"</string> - <string name="whichOpenLinksWithApp" msgid="6917864367861910086">"Отворајте врски со <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> - <string name="whichOpenHostLinksWithApp" msgid="2401668560768463004">"Отворајте врски на <xliff:g id="HOST">%1$s</xliff:g> со <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <string name="whichOpenHostLinksWith" msgid="7645631470199397485">"Отворајте линкови на <xliff:g id="HOST">%1$s</xliff:g> со"</string> + <string name="whichOpenLinksWith" msgid="1120936181362907258">"Отворајте линкови со"</string> + <string name="whichOpenLinksWithApp" msgid="6917864367861910086">"Отворајте линкови со <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="2401668560768463004">"Отворајте линкови на <xliff:g id="HOST">%1$s</xliff:g> со <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="7805857277166106236">"Дозволи пристап"</string> <string name="whichEditApplication" msgid="6191568491456092812">"Измени со"</string> <string name="whichEditApplicationNamed" msgid="8096494987978521514">"Измени со %1$s"</string> diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml index 4b6ce39f46ab..ac32b3cb378d 100644 --- a/core/res/res/values-ml/strings.xml +++ b/core/res/res/values-ml/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"<xliff:g id="OWNER_APP">%s</xliff:g> പ്രിന്റിംഗ് പ്രവർത്തനരഹിതമാക്കി."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"ഔദ്യോഗിക പ്രൊഫൈൽ ഓണാക്കുക"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"നിങ്ങളുടെ ഔദ്യോഗിക പ്രൊഫൈൽ ഓണാക്കുന്നത് വരെ നിങ്ങളുടെ വ്യക്തിപരമായ ആപ്പുകൾ ബ്ലോക്കായിരിക്കും"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"വ്യക്തിപര ആപ്പുകൾ <xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>-ന് ബ്ലോക്ക് ചെയ്യപ്പെടും. നിങ്ങളുടെ ഔദ്യോഗിക പ്രൊഫൈൽ <xliff:g id="NUMBER">%3$d</xliff:g> ദിവസത്തിൽ കൂടുതൽ ഓഫായ നിലയിൽ തുടരാൻ നിങ്ങളുടെ ഐടി അഡ്മിൻ അനുവദിക്കുന്നില്ല."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"ഓണാക്കുക"</string> <string name="me" msgid="6207584824693813140">"ഞാന്"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"ടാബ്ലെറ്റ് ഓപ്ഷനുകൾ"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Android ടിവി ഓപ്ഷനുകൾ"</string> diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml index 40a57be65804..2877e8009407 100644 --- a/core/res/res/values-mn/strings.xml +++ b/core/res/res/values-mn/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"<xliff:g id="OWNER_APP">%s</xliff:g> хэвлэх үйлдлийг идэвхгүй болгосон."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Ажлын профайлаа асаах"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Та ажлын профайлыг асаах хүртэл таны хувийн аппуудыг хориглосон"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Хувийн аппуудыг <xliff:g id="DATE">%1$s</xliff:g>-н <xliff:g id="TIME">%2$s</xliff:g>-д блоклоно. Таны IT админ таны ажлын профайлыг <xliff:g id="NUMBER">%3$d</xliff:g>-с олон хоног унтраалттай байхыг зөвшөөрдөггүй."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Асаах"</string> <string name="me" msgid="6207584824693813140">"Би"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Таблетын сонголтууд"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Android ТВ-н сонголт"</string> diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml index a5a0f9e587ec..f2bec3160830 100644 --- a/core/res/res/values-mr/strings.xml +++ b/core/res/res/values-mr/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"<xliff:g id="OWNER_APP">%s</xliff:g> नी प्रिंट करणे बंद केले आहे."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"तुमची कार्य प्रोफाइल सुरू करा"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"तुम्ही तुमची कार्य प्रोफाइल सुरू करेपर्यंत तुमची वैयक्तिक ॲप्स ब्लॉक केली आहेत"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"वैयक्तिक ॲप्स <xliff:g id="DATE">%1$s</xliff:g> रोजी <xliff:g id="TIME">%2$s</xliff:g> वाजता ब्लॉक केली जातील. तुमचा आयटी अॅडमिन तुमची कार्य प्रोफाइल <xliff:g id="NUMBER">%3$d</xliff:g> पेक्षा जास्त दिवसांसाठी बंद ठेवण्याची अनुमती देत नाही."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"सुरू करा"</string> <string name="me" msgid="6207584824693813140">"मी"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"टॅबलेट पर्याय"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Android TV पर्याय"</string> @@ -1131,7 +1129,7 @@ <string name="whichViewApplicationNamed" msgid="415164730629690105">"%1$s सह उघडा"</string> <string name="whichViewApplicationLabel" msgid="7367556735684742409">"उघडा"</string> <string name="whichOpenHostLinksWith" msgid="7645631470199397485">"वापरून <xliff:g id="HOST">%1$s</xliff:g> लिंक उघडा"</string> - <string name="whichOpenLinksWith" msgid="1120936181362907258">"वापरून लिंक उघडा"</string> + <string name="whichOpenLinksWith" msgid="1120936181362907258">"हे वापरून लिंक उघडा"</string> <string name="whichOpenLinksWithApp" msgid="6917864367861910086">"<xliff:g id="APPLICATION">%1$s</xliff:g> वापरून लिंक उघडा"</string> <string name="whichOpenHostLinksWithApp" msgid="2401668560768463004">"<xliff:g id="APPLICATION">%2$s</xliff:g> वापरून <xliff:g id="HOST">%1$s</xliff:g> लिंक उघडा"</string> <string name="whichGiveAccessToApplicationLabel" msgid="7805857277166106236">"अॅक्सेस द्या"</string> @@ -2054,21 +2052,21 @@ <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"गट संभाषण"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> <string name="resolver_personal_tab" msgid="2051260504014442073">"वैयक्तिक"</string> - <string name="resolver_work_tab" msgid="2690019516263167035">"ऑफिस"</string> + <string name="resolver_work_tab" msgid="2690019516263167035">"कार्य"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"वैयक्तिक दृश्य"</string> <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"कार्य दृश्य"</string> - <string name="resolver_cant_share_with_work_apps" msgid="637686613606502219">"हे ऑफिस ॲप्ससोबत शेअर करू शकत नाही"</string> + <string name="resolver_cant_share_with_work_apps" msgid="637686613606502219">"हे कार्य ॲप्ससोबत शेअर करू शकत नाही"</string> <string name="resolver_cant_share_with_work_apps_explanation" msgid="3332302070341130545">"तुमचा IT अॅडमिन तुम्हाला हा आशय तुमच्या ऑफिस प्रोफाइलमधील अॅप्ससोबत शेअर करू देत नाही"</string> <string name="resolver_cant_access_work_apps" msgid="2455757966397563223">"हे ऑफिस अॅप्ससोबत उघडू शकत नाही"</string> - <string name="resolver_cant_access_work_apps_explanation" msgid="3626983885525445790">"तुमचा IT अॅडमिन तुम्हाला हा आशय तुमच्या ऑफिस प्रोफाइलमधील अॅप्ससोबत उघडू देत नाही"</string> + <string name="resolver_cant_access_work_apps_explanation" msgid="3626983885525445790">"तुमचा IT अॅडमिन तुम्हाला हा आशय तुमच्या कार्य प्रोफाइलमधील अॅप्सनी उघडू देत नाही"</string> <string name="resolver_cant_share_with_personal_apps" msgid="3079139799233316203">"हे वैयक्तिक अॅप्ससोबत शेअर करू शकत नाही"</string> <string name="resolver_cant_share_with_personal_apps_explanation" msgid="2959282422751315171">"तुमचा IT अॅडमिन तुम्हाला हा आशय तुमच्या वैयक्तिक प्रोफाइलमधील अॅप्ससोबत शेअर करू देत नाही"</string> <string name="resolver_cant_access_personal_apps" msgid="648291604475669395">"हे वैयक्तिक अॅप्ससोबत उघडू शकत नाही"</string> <string name="resolver_cant_access_personal_apps_explanation" msgid="2298773629302296519">"तुमचा IT अॅडमिन तुम्हाला हा आशय तुमच्या वैयक्तिक प्रोफाइलमधील अॅप्ससोबत उघडू देत नाही"</string> - <string name="resolver_turn_on_work_apps" msgid="884910835250037247">"ऑफिस प्रोफाइल थांबवली आहे"</string> + <string name="resolver_turn_on_work_apps" msgid="884910835250037247">"कार्य प्रोफाइल थांबवली आहे"</string> <string name="resolver_switch_on_work" msgid="2873009160846966379">"सुरू करा"</string> - <string name="resolver_no_work_apps_available_share" msgid="7933949011797699505">"ऑफिस अॅप्स या आशयाला सपोर्ट करू शकत नाही"</string> - <string name="resolver_no_work_apps_available_resolve" msgid="1244844292366099399">"ऑफिस अॅप्स हा आशय उघडू शकत नाही"</string> + <string name="resolver_no_work_apps_available_share" msgid="7933949011797699505">"कार्य अॅप्स या आशयाला सपोर्ट करू शकत नाही"</string> + <string name="resolver_no_work_apps_available_resolve" msgid="1244844292366099399">"कार्य अॅप्स हा आशय उघडू शकत नाही"</string> <string name="resolver_no_personal_apps_available_share" msgid="5639102815174748732">"वैयक्तिक अॅप्स या आशयाला सपोर्ट करू शकत नाही"</string> <string name="resolver_no_personal_apps_available_resolve" msgid="5120671970531446978">"वैयक्तिक अॅप्स हा आशय उघडू शकत नाही"</string> <string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"सिम नेटवर्क अनलॉक पिन"</string> diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml index 5d075fa82487..fd6025ec0879 100644 --- a/core/res/res/values-ms/strings.xml +++ b/core/res/res/values-ms/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"Pencetakan dilumpuhkan oleh <xliff:g id="OWNER_APP">%s</xliff:g>."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Hidupkan profil kerja anda"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Apl peribadi anda disekat sehingga anda menghidupkan profil kerja"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Apl peribadi akan disekat pada <xliff:g id="DATE">%1$s</xliff:g> pukul <xliff:g id="TIME">%2$s</xliff:g>. Pentadbir IT anda tidak membenarkan profil kerja anda dimatikan melebihi <xliff:g id="NUMBER">%3$d</xliff:g> hari."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Hidupkan"</string> <string name="me" msgid="6207584824693813140">"Saya"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Pilihan tablet"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Pilihan Android TV"</string> diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml index 87eb087f83d4..1f72b8b83315 100644 --- a/core/res/res/values-my/strings.xml +++ b/core/res/res/values-my/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"<xliff:g id="OWNER_APP">%s</xliff:g> က ပုံနှိပ်ထုတ်ယူခြင်းကို ပိတ်ထားသည်။"</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"သင့်အလုပ်ပရိုဖိုင် ဖွင့်ခြင်း"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"သင့်အလုပ်ပရိုဖိုင် ဖွင့်သည်အထိ ကိုယ်ပိုင်အက်ပ်များကို ပိတ်ထားသည်"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"ကိုယ်ပိုင်အက်ပ်များကို <xliff:g id="DATE">%1$s</xliff:g> <xliff:g id="TIME">%2$s</xliff:g> တွင် ပိတ်ပါမည်။ သင့်အလုပ်ပရိုဖိုင် <xliff:g id="NUMBER">%3$d</xliff:g> ရက်ထက်ပိုပြီး ပိတ်ထားခြင်းကို သင်၏ IT စီမံခန့်ခွဲသူက ခွင့်မပြုပါ။"</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"ဖွင့်ရန်"</string> <string name="me" msgid="6207584824693813140">"ကျွန်ုပ်"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Tabletဆိုင်ရာရွေးချယ်မှုများ"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Android TV ရွေးချယ်စရာများ"</string> @@ -1092,7 +1090,7 @@ <string name="elapsed_time_short_format_mm_ss" msgid="8689459651807876423">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string> <string name="elapsed_time_short_format_h_mm_ss" msgid="2302144714803345056">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string> <string name="selectAll" msgid="1532369154488982046">"အားလုံးရွေးရန်"</string> - <string name="cut" msgid="2561199725874745819">"ဖြတ်ခြင်း"</string> + <string name="cut" msgid="2561199725874745819">"ဖြတ်ရန်"</string> <string name="copy" msgid="5472512047143665218">"ကူးရန်"</string> <string name="failed_to_copy_to_clipboard" msgid="725919885138539875">"ကလစ်ဘုတ်သို့ မိတ္တူကူးခြင်း မအောင်မြင်ပါ"</string> <string name="paste" msgid="461843306215520225">"Paste"</string> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index f61150a7f607..949c7f23e6e7 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"<xliff:g id="OWNER_APP">%s</xliff:g> har slått av utskrift."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Slå på jobbprofilen din"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"De personlige appene dine er blokkert til du slår på jobbprofilen din"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Personlige apper blir blokkert <xliff:g id="DATE">%1$s</xliff:g> klokken <xliff:g id="TIME">%2$s</xliff:g>. IT-administratoren din tillater ikke at jobbprofilen din er slått av i mer enn <xliff:g id="NUMBER">%3$d</xliff:g> dager."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Slå på"</string> <string name="me" msgid="6207584824693813140">"Meg"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Innstillinger for nettbrettet"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Android TV-alternativer"</string> diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml index dd27aaaaa50d..25cc45b9e964 100644 --- a/core/res/res/values-ne/strings.xml +++ b/core/res/res/values-ne/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"<xliff:g id="OWNER_APP">%s</xliff:g> ले छाप्ने कार्यलाई असक्षम पार्यो।"</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"आफ्नो कार्य प्रोफाइल सक्रिय गर्नुहोस्"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"तपाईंले आफ्नो कार्य प्रोफाइल सक्रिय नगरुन्जेल तपाईंका व्यक्तिगत अनुप्रयोगहरूलाई रोक लगाइन्छ"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"मिति <xliff:g id="DATE">%1$s</xliff:g> <xliff:g id="TIME">%2$s</xliff:g> बजे व्यक्तिगत एपहरूलाई रोक लगाइने छ। तपाईंका IT एडमिन तपाईंलाई आफ्नो कार्य प्रोफाइल <xliff:g id="NUMBER">%3$d</xliff:g> भन्दा धेरै दिन निष्क्रिय राख्ने अनुमति दिनुहुन्न।"</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"सक्रिय गर्नुहोस्"</string> <string name="me" msgid="6207584824693813140">"मलाई"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"ट्याब्लेट विकल्पहरू"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Android TV सम्बन्धी विकल्पहरू"</string> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index 64302dab7ce9..1739453fe0b8 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"Afdrukken uitgeschakeld door <xliff:g id="OWNER_APP">%s</xliff:g>."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Schakel je werkprofiel in"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Je persoonlijke apps zijn geblokkeerd totdat je je werkprofiel inschakelt"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Apps die worden gebruikt voor persoonlijke doeleinden, worden geblokkeerd op <xliff:g id="DATE">%1$s</xliff:g> om <xliff:g id="TIME">%2$s</xliff:g>. Je IT-beheerder staat niet toe dat je werkprofiel langer dan <xliff:g id="NUMBER">%3$d</xliff:g> dagen is uitgeschakeld."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Inschakelen"</string> <string name="me" msgid="6207584824693813140">"Ik"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Tabletopties"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Opties voor Android TV"</string> @@ -1550,7 +1548,7 @@ <string name="launchBrowserDefault" msgid="6328349989932924119">"Browser starten?"</string> <string name="SetupCallDefault" msgid="5581740063237175247">"Gesprek accepteren?"</string> <string name="activity_resolver_use_always" msgid="5575222334666843269">"Altijd"</string> - <string name="activity_resolver_use_once" msgid="948462794469672658">"Één keer"</string> + <string name="activity_resolver_use_once" msgid="948462794469672658">"Eén keer"</string> <string name="activity_resolver_work_profiles_support" msgid="4071345609235361269">"%1$s ondersteunt werkprofielen niet"</string> <string name="default_audio_route_name" product="tablet" msgid="367936735632195517">"Tablet"</string> <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"Tv"</string> diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml index 4becdaa16ef3..4224523a5333 100644 --- a/core/res/res/values-or/strings.xml +++ b/core/res/res/values-or/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"<xliff:g id="OWNER_APP">%s</xliff:g> ଦ୍ଵାରା ପ୍ରିଣ୍ଟିଙ୍ଗ ଅକ୍ଷମ କରାଯାଇଛି"</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"ୱାର୍କ ପ୍ରୋଫାଇଲ୍ ଚାଲୁ କରନ୍ତୁ"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"ଆପଣ ଆପଣଙ୍କ ୱାର୍କ ପ୍ରୋଫାଇଲ୍ ଚାଲୁ ନକରିବା ପର୍ଯ୍ୟନ୍ତ ଆପଣଙ୍କର ବ୍ୟକ୍ତିଗତ ଆପ୍ସ ବ୍ଲକ୍ କରାଯାଇଛି"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"<xliff:g id="DATE">%1$s</xliff:g> <xliff:g id="TIME">%2$s</xliff:g>ରେ ଆପଣଙ୍କ ବ୍ୟକ୍ତିଗତ ଆପ୍ସକୁ ବ୍ଲକ୍ କରାଯିବ। ଆପଣଙ୍କ IT ଆଡମିନ୍ ଆପଣଙ୍କ ୱାର୍କ ପ୍ରୋଫାଇଲକୁ <xliff:g id="NUMBER">%3$d</xliff:g>ରୁ ଅଧିକ ଦିନ ପାଇଁ ବନ୍ଦ କରିବାକୁ ଅନୁମତି ଦିଅନ୍ତି ନାହିଁ।"</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"ଚାଲୁ କରନ୍ତୁ"</string> <string name="me" msgid="6207584824693813140">"ମୁଁ"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"ଟାବଲେଟ୍ର ବିକଳ୍ପ"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Android ଟିଭିର ବିକଳ୍ପଗୁଡ଼ିକ"</string> diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml index fd3e638cb1b8..77341c677abe 100644 --- a/core/res/res/values-pa/strings.xml +++ b/core/res/res/values-pa/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"<xliff:g id="OWNER_APP">%s</xliff:g> ਵੱਲੋਂ ਪ੍ਰਿੰਟ ਕਰਨਾ ਬੰਦ ਕੀਤਾ ਗਿਆ।"</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"ਆਪਣਾ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਚਾਲੂ ਕਰੋ"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਆਪਣਾ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਚਾਲੂ ਨਹੀਂ ਕਰਦੇ ਤੁਹਾਡੀਆਂ ਨਿੱਜੀ ਐਪਾਂ ਬਲਾਕ ਰਹਿੰਦੀਆਂ ਹਨ"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"<xliff:g id="DATE">%1$s</xliff:g> ਨੂੰ <xliff:g id="TIME">%2$s</xliff:g> ਵਜੇ ਨਿੱਜੀ ਐਪਾਂ ਨੂੰ ਬਲਾਕ ਕਰ ਦਿੱਤਾ ਜਾਵੇਗਾ। ਤੁਹਾਡਾ ਆਈ.ਟੀ. ਪ੍ਰਸ਼ਾਸਕ ਤੁਹਾਡੇ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਨੂੰ <xliff:g id="NUMBER">%3$d</xliff:g> ਦਿਨਾਂ ਤੋਂ ਵੱਧ ਸਮੇਂ ਤੱਕ ਬੰਦ ਰਹਿਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਦਿੰਦਾ।"</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"ਚਾਲੂ ਕਰੋ"</string> <string name="me" msgid="6207584824693813140">"ਮੈਂ"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"ਟੈਬਲੈੱਟ ਵਿਕਲਪ"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Android TV ਦੇ ਵਿਕਲਪ"</string> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index 33104c791190..f89189b3fa9e 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -206,10 +206,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"Drukowanie wyłączone przez: <xliff:g id="OWNER_APP">%s</xliff:g>."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Włącz profil do pracy"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Zablokowano aplikacje osobiste do czasu włączenia profilu do pracy"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Aplikacje osobiste zostaną zablokowane <xliff:g id="DATE">%1$s</xliff:g> o <xliff:g id="TIME">%2$s</xliff:g>. Administrator IT nie pozwala na wyłączenie profilu służbowego na dłużej niż <xliff:g id="NUMBER">%3$d</xliff:g> dni."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Włącz"</string> <string name="me" msgid="6207584824693813140">"Ja"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Opcje tabletu"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Opcje Androida TV"</string> @@ -1170,7 +1168,7 @@ <string name="whichViewApplication" msgid="5733194231473132945">"Otwórz w aplikacji"</string> <string name="whichViewApplicationNamed" msgid="415164730629690105">"Otwórz w aplikacji %1$s"</string> <string name="whichViewApplicationLabel" msgid="7367556735684742409">"Otwórz"</string> - <string name="whichOpenHostLinksWith" msgid="7645631470199397485">"Otwieraj linki z: <xliff:g id="HOST">%1$s</xliff:g> w"</string> + <string name="whichOpenHostLinksWith" msgid="7645631470199397485">"Otwieraj linki z <xliff:g id="HOST">%1$s</xliff:g> w"</string> <string name="whichOpenLinksWith" msgid="1120936181362907258">"Otwieraj linki w"</string> <string name="whichOpenLinksWithApp" msgid="6917864367861910086">"Otwieraj linki w aplikacji <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> <string name="whichOpenHostLinksWithApp" msgid="2401668560768463004">"Otwieraj linki z: <xliff:g id="HOST">%1$s</xliff:g> w aplikacji <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> @@ -2125,18 +2123,18 @@ <string name="resolver_work_tab" msgid="2690019516263167035">"Służbowe"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Widok osobisty"</string> <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Widok służbowy"</string> - <string name="resolver_cant_share_with_work_apps" msgid="637686613606502219">"Nie można udostępnić aplikacjom do pracy"</string> - <string name="resolver_cant_share_with_work_apps_explanation" msgid="3332302070341130545">"Administrator IT nie pozwala na udostępnianie tej zawartości w profilu do pracy"</string> - <string name="resolver_cant_access_work_apps" msgid="2455757966397563223">"Nie można otworzyć w aplikacjach do pracy"</string> - <string name="resolver_cant_access_work_apps_explanation" msgid="3626983885525445790">"Administrator IT nie pozwala na otwieranie tej zawartości w profilu do pracy"</string> + <string name="resolver_cant_share_with_work_apps" msgid="637686613606502219">"Nie można udostępnić aplikacjom służbowym"</string> + <string name="resolver_cant_share_with_work_apps_explanation" msgid="3332302070341130545">"Administrator IT nie pozwala na udostępnianie tej zawartości w profilu służbowym"</string> + <string name="resolver_cant_access_work_apps" msgid="2455757966397563223">"Nie można otworzyć w aplikacjach służbowych"</string> + <string name="resolver_cant_access_work_apps_explanation" msgid="3626983885525445790">"Administrator IT nie pozwala na otwieranie tej zawartości w profilu służbowym"</string> <string name="resolver_cant_share_with_personal_apps" msgid="3079139799233316203">"Nie można udostępnić aplikacjom osobistym"</string> <string name="resolver_cant_share_with_personal_apps_explanation" msgid="2959282422751315171">"Administrator IT nie pozwala na udostępnianie tej zawartości w profilu osobistym"</string> <string name="resolver_cant_access_personal_apps" msgid="648291604475669395">"Nie można otworzyć w aplikacjach osobistych"</string> <string name="resolver_cant_access_personal_apps_explanation" msgid="2298773629302296519">"Administrator IT nie pozwala na otwieranie tej zawartości w profilu osobistym"</string> - <string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Działanie profilu do pracy jest wstrzymane"</string> + <string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Działanie profilu służbowego jest wstrzymane"</string> <string name="resolver_switch_on_work" msgid="2873009160846966379">"Włącz"</string> - <string name="resolver_no_work_apps_available_share" msgid="7933949011797699505">"Brak aplikacji do pracy, które obsługują tę zawartość"</string> - <string name="resolver_no_work_apps_available_resolve" msgid="1244844292366099399">"Brak aplikacji do pracy, które mogą otworzyć tę zawartość"</string> + <string name="resolver_no_work_apps_available_share" msgid="7933949011797699505">"Brak aplikacji służbowych, które obsługują tę zawartość"</string> + <string name="resolver_no_work_apps_available_resolve" msgid="1244844292366099399">"Brak aplikacji służbowych, które mogą otworzyć tę zawartość"</string> <string name="resolver_no_personal_apps_available_share" msgid="5639102815174748732">"Brak aplikacji osobistych, które obsługują tę zawartość"</string> <string name="resolver_no_personal_apps_available_resolve" msgid="5120671970531446978">"Brak aplikacji osobistych, które mogą otworzyć tę zawartość"</string> <string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"Kod PIN do karty SIM odblokowujący sieć"</string> diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index 25f8633b44ad..4858b42d8acf 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -56,8 +56,8 @@ </plurals> <string name="imei" msgid="2157082351232630390">"IMEI"</string> <string name="meid" msgid="3291227361605924674">"MEID"</string> - <string name="ClipMmi" msgid="4110549342447630629">"ID do chamador de entrada"</string> - <string name="ClirMmi" msgid="4702929460236547156">"ID do chamador de saída"</string> + <string name="ClipMmi" msgid="4110549342447630629">"Identificador de chamadas recebidas"</string> + <string name="ClirMmi" msgid="4702929460236547156">"Identificador de chamadas realizadas"</string> <string name="ColpMmi" msgid="4736462893284419302">"ID de linha conectada"</string> <string name="ColrMmi" msgid="5889782479745764278">"Restrição de ID de linha conectada"</string> <string name="CfMmi" msgid="8390012691099787178">"Encaminhamento de chamada"</string> @@ -71,12 +71,12 @@ <string name="RuacMmi" msgid="1876047385848991110">"Rejeição das chamadas indesejadas"</string> <string name="CndMmi" msgid="185136449405618437">"Chamando número de entrega"</string> <string name="DndMmi" msgid="8797375819689129800">"Não perturbe"</string> - <string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"O ID do chamador assume o padrão de restrito. Próxima chamada: Restrita"</string> - <string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"O ID do chamador assume o padrão de restrito. Próxima chamada: Não restrita"</string> - <string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"O ID do chamador assume o padrão de não restrito. Próxima chamada: Restrita"</string> - <string name="CLIRDefaultOffNextCallOff" msgid="2491576172356463443">"O ID do chamador assume o padrão de não restrito. Próxima chamada: Não restrita"</string> + <string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"O identificador de chamadas assume o padrão de restrito. Próxima chamada: Restrita"</string> + <string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"O identificador de chamadas assume o padrão de restrito. Próxima chamada: Não restrita"</string> + <string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"O identificador de chamadas assume o padrão de não restrito. Próxima chamada: Restrita"</string> + <string name="CLIRDefaultOffNextCallOff" msgid="2491576172356463443">"O identificador de chamadas assume o padrão de não restrito. Próxima chamada: Não restrita"</string> <string name="serviceNotProvisioned" msgid="8289333510236766193">"O serviço não foi habilitado."</string> - <string name="CLIRPermanent" msgid="166443681876381118">"Não é possível alterar a configuração de identificação de chamadas."</string> + <string name="CLIRPermanent" msgid="166443681876381118">"Não é possível alterar a configuração do identificador de chamadas."</string> <string name="RestrictedOnDataTitle" msgid="1500576417268169774">"Nenhum serviço móvel de dados"</string> <string name="RestrictedOnEmergencyTitle" msgid="2852916906106191866">"Chamadas de emergência indisponíveis"</string> <string name="RestrictedOnNormalTitle" msgid="7009474589746551737">"Sem serviço de voz"</string> @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"Impressão desativada por <xliff:g id="OWNER_APP">%s</xliff:g>."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Ativar perfil de trabalho"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Seus apps pessoais ficarão bloqueados até você ativar o perfil de trabalho"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Os apps pessoais serão bloqueados em <xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>. Seu administrador de TI não permite que o perfil de trabalho fique desativado por mais de <xliff:g id="NUMBER">%3$d</xliff:g> dias."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Ativar"</string> <string name="me" msgid="6207584824693813140">"Eu"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Opções do tablet"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Opções do Android TV"</string> @@ -1130,10 +1128,10 @@ <string name="whichViewApplication" msgid="5733194231473132945">"Abrir com"</string> <string name="whichViewApplicationNamed" msgid="415164730629690105">"Abrir com %1$s"</string> <string name="whichViewApplicationLabel" msgid="7367556735684742409">"Abrir"</string> - <string name="whichOpenHostLinksWith" msgid="7645631470199397485">"Abrir links do domínio <xliff:g id="HOST">%1$s</xliff:g> com"</string> + <string name="whichOpenHostLinksWith" msgid="7645631470199397485">"Abrir links do domínio <xliff:g id="HOST">%1$s</xliff:g> usando"</string> <string name="whichOpenLinksWith" msgid="1120936181362907258">"Abrir links com"</string> <string name="whichOpenLinksWithApp" msgid="6917864367861910086">"Abrir links com <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> - <string name="whichOpenHostLinksWithApp" msgid="2401668560768463004">"Abrir links do domínio <xliff:g id="HOST">%1$s</xliff:g> com <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="2401668560768463004">"Abrir links do domínio <xliff:g id="HOST">%1$s</xliff:g> usando <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="7805857277166106236">"Conceder acesso"</string> <string name="whichEditApplication" msgid="6191568491456092812">"Editar com"</string> <string name="whichEditApplicationNamed" msgid="8096494987978521514">"Editar com %1$s"</string> @@ -2059,12 +2057,12 @@ <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Visualização de trabalho"</string> <string name="resolver_cant_share_with_work_apps" msgid="637686613606502219">"Não é possível compartilhar este conteúdo com apps de trabalho"</string> <string name="resolver_cant_share_with_work_apps_explanation" msgid="3332302070341130545">"Seu administrador de TI não permite que você compartilhe este conteúdo com apps no seu perfil de trabalho"</string> - <string name="resolver_cant_access_work_apps" msgid="2455757966397563223">"Não é possível abrir com apps de trabalho"</string> - <string name="resolver_cant_access_work_apps_explanation" msgid="3626983885525445790">"Seu administrador de TI não permite que você abra este conteúdo com apps no seu perfil de trabalho"</string> + <string name="resolver_cant_access_work_apps" msgid="2455757966397563223">"Não é possível abrir usando apps de trabalho"</string> + <string name="resolver_cant_access_work_apps_explanation" msgid="3626983885525445790">"Seu administrador de TI não permite que você abra este conteúdo usando apps do seu perfil de trabalho"</string> <string name="resolver_cant_share_with_personal_apps" msgid="3079139799233316203">"Não é possível compartilhar este conteúdo com apps pessoais"</string> <string name="resolver_cant_share_with_personal_apps_explanation" msgid="2959282422751315171">"Seu administrador de TI não permite que você compartilhe este conteúdo com apps no seu perfil pessoal"</string> <string name="resolver_cant_access_personal_apps" msgid="648291604475669395">"Não é possível abrir este conteúdo com apps pessoais"</string> - <string name="resolver_cant_access_personal_apps_explanation" msgid="2298773629302296519">"Seu administrador de TI não permite que você abra este conteúdo com apps no seu perfil pessoal"</string> + <string name="resolver_cant_access_personal_apps_explanation" msgid="2298773629302296519">"Seu administrador de TI não permite que você abra este conteúdo usando apps do seu perfil pessoal"</string> <string name="resolver_turn_on_work_apps" msgid="884910835250037247">"O perfil de trabalho está pausado"</string> <string name="resolver_switch_on_work" msgid="2873009160846966379">"Ativar"</string> <string name="resolver_no_work_apps_available_share" msgid="7933949011797699505">"Apps de trabalho não são compatíveis com este conteúdo"</string> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index 5bc4fbdaeda8..a13c2d28f986 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"Impressão desativada por <xliff:g id="OWNER_APP">%s</xliff:g>."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Ative o perfil de trabalho"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"As suas apps pessoais estão bloqueadas até ativar o seu perfil de trabalho."</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"As apps pessoais serão bloqueadas a <xliff:g id="DATE">%1$s</xliff:g> à(s) <xliff:g id="TIME">%2$s</xliff:g>. O seu administrador de TI não permite que o seu perfil de trabalho fique desativado mais de <xliff:g id="NUMBER">%3$d</xliff:g> dias."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Ativar"</string> <string name="me" msgid="6207584824693813140">"Eu"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Opções do tablet"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Opções do Android TV"</string> @@ -1131,7 +1129,7 @@ <string name="whichViewApplicationNamed" msgid="415164730629690105">"Abrir com %1$s"</string> <string name="whichViewApplicationLabel" msgid="7367556735684742409">"Abrir"</string> <string name="whichOpenHostLinksWith" msgid="7645631470199397485">"Abra os links de <xliff:g id="HOST">%1$s</xliff:g> com:"</string> - <string name="whichOpenLinksWith" msgid="1120936181362907258">"Abra os links com:"</string> + <string name="whichOpenLinksWith" msgid="1120936181362907258">"Abrir os links com:"</string> <string name="whichOpenLinksWithApp" msgid="6917864367861910086">"Abra os links com a app <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> <string name="whichOpenHostLinksWithApp" msgid="2401668560768463004">"Abra os links de <xliff:g id="HOST">%1$s</xliff:g> com a app <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="7805857277166106236">"Conceder acesso"</string> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index 25f8633b44ad..4858b42d8acf 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -56,8 +56,8 @@ </plurals> <string name="imei" msgid="2157082351232630390">"IMEI"</string> <string name="meid" msgid="3291227361605924674">"MEID"</string> - <string name="ClipMmi" msgid="4110549342447630629">"ID do chamador de entrada"</string> - <string name="ClirMmi" msgid="4702929460236547156">"ID do chamador de saída"</string> + <string name="ClipMmi" msgid="4110549342447630629">"Identificador de chamadas recebidas"</string> + <string name="ClirMmi" msgid="4702929460236547156">"Identificador de chamadas realizadas"</string> <string name="ColpMmi" msgid="4736462893284419302">"ID de linha conectada"</string> <string name="ColrMmi" msgid="5889782479745764278">"Restrição de ID de linha conectada"</string> <string name="CfMmi" msgid="8390012691099787178">"Encaminhamento de chamada"</string> @@ -71,12 +71,12 @@ <string name="RuacMmi" msgid="1876047385848991110">"Rejeição das chamadas indesejadas"</string> <string name="CndMmi" msgid="185136449405618437">"Chamando número de entrega"</string> <string name="DndMmi" msgid="8797375819689129800">"Não perturbe"</string> - <string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"O ID do chamador assume o padrão de restrito. Próxima chamada: Restrita"</string> - <string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"O ID do chamador assume o padrão de restrito. Próxima chamada: Não restrita"</string> - <string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"O ID do chamador assume o padrão de não restrito. Próxima chamada: Restrita"</string> - <string name="CLIRDefaultOffNextCallOff" msgid="2491576172356463443">"O ID do chamador assume o padrão de não restrito. Próxima chamada: Não restrita"</string> + <string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"O identificador de chamadas assume o padrão de restrito. Próxima chamada: Restrita"</string> + <string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"O identificador de chamadas assume o padrão de restrito. Próxima chamada: Não restrita"</string> + <string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"O identificador de chamadas assume o padrão de não restrito. Próxima chamada: Restrita"</string> + <string name="CLIRDefaultOffNextCallOff" msgid="2491576172356463443">"O identificador de chamadas assume o padrão de não restrito. Próxima chamada: Não restrita"</string> <string name="serviceNotProvisioned" msgid="8289333510236766193">"O serviço não foi habilitado."</string> - <string name="CLIRPermanent" msgid="166443681876381118">"Não é possível alterar a configuração de identificação de chamadas."</string> + <string name="CLIRPermanent" msgid="166443681876381118">"Não é possível alterar a configuração do identificador de chamadas."</string> <string name="RestrictedOnDataTitle" msgid="1500576417268169774">"Nenhum serviço móvel de dados"</string> <string name="RestrictedOnEmergencyTitle" msgid="2852916906106191866">"Chamadas de emergência indisponíveis"</string> <string name="RestrictedOnNormalTitle" msgid="7009474589746551737">"Sem serviço de voz"</string> @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"Impressão desativada por <xliff:g id="OWNER_APP">%s</xliff:g>."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Ativar perfil de trabalho"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Seus apps pessoais ficarão bloqueados até você ativar o perfil de trabalho"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Os apps pessoais serão bloqueados em <xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>. Seu administrador de TI não permite que o perfil de trabalho fique desativado por mais de <xliff:g id="NUMBER">%3$d</xliff:g> dias."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Ativar"</string> <string name="me" msgid="6207584824693813140">"Eu"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Opções do tablet"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Opções do Android TV"</string> @@ -1130,10 +1128,10 @@ <string name="whichViewApplication" msgid="5733194231473132945">"Abrir com"</string> <string name="whichViewApplicationNamed" msgid="415164730629690105">"Abrir com %1$s"</string> <string name="whichViewApplicationLabel" msgid="7367556735684742409">"Abrir"</string> - <string name="whichOpenHostLinksWith" msgid="7645631470199397485">"Abrir links do domínio <xliff:g id="HOST">%1$s</xliff:g> com"</string> + <string name="whichOpenHostLinksWith" msgid="7645631470199397485">"Abrir links do domínio <xliff:g id="HOST">%1$s</xliff:g> usando"</string> <string name="whichOpenLinksWith" msgid="1120936181362907258">"Abrir links com"</string> <string name="whichOpenLinksWithApp" msgid="6917864367861910086">"Abrir links com <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> - <string name="whichOpenHostLinksWithApp" msgid="2401668560768463004">"Abrir links do domínio <xliff:g id="HOST">%1$s</xliff:g> com <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="2401668560768463004">"Abrir links do domínio <xliff:g id="HOST">%1$s</xliff:g> usando <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="7805857277166106236">"Conceder acesso"</string> <string name="whichEditApplication" msgid="6191568491456092812">"Editar com"</string> <string name="whichEditApplicationNamed" msgid="8096494987978521514">"Editar com %1$s"</string> @@ -2059,12 +2057,12 @@ <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Visualização de trabalho"</string> <string name="resolver_cant_share_with_work_apps" msgid="637686613606502219">"Não é possível compartilhar este conteúdo com apps de trabalho"</string> <string name="resolver_cant_share_with_work_apps_explanation" msgid="3332302070341130545">"Seu administrador de TI não permite que você compartilhe este conteúdo com apps no seu perfil de trabalho"</string> - <string name="resolver_cant_access_work_apps" msgid="2455757966397563223">"Não é possível abrir com apps de trabalho"</string> - <string name="resolver_cant_access_work_apps_explanation" msgid="3626983885525445790">"Seu administrador de TI não permite que você abra este conteúdo com apps no seu perfil de trabalho"</string> + <string name="resolver_cant_access_work_apps" msgid="2455757966397563223">"Não é possível abrir usando apps de trabalho"</string> + <string name="resolver_cant_access_work_apps_explanation" msgid="3626983885525445790">"Seu administrador de TI não permite que você abra este conteúdo usando apps do seu perfil de trabalho"</string> <string name="resolver_cant_share_with_personal_apps" msgid="3079139799233316203">"Não é possível compartilhar este conteúdo com apps pessoais"</string> <string name="resolver_cant_share_with_personal_apps_explanation" msgid="2959282422751315171">"Seu administrador de TI não permite que você compartilhe este conteúdo com apps no seu perfil pessoal"</string> <string name="resolver_cant_access_personal_apps" msgid="648291604475669395">"Não é possível abrir este conteúdo com apps pessoais"</string> - <string name="resolver_cant_access_personal_apps_explanation" msgid="2298773629302296519">"Seu administrador de TI não permite que você abra este conteúdo com apps no seu perfil pessoal"</string> + <string name="resolver_cant_access_personal_apps_explanation" msgid="2298773629302296519">"Seu administrador de TI não permite que você abra este conteúdo usando apps do seu perfil pessoal"</string> <string name="resolver_turn_on_work_apps" msgid="884910835250037247">"O perfil de trabalho está pausado"</string> <string name="resolver_switch_on_work" msgid="2873009160846966379">"Ativar"</string> <string name="resolver_no_work_apps_available_share" msgid="7933949011797699505">"Apps de trabalho não são compatíveis com este conteúdo"</string> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 891c6eda1c23..aeaceca65c65 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -204,10 +204,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"Printare dezactivată de <xliff:g id="OWNER_APP">%s</xliff:g>."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Activați profilul de serviciu"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Aplicațiile personale sunt blocate până când activați profilul de serviciu"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Aplicațiile personale vor fi blocate pe <xliff:g id="DATE">%1$s</xliff:g>, la <xliff:g id="TIME">%2$s</xliff:g>. Administratorul IT nu permite ca profilul de serviciu să fie dezactivat mai mult de <xliff:g id="NUMBER">%3$d</xliff:g> zile."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Activați"</string> <string name="me" msgid="6207584824693813140">"Eu"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Opțiuni tablet PC"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Opțiuni pentru Android TV"</string> @@ -2092,7 +2090,7 @@ <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Afișarea conținutului personal"</string> <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Afișarea conținutului de lucru"</string> <string name="resolver_cant_share_with_work_apps" msgid="637686613606502219">"Nu se poate trimite către aplicații pentru lucru"</string> - <string name="resolver_cant_share_with_work_apps_explanation" msgid="3332302070341130545">"Administratorul IT nu vă permite să trimiteți acest conținut cu aplicațiile din profilul de serviciu"</string> + <string name="resolver_cant_share_with_work_apps_explanation" msgid="3332302070341130545">"Administratorul IT nu vă permite să trimiteți acest conținut către aplicațiile din profilul de serviciu"</string> <string name="resolver_cant_access_work_apps" msgid="2455757966397563223">"Nu se poate deschide cu aplicații pentru lucru"</string> <string name="resolver_cant_access_work_apps_explanation" msgid="3626983885525445790">"Administratorul IT nu vă permite să deschideți acest conținut cu aplicațiile din profilul de serviciu"</string> <string name="resolver_cant_share_with_personal_apps" msgid="3079139799233316203">"Nu se poate trimite către aplicații personale"</string> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index 58806e99d567..83dd3e23c702 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -63,7 +63,7 @@ <string name="ColpMmi" msgid="4736462893284419302">"Идентификатор подключенной линии"</string> <string name="ColrMmi" msgid="5889782479745764278">"Ограничение идентификатора подключенной линии"</string> <string name="CfMmi" msgid="8390012691099787178">"Переадресация вызовов"</string> - <string name="CwMmi" msgid="3164609577675404761">"Параллельный вызов"</string> + <string name="CwMmi" msgid="3164609577675404761">"Ожидание вызова"</string> <string name="BaMmi" msgid="7205614070543372167">"Запрет вызовов"</string> <string name="PwdMmi" msgid="3360991257288638281">"Смена пароля"</string> <string name="PinMmi" msgid="7133542099618330959">"Смена PIN"</string> @@ -206,10 +206,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"Функция печати отключена приложением \"<xliff:g id="OWNER_APP">%s</xliff:g>\""</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Включите рабочий профиль"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Личные приложения будут заблокированы, пока вы не включите рабочий профиль."</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Личные приложения будут заблокированы <xliff:g id="DATE">%1$s</xliff:g> в <xliff:g id="TIME">%2$s</xliff:g>. Системный администратор запретил отключать рабочий профиль более чем на <xliff:g id="NUMBER">%3$d</xliff:g> дн."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Включить"</string> <string name="me" msgid="6207584824693813140">"Я"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Настройки планшетного ПК"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Настройки Android TV"</string> @@ -2133,7 +2131,7 @@ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="2959282422751315171">"Системный администратор запретил делиться этим контентом с приложениями из личного профиля."</string> <string name="resolver_cant_access_personal_apps" msgid="648291604475669395">"Этот контент нельзя открывать в личных приложениях"</string> <string name="resolver_cant_access_personal_apps_explanation" msgid="2298773629302296519">"Системный администратор запретил открывать этот контент, используя приложения из личного профиля."</string> - <string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Рабочий профиль приостановлен."</string> + <string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Действие рабочего профиля приостановлено."</string> <string name="resolver_switch_on_work" msgid="2873009160846966379">"Включить"</string> <string name="resolver_no_work_apps_available_share" msgid="7933949011797699505">"Нет рабочих приложений, поддерживающих этот контент."</string> <string name="resolver_no_work_apps_available_resolve" msgid="1244844292366099399">"Нет рабочих приложений, с помощью которых можно открыть этот контент."</string> diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml index fecfa1e784df..e61b4e8696a3 100644 --- a/core/res/res/values-si/strings.xml +++ b/core/res/res/values-si/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"<xliff:g id="OWNER_APP">%s</xliff:g> විසින් මුද්රණය කිරීම අබල කර ඇත."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"ඔබේ කාර්යාල පැතිකඩ ඔන් කරන්න"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"ඔබ ඔබගේ කාර්යාල පැතිකඩ ක්රියාත්මක කරන තෙක් ඔබගේ පෞද්ගලික යෙදුම් අවහිර කර ඇත"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"පෞද්ගලික යෙදුම් <xliff:g id="DATE">%1$s</xliff:g> දින <xliff:g id="TIME">%2$s</xliff:g>ට අවහිර වනු ඇත. ඔබේ IT පරිපාලක ඔබේ කාර්යාල පැතිකඩ දින <xliff:g id="NUMBER">%3$d</xliff:g>කට වඩා ඉවත් කර තැබීමට ඉඩ නොදේ."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"ක්රියාත්මක කරන්න"</string> <string name="me" msgid="6207584824693813140">"මම"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"ටැබ්ලට විකල්ප"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Android TV විකල්ප"</string> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index c218f28133d9..be1d8c1fef18 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -206,10 +206,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"Tlač zakázala aplikácia <xliff:g id="OWNER_APP">%s</xliff:g>."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Zapnite svoj pracovný profil"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Vaše osobné aplikácie sú zablokované, dokým nezapnete svoj pracovný profil"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Osobné aplikácie budú <xliff:g id="DATE">%1$s</xliff:g> o <xliff:g id="TIME">%2$s</xliff:g> zablokované. Váš správca IT nepovoľuje, aby váš pracovný profil bol vypnutý viac ako <xliff:g id="NUMBER">%3$d</xliff:g> d."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Zapnúť"</string> <string name="me" msgid="6207584824693813140">"Ja"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Možnosti tabletu"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Možnosti zariadenia Android TV"</string> @@ -245,7 +243,7 @@ <string name="global_action_power_off" msgid="4404936470711393203">"Vypnúť"</string> <string name="global_action_power_options" msgid="1185286119330160073">"Vypnutie"</string> <string name="global_action_restart" msgid="4678451019561687074">"Reštartovať"</string> - <string name="global_action_emergency" msgid="1387617624177105088">"Tiesňový režim"</string> + <string name="global_action_emergency" msgid="1387617624177105088">"Tieseň"</string> <string name="global_action_bug_report" msgid="5127867163044170003">"Hlásenie o chybách"</string> <string name="global_action_logout" msgid="6093581310002476511">"Ukončiť reláciu"</string> <string name="global_action_screenshot" msgid="2610053466156478564">"Snímka obrazovky"</string> @@ -1170,10 +1168,10 @@ <string name="whichViewApplication" msgid="5733194231473132945">"Otvoriť v aplikácii"</string> <string name="whichViewApplicationNamed" msgid="415164730629690105">"Otvoriť v aplikácii %1$s"</string> <string name="whichViewApplicationLabel" msgid="7367556735684742409">"Otvoriť"</string> - <string name="whichOpenHostLinksWith" msgid="7645631470199397485">"Otvárajte odkazy z webu <xliff:g id="HOST">%1$s</xliff:g> v prehliadači alebo aplikácii"</string> - <string name="whichOpenLinksWith" msgid="1120936181362907258">"Otvárajte odkazy v prehliadači"</string> - <string name="whichOpenLinksWithApp" msgid="6917864367861910086">"Otvárajte odkazy v prehliadači <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> - <string name="whichOpenHostLinksWithApp" msgid="2401668560768463004">"Otvárajte odkazy z webu <xliff:g id="HOST">%1$s</xliff:g> v prehliadači <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <string name="whichOpenHostLinksWith" msgid="7645631470199397485">"Otvárať odkazy <xliff:g id="HOST">%1$s</xliff:g> v aplikácii"</string> + <string name="whichOpenLinksWith" msgid="1120936181362907258">"Otvárať odkazy v aplikácii"</string> + <string name="whichOpenLinksWithApp" msgid="6917864367861910086">"Otvárať odkazy v aplikácii <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="2401668560768463004">"Otvárať odkazy <xliff:g id="HOST">%1$s</xliff:g> v aplikácii <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="7805857277166106236">"Udeliť prístup"</string> <string name="whichEditApplication" msgid="6191568491456092812">"Upraviť pomocou"</string> <string name="whichEditApplicationNamed" msgid="8096494987978521514">"Upraviť v aplikácii %1$s"</string> @@ -2126,13 +2124,13 @@ <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Osobné zobrazenie"</string> <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Pracovné zobrazenie"</string> <string name="resolver_cant_share_with_work_apps" msgid="637686613606502219">"Nedá sa zdieľať s pracovnými aplikáciami"</string> - <string name="resolver_cant_share_with_work_apps_explanation" msgid="3332302070341130545">"Správca IT vám zakázal zdieľať tento obsah pomocou aplikácií v pracovnom profile"</string> + <string name="resolver_cant_share_with_work_apps_explanation" msgid="3332302070341130545">"Váš správca IT vám zakázal zdieľať tento obsah pomocou aplikácií v pracovnom profile"</string> <string name="resolver_cant_access_work_apps" msgid="2455757966397563223">"Nedá sa otvoriť pomocou pracovných aplikácií"</string> - <string name="resolver_cant_access_work_apps_explanation" msgid="3626983885525445790">"Správca IT vám zakázal otvoriť tento obsah pomocou aplikácií v pracovnom profile"</string> + <string name="resolver_cant_access_work_apps_explanation" msgid="3626983885525445790">"Váš správca IT vám zakázal otvárať tento obsah pomocou aplikácií v pracovnom profile"</string> <string name="resolver_cant_share_with_personal_apps" msgid="3079139799233316203">"Nedá sa zdieľať pomocou osobných aplikácií"</string> - <string name="resolver_cant_share_with_personal_apps_explanation" msgid="2959282422751315171">"Správca IT vám zakázal zdieľať tento obsah pomocou aplikácií v osobnom profile"</string> + <string name="resolver_cant_share_with_personal_apps_explanation" msgid="2959282422751315171">"Váš správca IT vám zakázal zdieľať tento obsah pomocou aplikácií v osobnom profile"</string> <string name="resolver_cant_access_personal_apps" msgid="648291604475669395">"Nedá sa otvoriť pomocou osobných aplikácií"</string> - <string name="resolver_cant_access_personal_apps_explanation" msgid="2298773629302296519">"Správca IT vám zakázal otvoriť tento obsah pomocou aplikácií v osobnom profile"</string> + <string name="resolver_cant_access_personal_apps_explanation" msgid="2298773629302296519">"Váš správca IT vám zakázal otvárať tento obsah pomocou aplikácií v osobnom profile"</string> <string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Pracovný profil je pozastavený"</string> <string name="resolver_switch_on_work" msgid="2873009160846966379">"Zapnúť"</string> <string name="resolver_no_work_apps_available_share" msgid="7933949011797699505">"Tento obsah nepodporujú žiadne pracovné aplikácie"</string> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index 1bb856ee16e0..ec8bf51890a0 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -206,10 +206,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"Tiskanje je onemogočil pravilnik <xliff:g id="OWNER_APP">%s</xliff:g>."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Vklopite delovni profil"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Osebne aplikacije so blokirane, dokler ne vklopite delovnega profila"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Osebne aplikacije bodo blokirane <xliff:g id="DATE">%1$s</xliff:g> ob <xliff:g id="TIME">%2$s</xliff:g>. Skrbnik za IT ne dovoli, da bi bil delovni profil izklopljen več kot toliko dni: <xliff:g id="NUMBER">%3$d</xliff:g>."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Vklopi"</string> <string name="me" msgid="6207584824693813140">"Jaz"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Možnosti tabličnega računalnika"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Možnosti naprave Android TV"</string> diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml index bea3b724591d..16d7a7bb110c 100644 --- a/core/res/res/values-sq/strings.xml +++ b/core/res/res/values-sq/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"Printimi është çaktivizuar nga <xliff:g id="OWNER_APP">%s</xliff:g>."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Aktivizo profilin e punës"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Aplikacionet e tua personale janë bllokuar derisa të aktivizosh profilin tënd të punës"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Aplikacionet personale do të bllokohen më <xliff:g id="DATE">%1$s</xliff:g> në <xliff:g id="TIME">%2$s</xliff:g>. Administratori yt i teknologjisë së informacionit nuk lejon që profili yt i punës të qëndrojë joaktiv për më shumë se <xliff:g id="NUMBER">%3$d</xliff:g> ditë."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Aktivizo"</string> <string name="me" msgid="6207584824693813140">"Unë"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Opsionet e tabletit"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Opsionet e Android TV"</string> @@ -1161,7 +1159,7 @@ <string name="aerr_application_repeated" msgid="7804378743218496566">"<xliff:g id="APPLICATION">%1$s</xliff:g> vazhdon të ndalojë"</string> <string name="aerr_process_repeated" msgid="1153152413537954974">"<xliff:g id="PROCESS">%1$s</xliff:g> vazhdon të ndalojë"</string> <string name="aerr_restart" msgid="2789618625210505419">"Hap përsëri aplikacionin"</string> - <string name="aerr_report" msgid="3095644466849299308">"Dërgo koment"</string> + <string name="aerr_report" msgid="3095644466849299308">"Dërgo reagim"</string> <string name="aerr_close" msgid="3398336821267021852">"Mbyll"</string> <string name="aerr_mute" msgid="2304972923480211376">"Vendose në heshtje deri kur të riniset pajisja"</string> <string name="aerr_wait" msgid="3198677780474548217">"Prit!"</string> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index 46b2b6c0129a..269755a8cf76 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -204,10 +204,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"Штампање је онемогућила апликација <xliff:g id="OWNER_APP">%s</xliff:g>."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Укључите пословни профил"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Личне апликације су блокиране док не укључите пословни профил"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Личне апликације ће бити блокиране: <xliff:g id="DATE">%1$s</xliff:g> у <xliff:g id="TIME">%2$s</xliff:g>. ИТ администратор не дозвољава да пословни профил буде искључен дуже од <xliff:g id="NUMBER">%3$d</xliff:g> дана."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Укључи"</string> <string name="me" msgid="6207584824693813140">"Ја"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Опције за таблет"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Опције Android TV-а"</string> @@ -1151,7 +1149,7 @@ <string name="whichViewApplicationNamed" msgid="415164730629690105">"Отворите помоћу апликације %1$s"</string> <string name="whichViewApplicationLabel" msgid="7367556735684742409">"Отвори"</string> <string name="whichOpenHostLinksWith" msgid="7645631470199397485">"Отварајте <xliff:g id="HOST">%1$s</xliff:g> линкове помоћу"</string> - <string name="whichOpenLinksWith" msgid="1120936181362907258">"Отваратеј линкове помоћу"</string> + <string name="whichOpenLinksWith" msgid="1120936181362907258">"Отварај линкове помоћу"</string> <string name="whichOpenLinksWithApp" msgid="6917864367861910086">"Отварајте линкове помоћу апликације <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> <string name="whichOpenHostLinksWithApp" msgid="2401668560768463004">"Отварајте <xliff:g id="HOST">%1$s</xliff:g> линкове помоћу апликације <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="7805857277166106236">"Дозволи приступ"</string> @@ -2101,7 +2099,7 @@ <string name="resolver_cant_access_personal_apps_explanation" msgid="2298773629302296519">"ИТ администратор вам не дозвољава да отворите овај садржај помоћу апликација на личном профилу"</string> <string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Пословни профил је паузиран"</string> <string name="resolver_switch_on_work" msgid="2873009160846966379">"Укључи"</string> - <string name="resolver_no_work_apps_available_share" msgid="7933949011797699505">"Ниједна апликација за посао не може да подржава овај садржај"</string> + <string name="resolver_no_work_apps_available_share" msgid="7933949011797699505">"Ниједна апликација за посао не подржава овај садржај"</string> <string name="resolver_no_work_apps_available_resolve" msgid="1244844292366099399">"Ниједна апликација за посао не може да отвори овај садржај"</string> <string name="resolver_no_personal_apps_available_share" msgid="5639102815174748732">"Ниједна лична апликација не може да подржава овај садржај"</string> <string name="resolver_no_personal_apps_available_resolve" msgid="5120671970531446978">"Ниједна лична апликација не може да отвори овај садржај"</string> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index d9ee54e202b8..566d85f24c08 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"Utskrift har inaktiverats av <xliff:g id="OWNER_APP">%s</xliff:g>."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Aktivera jobbprofilen"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Privata appar blockeras tills du aktiverar jobbprofilen"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Privata appar blockeras den <xliff:g id="DATE">%1$s</xliff:g> kl. <xliff:g id="TIME">%2$s</xliff:g>. IT-administratören tillåter inte att din jobbprofil är inaktiverad i mer än <xliff:g id="NUMBER">%3$d</xliff:g> dagar."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Aktivera"</string> <string name="me" msgid="6207584824693813140">"Jag"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Alternativ för surfplattan"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Alternativ för Android TV"</string> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index 2f3361794dda..f4745c6c9bfd 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"Kipengele cha kuchapisha kimezimwa na <xliff:g id="OWNER_APP">%s</xliff:g>."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Washa wasifu wako wa kazini"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Programu zako za binafsi zimezuiwa hadi uwashe wasifu wako wa kazini"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Programu za binafsi zitazuiwa tarehe <xliff:g id="DATE">%1$s</xliff:g> saa <xliff:g id="TIME">%2$s</xliff:g>. Msimamizi wako wa TEHAMA haruhusu wasifu wako wa kazini kuzimwa kwa zaidi ya siku <xliff:g id="NUMBER">%3$d</xliff:g>."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Washa"</string> <string name="me" msgid="6207584824693813140">"Mimi"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Chaguo za kompyuta ndogo"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Chaguo za Android TV"</string> @@ -2057,11 +2055,11 @@ <string name="resolver_work_tab" msgid="2690019516263167035">"Kazini"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Mwonekano wa binafsi"</string> <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Mwonekano wa kazini"</string> - <string name="resolver_cant_share_with_work_apps" msgid="637686613606502219">"Imeshindwa kushiriki maudhui haya na programu za kazini"</string> + <string name="resolver_cant_share_with_work_apps" msgid="637686613606502219">"Huwezi kushiriki maudhui haya na programu za kazini"</string> <string name="resolver_cant_share_with_work_apps_explanation" msgid="3332302070341130545">"Msimamizi wako wa TEHAMA hakuruhusu ushiriki maudhui haya ukitumia programu zilizo kwenye wasifu wako wa kazini"</string> <string name="resolver_cant_access_work_apps" msgid="2455757966397563223">"Huwezi kufungua maudhui haya ukitumia programu za kazini"</string> <string name="resolver_cant_access_work_apps_explanation" msgid="3626983885525445790">"Msimamizi wako wa TEHAMA hakuruhusu ufungue maudhui haya ukitumia programu zilizo kwenye wasifu wako wa kazini"</string> - <string name="resolver_cant_share_with_personal_apps" msgid="3079139799233316203">"Imeshindwa kushiriki maudhui haya na programu za binafsi"</string> + <string name="resolver_cant_share_with_personal_apps" msgid="3079139799233316203">"Huwezi kushiriki maudhui haya na programu za binafsi"</string> <string name="resolver_cant_share_with_personal_apps_explanation" msgid="2959282422751315171">"Msimamizi wako wa TEHAMA hakuruhusu ushiriki maudhui haya ukitumia programu zilizo kwenye wasifu wako wa binafsi"</string> <string name="resolver_cant_access_personal_apps" msgid="648291604475669395">"Huwezi kufungua maudhui haya ukitumia programu za binafsi"</string> <string name="resolver_cant_access_personal_apps_explanation" msgid="2298773629302296519">"Msimamizi wako wa TEHAMA hakuruhusu ufungue maudhui haya ukitumia programu zilizo kwenye wasifu wako wa binafsi"</string> diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml index cc698c51fafd..2eb8c87e68e1 100644 --- a/core/res/res/values-ta/strings.xml +++ b/core/res/res/values-ta/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"பிரிண்ட் செய்வதை <xliff:g id="OWNER_APP">%s</xliff:g> தடுத்துள்ளது."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"பணிக் கணக்கை ஆன் செய்யுங்கள்"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"பணிக் கணக்கை ஆன் செய்யும் வரை உங்கள் தனிப்பட்ட ஆப்ஸ் தடுக்கப்பட்டிருக்கும்"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"<xliff:g id="DATE">%1$s</xliff:g> அன்று <xliff:g id="TIME">%2$s</xliff:g> நேரத்தில் தனிப்பட்ட ஆப்ஸ் தடுக்கப்படும். பணிக் கணக்கை <xliff:g id="NUMBER">%3$d</xliff:g> நாட்களுக்கு மேல் ஆஃப் செய்து வைத்திருப்பதை உங்கள் IT நிர்வாகி அனுமதிக்கவில்லை."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"ஆன் செய்"</string> <string name="me" msgid="6207584824693813140">"நான்"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"டேப்லெட் விருப்பங்கள்"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Android TV விருப்பத்தேர்வுகள்"</string> diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index b6de1ac49866..0251d721492a 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"ముద్రణ <xliff:g id="OWNER_APP">%s</xliff:g> ద్వారా నిలిపివేయబడింది."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"మీ పని ప్రొఫైల్ను ఆన్ చేయి"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"మీరు మీ కార్యాలయ ప్రొఫైల్ను ప్రారంభించే వరకు, మీ వ్యక్తిగత యాప్లు బ్లాక్ చేయబడతాయి"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"<xliff:g id="DATE">%1$s</xliff:g> తేదీన <xliff:g id="TIME">%2$s</xliff:g>కు వ్యక్తిగత యాప్లు బ్లాక్ చేయబడతాయి. <xliff:g id="NUMBER">%3$d</xliff:g> రోజులకు మించి మీ కార్యాలయ ప్రొఫైల్ను ఆఫ్లో ఉంచటానికి మీ IT అడ్మిన్ అనుమతించరు."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"ఆన్ చేయి"</string> <string name="me" msgid="6207584824693813140">"నేను"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"టాబ్లెట్ ఎంపికలు"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Android TV ఎంపికలు"</string> @@ -2032,7 +2030,7 @@ <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ఫైల్లు</item> <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> ఫైల్</item> </plurals> - <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"ఎవరికి షేర్ చేయాలనేదానికి సంబంధించి సిఫార్సులేవీ లేవు"</string> + <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"ఎవరికి షేర్ చేయాలనే దానికి సంబంధించి సిఫార్సులేవీ లేవు"</string> <string name="chooser_all_apps_button_label" msgid="3230427756238666328">"యాప్ల జాబితా"</string> <string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"ఈ యాప్కు రికార్డ్ చేసే అనుమతి మంజూరు కాలేదు, అయినా ఈ USB పరికరం ద్వారా ఆడియోను క్యాప్చర్ చేయగలదు."</string> <string name="accessibility_system_action_home_label" msgid="3234748160850301870">"హోమ్"</string> @@ -2060,7 +2058,7 @@ <string name="resolver_cant_share_with_work_apps" msgid="637686613606502219">"వర్క్ యాప్లతో దీనిని షేర్ చేయడం సాధ్యపడదు"</string> <string name="resolver_cant_share_with_work_apps_explanation" msgid="3332302070341130545">"మీ కార్యాలయ ప్రొఫైల్లోని యాప్లతో ఈ కంటెంట్ను మీరు షేర్ చేయడానికి మీ IT అడ్మిన్ అనుమతించరు"</string> <string name="resolver_cant_access_work_apps" msgid="2455757966397563223">"వర్క్ యాప్లతో తెరవడం సాధ్యపడదు"</string> - <string name="resolver_cant_access_work_apps_explanation" msgid="3626983885525445790">"మీ కార్యాలయ ప్రొఫైల్లోని యాప్లతో ఈ కంటెంట్ను మీరు తెరవడానికి మీ IT అడ్మిన్ అనుమతించరు"</string> + <string name="resolver_cant_access_work_apps_explanation" msgid="3626983885525445790">"కార్యాలయ ప్రొఫైల్లోని యాప్లతో ఈ కంటెంట్ను మీరు తెరవడానికి మీ IT అడ్మిన్ అనుమతించరు"</string> <string name="resolver_cant_share_with_personal_apps" msgid="3079139799233316203">"వ్యక్తిగత యాప్లతో దీనిని షేర్ చేయడం సాధ్యపడదు"</string> <string name="resolver_cant_share_with_personal_apps_explanation" msgid="2959282422751315171">"మీ వ్యక్తిగత ప్రొఫైల్లోని యాప్లతో ఈ కంటెంట్ను మీరు షేర్ చేయడానికి మీ IT అడ్మిన్ అనుమతించరు"</string> <string name="resolver_cant_access_personal_apps" msgid="648291604475669395">"దీనిని, వ్యక్తిగత యాప్లతో తెరవడం సాధ్యపడదు"</string> diff --git a/core/res/res/values-television/themes_device_defaults.xml b/core/res/res/values-television/themes_device_defaults.xml index cb3d32815ea9..d6bdeee00a9f 100644 --- a/core/res/res/values-television/themes_device_defaults.xml +++ b/core/res/res/values-television/themes_device_defaults.xml @@ -33,5 +33,6 @@ <style name="Theme.DeviceDefault.Autofill.Light" parent="Theme.DeviceDefault.Autofill"/> <style name="Theme.DeviceDefault.Light.Autofill.Save" parent="Theme.DeviceDefault.Autofill.Save"/> - <style name="Theme.DeviceDefault.Resolver" parent="Theme.Leanback.Resolver" /> + <style name="Theme.DeviceDefault.ResolverCommon" parent="Theme.Leanback.Resolver" /> + <style name="Theme.DeviceDefault.Resolver" parent="Theme.DeviceDefault.ResolverCommon" /> </resources> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index 84ca15ad2edf..683b22fa7396 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"<xliff:g id="OWNER_APP">%s</xliff:g> ปิดใช้การพิมพ์แล้ว"</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"เปิดโปรไฟล์งาน"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"แอปส่วนตัวจะถูกบล็อกไว้จนกว่าคุณจะเปิดโปรไฟล์งาน"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"แอปส่วนตัวจะถูกบล็อกในวันที่ <xliff:g id="DATE">%1$s</xliff:g> เวลา <xliff:g id="TIME">%2$s</xliff:g> ผู้ดูแลระบบไอทีไม่อนุญาตให้หยุดใช้โปรไฟล์งานเกิน <xliff:g id="NUMBER">%3$d</xliff:g> วัน"</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"เปิด"</string> <string name="me" msgid="6207584824693813140">"ฉัน"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"ตัวเลือกของแท็บเล็ต"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"ตัวเลือกของ Android TV"</string> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index 395020d2ffc3..45c8e349e5f0 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"Na-disable ng <xliff:g id="OWNER_APP">%s</xliff:g> ang pag-print."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"I-on ang profile sa trabaho"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Naka-block ang iyong mga personal na app hangga\'t hindi mo ino-on ang profile sa trabaho mo"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Iba-block ang mga personal na app sa <xliff:g id="DATE">%1$s</xliff:g> nang <xliff:g id="TIME">%2$s</xliff:g>. Hindi pinapayagan ng iyong IT admin na manatiling naka-off ang profile mo sa trabaho nang mahigit <xliff:g id="NUMBER">%3$d</xliff:g> (na) araw."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"I-on"</string> <string name="me" msgid="6207584824693813140">"Ako"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Mga pagpipilian sa tablet"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Mga opsyon sa Android TV"</string> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index c4da27c6de62..bb9ffc066917 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"Yazdırma işlemi <xliff:g id="OWNER_APP">%s</xliff:g> tarafından devre dışı bırakıldı."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"İş profilinizi açın"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"İş profilinizi açana kadar kişisel uygulamalarınız engellendi"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Kişisel uygulamalar <xliff:g id="DATE">%1$s</xliff:g> tarihinde saat <xliff:g id="TIME">%2$s</xliff:g> itibarıyla engellenecektir. BT yöneticiniz, iş profilinizin <xliff:g id="NUMBER">%3$d</xliff:g> günden fazla kapalı kalmasına izin vermiyor."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Aç"</string> <string name="me" msgid="6207584824693813140">"Ben"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Tablet seçenekleri"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Android TV seçenekleri"</string> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index 46f9fc954e11..6b24d83e7038 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -206,10 +206,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"Додаток <xliff:g id="OWNER_APP">%s</xliff:g> вимкнув друк."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Увімкніть робочий профіль"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Особисті додатки заблоковано, доки ви не ввімкнете робочий профіль"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Особисті додатки буде заблоковано <xliff:g id="DATE">%1$s</xliff:g> о <xliff:g id="TIME">%2$s</xliff:g>. Ваш ІТ-адміністратор не дозволяє, щоб робочий профіль був неактивний більше ніж <xliff:g id="NUMBER">%3$d</xliff:g> дн."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Увімкнути"</string> <string name="me" msgid="6207584824693813140">"Я"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Парам. пристрою"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Опції Android TV"</string> @@ -2135,8 +2133,8 @@ <string name="resolver_cant_access_personal_apps_explanation" msgid="2298773629302296519">"Ваш ІТ-адміністратор не дозволяє відкривати цей контент у додатках в особистому профілі"</string> <string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Робочий профіль призупинено"</string> <string name="resolver_switch_on_work" msgid="2873009160846966379">"Увімкнути"</string> - <string name="resolver_no_work_apps_available_share" msgid="7933949011797699505">"Робочі додатки не можуть підтримувати цей контент"</string> - <string name="resolver_no_work_apps_available_resolve" msgid="1244844292366099399">"Робочі додатки не можуть відкривати цей контент"</string> + <string name="resolver_no_work_apps_available_share" msgid="7933949011797699505">"Немає робочих додатків для цього контенту"</string> + <string name="resolver_no_work_apps_available_resolve" msgid="1244844292366099399">"Немає робочих додатків, щоб відкрити цей контент"</string> <string name="resolver_no_personal_apps_available_share" msgid="5639102815174748732">"Особисті додатки не можуть підтримувати цей контент"</string> <string name="resolver_no_personal_apps_available_resolve" msgid="5120671970531446978">"Особисті додатки не можуть відкривати цей контент"</string> <string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN-код розблокування мережі SIM-карти"</string> diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml index 3ec36bb9f7b0..b432f80fce0e 100644 --- a/core/res/res/values-ur/strings.xml +++ b/core/res/res/values-ur/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"<xliff:g id="OWNER_APP">%s</xliff:g> نے پرنٹنگ کو غیر فعال کر دیا ہے۔"</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"اپنی دفتری پروفائل آن کریں"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"آپ کے ذاتی ایپس کو اس وقت تک بلاک کر دیا جاتا ہے جب تک کہ آپ اپنے ورک پروفایل کو آن نہیں کرتے"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"<xliff:g id="DATE">%1$s</xliff:g> کو <xliff:g id="TIME">%2$s</xliff:g> بجے ذاتی ایپس کو مسدود کر دیا جائے گا۔ آپ کا IT منتظم آپ کی دفتری پروفائل کو <xliff:g id="NUMBER">%3$d</xliff:g> دن سے زیادہ بند رکھنے کی اجازت نہیں دیتا ہے۔"</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"آن کریں"</string> <string name="me" msgid="6207584824693813140">"میں"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"ٹیبلیٹ کے اختیارات"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Android TV اختیارات"</string> @@ -1130,8 +1128,8 @@ <string name="whichViewApplication" msgid="5733194231473132945">"اس کے ساتھ کھولیں"</string> <string name="whichViewApplicationNamed" msgid="415164730629690105">"%1$s کے ساتھ کھولیں"</string> <string name="whichViewApplicationLabel" msgid="7367556735684742409">"کھولیں"</string> - <string name="whichOpenHostLinksWith" msgid="7645631470199397485">"<xliff:g id="HOST">%1$s</xliff:g> لنکس کے ساتھ کھولیں"</string> - <string name="whichOpenLinksWith" msgid="1120936181362907258">"لنکس کے ساتھ کھولیں"</string> + <string name="whichOpenHostLinksWith" msgid="7645631470199397485">"<xliff:g id="HOST">%1$s</xliff:g> لنکس کے اس کے ساتھ کھولیں"</string> + <string name="whichOpenLinksWith" msgid="1120936181362907258">"اس کے ساتھ لنکس کھولیں"</string> <string name="whichOpenLinksWithApp" msgid="6917864367861910086">"<xliff:g id="APPLICATION">%1$s</xliff:g> کے ذریعے لنکس کھولیں"</string> <string name="whichOpenHostLinksWithApp" msgid="2401668560768463004">"<xliff:g id="HOST">%1$s</xliff:g> لنکس کو <xliff:g id="APPLICATION">%2$s</xliff:g> کے ذریعے کھولیں"</string> <string name="whichGiveAccessToApplicationLabel" msgid="7805857277166106236">"رسائی دیں"</string> @@ -1588,7 +1586,7 @@ </plurals> <string name="kg_pattern_instructions" msgid="8366024510502517748">"اپنا پیٹرن ڈرا کریں"</string> <string name="kg_sim_pin_instructions" msgid="6479401489471690359">"SIM PIN درج کریں"</string> - <string name="kg_pin_instructions" msgid="7355933174673539021">"PIN درج کریں"</string> + <string name="kg_pin_instructions" msgid="7355933174673539021">"PIN درج کریں"</string> <string name="kg_password_instructions" msgid="7179782578809398050">"پاس ورڈ درج کریں"</string> <string name="kg_puk_enter_puk_hint" msgid="6696187482616360994">"SIM اب غیر فعال ہوگیا ہے۔ جاری رکھنے کیلئے PUK کوڈ درج کریں۔ تفصیلات کیلئے کیریئر سے رابطہ کریں۔"</string> <string name="kg_puk_enter_pin_hint" msgid="8190982314659429770">"پسندیدہ PIN کوڈ درج کریں"</string> @@ -1761,7 +1759,7 @@ <string name="print_service_installed_title" msgid="6134880817336942482">"<xliff:g id="NAME">%s</xliff:g> سروس انسٹال ہو گئی"</string> <string name="print_service_installed_message" msgid="7005672469916968131">"فعال کرنے کیلئے تھپتھپائیں"</string> <string name="restr_pin_enter_admin_pin" msgid="1199419462726962697">"منتظم PIN درج کریں"</string> - <string name="restr_pin_enter_pin" msgid="373139384161304555">"PIN درج کریں"</string> + <string name="restr_pin_enter_pin" msgid="373139384161304555">"PIN درج کریں"</string> <string name="restr_pin_incorrect" msgid="3861383632940852496">"غلط"</string> <string name="restr_pin_enter_old_pin" msgid="7537079094090650967">"موجودہ PIN"</string> <string name="restr_pin_enter_new_pin" msgid="3267614461844565431">"نیا PIN"</string> diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml index 27b3e726140e..fffa26553312 100644 --- a/core/res/res/values-uz/strings.xml +++ b/core/res/res/values-uz/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"Chop etish funksiyasi <xliff:g id="OWNER_APP">%s</xliff:g> tomonidan faolsizlantirilgan."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Ish profilingizni yoqing"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Ish profilingiz yoniqligida shaxsiy ilovalaringiz bloklanadi"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Shaxsiy ilovalar <xliff:g id="DATE">%1$s</xliff:g> <xliff:g id="TIME">%2$s</xliff:g> da bloklanadi. AT administratoringiz ish profili <xliff:g id="NUMBER">%3$d</xliff:g> kundan ortiq oʻchiq qolishini taqiqlagan"</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Yoqish"</string> <string name="me" msgid="6207584824693813140">"Men"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Planshet sozlamalari"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Android TV parametrlari"</string> @@ -1308,8 +1306,8 @@ <string name="usb_power_notification_message" msgid="7284765627437897702">"Ulangan qurilma quvvatlanmoqda. Boshqa parametrlar uchun bosing."</string> <string name="usb_unsupported_audio_accessory_title" msgid="2335775548086533065">"Analogli audio uskuna aniqlandi"</string> <string name="usb_unsupported_audio_accessory_message" msgid="1300168007129796621">"Biriktirilgan qurilma mazkur telefon bilan mos emas. Batafsil axborot olish uchun bu yerga bosing."</string> - <string name="adb_active_notification_title" msgid="408390247354560331">"USB orqali nosozliklarni aniqlash"</string> - <string name="adb_active_notification_message" msgid="5617264033476778211">"USB orqali nosozliklarni aniqlashni faolsizlantirish uchun bosing"</string> + <string name="adb_active_notification_title" msgid="408390247354560331">"USB debagging ulandi"</string> + <string name="adb_active_notification_message" msgid="5617264033476778211">"USB debaggingni uzish uchun bosing"</string> <string name="adb_active_notification_message" product="tv" msgid="6624498401272780855">"USB orqali nosozliklarni tuzatishni o‘chirib qo‘yish uchun bosing."</string> <string name="adbwifi_active_notification_title" msgid="6147343659168302473">"Wi-Fi orqali debagging yoqildi"</string> <string name="adbwifi_active_notification_message" msgid="930987922852867972">"Wi-Fi orqali debagging uzilishi uchun bosing"</string> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index 5fe12fd1b43c..7ecad59d4162 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"<xliff:g id="OWNER_APP">%s</xliff:g> đã tắt tính năng in."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Bật hồ sơ công việc của bạn"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Ứng dụng cá nhân của bạn bị chặn cho tới khi bạn bật hồ sơ công việc"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Ứng dụng cá nhân sẽ bị chặn lúc <xliff:g id="TIME">%2$s</xliff:g> vào <xliff:g id="DATE">%1$s</xliff:g>. Quản trị viên CNTT không cho phép bạn tắt hồ sơ công việc quá <xliff:g id="NUMBER">%3$d</xliff:g> ngày."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Bật"</string> <string name="me" msgid="6207584824693813140">"Tôi"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Tùy chọn máy tính bảng"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Tùy chọn dành cho Android TV"</string> @@ -2032,7 +2030,7 @@ <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> tệp</item> <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> tệp</item> </plurals> - <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Không có người nào được đề xuất để chia sẻ"</string> + <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Không có gợi ý về người để chia sẻ"</string> <string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Danh sách ứng dụng"</string> <string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Ứng dụng này chưa được cấp quyền ghi âm nhưng vẫn có thể ghi âm thông qua thiết bị USB này."</string> <string name="accessibility_system_action_home_label" msgid="3234748160850301870">"Màn hình chính"</string> @@ -2065,7 +2063,7 @@ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="2959282422751315171">"Quản trị viên CNTT không cho phép chia sẻ nội dung này với các ứng dụng trong hồ sơ cá nhân của bạn"</string> <string name="resolver_cant_access_personal_apps" msgid="648291604475669395">"Không thể mở nội dung này bằng các ứng dụng cá nhân"</string> <string name="resolver_cant_access_personal_apps_explanation" msgid="2298773629302296519">"Quản trị viên CNTT không cho phép mở nội dung này bằng các ứng dụng trong hồ sơ cá nhân của bạn"</string> - <string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Hồ sơ công việc bị tạm dừng"</string> + <string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Hồ sơ công việc đã bị tạm dừng"</string> <string name="resolver_switch_on_work" msgid="2873009160846966379">"Bật"</string> <string name="resolver_no_work_apps_available_share" msgid="7933949011797699505">"Các ứng dụng công việc không hỗ trợ nội dung này"</string> <string name="resolver_no_work_apps_available_resolve" msgid="1244844292366099399">"Các ứng dụng công việc không thể mở nội dung này"</string> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 9faa93ad9a5e..6e2b78b0de93 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"“<xliff:g id="OWNER_APP">%s</xliff:g>”已停用打印功能。"</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"开启工作资料"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"系统已屏蔽您的个人应用。您需要开启工作资料,系统才会取消屏蔽这些应用"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"系统将于 <xliff:g id="DATE">%1$s</xliff:g><xliff:g id="TIME">%2$s</xliff:g> 屏蔽个人应用。IT 管理员不允许您的工作资料保持关闭状态超过 <xliff:g id="NUMBER">%3$d</xliff:g> 天。"</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"开启"</string> <string name="me" msgid="6207584824693813140">"我"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"平板电脑选项"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Android TV 选项"</string> diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index 66bc070c4775..f808f900cdc0 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"「<xliff:g id="OWNER_APP">%s</xliff:g>」暫停了列印。"</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"開啟工作設定檔"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"系統會封鎖您的個人應用程式,直至您開啟工作設定檔為止"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"個人應用程式將於 <xliff:g id="DATE">%1$s</xliff:g> <xliff:g id="TIME">%2$s</xliff:g> 封鎖。IT 管理員不允許您的工作設定檔保持關閉狀態超過 <xliff:g id="NUMBER">%3$d</xliff:g> 天。"</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"開啟"</string> <string name="me" msgid="6207584824693813140">"我本人"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"平板電腦選項"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Android TV 選項"</string> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index 6a7391bb0f56..559e681b178c 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"「<xliff:g id="OWNER_APP">%s</xliff:g>」已停用列印功能。"</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"開啟工作資料夾"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"系統已封鎖你的個人應用程式;你必須開啟工作資料夾,這些應用程式才會解除封鎖"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"系統將於 <xliff:g id="DATE">%1$s</xliff:g><xliff:g id="TIME">%2$s</xliff:g> 封鎖個人應用程式。IT 管理員不允許工作資料夾關閉超過 <xliff:g id="NUMBER">%3$d</xliff:g> 天。"</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"開啟"</string> <string name="me" msgid="6207584824693813140">"我"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"平板電腦選項"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Android TV 選項"</string> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index 946e4eac7532..3b95ffb497ba 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"Ukuphrinta kukhutshazwe nge-<xliff:g id="OWNER_APP">%s</xliff:g>."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Vula iphrofayela yakho yomsebenzi"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Izinhlelo zakho zokusebenza zomuntu siqu zivinjelwe kuze kube yilapho uvula iphrofayela yakho yomsebenzi"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Izinhlelo zokusebenza zomuntu siqu zizovinjelwa ngomhla ka-<xliff:g id="DATE">%1$s</xliff:g> ngo-<xliff:g id="TIME">%2$s</xliff:g>. Umphathi wakho we-IT akavumeli ukuthi iphrofayela yakho yomsebenzi ihlale ivaliwe izinsuku ezingaphezu kwezi-<xliff:g id="NUMBER">%3$d</xliff:g>."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Vula"</string> <string name="me" msgid="6207584824693813140">"Mina"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Okukhethwa kukho kwethebhulethi"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Izinketho ze-Android TV"</string> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 2cad9e6888a6..b79c9e804f89 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -4456,11 +4456,4 @@ <bool name="config_pdp_reject_enable_retry">false</bool> <!-- pdp data reject retry delay in ms --> <integer name="config_pdp_reject_retry_delay_ms">-1</integer> - - <!-- Package name that is recognized as an actor for the packages listed in - @array/config_overlayableConfiguratorTargets. If an overlay targeting one of the listed - targets is signed with the same signature as the configurator, the overlay will be granted - the "actor" policy. --> - <string name="config_overlayableConfigurator" translatable="false" /> - <string-array name="config_overlayableConfiguratorTargets" translatable="false" /> </resources> diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml index ad3d20ee5f24..59bb052cbdf5 100644 --- a/core/res/res/values/dimens.xml +++ b/core/res/res/values/dimens.xml @@ -312,6 +312,12 @@ <!-- The margin of the content to an image--> <dimen name="notification_content_image_margin_end">8dp</dimen> + <!-- The padding at the end of actions when the bubble button is visible--> + <dimen name="bubble_visible_padding_end">3dp</dimen> + + <!-- The padding at the end of actions when the bubble button is gone--> + <dimen name="bubble_gone_padding_end">12dp</dimen> + <!-- The spacing between messages in Notification.MessagingStyle --> <dimen name="notification_messaging_spacing">6dp</dimen> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index f30d482e06b2..ab4005b4893c 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -1785,6 +1785,7 @@ <java-symbol type="string" name="faceunlock_multiple_failures" /> <java-symbol type="string" name="global_actions" /> <java-symbol type="string" name="global_action_power_off" /> + <java-symbol type="string" name="global_action_power_options" /> <java-symbol type="string" name="global_action_restart" /> <java-symbol type="string" name="global_actions_airplane_mode_off_status" /> <java-symbol type="string" name="global_actions_airplane_mode_on_status" /> @@ -2766,6 +2767,7 @@ <java-symbol type="bool" name="config_mainBuiltInDisplayIsRound" /> <java-symbol type="id" name="actions_container" /> + <java-symbol type="id" name="actions_container_layout" /> <java-symbol type="id" name="smart_reply_container" /> <java-symbol type="id" name="remote_input_tag" /> <java-symbol type="id" name="pending_intent_tag" /> @@ -3533,6 +3535,8 @@ <java-symbol type="id" name="clip_to_padding_tag" /> <java-symbol type="id" name="clip_children_tag" /> <java-symbol type="id" name="bubble_button" /> + <java-symbol type="dimen" name="bubble_visible_padding_end" /> + <java-symbol type="dimen" name="bubble_gone_padding_end" /> <java-symbol type="dimen" name="messaging_avatar_size" /> <java-symbol type="dimen" name="messaging_group_sending_progress_size" /> <java-symbol type="dimen" name="messaging_image_rounding" /> @@ -3834,7 +3838,9 @@ <java-symbol type="string" name="config_factoryResetPackage" /> <java-symbol type="array" name="config_highRefreshRateBlacklist" /> + <java-symbol type="layout" name="chooser_dialog" /> <java-symbol type="layout" name="chooser_dialog_item" /> + <java-symbol type="drawable" name="chooser_dialog_background" /> <java-symbol type="id" name="chooser_copy_button" /> <java-symbol type="layout" name="chooser_action_button" /> <java-symbol type="dimen" name="chooser_action_button_icon_size" /> @@ -4033,8 +4039,5 @@ <java-symbol type="string" name="config_pdp_reject_service_not_subscribed" /> <java-symbol type="string" name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" /> - <java-symbol type="string" name="config_overlayableConfigurator" /> - <java-symbol type="array" name="config_overlayableConfiguratorTargets" /> - <java-symbol type="array" name="config_notificationMsgPkgsAllowedAsConvos" /> </resources> diff --git a/core/res/res/values/themes_leanback.xml b/core/res/res/values/themes_leanback.xml index a80725c2758b..9dca9128e362 100644 --- a/core/res/res/values/themes_leanback.xml +++ b/core/res/res/values/themes_leanback.xml @@ -128,6 +128,10 @@ <!-- Toolbar attributes --> <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> + + <!-- Icon sizes --> + <item name="iconfactoryIconSize">@dimen/resolver_icon_size</item> + <item name="iconfactoryBadgeSize">@dimen/resolver_badge_size</item> </style> <!-- @hide Special theme for the default system Activity-based Alert dialogs. --> diff --git a/core/tests/coretests/src/android/content/ContextTest.java b/core/tests/coretests/src/android/content/ContextTest.java index f13a11e9edfb..17d1389a6602 100644 --- a/core/tests/coretests/src/android/content/ContextTest.java +++ b/core/tests/coretests/src/android/content/ContextTest.java @@ -23,12 +23,14 @@ import static android.view.Display.DEFAULT_DISPLAY; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; import android.app.ActivityThread; import android.content.res.Configuration; import android.graphics.PixelFormat; import android.hardware.display.DisplayManager; import android.hardware.display.VirtualDisplay; +import android.inputmethodservice.InputMethodService; import android.media.ImageReader; import android.os.UserHandle; import android.view.Display; @@ -136,6 +138,13 @@ public class ContextTest { } @Test + public void testIsUiContext_InputMethodService_returnsTrue() { + final InputMethodService ims = new InputMethodService(); + + assertTrue(ims.isUiContext()); + } + + @Test public void testGetDisplayFromDisplayContextDerivedContextOnPrimaryDisplay() { verifyGetDisplayFromDisplayContextDerivedContext(false /* onSecondaryDisplay */); } diff --git a/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java b/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java index dcecb5f32096..547176855f32 100644 --- a/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java +++ b/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java @@ -34,9 +34,11 @@ import static com.android.internal.app.ChooserListAdapter.SHORTCUT_TARGET_SCORE_ import static com.android.internal.app.ChooserWrapperActivity.sOverrides; import static com.android.internal.app.MatcherUtils.first; +import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertNull; import static junit.framework.Assert.assertTrue; +import static org.hamcrest.CoreMatchers.allOf; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.CoreMatchers.notNullValue; @@ -1327,7 +1329,6 @@ public class ChooserActivityTest { assertThat(activity.getWorkListAdapter().getCount(), is(workProfileTargets)); } - @Ignore // b/148156663 @Test public void testWorkTab_selectingWorkTabAppOpensAppInWorkProfile() throws InterruptedException { // enable the work tab feature flag @@ -1354,8 +1355,10 @@ public class ChooserActivityTest { // wait for the share sheet to expand Thread.sleep(ChooserActivity.LIST_VIEW_UPDATE_INTERVAL_IN_MILLIS); - onView(first(withText(workResolvedComponentInfos.get(0) - .getResolveInfoAt(0).activityInfo.applicationInfo.name))) + onView(first(allOf( + withText(workResolvedComponentInfos.get(0) + .getResolveInfoAt(0).activityInfo.applicationInfo.name), + isDisplayed()))) .perform(click()); waitForIdle(); assertThat(chosen[0], is(workResolvedComponentInfos.get(0).getResolveInfoAt(0))); @@ -1953,6 +1956,45 @@ public class ChooserActivityTest { assertThat(activity.getAdapter().getRankedTargetCount(), is(3)); } + @Test + public void testWorkTab_selectingWorkTabWithPausedWorkProfile_directShareTargetsNotQueried() { + // enable the work tab feature flag + ResolverActivity.ENABLE_TABBED_VIEW = true; + markWorkProfileUserAvailable(); + List<ResolvedComponentInfo> personalResolvedComponentInfos = + createResolvedComponentsForTestWithOtherProfile(3, /* userId */ 10); + List<ResolvedComponentInfo> workResolvedComponentInfos = + createResolvedComponentsForTest(3); + setupResolverControllers(personalResolvedComponentInfos, workResolvedComponentInfos); + sOverrides.isQuietModeEnabled = true; + boolean[] isQueryDirectShareCalledOnWorkProfile = new boolean[] { false }; + sOverrides.onQueryDirectShareTargets = chooserListAdapter -> { + isQueryDirectShareCalledOnWorkProfile[0] = + (chooserListAdapter.getUserHandle().getIdentifier() == 10); + return null; + }; + boolean[] isQueryTargetServicesCalledOnWorkProfile = new boolean[] { false }; + sOverrides.onQueryTargetServices = chooserListAdapter -> { + isQueryTargetServicesCalledOnWorkProfile[0] = + (chooserListAdapter.getUserHandle().getIdentifier() == 10); + return null; + }; + Intent sendIntent = createSendTextIntent(); + sendIntent.setType("TestType"); + + mActivityRule.launchActivity(Intent.createChooser(sendIntent, "work tab test")); + waitForIdle(); + onView(withId(R.id.contentPanel)) + .perform(swipeUp()); + onView(withText(R.string.resolver_work_tab)).perform(click()); + waitForIdle(); + + assertFalse("Direct share targets were queried on a paused work profile", + isQueryDirectShareCalledOnWorkProfile[0]); + assertFalse("Target services were queried on a paused work profile", + isQueryTargetServicesCalledOnWorkProfile[0]); + } + private Intent createChooserIntent(Intent intent, Intent[] initialIntents) { Intent chooserIntent = new Intent(); chooserIntent.setAction(Intent.ACTION_CHOOSER); diff --git a/core/tests/coretests/src/com/android/internal/app/ChooserWrapperActivity.java b/core/tests/coretests/src/com/android/internal/app/ChooserWrapperActivity.java index 749b0e54b880..44a52639bd35 100644 --- a/core/tests/coretests/src/com/android/internal/app/ChooserWrapperActivity.java +++ b/core/tests/coretests/src/com/android/internal/app/ChooserWrapperActivity.java @@ -205,6 +205,23 @@ public class ChooserWrapperActivity extends ChooserActivity { return getApplicationContext(); } + @Override + protected void queryDirectShareTargets(ChooserListAdapter adapter, + boolean skipAppPredictionService) { + if (sOverrides.onQueryDirectShareTargets != null) { + sOverrides.onQueryDirectShareTargets.apply(adapter); + } + super.queryDirectShareTargets(adapter, skipAppPredictionService); + } + + @Override + protected void queryTargetServices(ChooserListAdapter adapter) { + if (sOverrides.onQueryTargetServices != null) { + sOverrides.onQueryTargetServices.apply(adapter); + } + super.queryTargetServices(adapter); + } + /** * We cannot directly mock the activity created since instrumentation creates it. * <p> @@ -214,6 +231,8 @@ public class ChooserWrapperActivity extends ChooserActivity { @SuppressWarnings("Since15") public Function<PackageManager, PackageManager> createPackageManager; public Function<TargetInfo, Boolean> onSafelyStartCallback; + public Function<ChooserListAdapter, Void> onQueryDirectShareTargets; + public Function<ChooserListAdapter, Void> onQueryTargetServices; public ResolverListController resolverListController; public ResolverListController workResolverListController; public Boolean isVoiceInteraction; @@ -233,6 +252,8 @@ public class ChooserWrapperActivity extends ChooserActivity { public void reset() { onSafelyStartCallback = null; + onQueryDirectShareTargets = null; + onQueryTargetServices = null; isVoiceInteraction = null; createPackageManager = null; previewThumbnail = null; diff --git a/core/tests/coretests/src/com/android/internal/app/ResolverActivityTest.java b/core/tests/coretests/src/com/android/internal/app/ResolverActivityTest.java index 8bee1e5cab3b..7dc5a8b58f91 100644 --- a/core/tests/coretests/src/com/android/internal/app/ResolverActivityTest.java +++ b/core/tests/coretests/src/com/android/internal/app/ResolverActivityTest.java @@ -592,7 +592,6 @@ public class ResolverActivityTest { TextUtils.equals(initialText, currentText)); } - @Ignore // b/148156663 @Test public void testWorkTab_noPersonalApps_canStartWorkApps() throws InterruptedException { @@ -617,8 +616,10 @@ public class ResolverActivityTest { waitForIdle(); // wait for the share sheet to expand Thread.sleep(ChooserActivity.LIST_VIEW_UPDATE_INTERVAL_IN_MILLIS); - onView(first(allOf(withText(workResolvedComponentInfos.get(0) - .getResolveInfoAt(0).activityInfo.applicationInfo.name), isCompletelyDisplayed()))) + onView(first(allOf( + withText(workResolvedComponentInfos.get(0) + .getResolveInfoAt(0).activityInfo.applicationInfo.name), + isDisplayed()))) .perform(click()); onView(withId(R.id.button_once)) .perform(click()); diff --git a/core/tests/hdmitests/src/android/hardware/hdmi/HdmiAudioSystemClientTest.java b/core/tests/hdmitests/src/android/hardware/hdmi/HdmiAudioSystemClientTest.java index 7cd2f3b4c2ab..a4f206586625 100644 --- a/core/tests/hdmitests/src/android/hardware/hdmi/HdmiAudioSystemClientTest.java +++ b/core/tests/hdmitests/src/android/hardware/hdmi/HdmiAudioSystemClientTest.java @@ -363,6 +363,16 @@ public class HdmiAudioSystemClientTest { public boolean isHdmiCecVolumeControlEnabled() { return true; } + + @Override + public void addHdmiCecVolumeControlFeatureListener( + IHdmiCecVolumeControlFeatureListener listener) { + } + + @Override + public void removeHdmiCecVolumeControlFeatureListener( + IHdmiCecVolumeControlFeatureListener listener) { + } } } diff --git a/core/tests/overlaytests/remount/Android.bp b/core/tests/overlaytests/remount/Android.bp index 5757cfe75514..4e79a4574af4 100644 --- a/core/tests/overlaytests/remount/Android.bp +++ b/core/tests/overlaytests/remount/Android.bp @@ -28,5 +28,6 @@ java_test_host { ":OverlayRemountedTest_Target", ":OverlayRemountedTest_TargetUpgrade", ":OverlayRemountedTest_Overlay", + ":OverlayRemountedTest_Overlay_SameCert", ], } diff --git a/core/tests/overlaytests/remount/src/com/android/overlaytest/remounted/PackagedUpgradedTest.java b/core/tests/overlaytests/remount/src/com/android/overlaytest/remounted/RegenerateIdmapTest.java index a4656403b03f..2b68015536ed 100644 --- a/core/tests/overlaytests/remount/src/com/android/overlaytest/remounted/PackagedUpgradedTest.java +++ b/core/tests/overlaytests/remount/src/com/android/overlaytest/remounted/RegenerateIdmapTest.java @@ -22,7 +22,9 @@ import org.junit.Test; import org.junit.runner.RunWith; @RunWith(DeviceJUnit4ClassRunner.class) -public class PackagedUpgradedTest extends OverlayRemountedTestBase { +public class RegenerateIdmapTest extends OverlayRemountedTestBase { + private static final String OVERLAY_SIGNATURE_APK = + "OverlayRemountedTest_Overlay_SameCert.apk"; private static final String TARGET_UPGRADE_APK = "OverlayRemountedTest_TargetUpgrade.apk"; @Test @@ -66,4 +68,32 @@ public class PackagedUpgradedTest extends OverlayRemountedTestBase { assertResource(targetReference, "@" + 0x7f0100ff + " -> true"); assertResource(targetOverlaid, "true"); } + + @Test + public void testIdmapPoliciesChanged() throws Exception { + final String targetResource = resourceName(TARGET_PACKAGE, "bool", + "signature_policy_overlaid"); + + mPreparer.pushResourceFile(TARGET_APK, "/product/app/OverlayTarget.apk") + .pushResourceFile(OVERLAY_APK, "/product/overlay/TestOverlay.apk") + .reboot() + .setOverlayEnabled(OVERLAY_PACKAGE, false); + + assertResource(targetResource, "false"); + + // The overlay is not signed with the same signature as the target. + mPreparer.setOverlayEnabled(OVERLAY_PACKAGE, true); + assertResource(targetResource, "false"); + + // Replace the overlay with a version of the overlay that is signed with the same signature + // as the target. + mPreparer.pushResourceFile(OVERLAY_SIGNATURE_APK, "/product/overlay/TestOverlay.apk") + .reboot(); + + // The idmap should have been recreated with the signature policy fulfilled. + assertResource(targetResource, "true"); + + mPreparer.setOverlayEnabled(OVERLAY_PACKAGE, false); + assertResource(targetResource, "false"); + } } diff --git a/core/tests/overlaytests/remount/test-apps/Overlay/Android.bp b/core/tests/overlaytests/remount/test-apps/Overlay/Android.bp index a1fdbfd3542c..032a0cdcb50d 100644 --- a/core/tests/overlaytests/remount/test-apps/Overlay/Android.bp +++ b/core/tests/overlaytests/remount/test-apps/Overlay/Android.bp @@ -19,3 +19,9 @@ android_test_helper_app { "com.android.overlaytest.overlay", ], } + +android_test_helper_app { + name: "OverlayRemountedTest_Overlay_SameCert", + certificate: ":rro-remounted-test-a", + sdk_version: "current", +}
\ No newline at end of file diff --git a/core/tests/overlaytests/remount/test-apps/Overlay/res/values/values.xml b/core/tests/overlaytests/remount/test-apps/Overlay/res/values/values.xml index 675e44f19f95..927d37fc60b9 100644 --- a/core/tests/overlaytests/remount/test-apps/Overlay/res/values/values.xml +++ b/core/tests/overlaytests/remount/test-apps/Overlay/res/values/values.xml @@ -17,4 +17,5 @@ <resources> <bool name="target_overlaid">true</bool> + <bool name="signature_policy_overlaid">true</bool> </resources> diff --git a/core/tests/overlaytests/remount/test-apps/Target/Android.bp b/core/tests/overlaytests/remount/test-apps/Target/Android.bp index 19947b1ea51a..e4b4eaa8d220 100644 --- a/core/tests/overlaytests/remount/test-apps/Target/Android.bp +++ b/core/tests/overlaytests/remount/test-apps/Target/Android.bp @@ -15,6 +15,7 @@ android_test_helper_app { name: "OverlayRemountedTest_Target", sdk_version: "test_current", + certificate: ":rro-remounted-test-a", apex_available: [ "com.android.overlaytest.overlaid", ], @@ -23,6 +24,7 @@ android_test_helper_app { android_test_helper_app { name: "OverlayRemountedTest_TargetUpgrade", + certificate: ":rro-remounted-test-a", resource_dirs: ["res_upgrade"], sdk_version: "test_current", } diff --git a/core/tests/overlaytests/remount/test-apps/Target/res/values/overlayable.xml b/core/tests/overlaytests/remount/test-apps/Target/res/values/overlayable.xml index 4aa5bcee8f3d..79c9a675a6dd 100644 --- a/core/tests/overlaytests/remount/test-apps/Target/res/values/overlayable.xml +++ b/core/tests/overlaytests/remount/test-apps/Target/res/values/overlayable.xml @@ -20,5 +20,8 @@ <policy type="public"> <item type="bool" name="target_overlaid" /> </policy> + <policy type="signature"> + <item type="bool" name="signature_policy_overlaid" /> + </policy> </overlayable> </resources> diff --git a/core/tests/overlaytests/remount/test-apps/Target/res/values/values.xml b/core/tests/overlaytests/remount/test-apps/Target/res/values/values.xml index 76253a95b766..64a1683e14be 100644 --- a/core/tests/overlaytests/remount/test-apps/Target/res/values/values.xml +++ b/core/tests/overlaytests/remount/test-apps/Target/res/values/values.xml @@ -23,4 +23,6 @@ <bool name="target_overlaid">false</bool> <public type="bool" name="target_overlaid" id="0x7f010000" /> <bool name="target_reference">@bool/target_overlaid</bool> + + <bool name="signature_policy_overlaid">false</bool> </resources> diff --git a/core/tests/overlaytests/remount/test-apps/certs/Android.bp b/core/tests/overlaytests/remount/test-apps/certs/Android.bp new file mode 100644 index 000000000000..06114efc1249 --- /dev/null +++ b/core/tests/overlaytests/remount/test-apps/certs/Android.bp @@ -0,0 +1,19 @@ +// 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. + +// development/tools/make_key rro-remounted-test-a '/CN=rro_test_a' +android_app_certificate { + name: "rro-remounted-test-a", + certificate: "rro-remounted-test-a", +} diff --git a/core/tests/overlaytests/remount/test-apps/certs/rro-remounted-test-a.pk8 b/core/tests/overlaytests/remount/test-apps/certs/rro-remounted-test-a.pk8 Binary files differnew file mode 100644 index 000000000000..aa6cc97d07f6 --- /dev/null +++ b/core/tests/overlaytests/remount/test-apps/certs/rro-remounted-test-a.pk8 diff --git a/core/tests/overlaytests/remount/test-apps/certs/rro-remounted-test-a.x509.pem b/core/tests/overlaytests/remount/test-apps/certs/rro-remounted-test-a.x509.pem new file mode 100644 index 000000000000..be491c7029fe --- /dev/null +++ b/core/tests/overlaytests/remount/test-apps/certs/rro-remounted-test-a.x509.pem @@ -0,0 +1,19 @@ +-----BEGIN CERTIFICATE----- +MIIDCzCCAfOgAwIBAgIUfphI+C6W6V6RomsP7+CW5dO5cGcwDQYJKoZIhvcNAQEL +BQAwFTETMBEGA1UEAwwKcnJvX3Rlc3RfYTAeFw0yMDA1MTQxNjM4MDBaFw00NzA5 +MzAxNjM4MDBaMBUxEzARBgNVBAMMCnJyb190ZXN0X2EwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQCvXM8tcqQFwH7iQG6+8mAx2ADhwbtq+8Rcmiz7wviW +Yf/eFDRuvZ/ma6lxeVJ7mcbF7A5rinEKdgN5hlW2UlbTmuX5YOiXnX3Y2J5t+8Pi +aq787IvWxkawwkj0Oy1Hk01Z4w3HTYntYqi36bq4QyNpwh515VqgvEyCHT7IPtQi +XjfwcTW0thUlSDyDkgxq9NxNEJgaHHOamKkeMCO8CkBWkhlcPXvjcM8DPFmyzDI9 +Czv8IYFZQbcG/N2GPH9hSteMnuC+zyoMio0V/VRctQGlAA8ATsheBkng0zcNRu9Z +GIavk5AaClmBFTeQx01j3HFSO8UDdDJ5Hk8uDTqecPLpAgMBAAGjUzBRMB0GA1Ud +DgQWBBSPbIdzSkPbzltj3qIS13LNDiyIiDAfBgNVHSMEGDAWgBSPbIdzSkPbzltj +3qIS13LNDiyIiDAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQCH +QvvMGyMvVJaWMEJwVdUnszdXiAlUtDd/2HpdGOxW6xVVAvveP8hJ71gWFQ7Qs3Mr +3jxclbC37qVAPiQb8kkD8qUgoQYMC43asif6Jn65OU1QkDRF3bFHP+rZVSPEwtvl +YMbOzHPOLr7HESwlM7TB6EoZ4oOso++jTYI/OSif1MOKOMbOt4X/DE/PXf81ayFs +uRjpocBqnLwOourABMcaKbA92jB0LRTtgv5ngOJ3+5P1cTiHktFbnqVWa8/A3uSA +dNR5dpOUjH+nCHTwPl64b7R70PgDxnoqMs0xI7VtJovXor64OZy9P8WTdurz5V/z +k2IVSi032bf0aTxamvqV +-----END CERTIFICATE----- diff --git a/core/tests/screenshothelpertests/src/com/android/internal/util/ScreenshotHelperTest.java b/core/tests/screenshothelpertests/src/com/android/internal/util/ScreenshotHelperTest.java index fe33cd80f735..4b8173732b4d 100644 --- a/core/tests/screenshothelpertests/src/com/android/internal/util/ScreenshotHelperTest.java +++ b/core/tests/screenshothelpertests/src/com/android/internal/util/ScreenshotHelperTest.java @@ -29,11 +29,12 @@ import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; +import android.content.ComponentName; import android.content.Context; import android.content.res.Resources; -import android.graphics.Bitmap; import android.graphics.Insets; import android.graphics.Rect; +import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.view.WindowManager; @@ -91,8 +92,7 @@ public final class ScreenshotHelperTest { @Test public void testProvidedImageScreenshot() { mScreenshotHelper.provideScreenshot( - Bitmap.createBitmap(10, 10, Bitmap.Config.ARGB_8888), new Rect(), - Insets.of(0, 0, 0, 0), 1, + new Bundle(), new Rect(), Insets.of(0, 0, 0, 0), 1, 1, new ComponentName("", ""), WindowManager.ScreenshotSource.SCREENSHOT_OTHER, mHandler, null); } diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml index aa4e9f20c7fc..9b503eba5c68 100644 --- a/data/etc/privapp-permissions-platform.xml +++ b/data/etc/privapp-permissions-platform.xml @@ -378,6 +378,9 @@ applications that come with the platform <permission name="android.permission.SET_WALLPAPER" /> <permission name="android.permission.SET_WALLPAPER_COMPONENT" /> <permission name="android.permission.REQUEST_NOTIFICATION_ASSISTANT_SERVICE" /> + <!-- Permissions required for Incremental CTS tests --> + <permission name="com.android.permission.USE_INSTALLER_V2"/> + <permission name="android.permission.LOADER_USAGE_STATS"/> <!-- Permission required to test system only camera devices. --> <permission name="android.permission.SYSTEM_CAMERA" /> <!-- Permission required to test ExplicitHealthCheckServiceImpl. --> diff --git a/libs/androidfw/include/androidfw/ResourceTypes.h b/libs/androidfw/include/androidfw/ResourceTypes.h index 2bfc7fc38d1c..21be81cb85bd 100644 --- a/libs/androidfw/include/androidfw/ResourceTypes.h +++ b/libs/androidfw/include/androidfw/ResourceTypes.h @@ -41,7 +41,7 @@ namespace android { constexpr const static uint32_t kIdmapMagic = 0x504D4449u; -constexpr const static uint32_t kIdmapCurrentVersion = 0x00000003u; +constexpr const static uint32_t kIdmapCurrentVersion = 0x00000004u; /** * In C++11, char16_t is defined as *at least* 16 bits. We do a lot of @@ -1746,6 +1746,9 @@ struct Idmap_header { uint32_t target_crc32; uint32_t overlay_crc32; + uint32_t fulfilled_policies; + uint8_t enforce_overlayable; + uint8_t target_path[256]; uint8_t overlay_path[256]; diff --git a/libs/androidfw/tests/data/overlay/overlay.apk b/libs/androidfw/tests/data/overlay/overlay.apk Binary files differindex 62e98662e68d..f1ed59279fdb 100644 --- a/libs/androidfw/tests/data/overlay/overlay.apk +++ b/libs/androidfw/tests/data/overlay/overlay.apk diff --git a/libs/androidfw/tests/data/overlay/overlay.idmap b/libs/androidfw/tests/data/overlay/overlay.idmap Binary files differindex 3759ed650033..29c5eb6a9ccf 100644 --- a/libs/androidfw/tests/data/overlay/overlay.idmap +++ b/libs/androidfw/tests/data/overlay/overlay.idmap diff --git a/media/java/android/media/IMediaRouter2.aidl b/media/java/android/media/IMediaRouter2.aidl index a8b82ba401eb..ca14052c964f 100644 --- a/media/java/android/media/IMediaRouter2.aidl +++ b/media/java/android/media/IMediaRouter2.aidl @@ -24,6 +24,8 @@ import android.os.Bundle; * @hide */ oneway interface IMediaRouter2 { + void notifyRouterRegistered(in List<MediaRoute2Info> currentRoutes, + in RoutingSessionInfo currentSystemSessionInfo); void notifyRoutesAdded(in List<MediaRoute2Info> routes); void notifyRoutesRemoved(in List<MediaRoute2Info> routes); void notifyRoutesChanged(in List<MediaRoute2Info> routes); diff --git a/media/java/android/media/MediaCas.java b/media/java/android/media/MediaCas.java index c652628eb425..590def4d4ced 100644 --- a/media/java/android/media/MediaCas.java +++ b/media/java/android/media/MediaCas.java @@ -20,6 +20,7 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.TestApi; +import android.app.ActivityManager; import android.content.Context; import android.hardware.cas.V1_0.HidlCasPluginDescriptor; import android.hardware.cas.V1_0.ICas; @@ -43,6 +44,8 @@ import android.os.RemoteException; import android.util.Log; import android.util.Singleton; +import com.android.internal.util.FrameworkStatsLog; + import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; @@ -122,6 +125,7 @@ public final class MediaCas implements AutoCloseable { private String mTvInputServiceSessionId; private int mClientId; private int mCasSystemId; + private int mUserId; private TunerResourceManager mTunerResourceManager = null; private final Map<Session, Integer> mSessionMap = new HashMap<>(); @@ -673,6 +677,8 @@ public final class MediaCas implements AutoCloseable { */ public MediaCas(int CA_system_id) throws UnsupportedCasException { try { + mCasSystemId = CA_system_id; + mUserId = ActivityManager.getCurrentUser(); IMediaCasService service = getService(); android.hardware.cas.V1_2.IMediaCasService serviceV12 = android.hardware.cas.V1_2.IMediaCasService.castFrom(service); @@ -721,7 +727,6 @@ public final class MediaCas implements AutoCloseable { this(casSystemId); Objects.requireNonNull(context, "context must not be null"); - mCasSystemId = casSystemId; mTunerResourceManager = (TunerResourceManager) context.getSystemService(Context.TV_TUNER_RESOURCE_MGR_SERVICE); if (mTunerResourceManager != null) { @@ -925,10 +930,18 @@ public final class MediaCas implements AutoCloseable { mICas.openSession(cb); MediaCasException.throwExceptionIfNeeded(cb.mStatus); addSessionToResourceMap(cb.mSession, sessionResourceHandle); + Log.d(TAG, "Write Stats Log for succeed to Open Session."); + FrameworkStatsLog + .write(FrameworkStatsLog.TV_CAS_SESSION_OPEN_STATUS, mUserId, mCasSystemId, + FrameworkStatsLog.TV_CAS_SESSION_OPEN_STATUS__STATE__SUCCEEDED); return cb.mSession; } catch (RemoteException e) { cleanupAndRethrowIllegalState(); } + Log.d(TAG, "Write Stats Log for fail to Open Session."); + FrameworkStatsLog + .write(FrameworkStatsLog.TV_CAS_SESSION_OPEN_STATUS, mUserId, mCasSystemId, + FrameworkStatsLog.TV_CAS_SESSION_OPEN_STATUS__STATE__FAILED); return null; } @@ -964,10 +977,18 @@ public final class MediaCas implements AutoCloseable { mICasV12.openSession_1_2(sessionUsage, scramblingMode, cb); MediaCasException.throwExceptionIfNeeded(cb.mStatus); addSessionToResourceMap(cb.mSession, sessionResourceHandle); + Log.d(TAG, "Write Stats Log for succeed to Open Session."); + FrameworkStatsLog + .write(FrameworkStatsLog.TV_CAS_SESSION_OPEN_STATUS, mUserId, mCasSystemId, + FrameworkStatsLog.TV_CAS_SESSION_OPEN_STATUS__STATE__SUCCEEDED); return cb.mSession; } catch (RemoteException e) { cleanupAndRethrowIllegalState(); } + Log.d(TAG, "Write Stats Log for fail to Open Session."); + FrameworkStatsLog + .write(FrameworkStatsLog.TV_CAS_SESSION_OPEN_STATUS, mUserId, mCasSystemId, + FrameworkStatsLog.TV_CAS_SESSION_OPEN_STATUS__STATE__FAILED); return null; } diff --git a/media/java/android/media/MediaRouter2.java b/media/java/android/media/MediaRouter2.java index 6634d4b4190e..20e26cd66e34 100644 --- a/media/java/android/media/MediaRouter2.java +++ b/media/java/android/media/MediaRouter2.java @@ -92,7 +92,7 @@ public final class MediaRouter2 { MediaRouter2Stub mStub; @GuardedBy("sRouterLock") - private final Map<String, RoutingController> mRoutingControllers = new ArrayMap<>(); + private final Map<String, RoutingController> mNonSystemRoutingControllers = new ArrayMap<>(); private final AtomicInteger mControllerCreationRequestCnt = new AtomicInteger(1); @@ -230,7 +230,7 @@ public final class MediaRouter2 { Log.e(TAG, "unregisterRouteCallback: Unable to set discovery request."); } } - if (mRouteCallbackRecords.size() == 0) { + if (mRouteCallbackRecords.isEmpty() && mNonSystemRoutingControllers.isEmpty()) { try { mMediaRouterService.unregisterRouter2(mStub); } catch (RemoteException ex) { @@ -470,7 +470,7 @@ public final class MediaRouter2 { List<RoutingController> result = new ArrayList<>(); result.add(0, mSystemController); synchronized (sRouterLock) { - result.addAll(mRoutingControllers.values()); + result.addAll(mNonSystemRoutingControllers.values()); } return result; } @@ -500,6 +500,77 @@ public final class MediaRouter2 { } } + void syncRoutesOnHandler(List<MediaRoute2Info> currentRoutes, + RoutingSessionInfo currentSystemSessionInfo) { + if (currentRoutes == null || currentRoutes.isEmpty() || currentSystemSessionInfo == null) { + Log.e(TAG, "syncRoutesOnHandler: Received wrong data. currentRoutes=" + currentRoutes + + ", currentSystemSessionInfo=" + currentSystemSessionInfo); + return; + } + + List<MediaRoute2Info> addedRoutes = new ArrayList<>(); + List<MediaRoute2Info> removedRoutes = new ArrayList<>(); + List<MediaRoute2Info> changedRoutes = new ArrayList<>(); + + synchronized (sRouterLock) { + List<String> currentRoutesIds = currentRoutes.stream().map(MediaRoute2Info::getId) + .collect(Collectors.toList()); + + for (String routeId : mRoutes.keySet()) { + if (!currentRoutesIds.contains(routeId)) { + // This route is removed while the callback is unregistered. + MediaRoute2Info route = mRoutes.get(routeId); + if (route.isSystemRoute() + || route.hasAnyFeatures(mDiscoveryPreference.getPreferredFeatures())) { + removedRoutes.add(mRoutes.get(routeId)); + } + } + } + + for (MediaRoute2Info route : currentRoutes) { + if (mRoutes.containsKey(route.getId())) { + if (!route.equals(mRoutes.get(route.getId()))) { + // This route is changed while the callback is unregistered. + if (route.isSystemRoute() + || route.hasAnyFeatures( + mDiscoveryPreference.getPreferredFeatures())) { + changedRoutes.add(route); + } + } + } else { + // This route is added while the callback is unregistered. + if (route.isSystemRoute() + || route.hasAnyFeatures(mDiscoveryPreference.getPreferredFeatures())) { + addedRoutes.add(route); + } + } + } + + mRoutes.clear(); + for (MediaRoute2Info route : currentRoutes) { + mRoutes.put(route.getId(), route); + } + + mShouldUpdateRoutes = true; + } + + if (addedRoutes.size() > 0) { + notifyRoutesAdded(addedRoutes); + } + if (removedRoutes.size() > 0) { + notifyRoutesRemoved(removedRoutes); + } + if (changedRoutes.size() > 0) { + notifyRoutesChanged(changedRoutes); + } + + RoutingSessionInfo oldInfo = mSystemController.getRoutingSessionInfo(); + mSystemController.setRoutingSessionInfo(currentSystemSessionInfo); + if (!oldInfo.equals(currentSystemSessionInfo)) { + notifyControllerUpdated(mSystemController); + } + } + void addRoutesOnHandler(List<MediaRoute2Info> routes) { // TODO(b/157874065): When onRoutesAdded is first called, // 1) clear mRoutes before adding the routes @@ -617,7 +688,7 @@ public final class MediaRouter2 { } else { newController = new RoutingController(sessionInfo); synchronized (sRouterLock) { - mRoutingControllers.put(newController.getId(), newController); + mNonSystemRoutingControllers.put(newController.getId(), newController); } } @@ -645,7 +716,7 @@ public final class MediaRouter2 { RoutingController matchingController; synchronized (sRouterLock) { - matchingController = mRoutingControllers.get(sessionInfo.getId()); + matchingController = mNonSystemRoutingControllers.get(sessionInfo.getId()); } if (matchingController == null) { @@ -674,7 +745,7 @@ public final class MediaRouter2 { final String uniqueSessionId = sessionInfo.getId(); RoutingController matchingController; synchronized (sRouterLock) { - matchingController = mRoutingControllers.get(uniqueSessionId); + matchingController = mNonSystemRoutingControllers.get(uniqueSessionId); } if (matchingController == null) { @@ -1232,23 +1303,34 @@ public final class MediaRouter2 { mIsReleased = true; } - MediaRouter2Stub stub; synchronized (sRouterLock) { - mRoutingControllers.remove(getId(), this); - stub = mStub; - } + if (!mNonSystemRoutingControllers.remove(getId(), this)) { + Log.w(TAG, "releaseInternal: Ignoring unknown controller."); + return false; + } - if (shouldReleaseSession && stub != null) { - try { - mMediaRouterService.releaseSessionWithRouter2(stub, getId()); - } catch (RemoteException ex) { - Log.e(TAG, "Unable to release session", ex); + if (shouldReleaseSession && mStub != null) { + try { + mMediaRouterService.releaseSessionWithRouter2(mStub, getId()); + } catch (RemoteException ex) { + Log.e(TAG, "Unable to release session", ex); + } } - } - if (shouldNotifyStop) { - mHandler.sendMessage(obtainMessage(MediaRouter2::notifyStop, MediaRouter2.this, - RoutingController.this)); + if (shouldNotifyStop) { + mHandler.sendMessage(obtainMessage(MediaRouter2::notifyStop, MediaRouter2.this, + RoutingController.this)); + } + + if (mRouteCallbackRecords.isEmpty() && mNonSystemRoutingControllers.isEmpty() + && mStub != null) { + try { + mMediaRouterService.unregisterRouter2(mStub); + } catch (RemoteException ex) { + Log.e(TAG, "releaseInternal: Unable to unregister media router.", ex); + } + mStub = null; + } } return true; } @@ -1415,6 +1497,13 @@ public final class MediaRouter2 { class MediaRouter2Stub extends IMediaRouter2.Stub { @Override + public void notifyRouterRegistered(List<MediaRoute2Info> currentRoutes, + RoutingSessionInfo currentSystemSessionInfo) { + mHandler.sendMessage(obtainMessage(MediaRouter2::syncRoutesOnHandler, + MediaRouter2.this, currentRoutes, currentSystemSessionInfo)); + } + + @Override public void notifyRoutesAdded(List<MediaRoute2Info> routes) { mHandler.sendMessage(obtainMessage(MediaRouter2::addRoutesOnHandler, MediaRouter2.this, routes)); diff --git a/media/java/android/media/MediaRouter2Manager.java b/media/java/android/media/MediaRouter2Manager.java index a382c2de223e..673fffe710a2 100644 --- a/media/java/android/media/MediaRouter2Manager.java +++ b/media/java/android/media/MediaRouter2Manager.java @@ -25,12 +25,14 @@ import android.content.Context; import android.media.session.MediaController; import android.media.session.MediaSessionManager; import android.os.Handler; +import android.os.Message; import android.os.RemoteException; import android.os.ServiceManager; import android.text.TextUtils; import android.util.Log; import com.android.internal.annotations.GuardedBy; +import com.android.internal.annotations.VisibleForTesting; import java.util.ArrayList; import java.util.Collections; @@ -52,6 +54,9 @@ import java.util.stream.Collectors; public final class MediaRouter2Manager { private static final String TAG = "MR2Manager"; private static final Object sLock = new Object(); + /** @hide */ + @VisibleForTesting + public static final int TRANSFER_TIMEOUT_MS = 30_000; @GuardedBy("sLock") private static MediaRouter2Manager sInstance; @@ -337,30 +342,18 @@ public final class MediaRouter2Manager { Objects.requireNonNull(sessionInfo, "sessionInfo must not be null"); Objects.requireNonNull(route, "route must not be null"); - //TODO(b/157875504): Ignore unknown route. - if (sessionInfo.getTransferableRoutes().contains(route.getId())) { - transferToRoute(sessionInfo, route); - return; - } - - if (TextUtils.isEmpty(sessionInfo.getClientPackageName())) { - Log.w(TAG, "transfer: Ignoring transfer without package name."); - notifyTransferFailed(sessionInfo, route); - return; + synchronized (mRoutesLock) { + if (!mRoutes.containsKey(route.getId())) { + Log.w(TAG, "transfer: Ignoring an unknown route id=" + route.getId()); + notifyTransferFailed(sessionInfo, route); + return; + } } - Client client = getOrCreateClient(); - if (client != null) { - try { - int requestId = mNextRequestId.getAndIncrement(); - //TODO(b/157875723): Ensure that every request is eventually removed. (Memory leak) - mTransferRequests.add(new TransferRequest(requestId, sessionInfo, route)); - - mMediaRouterService.requestCreateSessionWithManager( - client, requestId, sessionInfo.getClientPackageName(), route); - } catch (RemoteException ex) { - Log.e(TAG, "Unable to select media route", ex); - } + if (sessionInfo.getTransferableRoutes().contains(route.getId())) { + transferToRoute(sessionInfo, route); + } else { + requestCreateSession(sessionInfo, route); } } @@ -523,8 +516,8 @@ public final class MediaRouter2Manager { continue; } if (sessionInfo.getSelectedRoutes().contains(request.mTargetRoute.getId())) { - notifyTransferred(request.mOldSessionInfo, sessionInfo); mTransferRequests.remove(request); + notifyTransferred(request.mOldSessionInfo, sessionInfo); break; } } @@ -595,7 +588,7 @@ public final class MediaRouter2Manager { public List<MediaRoute2Info> getSelectedRoutes(@NonNull RoutingSessionInfo sessionInfo) { Objects.requireNonNull(sessionInfo, "sessionInfo must not be null"); - synchronized (sLock) { + synchronized (mRoutesLock) { return sessionInfo.getSelectedRoutes().stream().map(mRoutes::get) .filter(Objects::nonNull) .collect(Collectors.toList()); @@ -611,7 +604,7 @@ public final class MediaRouter2Manager { List<String> selectedRouteIds = sessionInfo.getSelectedRoutes(); - synchronized (sLock) { + synchronized (mRoutesLock) { return sessionInfo.getSelectableRoutes().stream() .filter(routeId -> !selectedRouteIds.contains(routeId)) .map(mRoutes::get) @@ -629,7 +622,7 @@ public final class MediaRouter2Manager { List<String> selectedRouteIds = sessionInfo.getSelectedRoutes(); - synchronized (sLock) { + synchronized (mRoutesLock) { return sessionInfo.getDeselectableRoutes().stream() .filter(routeId -> selectedRouteIds.contains(routeId)) .map(mRoutes::get) @@ -725,65 +718,89 @@ public final class MediaRouter2Manager { } /** - * Transfers to a given route for the remote session. + * Requests releasing a session. + * <p> + * If a session is released, any operation on the session will be ignored. + * {@link Callback#onTransferred(RoutingSessionInfo, RoutingSessionInfo)} with {@code null} + * session will be called when the session is released. + * </p> * - * @hide + * @see Callback#onTransferred(RoutingSessionInfo, RoutingSessionInfo) */ - void transferToRoute(@NonNull RoutingSessionInfo sessionInfo, - @NonNull MediaRoute2Info route) { + public void releaseSession(@NonNull RoutingSessionInfo sessionInfo) { Objects.requireNonNull(sessionInfo, "sessionInfo must not be null"); - Objects.requireNonNull(route, "route must not be null"); - if (sessionInfo.getSelectedRoutes().contains(route.getId())) { - Log.w(TAG, "Ignoring transferring to a route that is already added. route=" - + route); - return; - } - - if (!sessionInfo.getTransferableRoutes().contains(route.getId())) { - Log.w(TAG, "Ignoring transferring to a non-transferable route=" + route); - return; + Client client = getOrCreateClient(); + if (client != null) { + try { + int requestId = mNextRequestId.getAndIncrement(); + mMediaRouterService.releaseSessionWithManager( + client, requestId, sessionInfo.getId()); + } catch (RemoteException ex) { + Log.e(TAG, "releaseSession: Failed to send a request", ex); + } } + } - int requestId = mNextRequestId.getAndIncrement(); - mTransferRequests.add(new TransferRequest(requestId, sessionInfo, route)); + /** + * Transfers the remote session to the given route. + * + * @hide + */ + private void transferToRoute(@NonNull RoutingSessionInfo session, + @NonNull MediaRoute2Info route) { + int requestId = createTransferRequest(session, route); Client client = getOrCreateClient(); if (client != null) { try { mMediaRouterService.transferToRouteWithManager( - client, requestId, sessionInfo.getId(), route); + client, requestId, session.getId(), route); } catch (RemoteException ex) { Log.e(TAG, "transferToRoute: Failed to send a request.", ex); } } } - /** - * Requests releasing a session. - * <p> - * If a session is released, any operation on the session will be ignored. - * {@link Callback#onTransferred(RoutingSessionInfo, RoutingSessionInfo)} with {@code null} - * session will be called when the session is released. - * </p> - * - * @see Callback#onTransferred(RoutingSessionInfo, RoutingSessionInfo) - */ - public void releaseSession(@NonNull RoutingSessionInfo sessionInfo) { - Objects.requireNonNull(sessionInfo, "sessionInfo must not be null"); + private void requestCreateSession(RoutingSessionInfo oldSession, MediaRoute2Info route) { + if (TextUtils.isEmpty(oldSession.getClientPackageName())) { + Log.w(TAG, "requestCreateSession: Can't create a session without package name."); + notifyTransferFailed(oldSession, route); + return; + } + + int requestId = createTransferRequest(oldSession, route); Client client = getOrCreateClient(); if (client != null) { try { - int requestId = mNextRequestId.getAndIncrement(); - mMediaRouterService.releaseSessionWithManager( - client, requestId, sessionInfo.getId()); + mMediaRouterService.requestCreateSessionWithManager( + client, requestId, oldSession.getClientPackageName(), route); } catch (RemoteException ex) { - Log.e(TAG, "releaseSession: Failed to send a request", ex); + Log.e(TAG, "requestCreateSession: Failed to send a request", ex); } } } + private int createTransferRequest(RoutingSessionInfo session, MediaRoute2Info route) { + int requestId = mNextRequestId.getAndIncrement(); + TransferRequest transferRequest = new TransferRequest(requestId, session, route); + mTransferRequests.add(transferRequest); + + Message timeoutMessage = + obtainMessage(MediaRouter2Manager::handleTransferTimeout, this, transferRequest); + mHandler.sendMessageDelayed(timeoutMessage, TRANSFER_TIMEOUT_MS); + return requestId; + } + + private void handleTransferTimeout(TransferRequest request) { + boolean removed = mTransferRequests.remove(request); + if (removed) { + notifyTransferFailed(request.mOldSessionInfo, request.mTargetRoute); + } + } + + private boolean areSessionsMatched(MediaController mediaController, RoutingSessionInfo sessionInfo) { MediaController.PlaybackInfo playbackInfo = mediaController.getPlaybackInfo(); @@ -905,7 +922,7 @@ public final class MediaRouter2Manager { if (!(obj instanceof CallbackRecord)) { return false; } - return mCallback == ((CallbackRecord) obj).mCallback; + return mCallback == ((CallbackRecord) obj).mCallback; } @Override diff --git a/media/java/android/media/tv/TvRecordingClient.java b/media/java/android/media/tv/TvRecordingClient.java index 8ae98ae5e937..23fadac8a72b 100644 --- a/media/java/android/media/tv/TvRecordingClient.java +++ b/media/java/android/media/tv/TvRecordingClient.java @@ -146,6 +146,8 @@ public class TvRecordingClient { mPendingAppPrivateCommands.clear(); if (mSession != null) { mSession.release(); + mIsTuned = false; + mIsRecordingStarted = false; mSession = null; } } diff --git a/media/java/android/media/tv/tuner/dvr/DvrPlayback.java b/media/java/android/media/tv/tuner/dvr/DvrPlayback.java index 68071b0b0fe3..bb00bb3b8d56 100644 --- a/media/java/android/media/tv/tuner/dvr/DvrPlayback.java +++ b/media/java/android/media/tv/tuner/dvr/DvrPlayback.java @@ -20,12 +20,16 @@ import android.annotation.BytesLong; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.SystemApi; +import android.app.ActivityManager; import android.hardware.tv.tuner.V1_0.Constants; import android.media.tv.tuner.Tuner; import android.media.tv.tuner.Tuner.Result; import android.media.tv.tuner.TunerUtils; import android.media.tv.tuner.filter.Filter; import android.os.ParcelFileDescriptor; +import android.util.Log; + +import com.android.internal.util.FrameworkStatsLog; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -72,9 +76,15 @@ public class DvrPlayback implements AutoCloseable { */ public static final int PLAYBACK_STATUS_FULL = Constants.PlaybackStatus.SPACE_FULL; + private static final String TAG = "TvTunerPlayback"; + private long mNativeContext; private OnPlaybackStatusChangedListener mListener; private Executor mExecutor; + private int mUserId; + private static int sInstantId = 0; + private int mSegmentId = 0; + private int mUnderflow; private native int nativeAttachFilter(Filter filter); private native int nativeDetachFilter(Filter filter); @@ -88,6 +98,9 @@ public class DvrPlayback implements AutoCloseable { private native long nativeRead(byte[] bytes, long offset, long size); private DvrPlayback() { + mUserId = ActivityManager.getCurrentUser(); + mSegmentId = (sInstantId & 0x0000ffff) << 16; + sInstantId++; } /** @hide */ @@ -98,6 +111,9 @@ public class DvrPlayback implements AutoCloseable { } private void onPlaybackStatusChanged(int status) { + if (status == PLAYBACK_STATUS_EMPTY) { + mUnderflow++; + } if (mExecutor != null && mListener != null) { mExecutor.execute(() -> mListener.onPlaybackStatusChanged(status)); } @@ -154,6 +170,13 @@ public class DvrPlayback implements AutoCloseable { */ @Result public int start() { + mSegmentId = (mSegmentId & 0xffff0000) | (((mSegmentId & 0x0000ffff) + 1) & 0x0000ffff); + mUnderflow = 0; + Log.d(TAG, "Write Stats Log for Playback."); + FrameworkStatsLog + .write(FrameworkStatsLog.TV_TUNER_DVR_STATUS, mUserId, + FrameworkStatsLog.TV_TUNER_DVR_STATUS__TYPE__PLAYBACK, + FrameworkStatsLog.TV_TUNER_DVR_STATUS__STATE__STARTED, mSegmentId, 0); return nativeStartDvr(); } @@ -167,6 +190,11 @@ public class DvrPlayback implements AutoCloseable { */ @Result public int stop() { + Log.d(TAG, "Write Stats Log for Playback."); + FrameworkStatsLog + .write(FrameworkStatsLog.TV_TUNER_DVR_STATUS, mUserId, + FrameworkStatsLog.TV_TUNER_DVR_STATUS__TYPE__PLAYBACK, + FrameworkStatsLog.TV_TUNER_DVR_STATUS__STATE__STOPPED, mSegmentId, mUnderflow); return nativeStopDvr(); } diff --git a/media/java/android/media/tv/tuner/dvr/DvrRecorder.java b/media/java/android/media/tv/tuner/dvr/DvrRecorder.java index 198bd0f4e78e..887116725961 100644 --- a/media/java/android/media/tv/tuner/dvr/DvrRecorder.java +++ b/media/java/android/media/tv/tuner/dvr/DvrRecorder.java @@ -19,14 +19,19 @@ package android.media.tv.tuner.dvr; import android.annotation.BytesLong; import android.annotation.NonNull; import android.annotation.SystemApi; +import android.app.ActivityManager; import android.media.tv.tuner.Tuner; import android.media.tv.tuner.Tuner.Result; import android.media.tv.tuner.TunerUtils; import android.media.tv.tuner.filter.Filter; import android.os.ParcelFileDescriptor; +import android.util.Log; + +import com.android.internal.util.FrameworkStatsLog; import java.util.concurrent.Executor; + /** * Digital Video Record (DVR) recorder class which provides record control on Demux's output buffer. * @@ -34,9 +39,14 @@ import java.util.concurrent.Executor; */ @SystemApi public class DvrRecorder implements AutoCloseable { + private static final String TAG = "TvTunerRecord"; private long mNativeContext; private OnRecordStatusChangedListener mListener; private Executor mExecutor; + private int mUserId; + private static int sInstantId = 0; + private int mSegmentId = 0; + private int mOverflow; private native int nativeAttachFilter(Filter filter); private native int nativeDetachFilter(Filter filter); @@ -50,6 +60,9 @@ public class DvrRecorder implements AutoCloseable { private native long nativeWrite(byte[] bytes, long offset, long size); private DvrRecorder() { + mUserId = ActivityManager.getCurrentUser(); + mSegmentId = (sInstantId & 0x0000ffff) << 16; + sInstantId++; } /** @hide */ @@ -60,6 +73,9 @@ public class DvrRecorder implements AutoCloseable { } private void onRecordStatusChanged(int status) { + if (status == Filter.STATUS_OVERFLOW) { + mOverflow++; + } if (mExecutor != null && mListener != null) { mExecutor.execute(() -> mListener.onRecordStatusChanged(status)); } @@ -112,6 +128,13 @@ public class DvrRecorder implements AutoCloseable { */ @Result public int start() { + mSegmentId = (mSegmentId & 0xffff0000) | (((mSegmentId & 0x0000ffff) + 1) & 0x0000ffff); + mOverflow = 0; + Log.d(TAG, "Write Stats Log for Record."); + FrameworkStatsLog + .write(FrameworkStatsLog.TV_TUNER_DVR_STATUS, mUserId, + FrameworkStatsLog.TV_TUNER_DVR_STATUS__TYPE__RECORD, + FrameworkStatsLog.TV_TUNER_DVR_STATUS__STATE__STARTED, mSegmentId, 0); return nativeStartDvr(); } @@ -124,6 +147,11 @@ public class DvrRecorder implements AutoCloseable { */ @Result public int stop() { + Log.d(TAG, "Write Stats Log for Playback."); + FrameworkStatsLog + .write(FrameworkStatsLog.TV_TUNER_DVR_STATUS, mUserId, + FrameworkStatsLog.TV_TUNER_DVR_STATUS__TYPE__RECORD, + FrameworkStatsLog.TV_TUNER_DVR_STATUS__STATE__STOPPED, mSegmentId, mOverflow); return nativeStopDvr(); } diff --git a/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2ManagerTest.java b/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2ManagerTest.java index 1e49f49b37bc..356acdcc9dd8 100644 --- a/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2ManagerTest.java +++ b/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2ManagerTest.java @@ -17,6 +17,7 @@ package com.android.mediaroutertest; import static android.media.MediaRoute2Info.FEATURE_LIVE_AUDIO; +import static android.media.MediaRoute2Info.FEATURE_REMOTE_PLAYBACK; import static android.media.MediaRoute2Info.PLAYBACK_VOLUME_FIXED; import static android.media.MediaRoute2Info.PLAYBACK_VOLUME_VARIABLE; import static android.media.MediaRoute2ProviderService.REASON_REJECTED; @@ -28,6 +29,7 @@ import static com.android.mediaroutertest.StubMediaRoute2ProviderService.ROUTE_I import static com.android.mediaroutertest.StubMediaRoute2ProviderService.ROUTE_ID2; import static com.android.mediaroutertest.StubMediaRoute2ProviderService.ROUTE_ID4_TO_SELECT_AND_DESELECT; import static com.android.mediaroutertest.StubMediaRoute2ProviderService.ROUTE_ID5_TO_TRANSFER_TO; +import static com.android.mediaroutertest.StubMediaRoute2ProviderService.ROUTE_ID6_TO_BE_IGNORED; import static com.android.mediaroutertest.StubMediaRoute2ProviderService.ROUTE_ID_FIXED_VOLUME; import static com.android.mediaroutertest.StubMediaRoute2ProviderService.ROUTE_ID_SPECIAL_FEATURE; import static com.android.mediaroutertest.StubMediaRoute2ProviderService.ROUTE_ID_VARIABLE_VOLUME; @@ -51,6 +53,7 @@ import android.media.RouteDiscoveryPreference; import android.media.RoutingSessionInfo; import android.os.Bundle; import android.support.test.InstrumentationRegistry; +import android.support.test.filters.LargeTest; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; import android.text.TextUtils; @@ -79,6 +82,8 @@ public class MediaRouter2ManagerTest { private static final int TIMEOUT_MS = 5000; private static final String TEST_KEY = "test_key"; private static final String TEST_VALUE = "test_value"; + private static final String TEST_ID_UNKNOWN = "id_unknown"; + private static final String TEST_NAME_UNKNOWN = "unknown"; private Context mContext; private MediaRouter2Manager mManager; @@ -309,6 +314,36 @@ public class MediaRouter2ManagerTest { assertEquals(1, mManager.getRoutingSessions(mPackageName).size()); } + @Test + public void testTransfer_unknownRoute_fail() throws Exception { + addRouterCallback(new RouteCallback() {}); + + CountDownLatch onSessionCreatedLatch = new CountDownLatch(1); + CountDownLatch onTransferFailedLatch = new CountDownLatch(1); + + addManagerCallback(new MediaRouter2Manager.Callback() { + @Override + public void onTransferred(RoutingSessionInfo oldSessionInfo, + RoutingSessionInfo newSessionInfo) { + assertNotNull(newSessionInfo); + onSessionCreatedLatch.countDown(); + } + @Override + public void onTransferFailed(RoutingSessionInfo session, MediaRoute2Info route) { + onTransferFailedLatch.countDown(); + } + }); + + MediaRoute2Info unknownRoute = + new MediaRoute2Info.Builder(TEST_ID_UNKNOWN, TEST_NAME_UNKNOWN) + .addFeature(FEATURE_REMOTE_PLAYBACK) + .build(); + + mManager.transfer(mManager.getSystemRoutingSession(), unknownRoute); + assertFalse(onSessionCreatedLatch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS)); + assertTrue(onTransferFailedLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); + } + /** * Tests select, transfer, release of routes of a provider */ @@ -350,6 +385,35 @@ public class MediaRouter2ManagerTest { } @Test + @LargeTest + public void testTransfer_ignored_fails() throws Exception { + Map<String, MediaRoute2Info> routes = waitAndGetRoutesWithManager(FEATURES_ALL); + addRouterCallback(new RouteCallback() {}); + + CountDownLatch onSessionCreatedLatch = new CountDownLatch(1); + CountDownLatch onFailedLatch = new CountDownLatch(1); + + addManagerCallback(new MediaRouter2Manager.Callback() { + @Override + public void onTransferred(RoutingSessionInfo oldSessionInfo, + RoutingSessionInfo newSessionInfo) { + onSessionCreatedLatch.countDown(); + } + @Override + public void onTransferFailed(RoutingSessionInfo session, MediaRoute2Info route) { + onFailedLatch.countDown(); + } + }); + + List<RoutingSessionInfo> sessions = mManager.getRoutingSessions(mPackageName); + RoutingSessionInfo targetSession = sessions.get(sessions.size() - 1); + mManager.transfer(targetSession, routes.get(ROUTE_ID6_TO_BE_IGNORED)); + + assertFalse(onSessionCreatedLatch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS)); + assertTrue(onFailedLatch.await(MediaRouter2Manager.TRANSFER_TIMEOUT_MS, + TimeUnit.MILLISECONDS)); + } + @Test public void testSetSystemRouteVolume() throws Exception { // ensure client addManagerCallback(new MediaRouter2Manager.Callback()); @@ -639,8 +703,10 @@ public class MediaRouter2ManagerTest { mRouter2.registerRouteCallback(mExecutor, routeCallback, new RouteDiscoveryPreference.Builder(routeFeatures, true).build()); try { - addedLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS); - featuresLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS); + if (mManager.getAllRoutes().isEmpty()) { + addedLatch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS); + } + featuresLatch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS); return createRouteMap(mManager.getAvailableRoutes(mPackageName)); } finally { mRouter2.unregisterRouteCallback(routeCallback); diff --git a/media/tests/MediaRouter/src/com/android/mediaroutertest/StubMediaRoute2ProviderService.java b/media/tests/MediaRouter/src/com/android/mediaroutertest/StubMediaRoute2ProviderService.java index 4e398f26366a..4551876d774a 100644 --- a/media/tests/MediaRouter/src/com/android/mediaroutertest/StubMediaRoute2ProviderService.java +++ b/media/tests/MediaRouter/src/com/android/mediaroutertest/StubMediaRoute2ProviderService.java @@ -53,6 +53,9 @@ public class StubMediaRoute2ProviderService extends MediaRoute2ProviderService { public static final String ROUTE_ID5_TO_TRANSFER_TO = "route_id5_to_transfer_to"; public static final String ROUTE_NAME5 = "Sample Route 5 - Route to transfer to"; + public static final String ROUTE_ID6_TO_BE_IGNORED = "route_id6_to_be_ignored"; + public static final String ROUTE_NAME6 = "Sample Route 6 - Route to be ignored"; + public static final String ROUTE_ID_SPECIAL_FEATURE = "route_special_feature"; public static final String ROUTE_NAME_SPECIAL_FEATURE = "Special Feature Route"; @@ -98,7 +101,10 @@ public class StubMediaRoute2ProviderService extends MediaRoute2ProviderService { ROUTE_ID5_TO_TRANSFER_TO, ROUTE_NAME5) .addFeature(FEATURE_SAMPLE) .build(); - + MediaRoute2Info route6 = new MediaRoute2Info.Builder( + ROUTE_ID6_TO_BE_IGNORED, ROUTE_NAME6) + .addFeature(FEATURE_SAMPLE) + .build(); MediaRoute2Info routeSpecial = new MediaRoute2Info.Builder(ROUTE_ID_SPECIAL_FEATURE, ROUTE_NAME_SPECIAL_FEATURE) .addFeature(FEATURE_SAMPLE) @@ -121,6 +127,7 @@ public class StubMediaRoute2ProviderService extends MediaRoute2ProviderService { mRoutes.put(route3.getId(), route3); mRoutes.put(route4.getId(), route4); mRoutes.put(route5.getId(), route5); + mRoutes.put(route6.getId(), route6); mRoutes.put(routeSpecial.getId(), routeSpecial); mRoutes.put(fixedVolumeRoute.getId(), fixedVolumeRoute); @@ -219,6 +226,10 @@ public class StubMediaRoute2ProviderService extends MediaRoute2ProviderService { notifyRequestFailed(requestId, REASON_UNKNOWN_ERROR); return; } + // Ignores the request intentionally for testing + if (TextUtils.equals(ROUTE_ID6_TO_BE_IGNORED, routeId)) { + return; + } maybeDeselectRoute(routeId); final String sessionId = String.valueOf(mNextSessionId); diff --git a/packages/PackageInstaller/res/values-or/strings.xml b/packages/PackageInstaller/res/values-or/strings.xml index b9908d299a49..f3b97a98ccf4 100644 --- a/packages/PackageInstaller/res/values-or/strings.xml +++ b/packages/PackageInstaller/res/values-or/strings.xml @@ -19,7 +19,7 @@ <string name="app_name" msgid="7488448184431507488">"ପ୍ୟାକେଜ୍ ଇନଷ୍ଟଲର୍"</string> <string name="install" msgid="711829760615509273">"ଇନଷ୍ଟଲ୍ କରନ୍ତୁ"</string> <string name="done" msgid="6632441120016885253">"ହୋଇଗଲା"</string> - <string name="cancel" msgid="1018267193425558088">"କ୍ୟାନ୍ସଲ୍ କରନ୍ତୁ"</string> + <string name="cancel" msgid="1018267193425558088">"ବାତିଲ୍ କରନ୍ତୁ"</string> <string name="installing" msgid="4921993079741206516">"ଇନଷ୍ଟଲ୍ କରାଯାଉଛି…"</string> <string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ଇନଷ୍ଟଲ୍ କରାଯାଉଛି…"</string> <string name="install_done" msgid="5987363587661783896">"ଆପ୍ ଇନଷ୍ଟଲ୍ ହୋଇଗଲା।"</string> diff --git a/packages/SettingsLib/AdaptiveIcon/res/values/colors.xml b/packages/SettingsLib/AdaptiveIcon/res/values/colors.xml index 76d106a067dd..8f5b2ed3aaaf 100644 --- a/packages/SettingsLib/AdaptiveIcon/res/values/colors.xml +++ b/packages/SettingsLib/AdaptiveIcon/res/values/colors.xml @@ -18,4 +18,8 @@ <color name="homepage_generic_icon_background">#1A73E8</color> <color name="bt_outline_color">#1f000000</color> <!-- icon outline color --> + + <color name="advanced_outline_color">#BDC1C6</color> <!-- icon outline color --> + + <color name="advanced_icon_color">#3C4043</color> </resources> diff --git a/packages/SettingsLib/AdaptiveIcon/res/values/dimens.xml b/packages/SettingsLib/AdaptiveIcon/res/values/dimens.xml index 7f5b58c48abb..8f6e358cd9b6 100644 --- a/packages/SettingsLib/AdaptiveIcon/res/values/dimens.xml +++ b/packages/SettingsLib/AdaptiveIcon/res/values/dimens.xml @@ -18,6 +18,8 @@ <resources> <!-- Dashboard foreground image inset (from background edge to foreground edge) --> <dimen name="dashboard_tile_foreground_image_inset">6dp</dimen> + <!-- Advanced dashboard foreground image inset (from background edge to foreground edge) --> + <dimen name="advanced_dashboard_tile_foreground_image_inset">9dp</dimen> <!-- Stroke size of adaptive outline --> <dimen name="adaptive_outline_stroke">1dp</dimen> diff --git a/packages/SettingsLib/AdaptiveIcon/src/com/android/settingslib/widget/AdaptiveOutlineDrawable.java b/packages/SettingsLib/AdaptiveIcon/src/com/android/settingslib/widget/AdaptiveOutlineDrawable.java index 1c65bc248961..4438893dabfc 100644 --- a/packages/SettingsLib/AdaptiveIcon/src/com/android/settingslib/widget/AdaptiveOutlineDrawable.java +++ b/packages/SettingsLib/AdaptiveIcon/src/com/android/settingslib/widget/AdaptiveOutlineDrawable.java @@ -16,6 +16,10 @@ package com.android.settingslib.widget; +import static com.android.settingslib.widget.AdaptiveOutlineDrawable.AdaptiveOutlineIconType.TYPE_ADVANCED; +import static com.android.settingslib.widget.AdaptiveOutlineDrawable.AdaptiveOutlineIconType.TYPE_DEFAULT; + +import android.annotation.ColorInt; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.Canvas; @@ -27,35 +31,90 @@ import android.graphics.drawable.AdaptiveIconDrawable; import android.graphics.drawable.DrawableWrapper; import android.util.PathParser; +import androidx.annotation.IntDef; import androidx.annotation.VisibleForTesting; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + /** * Adaptive outline drawable with white plain background color and black outline */ public class AdaptiveOutlineDrawable extends DrawableWrapper { + + @Retention(RetentionPolicy.SOURCE) + @IntDef({TYPE_DEFAULT, TYPE_ADVANCED}) + public @interface AdaptiveOutlineIconType { + int TYPE_DEFAULT = 0; + int TYPE_ADVANCED = 1; + } + @VisibleForTesting - final Paint mOutlinePaint; + Paint mOutlinePaint; private Path mPath; - private final int mInsetPx; - private final Bitmap mBitmap; + private int mInsetPx; + private int mStrokeWidth; + private Bitmap mBitmap; + private int mType; public AdaptiveOutlineDrawable(Resources resources, Bitmap bitmap) { super(new AdaptiveIconShapeDrawable(resources)); + init(resources, bitmap, TYPE_DEFAULT); + } + + public AdaptiveOutlineDrawable(Resources resources, Bitmap bitmap, + @AdaptiveOutlineIconType int type) { + super(new AdaptiveIconShapeDrawable(resources)); + + init(resources, bitmap, type); + } + + private void init(Resources resources, Bitmap bitmap, + @AdaptiveOutlineIconType int type) { + mType = type; getDrawable().setTint(Color.WHITE); mPath = new Path(PathParser.createPathFromPathData( resources.getString(com.android.internal.R.string.config_icon_mask))); + mStrokeWidth = resources.getDimensionPixelSize(R.dimen.adaptive_outline_stroke); mOutlinePaint = new Paint(); - mOutlinePaint.setColor(resources.getColor(R.color.bt_outline_color, null)); + mOutlinePaint.setColor(getColor(resources, type)); mOutlinePaint.setStyle(Paint.Style.STROKE); - mOutlinePaint.setStrokeWidth(resources.getDimension(R.dimen.adaptive_outline_stroke)); + mOutlinePaint.setStrokeWidth(mStrokeWidth); mOutlinePaint.setAntiAlias(true); - mInsetPx = resources - .getDimensionPixelSize(R.dimen.dashboard_tile_foreground_image_inset); + mInsetPx = getDimensionPixelSize(resources, type); mBitmap = bitmap; } + private @ColorInt int getColor(Resources resources, @AdaptiveOutlineIconType int type) { + int resId; + switch (type) { + case TYPE_ADVANCED: + resId = R.color.advanced_outline_color; + break; + case TYPE_DEFAULT: + default: + resId = R.color.bt_outline_color; + break; + } + return resources.getColor(resId, /* theme */ null); + } + + private int getDimensionPixelSize(Resources resources, @AdaptiveOutlineIconType int type) { + int resId; + switch (type) { + case TYPE_ADVANCED: + resId = R.dimen.advanced_dashboard_tile_foreground_image_inset; + break; + case TYPE_DEFAULT: + default: + resId = R.dimen.dashboard_tile_foreground_image_inset; + break; + } + return resources.getDimensionPixelSize(resId); + } + @Override public void draw(Canvas canvas) { super.draw(canvas); @@ -68,7 +127,12 @@ public class AdaptiveOutlineDrawable extends DrawableWrapper { final int count = canvas.save(); canvas.scale(scaleX, scaleY); // Draw outline - canvas.drawPath(mPath, mOutlinePaint); + if (mType == TYPE_DEFAULT) { + canvas.drawPath(mPath, mOutlinePaint); + } else { + canvas.drawCircle(2 * mInsetPx, 2 * mInsetPx, 2 * mInsetPx - mStrokeWidth, + mOutlinePaint); + } canvas.restoreToCount(count); // Draw the foreground icon diff --git a/packages/SettingsLib/SearchWidget/res/values-fa/strings.xml b/packages/SettingsLib/SearchWidget/res/values-fa/strings.xml index fa5f9bdfe07b..2c9aaa5e9f95 100644 --- a/packages/SettingsLib/SearchWidget/res/values-fa/strings.xml +++ b/packages/SettingsLib/SearchWidget/res/values-fa/strings.xml @@ -17,5 +17,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="search_menu" msgid="1914043873178389845">"جستجوی تنظیمات"</string> + <string name="search_menu" msgid="1914043873178389845">"تنظیمات جستجو"</string> </resources> diff --git a/packages/SettingsLib/SearchWidget/res/values-tl/strings.xml b/packages/SettingsLib/SearchWidget/res/values-tl/strings.xml index 111cf5a15dba..14b7b2f62eee 100644 --- a/packages/SettingsLib/SearchWidget/res/values-tl/strings.xml +++ b/packages/SettingsLib/SearchWidget/res/values-tl/strings.xml @@ -17,5 +17,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="search_menu" msgid="1914043873178389845">"Mga setting ng paghahanap"</string> + <string name="search_menu" msgid="1914043873178389845">"Maghanap sa mga setting"</string> </resources> diff --git a/packages/SettingsLib/res/values-bn/arrays.xml b/packages/SettingsLib/res/values-bn/arrays.xml index a131a3b1ad91..b19cde4f2778 100644 --- a/packages/SettingsLib/res/values-bn/arrays.xml +++ b/packages/SettingsLib/res/values-bn/arrays.xml @@ -40,7 +40,7 @@ <item msgid="8339720953594087771">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> এর সাথে কানেক্ট হচ্ছে…"</item> <item msgid="3028983857109369308">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> দিয়ে যাচাইকরণ করা হচ্ছে..."</item> <item msgid="4287401332778341890">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> থেকে আইপি অ্যাড্রেস জানা হচ্ছে…"</item> - <item msgid="1043944043827424501">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> তে কানেক্ট হয়েছে"</item> + <item msgid="1043944043827424501">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>-এ কানেক্ট হয়েছে"</item> <item msgid="7445993821842009653">"স্থগিত করা হয়েছে"</item> <item msgid="1175040558087735707">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> থেকে ডিসকানেক্ট হচ্ছে…"</item> <item msgid="699832486578171722">"ডিসকানেক্ট করা হয়েছে"</item> diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml index 8db0b7e9dd28..2644cb987e3a 100644 --- a/packages/SettingsLib/res/values-el/strings.xml +++ b/packages/SettingsLib/res/values-el/strings.xml @@ -194,7 +194,7 @@ <item msgid="581904787661470707">"Ταχύτατη"</item> </string-array> <string name="choose_profile" msgid="343803890897657450">"Επιλογή προφίλ"</string> - <string name="category_personal" msgid="6236798763159385225">"Προσωπικός"</string> + <string name="category_personal" msgid="6236798763159385225">"Προσωπικό"</string> <string name="category_work" msgid="4014193632325996115">"Εργασίας"</string> <string name="development_settings_title" msgid="140296922921597393">"Επιλογές για προγραμματιστές"</string> <string name="development_settings_enable" msgid="4285094651288242183">"Ενεργοποίηση επιλογών για προγραμματιστές"</string> diff --git a/packages/SettingsLib/res/values-in/arrays.xml b/packages/SettingsLib/res/values-in/arrays.xml index e73febcb1aa4..d20bf38024ab 100644 --- a/packages/SettingsLib/res/values-in/arrays.xml +++ b/packages/SettingsLib/res/values-in/arrays.xml @@ -40,7 +40,7 @@ <item msgid="8339720953594087771">"Menyambung ke <xliff:g id="NETWORK_NAME">%1$s</xliff:g>…"</item> <item msgid="3028983857109369308">"Mengautentikasi dengan <xliff:g id="NETWORK_NAME">%1$s</xliff:g>…"</item> <item msgid="4287401332778341890">"Mendapatkan alamat IP dari <xliff:g id="NETWORK_NAME">%1$s</xliff:g>…"</item> - <item msgid="1043944043827424501">"Tersambung ke <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</item> + <item msgid="1043944043827424501">"Terhubung ke <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</item> <item msgid="7445993821842009653">"Ditangguhkan"</item> <item msgid="1175040558087735707">"Diputus dari <xliff:g id="NETWORK_NAME">%1$s</xliff:g>…"</item> <item msgid="699832486578171722">"Sambungan terputus"</item> diff --git a/packages/SettingsLib/res/values/dimens.xml b/packages/SettingsLib/res/values/dimens.xml index a5ec5e66f242..e552d78e1a45 100644 --- a/packages/SettingsLib/res/values/dimens.xml +++ b/packages/SettingsLib/res/values/dimens.xml @@ -94,4 +94,7 @@ <!-- Define minimal size of the tap area --> <dimen name="min_tap_target_size">48dp</dimen> + + <!-- Size of advanced icon --> + <dimen name="advanced_icon_size">18dp</dimen> </resources> diff --git a/packages/SettingsLib/src/com/android/settingslib/applications/AppUtils.java b/packages/SettingsLib/src/com/android/settingslib/applications/AppUtils.java index a6202956efa5..38eeda245616 100644 --- a/packages/SettingsLib/src/com/android/settingslib/applications/AppUtils.java +++ b/packages/SettingsLib/src/com/android/settingslib/applications/AppUtils.java @@ -19,10 +19,13 @@ package com.android.settingslib.applications; import android.app.Application; import android.content.ComponentName; import android.content.Context; +import android.content.Intent; import android.content.IntentFilter; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; import android.hardware.usb.IUsbManager; +import android.net.Uri; import android.os.RemoteException; import android.os.SystemProperties; import android.os.UserHandle; @@ -44,6 +47,15 @@ public class AppUtils { */ private static InstantAppDataProvider sInstantAppDataProvider = null; + private static final Intent sBrowserIntent; + + static { + sBrowserIntent = new Intent() + .setAction(Intent.ACTION_VIEW) + .addCategory(Intent.CATEGORY_BROWSABLE) + .setData(Uri.parse("http:")); + } + public static CharSequence getLaunchByDefaultSummary(ApplicationsState.AppEntry appEntry, IUsbManager usbManager, PackageManager pm, Context context) { String packageName = appEntry.info.packageName; @@ -153,4 +165,22 @@ public class AppUtils { return com.android.settingslib.utils.applications.AppUtils.getAppContentDescription(context, packageName, userId); } + + /** + * Returns a boolean indicating whether a given package is a browser app. + * + * An app is a "browser" if it has an activity resolution that wound up + * marked with the 'handleAllWebDataURI' flag. + */ + public static boolean isBrowserApp(Context context, String packageName, int userId) { + sBrowserIntent.setPackage(packageName); + final List<ResolveInfo> list = context.getPackageManager().queryIntentActivitiesAsUser( + sBrowserIntent, PackageManager.MATCH_ALL, userId); + for (ResolveInfo info : list) { + if (info.activityInfo != null && info.handleAllWebDataURI) { + return true; + } + } + return false; + } } diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothUtils.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothUtils.java index 9d1b3cf116d9..95e916b9871a 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothUtils.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothUtils.java @@ -1,5 +1,7 @@ package com.android.settingslib.bluetooth; +import static com.android.settingslib.widget.AdaptiveOutlineDrawable.AdaptiveOutlineIconType.TYPE_ADVANCED; + import android.bluetooth.BluetoothClass; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothProfile; @@ -7,6 +9,7 @@ import android.content.Context; import android.content.Intent; import android.content.res.Resources; import android.graphics.Bitmap; +import android.graphics.Canvas; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.net.Uri; @@ -213,6 +216,46 @@ public class BluetoothUtils { } /** + * Build device icon with advanced outline + */ + public static Drawable buildAdvancedDrawable(Context context, Drawable drawable) { + final int iconSize = context.getResources().getDimensionPixelSize( + R.dimen.advanced_icon_size); + final Resources resources = context.getResources(); + + Bitmap bitmap = null; + if (drawable instanceof BitmapDrawable) { + bitmap = ((BitmapDrawable) drawable).getBitmap(); + } else { + final int width = drawable.getIntrinsicWidth(); + final int height = drawable.getIntrinsicHeight(); + bitmap = createBitmap(drawable, + width > 0 ? width : 1, + height > 0 ? height : 1); + } + + if (bitmap != null) { + final Bitmap resizedBitmap = Bitmap.createScaledBitmap(bitmap, iconSize, + iconSize, false); + bitmap.recycle(); + return new AdaptiveOutlineDrawable(resources, resizedBitmap, TYPE_ADVANCED); + } + + return drawable; + } + + /** + * Creates a drawable with specified width and height. + */ + public static Bitmap createBitmap(Drawable drawable, int width, int height) { + final Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); + final Canvas canvas = new Canvas(bitmap); + drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); + drawable.draw(canvas); + return bitmap; + } + + /** * Get boolean Bluetooth metadata * * @param bluetoothDevice the BluetoothDevice to get metadata diff --git a/packages/SettingsLib/src/com/android/settingslib/media/BluetoothMediaDevice.java b/packages/SettingsLib/src/com/android/settingslib/media/BluetoothMediaDevice.java index 40d80488af96..00f94f5c2e64 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/BluetoothMediaDevice.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/BluetoothMediaDevice.java @@ -21,7 +21,6 @@ import android.content.Context; import android.graphics.drawable.Drawable; import android.media.MediaRoute2Info; import android.media.MediaRouter2Manager; -import android.util.Pair; import com.android.settingslib.R; import com.android.settingslib.bluetooth.BluetoothUtils; @@ -57,13 +56,11 @@ public class BluetoothMediaDevice extends MediaDevice { @Override public Drawable getIcon() { - final Pair<Drawable, String> pair = BluetoothUtils - .getBtRainbowDrawableWithDescription(mContext, mCachedDevice); - return isFastPairDevice() - ? pair.first - : BluetoothUtils.buildBtRainbowDrawable(mContext, - mContext.getDrawable(R.drawable.ic_headphone), - mCachedDevice.getAddress().hashCode()); + final Drawable drawable = getIconWithoutBackground(); + if (!isFastPairDevice()) { + setColorFilter(drawable); + } + return BluetoothUtils.buildAdvancedDrawable(mContext, drawable); } @Override diff --git a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaDevice.java b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaDevice.java index 8d6bc5c97228..ea71e52dc9c9 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaDevice.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaDevice.java @@ -55,9 +55,9 @@ public class InfoMediaDevice extends MediaDevice { @Override public Drawable getIcon() { - //TODO(b/120669861): Return remote device icon uri once api is ready. - return BluetoothUtils.buildBtRainbowDrawable(mContext, - mContext.getDrawable(getDrawableResId()), getId().hashCode()); + final Drawable drawable = getIconWithoutBackground(); + setColorFilter(drawable); + return BluetoothUtils.buildAdvancedDrawable(mContext, drawable); } @Override diff --git a/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java b/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java index 317077b14e30..126f9b91b0d2 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java @@ -31,6 +31,9 @@ import static android.media.MediaRoute2Info.TYPE_WIRED_HEADPHONES; import static android.media.MediaRoute2Info.TYPE_WIRED_HEADSET; import android.content.Context; +import android.content.res.ColorStateList; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffColorFilter; import android.graphics.drawable.Drawable; import android.media.MediaRoute2Info; import android.media.MediaRouter2Manager; @@ -39,6 +42,8 @@ import android.text.TextUtils; import androidx.annotation.IntDef; import androidx.annotation.VisibleForTesting; +import com.android.settingslib.R; + import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -131,6 +136,14 @@ public abstract class MediaDevice implements Comparable<MediaDevice> { getId()); } + void setColorFilter(Drawable drawable) { + final ColorStateList list = + mContext.getResources().getColorStateList( + R.color.advanced_icon_color, mContext.getTheme()); + drawable.setColorFilter(new PorterDuffColorFilter(list.getDefaultColor(), + PorterDuff.Mode.SRC_IN)); + } + /** * Get name from MediaDevice. * diff --git a/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java b/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java index c43a51246fb5..b6c0b30b3bd4 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java @@ -85,8 +85,9 @@ public class PhoneMediaDevice extends MediaDevice { @Override public Drawable getIcon() { - return BluetoothUtils.buildBtRainbowDrawable(mContext, - mContext.getDrawable(getDrawableResId()), getId().hashCode()); + final Drawable drawable = getIconWithoutBackground(); + setColorFilter(drawable); + return BluetoothUtils.buildAdvancedDrawable(mContext, drawable); } @Override @@ -105,7 +106,7 @@ public class PhoneMediaDevice extends MediaDevice { case TYPE_HDMI: case TYPE_WIRED_HEADSET: case TYPE_WIRED_HEADPHONES: - resId = com.android.internal.R.drawable.ic_bt_headphones_a2dp; + resId = R.drawable.ic_headphone; break; case TYPE_BUILTIN_SPEAKER: default: diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/PhoneMediaDeviceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/PhoneMediaDeviceTest.java index 421e5c0db1a1..00d1f76f025f 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/PhoneMediaDeviceTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/PhoneMediaDeviceTest.java @@ -79,13 +79,11 @@ public class PhoneMediaDeviceTest { public void getDrawableResId_returnCorrectResId() { when(mInfo.getType()).thenReturn(TYPE_WIRED_HEADPHONES); - assertThat(mPhoneMediaDevice.getDrawableResId()) - .isEqualTo(com.android.internal.R.drawable.ic_bt_headphones_a2dp); + assertThat(mPhoneMediaDevice.getDrawableResId()).isEqualTo(R.drawable.ic_headphone); when(mInfo.getType()).thenReturn(TYPE_WIRED_HEADSET); - assertThat(mPhoneMediaDevice.getDrawableResId()) - .isEqualTo(com.android.internal.R.drawable.ic_bt_headphones_a2dp); + assertThat(mPhoneMediaDevice.getDrawableResId()).isEqualTo(R.drawable.ic_headphone); when(mInfo.getType()).thenReturn(TYPE_BUILTIN_SPEAKER); diff --git a/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java b/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java index fa87b62bd73a..eb7ad72eb1ba 100644 --- a/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java +++ b/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java @@ -316,7 +316,6 @@ public class SettingsBackupTest { Settings.Global.KERNEL_CPU_THREAD_READER, Settings.Global.LANG_ID_UPDATE_CONTENT_URL, Settings.Global.LANG_ID_UPDATE_METADATA_URL, - Settings.Global.LAST_ACTIVE_USER_ID, Settings.Global.LOCATION_BACKGROUND_THROTTLE_INTERVAL_MS, Settings.Global.LOCATION_BACKGROUND_THROTTLE_PROXIMITY_ALERT_INTERVAL_MS, Settings.Global.LOCATION_BACKGROUND_THROTTLE_PACKAGE_WHITELIST, diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml index 44349c5f5ab4..4e17062fc52c 100644 --- a/packages/Shell/AndroidManifest.xml +++ b/packages/Shell/AndroidManifest.xml @@ -201,6 +201,9 @@ <uses-permission android:name="android.permission.MANAGE_APPOPS" /> + <!-- Permission required for IncrementalLogCollectionTest --> + <uses-permission android:name="android.permission.LOADER_USAGE_STATS" /> + <!-- Permission required for storage tests - FuseDaemonHostTest --> <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/> diff --git a/packages/Shell/res/layout/dialog_bugreport_info.xml b/packages/Shell/res/layout/dialog_bugreport_info.xml index 4bd871103193..ea2427920285 100644 --- a/packages/Shell/res/layout/dialog_bugreport_info.xml +++ b/packages/Shell/res/layout/dialog_bugreport_info.xml @@ -14,58 +14,63 @@ limitations under the License. --> -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:orientation="vertical" - android:paddingTop="15dp" - android:paddingStart="24dp" - android:paddingEnd="24dp" - android:focusableInTouchMode="false" - android:focusable="false" - android:importantForAutofill="noExcludeDescendants" - android:layout_width="wrap_content" +<ScrollView + xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" android:layout_height="wrap_content"> - <TextView + <LinearLayout + android:orientation="vertical" + android:paddingTop="15dp" + android:paddingStart="24dp" + android:paddingEnd="24dp" android:focusableInTouchMode="false" android:focusable="false" - android:inputType="textNoSuggestions" + android:importantForAutofill="noExcludeDescendants" android:layout_width="match_parent" - android:layout_height="wrap_content" - android:text="@string/bugreport_info_name"/> - <EditText - android:id="@+id/name" - android:nextFocusDown="@+id/title" - android:maxLength="30" - android:singleLine="true" - android:inputType="textNoSuggestions" - android:layout_width="match_parent" - android:layout_height="wrap_content"/> - <TextView - android:focusableInTouchMode="false" - android:focusable="false" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:text="@string/bugreport_info_title"/> - <EditText - android:id="@+id/title" - android:nextFocusUp="@+id/name" - android:nextFocusDown="@+id/description" - android:maxLength="80" - android:singleLine="true" - android:inputType="textAutoCorrect|textCapSentences" - android:layout_width="match_parent" - android:layout_height="wrap_content"/> - <TextView - android:focusableInTouchMode="false" - android:focusable="false" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:editable="false" - android:text="@string/bugreport_info_description"/> - <EditText - android:id="@+id/description" - android:nextFocusUp="@+id/title" - android:singleLine="false" - android:inputType="textMultiLine|textAutoCorrect|textCapSentences" - android:layout_width="match_parent" - android:layout_height="wrap_content"/> -</LinearLayout> + android:layout_height="wrap_content"> + <TextView + android:focusableInTouchMode="false" + android:focusable="false" + android:inputType="textNoSuggestions" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="@string/bugreport_info_name"/> + <EditText + android:id="@+id/name" + android:nextFocusDown="@+id/title" + android:maxLength="30" + android:singleLine="true" + android:inputType="textNoSuggestions" + android:layout_width="match_parent" + android:layout_height="wrap_content"/> + <TextView + android:focusableInTouchMode="false" + android:focusable="false" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="@string/bugreport_info_title"/> + <EditText + android:id="@+id/title" + android:nextFocusUp="@+id/name" + android:nextFocusDown="@+id/description" + android:maxLength="80" + android:singleLine="true" + android:inputType="textAutoCorrect|textCapSentences" + android:layout_width="match_parent" + android:layout_height="wrap_content"/> + <TextView + android:focusableInTouchMode="false" + android:focusable="false" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:editable="false" + android:text="@string/bugreport_info_description"/> + <EditText + android:id="@+id/description" + android:nextFocusUp="@+id/title" + android:singleLine="false" + android:inputType="textMultiLine|textAutoCorrect|textCapSentences" + android:layout_width="match_parent" + android:layout_height="wrap_content"/> + </LinearLayout> +</ScrollView> diff --git a/packages/SystemUI/res-keyguard/values-ko/strings.xml b/packages/SystemUI/res-keyguard/values-ko/strings.xml index 06074b2726c3..606bb5047245 100644 --- a/packages/SystemUI/res-keyguard/values-ko/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ko/strings.xml @@ -62,7 +62,7 @@ <string name="kg_forgot_pattern_button_text" msgid="3304688032024541260">"패턴을 잊음"</string> <string name="kg_wrong_pattern" msgid="5907301342430102842">"잘못된 패턴"</string> <string name="kg_wrong_password" msgid="4143127991071670512">"잘못된 비밀번호"</string> - <string name="kg_wrong_pin" msgid="4160978845968732624">"잘못된 PIN"</string> + <string name="kg_wrong_pin" msgid="4160978845968732624">"PIN 오류"</string> <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914"> <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g>초 후에 다시 시도하세요.</item> <item quantity="one">1초 후에 다시 시도하세요.</item> diff --git a/packages/SystemUI/res-keyguard/values-ur/strings.xml b/packages/SystemUI/res-keyguard/values-ur/strings.xml index 981bc03387b5..22a477e3d63f 100644 --- a/packages/SystemUI/res-keyguard/values-ur/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ur/strings.xml @@ -71,7 +71,7 @@ <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"SIM PIN درج کریں۔"</string> <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" کیلئے SIM PIN درج کریں۔"</string> <string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> موبائل سروس کے بغیر آلہ کا استعمال کرنے کیلئے eSIM غیر فعال کریں۔"</string> - <string name="kg_pin_instructions" msgid="822353548385014361">"PIN درج کریں"</string> + <string name="kg_pin_instructions" msgid="822353548385014361">"PIN درج کریں"</string> <string name="kg_password_instructions" msgid="324455062831719903">"پاسورڈ درج کریں"</string> <string name="kg_puk_enter_puk_hint" msgid="3005288372875367017">"SIM اب غیر فعال ہوگیا ہے۔ جاری رکھنے کیلئے PUK کوڈ درج کریں۔ تفصیلات کیلئے کیریئر سے رابطہ کریں۔"</string> <string name="kg_puk_enter_puk_hint_multi" msgid="4876780689904862943">"SIM \"<xliff:g id="CARRIER">%1$s</xliff:g>\" اب غیر فعال ہے۔ جاری رکھنے کیلئے PUK کوڈ درج کریں۔ تفصیلات کیلئے کیریئر سے رابطہ کریں۔"</string> diff --git a/packages/SystemUI/res-keyguard/values-uz/strings.xml b/packages/SystemUI/res-keyguard/values-uz/strings.xml index 1905e64ea754..72d4fae575b8 100644 --- a/packages/SystemUI/res-keyguard/values-uz/strings.xml +++ b/packages/SystemUI/res-keyguard/values-uz/strings.xml @@ -33,7 +33,7 @@ <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Parolni kiriting"</string> <string name="keyguard_password_wrong_pin_code" msgid="3514267777289393046">"PIN kodi xato."</string> <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"SIM karta yaroqsiz."</string> - <string name="keyguard_charged" msgid="5478247181205188995">"Batareya quvvati to‘ldi"</string> + <string name="keyguard_charged" msgid="5478247181205188995">"Quvvat oldi"</string> <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Simsiz quvvatlanyapti"</string> <string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Quvvat olmoqda"</string> <string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Tezkor quvvat olmoqda"</string> diff --git a/packages/SystemUI/res-product/values-af/strings.xml b/packages/SystemUI/res-product/values-af/strings.xml index 8c979b2fe397..1d335c3dff9b 100644 --- a/packages/SystemUI/res-product/values-af/strings.xml +++ b/packages/SystemUI/res-product/values-af/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Jy het die foon <xliff:g id="NUMBER">%d</xliff:g> keer verkeerd probeer ontsluit. Die werkprofiel sal verwyder word, wat alle profieldata sal uitvee."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Jy het jou ontsluitpatroon <xliff:g id="NUMBER_0">%1$d</xliff:g> keer verkeerd geteken. Na nóg <xliff:g id="NUMBER_1">%2$d</xliff:g> onsuksesvolle pogings sal jy gevra word om jou e-posrekening te gebruik om jou tablet te ontsluit.\n\n Probeer weer oor <xliff:g id="NUMBER_2">%3$d</xliff:g> sekondes."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Jy het jou ontsluitpatroon <xliff:g id="NUMBER_0">%1$d</xliff:g> keer verkeerd geteken. Na nóg <xliff:g id="NUMBER_1">%2$d</xliff:g> onsuksesvolle pogings sal jy gevra word om jou e-posrekening te gebruik om jou foon te ontsluit.\n\n Probeer weer oor <xliff:g id="NUMBER_2">%3$d</xliff:g> sekondes."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Ontsluit jou foon vir meer opsies"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Ontsluit jou tablet vir meer opsies"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Ontsluit jou toestel vir meer opsies"</string> </resources> diff --git a/packages/SystemUI/res-product/values-am/strings.xml b/packages/SystemUI/res-product/values-am/strings.xml index 4e483a50035b..c11e85689f69 100644 --- a/packages/SystemUI/res-product/values-am/strings.xml +++ b/packages/SystemUI/res-product/values-am/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"ስልኩን <xliff:g id="NUMBER">%d</xliff:g> ጊዜ ትክክል ባልሆነ መልኩ ለመክፈት ሞክረዋል። የስራ መገለጫው ይወገዳል፣ ይህም ሁሉንም የመገለጫ ውሂብ ይሰርዛል።"</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"የመክፈቻ ስርዓተ ጥለቱን <xliff:g id="NUMBER_0">%1$d</xliff:g> ጊዜ በትክክል አልሳሉትም። ከ<xliff:g id="NUMBER_1">%2$d</xliff:g> ተጨማሪ ያልተሳኩ ሙከራዎች በኋላ የኢሜይል መለያ ተጠቅመው ጡባዊዎን እንዲከፍቱ ይጠየቃሉ።\n\n ከ<xliff:g id="NUMBER_2">%3$d</xliff:g> ከሰከንዶች በኋላ እንደገና ይሞክሩ።"</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"የመክፈቻ ስርዓተ ጥለቱን <xliff:g id="NUMBER_0">%1$d</xliff:g> ጊዜ በትክክል አልሳሉትም። ከ<xliff:g id="NUMBER_1">%2$d</xliff:g> ተጨማሪ ያልተሳኩ ሙከራዎች በኋላ የኢሜይል መለያ ተጠቅመው ስልክዎን እንዲከፍቱ ይጠየቃሉ።\n\nእባክዎ ከ<xliff:g id="NUMBER_2">%3$d</xliff:g> ሰከንዶች በኋላ እንደገና ይሞክሩ።"</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"ለተጨማሪ አማራጮች የእርስዎን ስልክ ይክፈቱ"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"ለተጨማሪ አማራጮች የእርስዎን ጡባዊ ይክፈቱ"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"ለተጨማሪ አማራጮች የእርስዎን መሣሪያ ይክፈቱ"</string> </resources> diff --git a/packages/SystemUI/res-product/values-ar/strings.xml b/packages/SystemUI/res-product/values-ar/strings.xml index 8e56636a5fd6..a13136fbd1e2 100644 --- a/packages/SystemUI/res-product/values-ar/strings.xml +++ b/packages/SystemUI/res-product/values-ar/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"أخطأت في محاولة فتح قفل الهاتف <xliff:g id="NUMBER">%d</xliff:g> مرة. ستتم إزالة الملف الشخصي للعمل، ومن ثم يتم حذف جميع بياناته."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"رسمت نقش فتح القفل بشكل غير صحيح <xliff:g id="NUMBER_0">%1$d</xliff:g> مرة. بعد إجراء <xliff:g id="NUMBER_1">%2$d</xliff:g> محاولة غير ناجحة أخرى، ستُطالَب بفتح قفل الجهاز اللوحي باستخدام معلومات حساب بريد إلكتروني.\n\n يُرجى إعادة المحاولة خلال <xliff:g id="NUMBER_2">%3$d</xliff:g> ثانية."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"رسمت نقش فتح القفل بشكل غير صحيح <xliff:g id="NUMBER_0">%1$d</xliff:g> مرة. بعد إجراء <xliff:g id="NUMBER_1">%2$d</xliff:g> محاولة غير ناجحة أخرى، ستُطالَب بفتح قفل الهاتف باستخدام حساب بريد إلكتروني.\n\n يُرجى إعادة المحاولة خلال <xliff:g id="NUMBER_2">%3$d</xliff:g> ثانية."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"يمكنك فتح قفل هاتفك للوصول إلى مزيد من الخيارات."</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"يمكنك فتح قفل جهازك اللوحي للوصول إلى مزيد من الخيارات."</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"يمكنك فتح قفل جهازك للوصول إلى مزيد من الخيارات."</string> </resources> diff --git a/packages/SystemUI/res-product/values-as/strings.xml b/packages/SystemUI/res-product/values-as/strings.xml index a6a35f398e3b..c3e965c8d316 100644 --- a/packages/SystemUI/res-product/values-as/strings.xml +++ b/packages/SystemUI/res-product/values-as/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"আপুনি ফ’নটো আনলক কৰিবলৈ <xliff:g id="NUMBER">%d</xliff:g> বাৰ ভুলকৈ প্ৰয়াস কৰিছে। কৰ্মস্থানৰ প্ৰ’ফাইলটো আঁতৰোৱা হ’ব, যিয়ে প্ৰ’ফাইলটোৰ সকলো ডেটা মচি পেলাব।"</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"আপুনি নিজৰ আনলক কৰা আৰ্হিটো <xliff:g id="NUMBER_0">%1$d</xliff:g> বাৰ ভুলকৈ আঁকিছে। আৰু <xliff:g id="NUMBER_1">%2$d</xliff:g> বাৰ ভুলকৈ প্ৰয়াস কৰাৰ পাছত আপোনাক নিজৰ টেবলেটটো এটা ইমেইল একাউণ্টৰ জৰিয়তে আনলক কৰিবলৈ কোৱা হ’ব।\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> ছেকেণ্ডৰ পাছত পুনৰ চেষ্টা কৰক।"</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"আপুনি নিজৰ আনলক কৰা আৰ্হিটো <xliff:g id="NUMBER_0">%1$d</xliff:g> বাৰ ভুলকৈ আঁকিছে। আৰু <xliff:g id="NUMBER_1">%2$d</xliff:g> বাৰ ভুলকৈ প্ৰয়াস কৰাৰ পাছত আপোনাক নিজৰ ফ’নটো এটা ইমেইল একাউণ্টৰ জৰিয়তে আনলক কৰিবলৈ কোৱা হ’ব।\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> ছেকেণ্ডৰ পাছত পুনৰ চেষ্টা কৰক।"</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"অধিক বিকল্পৰ বাবে আপোনাৰ ফ’নটো আনলক কৰক"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"অধিক বিকল্পৰ বাবে আপোনাৰ টেবলেটটো আনলক কৰক"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"অধিক বিকল্পৰ বাবে আপোনাৰ ডিভাইচটো আনলক কৰক"</string> </resources> diff --git a/packages/SystemUI/res-product/values-az/strings.xml b/packages/SystemUI/res-product/values-az/strings.xml index 1db1503525e9..ee86ae23d48f 100644 --- a/packages/SystemUI/res-product/values-az/strings.xml +++ b/packages/SystemUI/res-product/values-az/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Telefonun kilidini açmaq üçün <xliff:g id="NUMBER">%d</xliff:g> dəfə yanlış cəhd etmisiniz. İş profili silinəcək və bütün data ləğv ediləcək."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Kilid açma modelini <xliff:g id="NUMBER_0">%1$d</xliff:g> dəfə yanlış çəkmisiniz. Daha <xliff:g id="NUMBER_1">%2$d</xliff:g> uğursuz cəhddən sonra planşet kilidini e-poçt hesabınızla açmaq tələb olunacaq.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> saniyə sonra yenidən cəhd edin."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Kilid açma modelini artıq <xliff:g id="NUMBER_0">%1$d</xliff:g> dəfə yanlış çəkmisiniz. Daha <xliff:g id="NUMBER_1">%2$d</xliff:g> uğursuz cəhddən sonra telefon kilidini e-poçt hesabınızla açmaq tələb olunacaq.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> saniyə sonra yenidən cəhd edin."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Daha çox seçim üçün telefonu kiliddən çıxarın"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Daha çox seçim üçün planşeti kiliddən çıxarın"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Daha çox seçim üçün cihazı kiliddən çıxarın"</string> </resources> diff --git a/packages/SystemUI/res-product/values-b+sr+Latn/strings.xml b/packages/SystemUI/res-product/values-b+sr+Latn/strings.xml index 3a2482607fd6..7a27dd0fd9b6 100644 --- a/packages/SystemUI/res-product/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res-product/values-b+sr+Latn/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Pogrešno ste pokušali da otključate telefon <xliff:g id="NUMBER">%d</xliff:g> puta. Uklonićemo poslovni profil, čime se brišu svi podaci sa profila."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Netačno ste nacrtali šablon za otključavanje <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. Ako pogrešno pokušate još <xliff:g id="NUMBER_1">%2$d</xliff:g> puta, zatražićemo da otključate tablet pomoću imejl naloga.\n\n Probajte ponovo za <xliff:g id="NUMBER_2">%3$d</xliff:g> sek."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Netačno ste nacrtali šablon za otključavanje <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. Ako pogrešno pokušate još <xliff:g id="NUMBER_1">%2$d</xliff:g> puta, zatražićemo da otključate telefon pomoću imejl naloga.\n\n Probajte ponovo za <xliff:g id="NUMBER_2">%3$d</xliff:g> sek."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Otključajte telefon za još opcija"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Otključajte tablet za još opcija"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Otključajte uređaj za još opcija"</string> </resources> diff --git a/packages/SystemUI/res-product/values-be/strings.xml b/packages/SystemUI/res-product/values-be/strings.xml index a1b941fc6978..4fd7cc047246 100644 --- a/packages/SystemUI/res-product/values-be/strings.xml +++ b/packages/SystemUI/res-product/values-be/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Вы не змаглі разблакіраваць тэлефон столькі разоў: <xliff:g id="NUMBER">%d</xliff:g>. Працоўны профіль будзе выдалены, і гэта прывядзе да выдалення ўсіх даных у профілі."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Вы няправільна ўвялі ўзор разблакіроўкі столькі разоў: <xliff:g id="NUMBER_0">%1$d</xliff:g>. Пасля яшчэ некалькіх няўдалых спроб (<xliff:g id="NUMBER_1">%2$d</xliff:g>) вам будзе прапанавана разблакіраваць планшэт, увайшоўшы ва ўліковы запіс электроннай пошты.\n\n Паўтарыце спробу праз <xliff:g id="NUMBER_2">%3$d</xliff:g> с."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Вы няправільна ўвялі ўзор разблакіроўкі столькі разоў: <xliff:g id="NUMBER_0">%1$d</xliff:g>. Пасля яшчэ некалькіх няўдалых спроб (<xliff:g id="NUMBER_1">%2$d</xliff:g>) вам будзе прапанавана разблакіраваць тэлефон, увайшоўшы ва ўліковы запіс электроннай пошты.\n\n Паўтарыце спробу праз <xliff:g id="NUMBER_2">%3$d</xliff:g> с."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Каб адкрыць іншыя параметры, разблакіруйце тэлефон"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Каб адкрыць іншыя параметры, разблакіруйце планшэт"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Каб адкрыць іншыя параметры, разблакіруйце прыладу"</string> </resources> diff --git a/packages/SystemUI/res-product/values-bg/strings.xml b/packages/SystemUI/res-product/values-bg/strings.xml index cce012e2bf8a..cfdab241f45f 100644 --- a/packages/SystemUI/res-product/values-bg/strings.xml +++ b/packages/SystemUI/res-product/values-bg/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Опитахте да отключите телефона и сбъркахте <xliff:g id="NUMBER">%d</xliff:g> пъти. Служебният потребителски профил ще бъде премахнат, при което ще се изтрият всички данни за него."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Начертахте неправилно фигурата си за отключване <xliff:g id="NUMBER_0">%1$d</xliff:g> пъти. След още <xliff:g id="NUMBER_1">%2$d</xliff:g> неуспешни опита ще бъдете помолени да отключите таблета си посредством имейл адрес.\n\n Опитайте отново след <xliff:g id="NUMBER_2">%3$d</xliff:g> секунди."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Начертахте неправилно фигурата си за отключване <xliff:g id="NUMBER_0">%1$d</xliff:g> пъти. След още <xliff:g id="NUMBER_1">%2$d</xliff:g> неуспешни опита ще бъдете помолени да отключите телефона посредством имейл адрес.\n\n Опитайте отново след <xliff:g id="NUMBER_2">%3$d</xliff:g> секунди."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Отключете телефона си за още опции"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Отключете таблета си за още опции"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Отключете устройството си за още опции"</string> </resources> diff --git a/packages/SystemUI/res-product/values-bn/strings.xml b/packages/SystemUI/res-product/values-bn/strings.xml index 8c36fcb088e9..214dd45040fc 100644 --- a/packages/SystemUI/res-product/values-bn/strings.xml +++ b/packages/SystemUI/res-product/values-bn/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"আপনি <xliff:g id="NUMBER">%d</xliff:g> বার ভুল পদ্ধতিতে ফোন আনলক করার চেষ্টা করেছেন। অফিস প্রোফাইলটি সরিয়ে দেওয়া হবে, যার ফলে প্রোফাইলের সমস্ত ডেটা মুছে যাবে।"</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"আপনি <xliff:g id="NUMBER_0">%1$d</xliff:g> বার ভুল পদ্ধতিতে প্যাটার্ন আনলক করার চেষ্টা করেছেন। আরও <xliff:g id="NUMBER_1">%2$d</xliff:g> বার এটি করলে আপনাকে প্যাটার্ন আনলক করতে একটি ইমেল অ্যাকাউন্ট ব্যবহার করতে বলা হবে।\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> সেকেন্ড পরে আবার চেষ্টা করুন।"</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"আপনি <xliff:g id="NUMBER_0">%1$d</xliff:g> বার ভুল পদ্ধতিতে প্যাটার্ন আনলক করার চেষ্টা করেছেন। আরও <xliff:g id="NUMBER_1">%2$d</xliff:g> বার এটি করলে আপনাকে প্যাটার্ন আনলক করতে একটি ইমেল অ্যাকাউন্ট ব্যবহারের করতে বলা হবে।\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> সেকেন্ড পরে আবার চেষ্টা করুন।"</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"আরও বিকল্প দেখতে আপনার ফোন আনলক করুন"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"আরও বিকল্প দেখতে আপনার ট্যাবলেট আনলক করুন"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"আরও বিকল্প দেখতে আপনার ডিভাইস আনলক করুন"</string> </resources> diff --git a/packages/SystemUI/res-product/values-bs/strings.xml b/packages/SystemUI/res-product/values-bs/strings.xml index c512f5580ad2..ed5caae511fa 100644 --- a/packages/SystemUI/res-product/values-bs/strings.xml +++ b/packages/SystemUI/res-product/values-bs/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Pokušali ste neispravno otključati telefon <xliff:g id="NUMBER">%d</xliff:g> puta. Radni profil će se ukloniti i svi podaci s profila će se izbrisati."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Pogrešno ste nacrtali uzorak za otključavanje <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. U slučaju još <xliff:g id="NUMBER_1">%2$d</xliff:g> pokušaja bez uspjeha, od vas će se tražiti da otključate tablet pomoću računa e-pošte. \n\n Pokušajte ponovo za <xliff:g id="NUMBER_2">%3$d</xliff:g> s."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Pogrešno ste nacrtali uzorak za otključavanje <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. U slučaju još <xliff:g id="NUMBER_1">%2$d</xliff:g> pokušaja bez uspjeha, od vas će se tražiti da otključate telefon pomoću računa e-pošte. \n\n Pokušajte ponovo za <xliff:g id="NUMBER_2">%3$d</xliff:g> s."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Otključajte telefon za više opcija"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Otključajte tablet za više opcija"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Otključajte uređaj za više opcija"</string> </resources> diff --git a/packages/SystemUI/res-product/values-ca/strings.xml b/packages/SystemUI/res-product/values-ca/strings.xml index 5bb73e44f2f7..44417927a1dd 100644 --- a/packages/SystemUI/res-product/values-ca/strings.xml +++ b/packages/SystemUI/res-product/values-ca/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Has provat de desbloquejar el telèfon <xliff:g id="NUMBER">%d</xliff:g> vegades de manera incorrecta. El perfil de treball se suprimirà, juntament amb totes les dades que contingui."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Has dibuixat el patró de desbloqueig <xliff:g id="NUMBER_0">%1$d</xliff:g> vegades de manera incorrecta. Si falles <xliff:g id="NUMBER_1">%2$d</xliff:g> vegades més, se\'t demanarà que desbloquegis la tauleta amb un compte de correu electrònic.\n\n Torna-ho a provar d\'aquí a <xliff:g id="NUMBER_2">%3$d</xliff:g> segons."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Has dibuixat el patró de desbloqueig <xliff:g id="NUMBER_0">%1$d</xliff:g> vegades de manera incorrecta. Si falles <xliff:g id="NUMBER_1">%2$d</xliff:g> vegades més, se\'t demanarà que desbloquegis el telèfon amb un compte de correu electrònic.\n\n Torna-ho a provar d\'aquí a <xliff:g id="NUMBER_2">%3$d</xliff:g> segons."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Desbloqueja el teu telèfon per veure més opcions"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Desbloqueja la teva tauleta per veure més opcions"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Desbloqueja el teu dispositiu per veure més opcions"</string> </resources> diff --git a/packages/SystemUI/res-product/values-cs/strings.xml b/packages/SystemUI/res-product/values-cs/strings.xml index bd0b66a99591..aa6ba7212e9c 100644 --- a/packages/SystemUI/res-product/values-cs/strings.xml +++ b/packages/SystemUI/res-product/values-cs/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Již <xliff:g id="NUMBER">%d</xliff:g>krát jste se pokusili odemknout telefon nesprávným způsobem. Pracovní profil bude odstraněn, čímž budou smazána všechna jeho data."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Již <xliff:g id="NUMBER_0">%1$d</xliff:g>krát jste nesprávně zadali své bezpečnostní gesto. Po <xliff:g id="NUMBER_1">%2$d</xliff:g>dalších neúspěšných pokusech budete požádáni o odemčení tabletu pomocí e-mailového účtu.\n\n Zkuste to znovu za <xliff:g id="NUMBER_2">%3$d</xliff:g> s."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Již <xliff:g id="NUMBER_0">%1$d</xliff:g>krát jste nesprávně zadali své bezpečnostní gesto. Po <xliff:g id="NUMBER_1">%2$d</xliff:g> dalších neúspěšných pokusech budete požádáni o odemčení telefonu pomocí e-mailového účtu.\n\n Zkuste to znovu za <xliff:g id="NUMBER_2">%3$d</xliff:g> s."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Chcete-li zobrazit další možnosti, odemkněte telefon"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Chcete-li zobrazit další možnosti, odemkněte tablet"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Chcete-li zobrazit další možnosti, odemkněte zařízení"</string> </resources> diff --git a/packages/SystemUI/res-product/values-da/strings.xml b/packages/SystemUI/res-product/values-da/strings.xml index 7777bd5881e9..5b2112ec7d70 100644 --- a/packages/SystemUI/res-product/values-da/strings.xml +++ b/packages/SystemUI/res-product/values-da/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Du har forsøgt at låse telefonen op med den forkerte adgangskode <xliff:g id="NUMBER">%d</xliff:g> gange. Arbejdsprofilen fjernes, hvilket sletter alle profildata."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Du har tegnet dit oplåsningsmønster forkert <xliff:g id="NUMBER_0">%1$d</xliff:g> gange. Efter endnu <xliff:g id="NUMBER_1">%2$d</xliff:g> mislykkede forsøg bliver du bedt om at låse din tablet op ved hjælp af en mailkonto.\n\n Prøv igen om <xliff:g id="NUMBER_2">%3$d</xliff:g> sekunder."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Du har tegnet dit oplåsningsmønster forkert <xliff:g id="NUMBER_0">%1$d</xliff:g> gange. Efter endnu <xliff:g id="NUMBER_1">%2$d</xliff:g> mislykkede forsøg bliver du bedt om at låse din telefon op ved hjælp af en mailkonto.\n\n Prøv igen om <xliff:g id="NUMBER_2">%3$d</xliff:g> sekunder."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Lås din telefon op for at se flere valgmuligheder"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Lås din tablet op for at se flere valgmuligheder"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Lås din enhed op for at se flere valgmuligheder"</string> </resources> diff --git a/packages/SystemUI/res-product/values-de/strings.xml b/packages/SystemUI/res-product/values-de/strings.xml index 78b902324a0b..5c8f842fa2d3 100644 --- a/packages/SystemUI/res-product/values-de/strings.xml +++ b/packages/SystemUI/res-product/values-de/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Du hast <xliff:g id="NUMBER">%d</xliff:g>-mal erfolglos versucht, das Smartphone zu entsperren. Das Arbeitsprofil wird nun entfernt und alle Profildaten werden gelöscht."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Du hast dein Entsperrungsmuster <xliff:g id="NUMBER_0">%1$d</xliff:g>-mal falsch gezeichnet. Nach <xliff:g id="NUMBER_1">%2$d</xliff:g> weiteren erfolglosen Versuchen wirst du aufgefordert, dein Tablet mithilfe eines E-Mail-Kontos zu entsperren.\n\n Versuche es in <xliff:g id="NUMBER_2">%3$d</xliff:g> Sekunden noch einmal."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Du hast dein Entsperrungsmuster <xliff:g id="NUMBER_0">%1$d</xliff:g>-mal falsch gezeichnet. Nach <xliff:g id="NUMBER_1">%2$d</xliff:g> weiteren erfolglosen Versuchen wirst du aufgefordert, dein Smartphone mithilfe eines E-Mail-Kontos zu entsperren.\n\n Versuche es in <xliff:g id="NUMBER_2">%3$d</xliff:g> Sekunden noch einmal."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Entsperre dein Smartphone für weitere Optionen"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Entsperre dein Tablet für weitere Optionen"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Entsperre dein Gerät für weitere Optionen"</string> </resources> diff --git a/packages/SystemUI/res-product/values-el/strings.xml b/packages/SystemUI/res-product/values-el/strings.xml index 9eb7307c0399..8dd9ec25ccb1 100644 --- a/packages/SystemUI/res-product/values-el/strings.xml +++ b/packages/SystemUI/res-product/values-el/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Δοκιμάσατε να ξεκλειδώσετε το τηλέφωνο <xliff:g id="NUMBER">%d</xliff:g> φορές χωρίς επιτυχία. Το προφίλ εργασίας θα καταργηθεί και θα διαγραφούν όλα τα δεδομένα προφίλ."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Σχεδιάσατε το μοτίβο ξεκλειδώματος εσφαλμένα <xliff:g id="NUMBER_0">%1$d</xliff:g> φορές. Μετά από <xliff:g id="NUMBER_1">%2$d</xliff:g> ακόμα ανεπιτυχείς προσπάθειες, θα σας ζητηθεί να ξεκλειδώσετε το tablet με τη χρήση ενός λογαριασμού ηλεκτρονικού ταχυδρομείου.\n\n Δοκιμάστε να συνδεθείτε ξανά σε <xliff:g id="NUMBER_2">%3$d</xliff:g> δευτερόλεπτα."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Σχεδιάσατε το μοτίβο ξεκλειδώματος εσφαλμένα <xliff:g id="NUMBER_0">%1$d</xliff:g> φορές. Μετά από <xliff:g id="NUMBER_1">%2$d</xliff:g> ακόμα ανεπιτυχείς προσπάθειες, θα σας ζητηθεί να ξεκλειδώσετε το τηλέφωνό σας με τη χρήση ενός λογαριασμού ηλεκτρονικού ταχυδρομείου.\n\n Δοκιμάστε ξανά σε <xliff:g id="NUMBER_2">%3$d</xliff:g> δευτερόλεπτα."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Ξεκλειδώστε το τηλέφωνό σας για περισσότερες επιλογές"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Ξεκλειδώστε το tablet για περισσότερες επιλογές"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Ξεκλειδώστε τη συσκευή σας για περισσότερες επιλογές"</string> </resources> diff --git a/packages/SystemUI/res-product/values-en-rAU/strings.xml b/packages/SystemUI/res-product/values-en-rAU/strings.xml index c0a535ce5f4b..3de7b654ead0 100644 --- a/packages/SystemUI/res-product/values-en-rAU/strings.xml +++ b/packages/SystemUI/res-product/values-en-rAU/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"You have incorrectly attempted to unlock the phone <xliff:g id="NUMBER">%d</xliff:g> times. The work profile will be removed, which will delete all profile data."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"You have incorrectly drawn your unlock pattern <xliff:g id="NUMBER_0">%1$d</xliff:g> times. After <xliff:g id="NUMBER_1">%2$d</xliff:g> more unsuccessful attempts, you will be asked to unlock your tablet using an email account.\n\n Try again in <xliff:g id="NUMBER_2">%3$d</xliff:g> seconds."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"You have incorrectly drawn your unlock pattern <xliff:g id="NUMBER_0">%1$d</xliff:g> times. After <xliff:g id="NUMBER_1">%2$d</xliff:g> more unsuccessful attempts, you will be asked to unlock your phone using an email account.\n\n Try again in <xliff:g id="NUMBER_2">%3$d</xliff:g> seconds."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Unlock your phone for more options"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Unlock your tablet for more options"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Unlock your device for more options"</string> </resources> diff --git a/packages/SystemUI/res-product/values-en-rCA/strings.xml b/packages/SystemUI/res-product/values-en-rCA/strings.xml index c0a535ce5f4b..3de7b654ead0 100644 --- a/packages/SystemUI/res-product/values-en-rCA/strings.xml +++ b/packages/SystemUI/res-product/values-en-rCA/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"You have incorrectly attempted to unlock the phone <xliff:g id="NUMBER">%d</xliff:g> times. The work profile will be removed, which will delete all profile data."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"You have incorrectly drawn your unlock pattern <xliff:g id="NUMBER_0">%1$d</xliff:g> times. After <xliff:g id="NUMBER_1">%2$d</xliff:g> more unsuccessful attempts, you will be asked to unlock your tablet using an email account.\n\n Try again in <xliff:g id="NUMBER_2">%3$d</xliff:g> seconds."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"You have incorrectly drawn your unlock pattern <xliff:g id="NUMBER_0">%1$d</xliff:g> times. After <xliff:g id="NUMBER_1">%2$d</xliff:g> more unsuccessful attempts, you will be asked to unlock your phone using an email account.\n\n Try again in <xliff:g id="NUMBER_2">%3$d</xliff:g> seconds."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Unlock your phone for more options"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Unlock your tablet for more options"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Unlock your device for more options"</string> </resources> diff --git a/packages/SystemUI/res-product/values-en-rGB/strings.xml b/packages/SystemUI/res-product/values-en-rGB/strings.xml index c0a535ce5f4b..3de7b654ead0 100644 --- a/packages/SystemUI/res-product/values-en-rGB/strings.xml +++ b/packages/SystemUI/res-product/values-en-rGB/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"You have incorrectly attempted to unlock the phone <xliff:g id="NUMBER">%d</xliff:g> times. The work profile will be removed, which will delete all profile data."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"You have incorrectly drawn your unlock pattern <xliff:g id="NUMBER_0">%1$d</xliff:g> times. After <xliff:g id="NUMBER_1">%2$d</xliff:g> more unsuccessful attempts, you will be asked to unlock your tablet using an email account.\n\n Try again in <xliff:g id="NUMBER_2">%3$d</xliff:g> seconds."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"You have incorrectly drawn your unlock pattern <xliff:g id="NUMBER_0">%1$d</xliff:g> times. After <xliff:g id="NUMBER_1">%2$d</xliff:g> more unsuccessful attempts, you will be asked to unlock your phone using an email account.\n\n Try again in <xliff:g id="NUMBER_2">%3$d</xliff:g> seconds."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Unlock your phone for more options"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Unlock your tablet for more options"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Unlock your device for more options"</string> </resources> diff --git a/packages/SystemUI/res-product/values-en-rIN/strings.xml b/packages/SystemUI/res-product/values-en-rIN/strings.xml index c0a535ce5f4b..3de7b654ead0 100644 --- a/packages/SystemUI/res-product/values-en-rIN/strings.xml +++ b/packages/SystemUI/res-product/values-en-rIN/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"You have incorrectly attempted to unlock the phone <xliff:g id="NUMBER">%d</xliff:g> times. The work profile will be removed, which will delete all profile data."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"You have incorrectly drawn your unlock pattern <xliff:g id="NUMBER_0">%1$d</xliff:g> times. After <xliff:g id="NUMBER_1">%2$d</xliff:g> more unsuccessful attempts, you will be asked to unlock your tablet using an email account.\n\n Try again in <xliff:g id="NUMBER_2">%3$d</xliff:g> seconds."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"You have incorrectly drawn your unlock pattern <xliff:g id="NUMBER_0">%1$d</xliff:g> times. After <xliff:g id="NUMBER_1">%2$d</xliff:g> more unsuccessful attempts, you will be asked to unlock your phone using an email account.\n\n Try again in <xliff:g id="NUMBER_2">%3$d</xliff:g> seconds."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Unlock your phone for more options"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Unlock your tablet for more options"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Unlock your device for more options"</string> </resources> diff --git a/packages/SystemUI/res-product/values-es-rUS/strings.xml b/packages/SystemUI/res-product/values-es-rUS/strings.xml index fe081eafd1bd..b333479ad264 100644 --- a/packages/SystemUI/res-product/values-es-rUS/strings.xml +++ b/packages/SystemUI/res-product/values-es-rUS/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Intentaste desbloquear el teléfono <xliff:g id="NUMBER">%d</xliff:g> veces de manera incorrecta. Se quitará el perfil de trabajo, lo que borrará todos los datos asociados."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Dibujaste el patrón de desbloqueo <xliff:g id="NUMBER_0">%1$d</xliff:g> veces de manera incorrecta. Después de <xliff:g id="NUMBER_1">%2$d</xliff:g> intentos incorrectos más, se te solicitará que desbloquees la tablet mediante una cuenta de correo electrónico.\n\n Vuelve a intentarlo en <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Dibujaste el patrón de desbloqueo <xliff:g id="NUMBER_0">%1$d</xliff:g> veces de manera incorrecta. Después de <xliff:g id="NUMBER_1">%2$d</xliff:g> intentos incorrectos más, se te solicitará que desbloquees el dispositivo mediante una cuenta de correo electrónico.\n\n Vuelve a intentarlo en <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Desbloquea el teléfono para ver más opciones"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Desbloquea la tablet para ver más opciones"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Desbloquea el dispositivo para ver más opciones"</string> </resources> diff --git a/packages/SystemUI/res-product/values-es/strings.xml b/packages/SystemUI/res-product/values-es/strings.xml index f170c1275daa..03ff2ff8a2d9 100644 --- a/packages/SystemUI/res-product/values-es/strings.xml +++ b/packages/SystemUI/res-product/values-es/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Has intentado desbloquear el teléfono de forma incorrecta <xliff:g id="NUMBER">%d</xliff:g> veces. Se quitará este perfil de trabajo y se eliminarán todos sus datos."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Has dibujado un patrón de desbloqueo incorrecto <xliff:g id="NUMBER_0">%1$d</xliff:g> veces. Si se producen <xliff:g id="NUMBER_1">%2$d</xliff:g> intentos incorrectos más, se te pedirá que desbloquees el tablet con una cuenta de correo electrónico.\n\n Vuelve a intentarlo en <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Has dibujado un patrón de desbloqueo incorrecto <xliff:g id="NUMBER_0">%1$d</xliff:g> veces. Si se producen <xliff:g id="NUMBER_1">%2$d</xliff:g> intentos incorrectos más, se te pedirá que desbloquees el teléfono con una cuenta de correo electrónico.\n\n Vuelve a intentarlo en <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Desbloquea el teléfono para ver más opciones"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Desbloquea el tablet para ver más opciones"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Desbloquea el dispositivo para ver más opciones"</string> </resources> diff --git a/packages/SystemUI/res-product/values-et/strings.xml b/packages/SystemUI/res-product/values-et/strings.xml index f64be8fd810f..01060cb6dc9b 100644 --- a/packages/SystemUI/res-product/values-et/strings.xml +++ b/packages/SystemUI/res-product/values-et/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Olete püüdnud <xliff:g id="NUMBER">%d</xliff:g> korda telefoni valesti avada. Tööprofiil eemaldatakse ja kõik profiiliandmed kustutatakse."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Joonistasite oma avamismustri <xliff:g id="NUMBER_0">%1$d</xliff:g> korda valesti. Pärast veel <xliff:g id="NUMBER_1">%2$d</xliff:g> ebaõnnestunud katset palutakse teil tahvelarvuti avada meilikontoga.\n\n Proovige uuesti <xliff:g id="NUMBER_2">%3$d</xliff:g> sekundi pärast."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Joonistasite oma avamismustri <xliff:g id="NUMBER_0">%1$d</xliff:g> korda valesti. Pärast veel <xliff:g id="NUMBER_1">%2$d</xliff:g> ebaõnnestunud katset palutakse teil telefon avada meilikontoga.\n\n Proovige uuesti <xliff:g id="NUMBER_2">%3$d</xliff:g> sekundi pärast."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Lisavalikute nägemiseks avage oma telefon"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Lisavalikute nägemiseks avage oma tahvelarvuti"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Lisavalikute nägemiseks avage oma seade"</string> </resources> diff --git a/packages/SystemUI/res-product/values-eu/strings.xml b/packages/SystemUI/res-product/values-eu/strings.xml index 2feed17c1f90..e6cf28d2fac0 100644 --- a/packages/SystemUI/res-product/values-eu/strings.xml +++ b/packages/SystemUI/res-product/values-eu/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"<xliff:g id="NUMBER">%d</xliff:g> aldiz saiatu zara telefonoa desblokeatzen, baina huts egin duzu denetan. Laneko profila kendu egingo da eta, ondorioz, profileko datu guztiak ezabatuko dira."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Desblokeatzeko eredua oker marraztu duzu <xliff:g id="NUMBER_0">%1$d</xliff:g> aldiz. Beste <xliff:g id="NUMBER_1">%2$d</xliff:g> aldiz oker marrazten baduzu, tableta posta-kontu baten bidez desblokeatzeko eskatuko dizugu.\n\n Saiatu berriro <xliff:g id="NUMBER_2">%3$d</xliff:g> segundo barru."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Desblokeatzeko eredua oker marraztu duzu <xliff:g id="NUMBER_0">%1$d</xliff:g> aldiz. Beste <xliff:g id="NUMBER_1">%2$d</xliff:g> aldiz oker marrazten baduzu, telefonoa posta-kontu baten bidez desblokeatzeko eskatuko dizugu.\n\n Saiatu berriro <xliff:g id="NUMBER_2">%3$d</xliff:g> segundo barru."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Desblokeatu telefonoa aukera gehiago ikusteko"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Desblokeatu tableta aukera gehiago ikusteko"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Desblokeatu gailua aukera gehiago ikusteko"</string> </resources> diff --git a/packages/SystemUI/res-product/values-fa/strings.xml b/packages/SystemUI/res-product/values-fa/strings.xml index b55743046e07..52fa2d85d074 100644 --- a/packages/SystemUI/res-product/values-fa/strings.xml +++ b/packages/SystemUI/res-product/values-fa/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"<xliff:g id="NUMBER">%d</xliff:g> تلاش ناموفق برای باز کردن قفل تلفن داشتهاید. نمایه کاری پاک میشود که با آن همه دادههای نمایه حذف میشود."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"شما الگوی باز کردن قفل را <xliff:g id="NUMBER_0">%1$d</xliff:g> بار اشتباه کشیدهاید. بعد از <xliff:g id="NUMBER_1">%2$d</xliff:g> تلاش ناموفق، از شما خواسته میشود که با استفاده از یک حساب ایمیل قفل رایانه لوحی خود را باز کنید.\n\n لطفاً پس از <xliff:g id="NUMBER_2">%3$d</xliff:g> ثانیه دوباره امتحان کنید."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"شما الگوی باز کردن قفل را <xliff:g id="NUMBER_0">%1$d</xliff:g> بار اشتباه کشیدهاید. پس از <xliff:g id="NUMBER_1">%2$d</xliff:g> تلاش ناموفق، از شما خواسته میشود که با استفاده از یک حساب ایمیل قفل تلفن را باز کنید.\n\n لطفاً پس از <xliff:g id="NUMBER_2">%3$d</xliff:g> ثانیه دوباره امتحان کنید."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"برای گزینههای بیشتر، قفل تلفن را باز کنید"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"برای گزینههای بیشتر، قفل رایانه لوحی را باز کنید"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"برای گزینههای بیشتر، قفل دستگاه را باز کنید"</string> </resources> diff --git a/packages/SystemUI/res-product/values-fi/strings.xml b/packages/SystemUI/res-product/values-fi/strings.xml index 815a8ac3acb4..4001b30eb4d9 100644 --- a/packages/SystemUI/res-product/values-fi/strings.xml +++ b/packages/SystemUI/res-product/values-fi/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Yritit avata puhelimen lukituksen virheellisillä tiedoilla <xliff:g id="NUMBER">%d</xliff:g> kertaa. Työprofiili ja kaikki sen data poistetaan."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Piirsit lukituksenpoistokuvion väärin <xliff:g id="NUMBER_0">%1$d</xliff:g> kertaa. Jos piirrät kuvion väärin vielä <xliff:g id="NUMBER_1">%2$d</xliff:g> kertaa, sinua pyydetään avaamaan tabletin lukitus sähköpostitilin avulla.\n\n Yritä uudelleen <xliff:g id="NUMBER_2">%3$d</xliff:g> sekunnin kuluttua."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Piirsit lukituksenpoistokuvion väärin <xliff:g id="NUMBER_0">%1$d</xliff:g> kertaa. Jos piirrät kuvion väärin vielä <xliff:g id="NUMBER_1">%2$d</xliff:g> kertaa, sinua pyydetään avaamaan puhelimesi lukitus sähköpostitilin avulla.\n\n Yritä uudelleen <xliff:g id="NUMBER_2">%3$d</xliff:g> sekunnin kuluttua."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Avaa puhelimen lukitus, niin näet enemmän vaihtoehtoja"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Avaa tabletin lukitus, niin näet enemmän vaihtoehtoja"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Avaa laitteen lukitus, niin näet enemmän vaihtoehtoja"</string> </resources> diff --git a/packages/SystemUI/res-product/values-fr-rCA/strings.xml b/packages/SystemUI/res-product/values-fr-rCA/strings.xml index 6490511cfaa4..0849256bb53a 100644 --- a/packages/SystemUI/res-product/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res-product/values-fr-rCA/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Vous avez tenté de déverrouiller ce téléphone à <xliff:g id="NUMBER">%d</xliff:g> reprises. Le profil professionnel sera supprimé, ce qui entraîne la suppression de toutes ses données."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Vous avez dessiné un schéma de déverrouillage incorrect à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises. Si vous échouez encore <xliff:g id="NUMBER_1">%2$d</xliff:g> fois, vous devrez déverrouiller votre tablette à l\'aide d\'un compte de courriel.\n\nVeuillez réessayer dans <xliff:g id="NUMBER_2">%3$d</xliff:g> secondes."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Vous avez dessiné un schéma de déverrouillage incorrect à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises. Si vous échouez encore <xliff:g id="NUMBER_1">%2$d</xliff:g> fois, vous devrez déverrouiller votre téléphone à l\'aide d\'un compte de courriel.\n\nVeuillez réessayer dans <xliff:g id="NUMBER_2">%3$d</xliff:g> secondes."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Déverrouillez votre téléphone pour afficher davantage d\'options"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Déverrouillez votre tablette pour afficher davantage d\'options"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Déverrouillez votre appareil pour afficher davantage d\'options"</string> </resources> diff --git a/packages/SystemUI/res-product/values-fr/strings.xml b/packages/SystemUI/res-product/values-fr/strings.xml index c92fbec96267..1bbb759046e1 100644 --- a/packages/SystemUI/res-product/values-fr/strings.xml +++ b/packages/SystemUI/res-product/values-fr/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Vous avez tenté de déverrouiller le téléphone à <xliff:g id="NUMBER">%d</xliff:g> reprises. Le profil professionnel et toutes les données associées vont être supprimés."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Vous avez dessiné un schéma de déverrouillage incorrect à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises. Si vous échouez encore <xliff:g id="NUMBER_1">%2$d</xliff:g> fois, vous devrez déverrouiller votre tablette à l\'aide d\'un compte de messagerie électronique.\n\nRéessayez dans <xliff:g id="NUMBER_2">%3$d</xliff:g> secondes."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Vous avez dessiné un schéma de déverrouillage incorrect à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises. Si vous échouez encore <xliff:g id="NUMBER_1">%2$d</xliff:g> fois, vous devrez déverrouiller votre téléphone à l\'aide d\'un compte de messagerie électronique.\n\nRéessayez dans <xliff:g id="NUMBER_2">%3$d</xliff:g> secondes."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Déverrouillez votre téléphone pour obtenir plus d\'options"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Déverrouillez votre tablette pour obtenir plus d\'options"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Déverrouillez votre appareil pour obtenir plus d\'options"</string> </resources> diff --git a/packages/SystemUI/res-product/values-gl/strings.xml b/packages/SystemUI/res-product/values-gl/strings.xml index eb2681c193c1..6f034fb369d9 100644 --- a/packages/SystemUI/res-product/values-gl/strings.xml +++ b/packages/SystemUI/res-product/values-gl/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Tentaches desbloquear o teléfono <xliff:g id="NUMBER">%d</xliff:g> veces de forma incorrecta. Quitarase o perfil de traballo e, por conseguinte, todos os seus datos."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Debuxaches o padrón de desbloqueo <xliff:g id="NUMBER_0">%1$d</xliff:g> veces de forma incorrecta. Se realizas <xliff:g id="NUMBER_1">%2$d</xliff:g> intentos incorrectos máis, terás que desbloquear a tableta a través dunha conta de correo electrónico.\n\n Téntao de novo en <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Debuxaches o padrón de desbloqueo <xliff:g id="NUMBER_0">%1$d</xliff:g> veces de forma incorrecta. Se realizas <xliff:g id="NUMBER_1">%2$d</xliff:g> intentos incorrectos máis, terás que desbloquear o teléfono a través dunha conta de correo electrónico.\n\n Téntao de novo en <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Desbloquea o teléfono para ver máis opcións"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Desbloquea a tableta para ver máis opcións"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Desbloquea o dispositivo para ver máis opcións"</string> </resources> diff --git a/packages/SystemUI/res-product/values-gu/strings.xml b/packages/SystemUI/res-product/values-gu/strings.xml index 3fffab621f3c..9839b42919e4 100644 --- a/packages/SystemUI/res-product/values-gu/strings.xml +++ b/packages/SystemUI/res-product/values-gu/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"તમે ફોનને <xliff:g id="NUMBER">%d</xliff:g> વખત ખોટી રીતે અનલૉક કરવાનો પ્રયાસ કર્યો છે. આ કાર્યાલયની પ્રોફાઇલ કાઢી નાખવામાં આવશે, જે તમામ પ્રોફાઇલ ડેટાને ડિલીટ કરી દેશે."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"તમે તમારી અનલૉક પૅટર્ન <xliff:g id="NUMBER_0">%1$d</xliff:g> વખત ખોટી રીતે દોરી છે. વધુ <xliff:g id="NUMBER_1">%2$d</xliff:g> અસફળ પ્રયાસો પછી, તમને એક ઇમેઇલ એકાઉન્ટનો ઉપયોગ કરીને તમારા ટૅબ્લેટને અનલૉક કરવાનું કહેવામાં આવશે.\n\n<xliff:g id="NUMBER_2">%3$d</xliff:g> સેકન્ડમાં ફરી પ્રયાસ કરો."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"તમે તમારી અનલૉક પૅટર્ન <xliff:g id="NUMBER_0">%1$d</xliff:g> વખત ખોટી રીતે દોરી છે. વધુ <xliff:g id="NUMBER_1">%2$d</xliff:g> અસફળ પ્રયાસો પછી, તમને ઇમેઇલ એકાઉન્ટનો ઉપયોગ કરીને તમારા ફોનને અનલૉક કરવાનું કહેવામાં આવશે.\n\n<xliff:g id="NUMBER_2">%3$d</xliff:g> સેકન્ડમાં ફરીથી પ્રયાસ કરો."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"વધુ વિકલ્પો માટે તમારા ફોનને અનલૉક કરો"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"વધુ વિકલ્પો માટે તમારા ટૅબ્લેટને અનલૉક કરો"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"વધુ વિકલ્પો માટે તમારા ડિવાઇસને અનલૉક કરો"</string> </resources> diff --git a/packages/SystemUI/res-product/values-hi/strings.xml b/packages/SystemUI/res-product/values-hi/strings.xml index 7d7b8299f4fc..83c67e2fc724 100644 --- a/packages/SystemUI/res-product/values-hi/strings.xml +++ b/packages/SystemUI/res-product/values-hi/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"आप फ़ोन को अनलॉक करने के लिए <xliff:g id="NUMBER">%d</xliff:g> बार गलत पासवर्ड डाल चुके हैं. इसकी वजह से वर्क प्रोफ़ाइल को हटा दिया जाएगा जिससे उपयोगकर्ता की प्रोफ़ाइल का सारा डेटा मिट जाएगा."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"आपने लॉक खोलने के पैटर्न को <xliff:g id="NUMBER_0">%1$d</xliff:g> बार गलत तरीके से बनाया है. इसलिए, <xliff:g id="NUMBER_1">%2$d</xliff:g> और गलत पैटर्न बनाने के बाद, टैबलेट को अनलॉक करने के लिए आपसे ईमेल खाते का इस्तेमाल करने को कहा जाएगा.\n\n अनलॉक करने के लिए <xliff:g id="NUMBER_2">%3$d</xliff:g> सेकंड में फिर से कोशिश करें."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"आपने लॉक खोलने के पैटर्न को <xliff:g id="NUMBER_0">%1$d</xliff:g> बार गलत तरीके से बनाया है. इसलिए, <xliff:g id="NUMBER_1">%2$d</xliff:g> और गलत पैटर्न बनाने के बाद, आपसे फ़ोन को अनलॉक करने के लिए ईमेल खाते का इस्तेमाल करने को कहा जाएगा.\n\n अनलॉक करने के लिए <xliff:g id="NUMBER_2">%3$d</xliff:g> सेकंड में फिर से कोशिश करें."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"ज़्यादा विकल्प देखने के लिए, अपना फ़ोन अनलॉक करें"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"ज़्यादा विकल्प देखने के लिए, अपना टैबलेट अनलॉक करें"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"ज़्यादा विकल्प देखने के लिए, अपना डिवाइस अनलॉक करें"</string> </resources> diff --git a/packages/SystemUI/res-product/values-hr/strings.xml b/packages/SystemUI/res-product/values-hr/strings.xml index 7ad09d05dcc0..13f0023deac4 100644 --- a/packages/SystemUI/res-product/values-hr/strings.xml +++ b/packages/SystemUI/res-product/values-hr/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Neuspješno ste pokušali otključati telefon <xliff:g id="NUMBER">%d</xliff:g> put/a. Radni će se profil ukloniti, a time će se izbrisati i svi njegovi podaci."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Netočno ste iscrtali uzorak za otključavanje <xliff:g id="NUMBER_0">%1$d</xliff:g> put/a. Nakon još <xliff:g id="NUMBER_1">%2$d</xliff:g> pokušaja morat ćete otključati tablet pomoću računa e-pošte.\n\n Pokušajte ponovo za <xliff:g id="NUMBER_2">%3$d</xliff:g> s."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Netočno ste iscrtali uzorak za otključavanje <xliff:g id="NUMBER_0">%1$d</xliff:g> put/a. Nakon još <xliff:g id="NUMBER_1">%2$d</xliff:g> pokušaja morat ćete otključati telefon pomoću računa e-pošte.\n\n Pokušajte ponovo za <xliff:g id="NUMBER_2">%3$d</xliff:g> s."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Za više opcija otključajte telefon"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Za više opcija otključajte tablet"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Za više opcija otključajte uređaj"</string> </resources> diff --git a/packages/SystemUI/res-product/values-hu/strings.xml b/packages/SystemUI/res-product/values-hu/strings.xml index ffcaa8d7b698..743e2082dd81 100644 --- a/packages/SystemUI/res-product/values-hu/strings.xml +++ b/packages/SystemUI/res-product/values-hu/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"<xliff:g id="NUMBER">%d</xliff:g> alkalommal próbálkozott sikertelenül a telefon zárolásának feloldásával. A rendszer eltávolítja a munkaprofilt, és ezzel a profil összes adata törlődik."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"<xliff:g id="NUMBER_0">%1$d</xliff:g> alkalommal helytelenül rajzolta le a feloldási mintát. További <xliff:g id="NUMBER_1">%2$d</xliff:g> sikertelen kísérlet után e-mail-fiók használatával kell feloldania táblagépét.\n\nPróbálja újra <xliff:g id="NUMBER_2">%3$d</xliff:g> másodperc múlva."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"<xliff:g id="NUMBER_0">%1$d</xliff:g> alkalommal helytelenül rajzolta le a feloldási mintát. További <xliff:g id="NUMBER_1">%2$d</xliff:g> sikertelen kísérlet után e-mail-fiók használatával kell feloldania telefonját.\n\nPróbálja újra <xliff:g id="NUMBER_2">%3$d</xliff:g> másodperc múlva."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"További lehetőségekért oldja fel a telefont"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"További lehetőségekért oldja fel a táblagépet"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"További lehetőségekért oldja fel az eszközt"</string> </resources> diff --git a/packages/SystemUI/res-product/values-hy/strings.xml b/packages/SystemUI/res-product/values-hy/strings.xml index 6633ec825535..f245562d541a 100644 --- a/packages/SystemUI/res-product/values-hy/strings.xml +++ b/packages/SystemUI/res-product/values-hy/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Դուք կատարել եք հեռախոսն ապակողպելու <xliff:g id="NUMBER">%d</xliff:g> անհաջող փորձ: Աշխատանքային պրոֆիլը կհեռացվի, և պրոֆիլի բոլոր տվյալները կջնջվեն:"</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Դուք կատարել եք ապակողպման նախշը մուտքագրելու <xliff:g id="NUMBER_0">%1$d</xliff:g> անհաջող փորձ: Եվս <xliff:g id="NUMBER_1">%2$d</xliff:g> անհաջող փորձից հետո ձեզանից կպահանջվի ապակողպել պլանշետը էլփոստի հաշվի միջոցով։\n\n Խնդրում ենք կրկին փորձել <xliff:g id="NUMBER_2">%3$d</xliff:g> վայրկյանից:"</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Դուք <xliff:g id="NUMBER_0">%1$d</xliff:g> անգամ սխալ եք հավաքել ձեր ապակողպման նմուշը: Եվս <xliff:g id="NUMBER_1">%2$d</xliff:g> անհաջող փորձից հետո ձեզ կառաջարկվի ապակողպել հեռախոսը` օգտագործելով էլփոստի հաշիվ:\n\n Կրկին փորձեք <xliff:g id="NUMBER_2">%3$d</xliff:g> վայրկյանից:"</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Ապակողպեք ձեր հեռախոսը՝ լրացուցիչ կարգավորումները տեսնելու համար"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Ապակողպեք ձեր պլանշետը՝ լրացուցիչ կարգավորումները տեսնելու համար"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Ապակողպեք ձեր սարքը՝ լրացուցիչ կարգավորումները տեսնելու համար"</string> </resources> diff --git a/packages/SystemUI/res-product/values-in/strings.xml b/packages/SystemUI/res-product/values-in/strings.xml index 7037aa150c64..2e0580f568f9 100644 --- a/packages/SystemUI/res-product/values-in/strings.xml +++ b/packages/SystemUI/res-product/values-in/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Anda telah <xliff:g id="NUMBER">%d</xliff:g> kali berupaya membuka kunci ponsel dengan tidak benar. Profil kerja akan dihapus, sehingga semua data profil akan dihapus."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Anda telah <xliff:g id="NUMBER_0">%1$d</xliff:g> kali salah menggambar pola pembuka kunci. Setelah <xliff:g id="NUMBER_1">%2$d</xliff:g> lagi upaya yang tidak berhasil, Anda akan diminta membuka kunci tablet menggunakan akun email.\n\n Coba lagi dalam <xliff:g id="NUMBER_2">%3$d</xliff:g> detik."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Anda telah <xliff:g id="NUMBER_0">%1$d</xliff:g> kali salah menggambar pola pembuka kunci. Setelah <xliff:g id="NUMBER_1">%2$d</xliff:g> lagi upaya yang tidak berhasil, Anda akan diminta membuka kunci ponsel menggunakan akun email.\n\n Coba lagi dalam <xliff:g id="NUMBER_2">%3$d</xliff:g> detik."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Buka kunci ponsel untuk melihat opsi lainnya"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Buka kunci tablet untuk melihat opsi lainnya"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Buka kunci perangkat untuk melihat opsi lainnya"</string> </resources> diff --git a/packages/SystemUI/res-product/values-is/strings.xml b/packages/SystemUI/res-product/values-is/strings.xml index 2ae3e088361e..32f6e21e124f 100644 --- a/packages/SystemUI/res-product/values-is/strings.xml +++ b/packages/SystemUI/res-product/values-is/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Þú hefur gert <xliff:g id="NUMBER">%d</xliff:g> árangurslausar tilraunir til að opna símann. Vinnusniðið verður fjarlægt, með þeim afleiðingum að öllum gögnum þess verður eytt."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Þú hefur teiknað rangt opnunarmynstur <xliff:g id="NUMBER_0">%1$d</xliff:g> sinnum. Eftir <xliff:g id="NUMBER_1">%2$d</xliff:g> árangurslausar tilraunir í viðbót verðurðu beðin(n) um að opna spjaldtölvuna með tölvupóstreikningi.\n\n Reyndu aftur eftir <xliff:g id="NUMBER_2">%3$d</xliff:g> sekúndur."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Þú hefur teiknað rangt opnunarmynstur <xliff:g id="NUMBER_0">%1$d</xliff:g> sinnum. Eftir <xliff:g id="NUMBER_1">%2$d</xliff:g> árangurslausar tilraunir í viðbót verðurðu beðin(n) um að opna símann með tölvupóstreikningi.\n\n Reyndu aftur eftir <xliff:g id="NUMBER_2">%3$d</xliff:g> sekúndur."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Taktu símann úr lás til að fá fleiri valkosti"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Taktu spjaldtölvuna úr lás til að fá fleiri valkosti"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Taktu tækið úr lás til að fá fleiri valkosti"</string> </resources> diff --git a/packages/SystemUI/res-product/values-it/strings.xml b/packages/SystemUI/res-product/values-it/strings.xml index 8598fbb3cf6d..3403f3106678 100644 --- a/packages/SystemUI/res-product/values-it/strings.xml +++ b/packages/SystemUI/res-product/values-it/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Hai tentato di sbloccare il telefono senza riuscirci per <xliff:g id="NUMBER">%d</xliff:g> volte. Il profilo di lavoro verrà rimosso e verranno quindi eliminati tutti i dati associati."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"<xliff:g id="NUMBER_0">%1$d</xliff:g> tentativi errati di inserimento della sequenza di sblocco. Dopo altri <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativi falliti, ti verrà chiesto di sbloccare il tablet con un account email.\n\n Riprova tra <xliff:g id="NUMBER_2">%3$d</xliff:g> secondi."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"<xliff:g id="NUMBER_0">%1$d</xliff:g> tentativi errati di inserimento della sequenza di sblocco. Dopo altri <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativi falliti, ti verrà chiesto di sbloccare il telefono con un account email.\n\n Riprova tra <xliff:g id="NUMBER_2">%3$d</xliff:g> secondi."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Sblocca il telefono per visualizzare altre opzioni"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Sblocca il tablet per visualizzare altre opzioni"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Sblocca il dispositivo per visualizzare altre opzioni"</string> </resources> diff --git a/packages/SystemUI/res-product/values-iw/strings.xml b/packages/SystemUI/res-product/values-iw/strings.xml index 305b3ef92893..4ba8657a77e3 100644 --- a/packages/SystemUI/res-product/values-iw/strings.xml +++ b/packages/SystemUI/res-product/values-iw/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"ניסית לבטל את נעילת הטלפון <xliff:g id="NUMBER">%d</xliff:g> פעמים. פרופיל העבודה יוסר וכל נתוני הפרופיל יימחקו."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"שרטטת קו ביטול נעילה שגוי <xliff:g id="NUMBER_0">%1$d</xliff:g> פעמים. לאחר <xliff:g id="NUMBER_1">%2$d</xliff:g> ניסיונות כושלים נוספים, ,תישלח אליך בקשה לבטל את נעילת הטאבלט באמצעות חשבון אימייל.\n\n יש לנסות שוב בעוד <xliff:g id="NUMBER_2">%3$d</xliff:g> שניות."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"שרטטת קו ביטול נעילה שגוי <xliff:g id="NUMBER_0">%1$d</xliff:g> פעמים. לאחר <xliff:g id="NUMBER_1">%2$d</xliff:g> ניסיונות כושלים נוספים, תשילח אליך בקשה לבטל את נעילת הטלפון באמצעות חשבון אימייל.\n\n יש לנסות שוב בעוד <xliff:g id="NUMBER_2">%3$d</xliff:g> שניות."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"לאפשרויות נוספות, יש לבטל את נעילת הטלפון"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"לאפשרויות נוספות, יש לבטל את נעילת הטאבלט"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"לאפשרויות נוספות, יש לבטל את נעילת המכשיר"</string> </resources> diff --git a/packages/SystemUI/res-product/values-ja/strings.xml b/packages/SystemUI/res-product/values-ja/strings.xml index bc611d182191..0e7497aaa354 100644 --- a/packages/SystemUI/res-product/values-ja/strings.xml +++ b/packages/SystemUI/res-product/values-ja/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"スマートフォンのロック解除に <xliff:g id="NUMBER">%d</xliff:g> 回失敗しました。仕事用プロファイルは削除され、プロファイルのデータはすべて消去されます。"</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"ロック解除パターンの入力を <xliff:g id="NUMBER_0">%1$d</xliff:g> 回間違えました。あと <xliff:g id="NUMBER_1">%2$d</xliff:g> 回間違えると、タブレットのロック解除にメール アカウントが必要になります。\n\n<xliff:g id="NUMBER_2">%3$d</xliff:g> 秒後にもう一度お試しください。"</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"ロック解除パターンの入力を <xliff:g id="NUMBER_0">%1$d</xliff:g> 回間違えました。あと <xliff:g id="NUMBER_1">%2$d</xliff:g> 回間違えると、スマートフォンのロック解除にメール アカウントが必要になります。\n\n<xliff:g id="NUMBER_2">%3$d</xliff:g> 秒後にもう一度お試しください。"</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"スマートフォンのロックを解除してその他のオプションを表示する"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"タブレットのロックを解除してその他のオプションを表示する"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"デバイスのロックを解除してその他のオプションを表示する"</string> </resources> diff --git a/packages/SystemUI/res-product/values-ka/strings.xml b/packages/SystemUI/res-product/values-ka/strings.xml index 0d47bed9b721..3d04a3c73a01 100644 --- a/packages/SystemUI/res-product/values-ka/strings.xml +++ b/packages/SystemUI/res-product/values-ka/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"თქვენ არასწორად ცადეთ ტელეფონის განბლოკვა <xliff:g id="NUMBER">%d</xliff:g>-ჯერ. ამის გამო, სამსახურის პროფილი ამოიშლება, რაც პროფილის ყველა მონაცემის წაშლას გამოიწვევს."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"თქვენ არასწორად დახატეთ თქვენი განბლოკვის ნიმუში <xliff:g id="NUMBER_0">%1$d</xliff:g>-ჯერ. კიდევ <xliff:g id="NUMBER_1">%2$d</xliff:g> წარუმატებელი მცდელობის შემდეგ მოგთხოვთ, ტაბლეტი თქვენი ელფოსტის ანგარიშის მეშვეობით განბლოკოთ.\n\n ცადეთ ხელახლა <xliff:g id="NUMBER_2">%3$d</xliff:g> წამში."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"თქვენ არასწორად დახატეთ თქვენი განბლოკვის ნიმუში <xliff:g id="NUMBER_0">%1$d</xliff:g>-ჯერ. კიდევ <xliff:g id="NUMBER_1">%2$d</xliff:g> წარუმატებელი მცდელობის შემდეგ მოგთხოვთ, ტელეფონი თქვენი ელფოსტის ანგარიშის მეშვეობით განბლოკოთ.\n\n ცადეთ ხელახლა <xliff:g id="NUMBER_2">%3$d</xliff:g> წამში."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"მეტი ვარიანტის სანახავად განბლოკეთ თქვენი ტელეფონი"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"მეტი ვარიანტის სანახავად განბლოკეთ თქვენი ტაბლეტი"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"მეტი ვარიანტის სანახავად განბლოკეთ თქვენი მოწყობილობა"</string> </resources> diff --git a/packages/SystemUI/res-product/values-kk/strings.xml b/packages/SystemUI/res-product/values-kk/strings.xml index 73c02d09c610..d2aec4bdccde 100644 --- a/packages/SystemUI/res-product/values-kk/strings.xml +++ b/packages/SystemUI/res-product/values-kk/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Телефон құлпын ашуға <xliff:g id="NUMBER">%d</xliff:g> рет сәтсіз әрекет жасалды. Жұмыс профилі өшіріліп, оның бүкіл деректері жойылады."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Құлыпты ашу өрнегі <xliff:g id="NUMBER_0">%1$d</xliff:g> рет қате енгізілді. <xliff:g id="NUMBER_1">%2$d</xliff:g> әрекет қалды. Одан кейін планшетті есептік жазба арқылы ашу сұралады. \n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> секундтан кейін әрекетті қайталаңыз."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Құлыпты ашу өрнегі <xliff:g id="NUMBER_0">%1$d</xliff:g> рет қате енгізілді. <xliff:g id="NUMBER_1">%2$d</xliff:g> әрекет қалды. Одан кейін телефонды есептік жазба арқылы ашу сұралады. \n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> секундтан кейін әрекетті қайталаңыз."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Басқа опцияларды көру үшін телефон құлпын ашыңыз."</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Басқа опцияларды көру үшін планшет құлпын ашыңыз."</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Басқа опцияларды көру үшін құрылғы құлпын ашыңыз."</string> </resources> diff --git a/packages/SystemUI/res-product/values-km/strings.xml b/packages/SystemUI/res-product/values-km/strings.xml index 5449a5b94866..0a840edc9503 100644 --- a/packages/SystemUI/res-product/values-km/strings.xml +++ b/packages/SystemUI/res-product/values-km/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"អ្នកបានព្យាយាមដោះសោទូរសព្ទនេះមិនត្រឹមត្រូវចំនួន <xliff:g id="NUMBER">%d</xliff:g> ដងហើយ។ កម្រងព័ត៌មានការងារនេះនឹងត្រូវបានលុប ហើយវានឹងលុបទិន្នន័យកម្រងព័ត៌មានទាំងអស់។"</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"អ្នកបានគូរលំនាំដោះសោរបស់អ្នកមិនត្រឹមត្រូវចំនួន <xliff:g id="NUMBER_0">%1$d</xliff:g> ដងហើយ។ បន្ទាប់ពីមានការព្យាយាមដោះសោចំនួន <xliff:g id="NUMBER_1">%2$d</xliff:g> ដងទៀតមិនទទួលបានជោគជ័យ អ្នកនឹងត្រូវបានស្នើឱ្យដោះសោថេប្លេតរបស់អ្នក ដោយប្រើគណនីអ៊ីមែល។\n\n សូមព្យាយាមម្ដងទៀតក្នុងរយៈពេល <xliff:g id="NUMBER_2">%3$d</xliff:g> វិនាទីទៀត។"</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"អ្នកបានគូរលំនាំដោះសោរបស់អ្នកមិនត្រឹមត្រូវចំនួន <xliff:g id="NUMBER_0">%1$d</xliff:g> ដងហើយ។ បន្ទាប់ពីមានការព្យាយាមដោះសោចំនួន <xliff:g id="NUMBER_1">%2$d</xliff:g> ដងទៀតមិនទទួលបានជោគជ័យ អ្នកនឹងត្រូវបានស្នើឱ្យដោះសោទូរសព្ទរបស់អ្នកដោយប្រើគណនីអ៊ីមែល។\n\n សូមព្យាយាមម្ដងទៀតក្នុងរយៈពេល <xliff:g id="NUMBER_2">%3$d</xliff:g> វិនាទីទៀត។"</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"ដោះសោទូរសព្ទរបស់អ្នកសម្រាប់ជម្រើសច្រើនទៀត"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"ដោះសោថេប្លេតរបស់អ្នកសម្រាប់ជម្រើសច្រើនទៀត"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"ដោះសោឧបករណ៍របស់អ្នកសម្រាប់ជម្រើសច្រើនទៀត"</string> </resources> diff --git a/packages/SystemUI/res-product/values-kn/strings.xml b/packages/SystemUI/res-product/values-kn/strings.xml index 7b195ce5c086..1b0f8bd127aa 100644 --- a/packages/SystemUI/res-product/values-kn/strings.xml +++ b/packages/SystemUI/res-product/values-kn/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"ಫೋನ್ ಅನ್ನು ಅನ್ಲಾಕ್ ಮಾಡಲು ನೀವು <xliff:g id="NUMBER">%d</xliff:g> ಬಾರಿ ತಪ್ಪಾಗಿ ಪ್ರಯತ್ನಿಸಿದ್ದೀರಿ. ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್ ಅನ್ನು ತೆಗೆದುಹಾಕಲಾಗುತ್ತದೆ, ಇದು ಪ್ರೊಫೈಲ್ನ ಎಲ್ಲಾ ಡೇಟಾವನ್ನು ಅಳಿಸುತ್ತದೆ."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"ನಿಮ್ಮ ಅನ್ಲಾಕ್ ಪ್ಯಾಟರ್ನ್ ಅನ್ನು ನೀವು <xliff:g id="NUMBER_0">%1$d</xliff:g> ಬಾರಿ ತಪ್ಪಾಗಿ ಡ್ರಾ ಮಾಡಿರುವಿರಿ. <xliff:g id="NUMBER_1">%2$d</xliff:g> ಕ್ಕೂ ಹೆಚ್ಚಿನ ವಿಫಲ ಪ್ರಯತ್ನಗಳ ಬಳಿಕ, ನಿಮ್ಮ ಇಮೇಲ್ ಖಾತೆಯನ್ನು ಬಳಸಿ ಟ್ಯಾಬ್ಲೆಟ್ ಅನ್ಲಾಕ್ ಮಾಡಲು ನಿಮ್ಮನ್ನು ಕೇಳಲಾಗುತ್ತದೆ.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> ಸೆಕೆಂಡ್ಗಳಲ್ಲಿ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"ನಿಮ್ಮ ಅನ್ಲಾಕ್ ಪ್ಯಾಟರ್ನ್ ಅನ್ನು ನೀವು <xliff:g id="NUMBER_0">%1$d</xliff:g> ಬಾರಿ ತಪ್ಪಾಗಿ ಡ್ರಾ ಮಾಡಿರುವಿರಿ. <xliff:g id="NUMBER_1">%2$d</xliff:g> ಕ್ಕೂ ಹೆಚ್ಚಿನ ವಿಫಲ ಪ್ರಯತ್ನಗಳ ಬಳಿಕ, ಇಮೇಲ್ ಖಾತೆಯನ್ನು ಬಳಸಿ ನಿಮ್ಮ ಫೋನ್ ಅನ್ಲಾಕ್ ಮಾಡಲು ನಿಮ್ಮನ್ನು ಕೇಳಲಾಗುತ್ತದೆ.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> ಸೆಕೆಂಡ್ಗಳಲ್ಲಿ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"ಹೆಚ್ಚಿನ ಆಯ್ಕೆಗಳಿಗಾಗಿ ನಿಮ್ಮ ಫೋನ್ ಅನ್ನು ಅನ್ಲಾಕ್ ಮಾಡಿ"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"ಹೆಚ್ಚಿನ ಆಯ್ಕೆಗಳಿಗಾಗಿ ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್ ಅನ್ನು ಅನ್ಲಾಕ್ ಮಾಡಿ"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"ಹೆಚ್ಚಿನ ಆಯ್ಕೆಗಳಿಗಾಗಿ ನಿಮ್ಮ ಸಾಧನವನ್ನು ಅನ್ಲಾಕ್ ಮಾಡಿ"</string> </resources> diff --git a/packages/SystemUI/res-product/values-ko/strings.xml b/packages/SystemUI/res-product/values-ko/strings.xml index cb2dc008f6ac..3629f2f3761b 100644 --- a/packages/SystemUI/res-product/values-ko/strings.xml +++ b/packages/SystemUI/res-product/values-ko/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"휴대전화 잠금 해제에 <xliff:g id="NUMBER">%d</xliff:g>번 실패했습니다. 직장 프로필과 모든 프로필 데이터가 삭제됩니다."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"잠금 해제 패턴을 <xliff:g id="NUMBER_0">%1$d</xliff:g>회 잘못 그렸습니다. <xliff:g id="NUMBER_1">%2$d</xliff:g>회 더 실패하면 이메일 계정을 사용하여 태블릿을 잠금 해제해야 합니다.\n\n<xliff:g id="NUMBER_2">%3$d</xliff:g>초 후에 다시 시도해 주세요."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"잠금 해제 패턴을 <xliff:g id="NUMBER_0">%1$d</xliff:g>회 잘못 그렸습니다. <xliff:g id="NUMBER_1">%2$d</xliff:g>회 더 실패하면 이메일 계정을 사용하여 휴대전화를 잠금 해제해야 합니다.\n\n<xliff:g id="NUMBER_2">%3$d</xliff:g>초 후에 다시 시도해 주세요."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"더 많은 옵션을 확인하려면 휴대전화를 잠금 해제하세요."</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"더 많은 옵션을 확인하려면 태블릿을 잠금 해제하세요."</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"더 많은 옵션을 확인하려면 기기를 잠금 해제하세요."</string> </resources> diff --git a/packages/SystemUI/res-product/values-ky/strings.xml b/packages/SystemUI/res-product/values-ky/strings.xml index 7bdcb55cefe0..4eb90caa4391 100644 --- a/packages/SystemUI/res-product/values-ky/strings.xml +++ b/packages/SystemUI/res-product/values-ky/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Телефондун кулпусун <xliff:g id="NUMBER">%d</xliff:g> жолу туура эмес ачууга аракет жасадыңыз. Жумуш профили өчүрүлүп, андагы бардык маалымат өчүрүлөт."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Графикалык ачкычты <xliff:g id="NUMBER_0">%1$d</xliff:g> жолу туура эмес тарттыңыз. Дагы <xliff:g id="NUMBER_1">%2$d</xliff:g> ийгиликсиз аракеттен кийин планшетиңизди бөгөттөн электрондук почтаңыз аркылуу чыгаруу талап кылынат.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> секунддан кийин кайра аракеттениңиз."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Графикалык ачкычты <xliff:g id="NUMBER_0">%1$d</xliff:g> жолу туура эмес тарттыңыз. Дагы <xliff:g id="NUMBER_1">%2$d</xliff:g> ийгиликсиз аракеттен кийин телефонуңузду бөгөттөн электрондук почтаңыз аркылуу чыгаруу талап кылынат.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> секунддан кийин кайра аракеттениңиз."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Дагы башка параметрлерди көрүү үчүн телефонуңуздун кулпусун ачыңыз"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Дагы башка параметрлерди көрүү үчүн планшетиңиздин кулпусун ачыңыз"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Дагы башка параметрлерди көрүү үчүн түзмөгүңүздүн кулпусун ачыңыз"</string> </resources> diff --git a/packages/SystemUI/res-product/values-lo/strings.xml b/packages/SystemUI/res-product/values-lo/strings.xml index c66059c4ecab..2b262e7008f5 100644 --- a/packages/SystemUI/res-product/values-lo/strings.xml +++ b/packages/SystemUI/res-product/values-lo/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"ທ່ານພະຍາຍາມປົດລັອກໂທລະສັບຜິດ <xliff:g id="NUMBER">%d</xliff:g> ເທື່ອແລ້ວ. ໂປຣໄຟລ໌ບ່ອນເຮັດວຽກຈະຖືກລຶບອອກ, ເຊິ່ງຈະລຶບຂໍ້ມູນໂປຣໄຟລ໌ທັງໝົດອອກນຳ."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"ທ່ານແຕ້ມຮູບແບບປົດລັອກຜິດ <xliff:g id="NUMBER_0">%1$d</xliff:g> ເທື່ອແລ້ວ. ຫຼັງຈາກແຕ້ມຜິດອີກ <xliff:g id="NUMBER_1">%2$d</xliff:g> ເທື່ອ, ທ່ານຈະຖືກຖາມໃຫ້ປົດລັອກແທັບເລັດຂອງທ່ານດ້ວຍການເຂົ້າສູ່ລະບົບໂດຍໃຊ້ອີເມວຂອງທ່ານ.\n\n ກະລຸນາລອງໃໝ່ໃນອີກ <xliff:g id="NUMBER_2">%3$d</xliff:g> ວິນາທີ."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"ທ່ານແຕ້ມຮູບແບບປົດລັອກຜິດ <xliff:g id="NUMBER_0">%1$d</xliff:g> ເທື່ອແລ້ວ. ຫຼັງຈາກແຕ້ມຜິດອີກ <xliff:g id="NUMBER_1">%2$d</xliff:g> ເທື່ອ, ທ່ານຈະຖືກຖາມໃຫ້ປົດໂທລະສັບຂອງທ່ານດ້ວຍການເຂົ້າສູ່ລະບົບໂດຍໃຊ້ບັນຊີອີເມວ.\n\n ກະລຸນາລອງໃໝ່ໃນອີກ <xliff:g id="NUMBER_2">%3$d</xliff:g> ວິນາທີ."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"ປົດລັອກໂທລະສັບຂອງທ່ານເພື່ອໃຊ້ຕົວເລືອກເພີ່ມເຕີມ"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"ປົດລັອກແທັບເລັດຂອງທ່ານເພື່ອໃຊ້ຕົວເລືອກເພີ່ມເຕີມ"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"ປົດລັອກອຸປະກອນຂອງທ່ານເພື່ອໃຊ້ຕົວເລືອກເພີ່ມເຕີມ"</string> </resources> diff --git a/packages/SystemUI/res-product/values-lt/strings.xml b/packages/SystemUI/res-product/values-lt/strings.xml index 3771d4386c8d..8ac5895ce065 100644 --- a/packages/SystemUI/res-product/values-lt/strings.xml +++ b/packages/SystemUI/res-product/values-lt/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"<xliff:g id="NUMBER">%d</xliff:g> kart. nesėkmingai bandėte atrakinti telefoną. Darbo profilis bus pašalintas ir visi profilio duomenys bus ištrinti."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"<xliff:g id="NUMBER_0">%1$d</xliff:g> kart. netinkamai nupiešėte atrakinimo piešinį. Po dar <xliff:g id="NUMBER_1">%2$d</xliff:g> nesėkm. band. būsite paprašyti atrakinti planšetinį kompiuterį naudodami el. pašto paskyrą.\n\n Bandykite dar kartą po <xliff:g id="NUMBER_2">%3$d</xliff:g> sek."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"<xliff:g id="NUMBER_0">%1$d</xliff:g> kart. netinkamai nupiešėte atrakinimo piešinį. Po dar <xliff:g id="NUMBER_1">%2$d</xliff:g> nesėkm. band. būsite paprašyti atrakinti telefoną naudodami el. pašto paskyrą.\n\n Bandykite dar kartą po <xliff:g id="NUMBER_2">%3$d</xliff:g> sek."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Atrakinkite telefoną, kad galėtumėte naudoti daugiau parinkčių"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Atrakinkite planšetinį kompiuterį, kad galėtumėte naudoti daugiau parinkčių"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Atrakinkite įrenginį, kad galėtumėte naudoti daugiau parinkčių"</string> </resources> diff --git a/packages/SystemUI/res-product/values-lv/strings.xml b/packages/SystemUI/res-product/values-lv/strings.xml index 65f757f57bac..174f5d215634 100644 --- a/packages/SystemUI/res-product/values-lv/strings.xml +++ b/packages/SystemUI/res-product/values-lv/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Jūs <xliff:g id="NUMBER">%d</xliff:g> reizi(-es) nesekmīgi mēģinājāt atbloķēt tālruni. Darba profils tiks noņemts, kā arī visi profila dati tiks dzēsti."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Jūs <xliff:g id="NUMBER_0">%1$d</xliff:g> reizi(-es) nepareizi norādījāt atbloķēšanas kombināciju. Pēc vēl <xliff:g id="NUMBER_1">%2$d</xliff:g> neveiksmīga(-iem) mēģinājuma(-iem) planšetdators būs jāatbloķē, izmantojot e-pasta kontu.\n\nMēģiniet vēlreiz pēc <xliff:g id="NUMBER_2">%3$d</xliff:g> sekundes(-ēm)."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Jūs <xliff:g id="NUMBER_0">%1$d</xliff:g> reizi(-es) nepareizi norādījāt atbloķēšanas kombināciju. Pēc vēl <xliff:g id="NUMBER_1">%2$d</xliff:g> nesekmīga(-iem) mēģinājuma(-iem) tālrunis būs jāatbloķē, izmantojot e-pasta kontu.\n\nMēģiniet vēlreiz pēc <xliff:g id="NUMBER_2">%3$d</xliff:g> sekundes(-ēm)."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Atbloķējiet tālruni, lai skatītu citas opcijas."</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Atbloķējiet planšetdatoru, lai skatītu citas opcijas."</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Atbloķējiet ierīci, lai skatītu citas opcijas."</string> </resources> diff --git a/packages/SystemUI/res-product/values-mk/strings.xml b/packages/SystemUI/res-product/values-mk/strings.xml index 7df263429a53..86ff8d1c9c7a 100644 --- a/packages/SystemUI/res-product/values-mk/strings.xml +++ b/packages/SystemUI/res-product/values-mk/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Погрешно се обидовте да го отклучите телефонот <xliff:g id="NUMBER">%d</xliff:g> пати. Работниот профил ќе се отстрани, со што ќе се избришат сите податоци на профилот."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Погрешно ја употребивте вашата шема на отклучување <xliff:g id="NUMBER_0">%1$d</xliff:g> пати. По уште <xliff:g id="NUMBER_1">%2$d</xliff:g> неуспешни обиди, ќе побараме да го отклучите таблетот со сметка на е-пошта.\n\n Обидете се повторно за <xliff:g id="NUMBER_2">%3$d</xliff:g> секунди."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Погрешно ја употребивте вашата шема на отклучување <xliff:g id="NUMBER_0">%1$d</xliff:g> пати. По уште <xliff:g id="NUMBER_1">%2$d</xliff:g> неуспешни обиди, ќе побараме да го отклучите телефонот со сметка на е-пошта.\n\n Обидете се повторно за <xliff:g id="NUMBER_2">%3$d</xliff:g> секунди."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Отклучето го вашиот телефон за повеќе опции"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Отклучето го вашиот таблет за повеќе опции"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Отклучето го вашиот уред за повеќе опции"</string> </resources> diff --git a/packages/SystemUI/res-product/values-ml/strings.xml b/packages/SystemUI/res-product/values-ml/strings.xml index 3cf933cfc3f2..284f55264909 100644 --- a/packages/SystemUI/res-product/values-ml/strings.xml +++ b/packages/SystemUI/res-product/values-ml/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"നിങ്ങൾ <xliff:g id="NUMBER">%d</xliff:g> തവണ തെറ്റായ രീതിയിൽ ഫോൺ അൺലോക്ക് ചെയ്യാൻ ശ്രമിച്ചു. ഔദ്യോഗിക പ്രൊഫൈൽ നീക്കം ചെയ്യപ്പെടുകയും, അതുവഴി എല്ലാ പ്രൊഫൈൽ ഡാറ്റയും ഇല്ലാതാകുകയും ചെയ്യും."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"നിങ്ങൾ <xliff:g id="NUMBER_0">%1$d</xliff:g> തവണ തെറ്റായ രീതിയിൽ അൺലോക്ക് പാറ്റേൺ വരച്ചു. <xliff:g id="NUMBER_1">%2$d</xliff:g> ശ്രമങ്ങൾ കൂടി പരാജയപ്പെട്ടാൽ, ഒരു ഇമെയിൽ അക്കൗണ്ടുപയോഗിച്ച് ടാബ്ലെറ്റ് അൺലോക്ക് ചെയ്യാൻ നിങ്ങളോട് ആവശ്യപ്പെടും.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> സെക്കന്റ് കഴിഞ്ഞ് വീണ്ടും ശ്രമിക്കുക."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"നിങ്ങൾ <xliff:g id="NUMBER_0">%1$d</xliff:g> തവണ തെറ്റായ രീതിയിൽ അൺലോക്ക് പാറ്റേൺ വരച്ചു. <xliff:g id="NUMBER_1">%2$d</xliff:g> ശ്രമങ്ങൾ കൂടി പരാജയപ്പെട്ടാൽ, ഒരു ഇമെയിൽ അക്കൗണ്ടുപയോഗിച്ച് ഫോൺ അൺലോക്ക് ചെയ്യാൻ നിങ്ങളോട് ആവശ്യപ്പെടും.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> സെക്കന്റ് കഴിഞ്ഞ് വീണ്ടും ശ്രമിക്കുക."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"കൂടുതൽ ഓപ്ഷനുകൾക്ക് നിങ്ങളുടെ ഫോൺ അൺലോക്ക് ചെയ്യുക"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"കൂടുതൽ ഓപ്ഷനുകൾക്ക് നിങ്ങളുടെ ടാബ്ലെറ്റ് അൺലോക്ക് ചെയ്യുക"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"കൂടുതൽ ഓപ്ഷനുകൾക്ക് നിങ്ങളുടെ ഉപകരണം അൺലോക്ക് ചെയ്യുക"</string> </resources> diff --git a/packages/SystemUI/res-product/values-mn/strings.xml b/packages/SystemUI/res-product/values-mn/strings.xml index cb6448a01132..6a0f668986f8 100644 --- a/packages/SystemUI/res-product/values-mn/strings.xml +++ b/packages/SystemUI/res-product/values-mn/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Та утасны түгжээг тайлах оролдлогыг <xliff:g id="NUMBER">%d</xliff:g> удаа буруу хийсэн байна. Ажлын профайлыг устгах бөгөөд ингэснээр профайлын бүх өгөгдлийг устгах болно."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Та тайлах хээгээ <xliff:g id="NUMBER_0">%1$d</xliff:g> удаа буруу зурсан байна. Дахин <xliff:g id="NUMBER_1">%2$d</xliff:g> удаа буруу зурсны дараа та имэйл бүртгэл ашиглан таблетынхаа түгжээг тайлах шаардлагатай болно.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> секундийн дараа дахин оролдоно уу."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Та тайлах хээгээ <xliff:g id="NUMBER_0">%1$d</xliff:g> удаа буруу зурсан байна. Дахин <xliff:g id="NUMBER_1">%2$d</xliff:g> удаа буруу зурсны дараа та имэйл бүртгэл ашиглан утасныхаа түгжээг тайлах шаардлагатай болно.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> секундийн дараа дахин оролдоно уу."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Бусад сонголтыг харахын тулд утасныхаа түгжээг тайлна уу"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Бусад сонголтыг харахын тулд таблетынхаа түгжээг тайлна уу"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Бусад сонголтыг харахын тулд төхөөрөмжийнхөө түгжээг тайлна уу"</string> </resources> diff --git a/packages/SystemUI/res-product/values-mr/strings.xml b/packages/SystemUI/res-product/values-mr/strings.xml index 4854a8285664..c9cd4ba8442b 100644 --- a/packages/SystemUI/res-product/values-mr/strings.xml +++ b/packages/SystemUI/res-product/values-mr/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"तुम्ही फोन अनलॉक करण्याचा <xliff:g id="NUMBER">%d</xliff:g> वेळा चुकीच्या पद्धतीने प्रयत्न केला आहे. कार्य प्रोफाइल काढली जाईल, त्यामुळे सर्व प्रोफाइल डेटा हटवला जाईल."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"तुम्ही तुमचा अनलॉक पॅटर्न <xliff:g id="NUMBER_0">%1$d</xliff:g> वेळा चुकीच्या पद्धतीने काढला आहे. आणखी <xliff:g id="NUMBER_1">%2$d</xliff:g> अयशस्वी प्रयत्नांनंतर, तुम्हाला ईमेल खाते वापरून तुमचा टॅबलेट अनलॉक करण्यास सांगितले जाईल.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> सेकंदांमध्ये पुन्हा प्रयत्न करा."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"तुम्ही तुमचा अनलॉक पॅटर्न <xliff:g id="NUMBER_0">%1$d</xliff:g> वेळा चुकीच्या पद्धतीने काढला आहे. आणखी <xliff:g id="NUMBER_1">%2$d</xliff:g> अयशस्वी प्रयत्नांनंतर, तुम्हाला ईमेल खाते वापरून तुमचा फोन अनलॉक करण्यास सांगितले जाईल.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> सेकंदांमध्ये पुन्हा प्रयत्न करा."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"आणखी पर्यायांसाठी तुमचा फोन अनलॉक करा"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"आणखी पर्यायांसाठी तुमचा टॅबलेट अनलॉक करा"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"आणखी पर्यायांसाठी तुमचे डिव्हाइस अनलॉक करा"</string> </resources> diff --git a/packages/SystemUI/res-product/values-ms/strings.xml b/packages/SystemUI/res-product/values-ms/strings.xml index e93d394a5a6e..ded2b3d1f89d 100644 --- a/packages/SystemUI/res-product/values-ms/strings.xml +++ b/packages/SystemUI/res-product/values-ms/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Anda telah salah membuka kunci telefon sebanyak <xliff:g id="NUMBER">%d</xliff:g> kali. Profil kerja ini akan dialih keluar sekali gus memadamkan semua data profil."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Anda telah tersilap lukis corak buka kunci sebanyak <xliff:g id="NUMBER_0">%1$d</xliff:g> kali. Selepas <xliff:g id="NUMBER_1">%2$d</xliff:g> lagi percubaan yang gagal, anda akan diminta membuka kunci tablet anda menggunakan akaun e-mel.\n\n Cuba lagi dalam <xliff:g id="NUMBER_2">%3$d</xliff:g> saat."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Anda telah tersilap lukis corak buka kunci sebanyak <xliff:g id="NUMBER_0">%1$d</xliff:g> kali. Selepas <xliff:g id="NUMBER_1">%2$d</xliff:g> lagi percubaan yang gagal, anda akan diminta membuka kunci telefon anda menggunakan akaun e-mel.\n\n Cuba lagi dalam <xliff:g id="NUMBER_2">%3$d</xliff:g> saat."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Buka kunci telefon anda untuk mendapatkan lagi pilihan"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Buka kunci tablet anda untuk mendapatkan lagi pilihan"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Buka kunci peranti anda untuk mendapatkan lagi pilihan"</string> </resources> diff --git a/packages/SystemUI/res-product/values-my/strings.xml b/packages/SystemUI/res-product/values-my/strings.xml index 8ff643c837b6..43c2aca274ee 100644 --- a/packages/SystemUI/res-product/values-my/strings.xml +++ b/packages/SystemUI/res-product/values-my/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"ဖုန်းကို <xliff:g id="NUMBER">%d</xliff:g> ကြိမ် မှားယွင်းစွာ လော့ခ်ဖွင့်ရန် ကြိုးစားခဲ့ပါသည်။ အလုပ်ပရိုဖိုင်ကို ဖယ်ရှားလိုက်မည်ဖြစ်ပြီး ပရိုဖိုင်ဒေတာ အားလုံးကိုလည်း ဖျက်လိုက်ပါမည်။"</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"သင်သည် သင်၏ လော့ခ်ဖွင့်ခြင်းပုံစံကို <xliff:g id="NUMBER_0">%1$d</xliff:g> ကြိမ် မှားယွင်းစွာ ဆွဲခဲ့ပါသည်။ <xliff:g id="NUMBER_1">%2$d</xliff:g> ကြိမ် ထပ်မံမှားယွင်းပြီးသည့်နောက်တွင် သင့်အီးမေးလ်အကောင့်အား အသုံးပြု၍ တက်ဘလက်ကို လော့ခ်ဖွင့်ရန် တောင်းဆိုသွားပါမည်။\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> စက္ကန့်အကြာတွင် ထပ်စမ်းကြည့်ပါ။"</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"သင်သည် သင်၏ လော့ခ်ဖွင့်ခြင်းပုံစံကို <xliff:g id="NUMBER_0">%1$d</xliff:g> ကြိမ် မှားယွင်းစွာ ဆွဲခဲ့ပါသည်။ <xliff:g id="NUMBER_1">%2$d</xliff:g> ကြိမ် ထပ်မံမှားယွင်းပြီးသည့်နောက်တွင် သင့်အီးမေးလ်အကောင့်အား အသုံးပြု၍ ဖုန်းကို လော့ခ်ဖွင့်ရန် တောင်းဆိုသွားပါမည်။\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> စက္ကန့်အကြာတွင် ထပ်စမ်းကြည့်ပါ။"</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"နောက်ထပ် ထိန်းချုပ်မှုများအတွက် သင့်ဖုန်းကို လော့ခ်ဖွင့်ပါ"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"နောက်ထပ် ထိန်းချုပ်မှုများအတွက် သင့်တက်ဘလက်ကို လော့ခ်ဖွင့်ပါ"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"နောက်ထပ် ထိန်းချုပ်မှုများအတွက် သင့်စက်ကို လော့ခ်ဖွင့်ပါ"</string> </resources> diff --git a/packages/SystemUI/res-product/values-nb/strings.xml b/packages/SystemUI/res-product/values-nb/strings.xml index 56817f5a3307..c7d5bb1263db 100644 --- a/packages/SystemUI/res-product/values-nb/strings.xml +++ b/packages/SystemUI/res-product/values-nb/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Du har gjort feil i forsøket på å låse opp telefonen <xliff:g id="NUMBER">%d</xliff:g> ganger. Jobbprofilen blir fjernet, og alle profildataene blir slettet."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Du har tegnet opplåsingsmønsteret feil <xliff:g id="NUMBER_0">%1$d</xliff:g> ganger. Etter ytterligere <xliff:g id="NUMBER_1">%2$d</xliff:g> nye mislykkede forsøk blir du bedt om å låse opp nettbrettet via en e-postkonto.\n\n Prøv på nytt om <xliff:g id="NUMBER_2">%3$d</xliff:g> sekunder."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Du har tegnet opplåsingsmønsteret feil <xliff:g id="NUMBER_0">%1$d</xliff:g> ganger. Etter ytterligere <xliff:g id="NUMBER_1">%2$d</xliff:g> nye mislykkede forsøk blir du bedt om å låse opp telefonen via en e-postkonto.\n\n Prøv på nytt om <xliff:g id="NUMBER_2">%3$d</xliff:g> sekunder."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Lås opp telefonen din for å få flere alternativer"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Lås opp nettbrettet ditt for å få flere alternativer"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Lås opp enheten din for å få flere alternativer"</string> </resources> diff --git a/packages/SystemUI/res-product/values-ne/strings.xml b/packages/SystemUI/res-product/values-ne/strings.xml index 17492be59b0b..81a063c721cf 100644 --- a/packages/SystemUI/res-product/values-ne/strings.xml +++ b/packages/SystemUI/res-product/values-ne/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"तपाईंले <xliff:g id="NUMBER">%d</xliff:g> पटक गलत तरिकाले फोन अनलक गर्ने प्रयास गर्नुभएको छ। कार्य प्रोफाइललाई यसका सबै डेटा मेटिने गरी हटाइने छ।"</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"तपाईंले <xliff:g id="NUMBER_0">%1$d</xliff:g> पटक आफ्नो अनलक गर्ने ढाँचा गलत रूपमा कोर्नुभयो। थप <xliff:g id="NUMBER_1">%2$d</xliff:g> पटक असफल प्रयास गरेपछि, तपाईंलाई एउटा इमेल खाता प्रयोग गरेर आफ्नो ट्याब्लेट अनलक गर्न आग्रह गरिने छ।\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> सेकेन्डमा फेरि प्रयास गर्नुहोस्।"</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"तपाईंले <xliff:g id="NUMBER_0">%1$d</xliff:g> पटक आफ्नो अनलक गर्ने ढाँचा गलत रूपमा कोर्नुभयो। थप <xliff:g id="NUMBER_1">%2$d</xliff:g> पटक असफल प्रयास गरेपछि, तपाईंलाई एउटा इमेल खाता प्रयोग गरेर आफ्नो फोन अनलक गर्न आग्रह गरिने छ।\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> सेकेन्डमा फेरि प्रयास गर्नुहोस्।"</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"थप विकल्पहरू हेर्न आफ्नो फोन अनलक गर्नुहोस्"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"थप विकल्पहरू हेर्न आफ्नो ट्याब्लेट अनलक गर्नुहोस्"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"थप विकल्पहरू हेर्न आफ्नो यन्त्र अनलक गर्नुहोस्"</string> </resources> diff --git a/packages/SystemUI/res-product/values-nl/strings.xml b/packages/SystemUI/res-product/values-nl/strings.xml index bc3e72b7595f..76f66b790690 100644 --- a/packages/SystemUI/res-product/values-nl/strings.xml +++ b/packages/SystemUI/res-product/values-nl/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Je hebt <xliff:g id="NUMBER">%d</xliff:g> mislukte pogingen ondernomen om de telefoon te ontgrendelen. Het werkprofiel wordt verwijderd, waardoor alle profielgegevens worden verwijderd."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Je hebt je ontgrendelingspatroon <xliff:g id="NUMBER_0">%1$d</xliff:g> keer onjuist getekend. Na nog eens <xliff:g id="NUMBER_1">%2$d</xliff:g> mislukte pogingen wordt je gevraagd je tablet te ontgrendelen via een e-mailaccount.\n\n Probeer het over <xliff:g id="NUMBER_2">%3$d</xliff:g> seconden opnieuw."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Je hebt je ontgrendelingspatroon <xliff:g id="NUMBER_0">%1$d</xliff:g> keer onjuist getekend. Na nog eens <xliff:g id="NUMBER_1">%2$d</xliff:g> mislukte pogingen wordt je gevraagd je telefoon te ontgrendelen via een e-mailaccount.\n\n Probeer het over <xliff:g id="NUMBER_2">%3$d</xliff:g> seconden opnieuw."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Ontgrendel je telefoon voor meer opties"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Ontgrendel je tablet voor meer opties"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Ontgrendel je apparaat voor meer opties"</string> </resources> diff --git a/packages/SystemUI/res-product/values-or/strings.xml b/packages/SystemUI/res-product/values-or/strings.xml index 02948f9b72a6..f0525c98e311 100644 --- a/packages/SystemUI/res-product/values-or/strings.xml +++ b/packages/SystemUI/res-product/values-or/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"ଆପଣ ଫୋନ୍କୁ ଅନ୍ଲକ୍ କରିବାକୁ<xliff:g id="NUMBER">%d</xliff:g>ଥର ଭୁଲ ପ୍ରୟାସ କରିଛନ୍ତି। କାର୍ଯ୍ୟ ପ୍ରୋଫାଇଲ୍ ବାହାର କରିଦିଆଯିବ, ଯାହା ଫଳରେ ସମସ୍ତ ପ୍ରୋଫାଇଲ୍ ଡାଟା ଡିଲିଟ୍ ହେବ।"</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"ଆପଣ ଆପଣଙ୍କ ଅନ୍ଲକ୍ ପାଟର୍ନକୁ <xliff:g id="NUMBER_0">%1$d</xliff:g>ଥର ଭୁଲ ଭାବେ ଡ୍ର କରିଛନ୍ତି। ଆଉ <xliff:g id="NUMBER_1">%2$d</xliff:g>ଟି ଭୁଲ ପ୍ରୟାସ ପରେ ଆପଣଙ୍କୁ ଏକ ଇମେଲ୍ ଆକାଉଣ୍ଟ ବ୍ୟବହାର କରି ଆପଣଙ୍କ ଟାବ୍ଲୋଟ୍କୁ ଅନ୍ଲକ୍ କରିବା ପାଇଁ କୁହାଯିବ।\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> ସେକେଣ୍ଡ ପରେ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।"</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"ଆପଣ ଆପଣଙ୍କ ଅନ୍ଲକ୍ ପାଟର୍ନକୁ <xliff:g id="NUMBER_0">%1$d</xliff:g>ଥର ଭୁଲ ଭାବେ ଡ୍ର କରିଛନ୍ତି। ଆଉ <xliff:g id="NUMBER_1">%2$d</xliff:g>ଟି ଭୁଲ ପ୍ରୟାସ ପରେ ଆପଣଙ୍କୁ ଏକ ଇମେଲ୍ ଆକାଉଣ୍ଟ ବ୍ୟବହାର କରି ଆପଣଙ୍କ ଫୋନ୍କୁ ଅନ୍ଲକ୍ କରିବା ପାଇଁ କୁହାଯିବ।\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> ସେକେଣ୍ଡ ପରେ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।"</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"ଅଧିକ ବିକଳ୍ପ ପାଇଁ ଆପଣଙ୍କ ଫୋନ୍ ଅନଲକ୍ କରନ୍ତୁ"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"ଅଧିକ ବିକଳ୍ପ ପାଇଁ ଆପଣଙ୍କ ଟାବଲେଟ୍ ଅନଲକ୍ କରନ୍ତୁ"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"ଅଧିକ ବିକଳ୍ପ ପାଇଁ ଆପଣଙ୍କ ଡିଭାଇସ୍ ଅନଲକ୍ କରନ୍ତୁ"</string> </resources> diff --git a/packages/SystemUI/res-product/values-pa/strings.xml b/packages/SystemUI/res-product/values-pa/strings.xml index 4f08cfdfc47f..fa6cc3ba1aa4 100644 --- a/packages/SystemUI/res-product/values-pa/strings.xml +++ b/packages/SystemUI/res-product/values-pa/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"ਤੁਸੀਂ <xliff:g id="NUMBER">%d</xliff:g> ਵਾਰ ਗਲਤ ਢੰਗ ਨਾਲ ਫ਼ੋਨ ਨੂੰ ਅਣਲਾਕ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ ਹੈ। ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਹਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ, ਜਿਸ ਨਾਲ ਸਾਰਾ ਪ੍ਰੋਫਾਈਲ ਡਾਟਾ ਮਿਟ ਜਾਵੇਗਾ।"</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"ਤੁਸੀਂ <xliff:g id="NUMBER_0">%1$d</xliff:g> ਵਾਰ ਆਪਣਾ ਅਣਲਾਕ ਪੈਟਰਨ ਗਲਤ ਢੰਗ ਨਾਲ ਉਲੀਕਿਆ ਹੈ। <xliff:g id="NUMBER_1">%2$d</xliff:g> ਹੋਰ ਅਸਫਲ ਕੋਸ਼ਿਸ਼ਾਂ ਤੋਂ ਬਾਅਦ, ਤੁਹਾਨੂੰ ਇੱਕ ਈਮੇਲ ਖਾਤਾ ਵਰਤਦੇ ਹੋਏ ਆਪਣੇ ਟੈਬਲੈੱਟ ਨੂੰ ਅਣਲਾਕ ਕਰਨ ਲਈ ਕਿਹਾ ਜਾਵੇਗਾ।\n\n<xliff:g id="NUMBER_2">%3$d</xliff:g> ਸਕਿੰਟਾਂ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"ਤੁਸੀਂ <xliff:g id="NUMBER_0">%1$d</xliff:g> ਵਾਰ ਆਪਣਾ ਅਣਲਾਕ ਪੈਟਰਨ ਗਲਤ ਢੰਗ ਨਾਲ ਡ੍ਰਾ ਕੀਤਾ ਹੈ। <xliff:g id="NUMBER_1">%2$d</xliff:g> ਹੋਰ ਅਸਫਲ ਕੋਸ਼ਿਸ਼ਾਂ ਤੋਂ ਬਾਅਦ, ਤੁਹਾਨੂੰ ਇੱਕ ਈਮੇਲ ਖਾਤਾ ਵਰਤਦੇ ਹੋਏ ਆਪਣਾ ਫ਼ੋਨ ਅਣਲਾਕ ਕਰਨ ਲਈ ਕਿਹਾ ਜਾਏਗਾ।\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> ਸਕਿੰਟਾਂ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"ਹੋਰ ਵਿਕਲਪਾਂ ਲਈ ਆਪਣਾ ਫ਼ੋਨ ਅਣਲਾਕ ਕਰੋ"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"ਹੋਰ ਵਿਕਲਪਾਂ ਲਈ ਆਪਣਾ ਟੈਬਲੈੱਟ ਅਣਲਾਕ ਕਰੋ"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"ਹੋਰ ਵਿਕਲਪਾਂ ਲਈ ਆਪਣਾ ਡੀਵਾਈਸ ਅਣਲਾਕ ਕਰੋ"</string> </resources> diff --git a/packages/SystemUI/res-product/values-pl/strings.xml b/packages/SystemUI/res-product/values-pl/strings.xml index 132a0b9020a4..9a9980a02782 100644 --- a/packages/SystemUI/res-product/values-pl/strings.xml +++ b/packages/SystemUI/res-product/values-pl/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Po raz <xliff:g id="NUMBER">%d</xliff:g> próbowano nieprawidłowo odblokować telefon. Profil do pracy zostanie usunięty, co spowoduje skasowanie wszystkich jego danych."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Po raz <xliff:g id="NUMBER_0">%1$d</xliff:g> nieprawidłowo narysowano wzór odblokowania. Po kolejnych <xliff:g id="NUMBER_1">%2$d</xliff:g> nieudanych próbach konieczne będzie odblokowanie tabletu przy użyciu konta e-mail.\n\n Spróbuj ponownie za <xliff:g id="NUMBER_2">%3$d</xliff:g> s."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Po raz <xliff:g id="NUMBER_0">%1$d</xliff:g> nieprawidłowo narysowano wzór odblokowania. Po kolejnych <xliff:g id="NUMBER_1">%2$d</xliff:g> nieudanych próbach konieczne będzie odblokowanie telefonu przy użyciu konta e-mail.\n\n Spróbuj ponownie za <xliff:g id="NUMBER_2">%3$d</xliff:g> s."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Odblokuj telefon, by wyświetlić więcej opcji"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Odblokuj tablet, by wyświetlić więcej opcji"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Odblokuj urządzenie, by wyświetlić więcej opcji"</string> </resources> diff --git a/packages/SystemUI/res-product/values-pt-rBR/strings.xml b/packages/SystemUI/res-product/values-pt-rBR/strings.xml index 6497db23f9f0..499850a6995f 100644 --- a/packages/SystemUI/res-product/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res-product/values-pt-rBR/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Você tentou desbloquear o smartphone incorretamente <xliff:g id="NUMBER">%d</xliff:g> vezes. O perfil de trabalho será removido, o que excluirá todos os dados do perfil."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Você desenhou seu padrão de desbloqueio incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Se fizer mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas incorretas, será solicitado que você use uma conta de e-mail para desbloquear o tablet.\n\n Tente novamente em <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Você desenhou seu padrão de desbloqueio incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Se fizer mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas incorretas, será solicitado que você use uma conta de e-mail para desbloquear o smartphone.\n\n Tente novamente em <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Desbloqueie seu smartphone para ver mais opções"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Desbloqueie seu tablet para ver mais opções"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Desbloqueie seu dispositivo para ver mais opções"</string> </resources> diff --git a/packages/SystemUI/res-product/values-pt-rPT/strings.xml b/packages/SystemUI/res-product/values-pt-rPT/strings.xml index 31dcdebcf73a..22166bd19a21 100644 --- a/packages/SystemUI/res-product/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res-product/values-pt-rPT/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Tentou desbloquear incorretamente o telemóvel <xliff:g id="NUMBER">%d</xliff:g> vezes. O perfil de trabalho será removido, o que eliminará todos os dados do mesmo."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Desenhou o padrão de desbloqueio incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Após mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas sem êxito, ser-lhe-á pedido para desbloquear o tablet através de uma conta de email.\n\n Tente novamente dentro de <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Desenhou o padrão de desbloqueio incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Após mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas sem êxito, ser-lhe-á pedido para desbloquear o telemóvel através de uma conta de email.\n\n Tente novamente dentro de <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Desbloqueie o telemóvel para obter mais opções."</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Desbloqueie o tablet para obter mais opções."</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Desbloqueie o dispositivo para obter mais opções."</string> </resources> diff --git a/packages/SystemUI/res-product/values-pt/strings.xml b/packages/SystemUI/res-product/values-pt/strings.xml index 6497db23f9f0..499850a6995f 100644 --- a/packages/SystemUI/res-product/values-pt/strings.xml +++ b/packages/SystemUI/res-product/values-pt/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Você tentou desbloquear o smartphone incorretamente <xliff:g id="NUMBER">%d</xliff:g> vezes. O perfil de trabalho será removido, o que excluirá todos os dados do perfil."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Você desenhou seu padrão de desbloqueio incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Se fizer mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas incorretas, será solicitado que você use uma conta de e-mail para desbloquear o tablet.\n\n Tente novamente em <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Você desenhou seu padrão de desbloqueio incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Se fizer mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas incorretas, será solicitado que você use uma conta de e-mail para desbloquear o smartphone.\n\n Tente novamente em <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Desbloqueie seu smartphone para ver mais opções"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Desbloqueie seu tablet para ver mais opções"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Desbloqueie seu dispositivo para ver mais opções"</string> </resources> diff --git a/packages/SystemUI/res-product/values-ro/strings.xml b/packages/SystemUI/res-product/values-ro/strings.xml index 0c436b09924a..4740501f47bd 100644 --- a/packages/SystemUI/res-product/values-ro/strings.xml +++ b/packages/SystemUI/res-product/values-ro/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Ați efectuat <xliff:g id="NUMBER">%d</xliff:g> încercări incorecte de deblocare a telefonului. Profilul de serviciu va fi eliminat, iar toate datele profilului vor fi șterse."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Ați desenat incorect modelul pentru deblocare de <xliff:g id="NUMBER_0">%1$d</xliff:g> ori. După încă <xliff:g id="NUMBER_1">%2$d</xliff:g> încercări nereușite, vi se va solicita să deblocați tableta cu ajutorul unui cont de e-mail.\n\n Încercați din nou peste <xliff:g id="NUMBER_2">%3$d</xliff:g> secunde."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Ați desenat incorect modelul pentru deblocare de <xliff:g id="NUMBER_0">%1$d</xliff:g> ori. După încă <xliff:g id="NUMBER_1">%2$d</xliff:g> încercări nereușite, vi se va solicita să deblocați telefonul cu ajutorul unui cont de e-mail.\n\n Încercați din nou peste <xliff:g id="NUMBER_2">%3$d</xliff:g> secunde."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Deblocați telefonul pentru mai multe opțiuni"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Deblocați tableta pentru mai multe opțiuni"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Deblocați dispozitivul pentru mai multe opțiuni"</string> </resources> diff --git a/packages/SystemUI/res-product/values-ru/strings.xml b/packages/SystemUI/res-product/values-ru/strings.xml index 856ac3a520d7..e622dbce1745 100644 --- a/packages/SystemUI/res-product/values-ru/strings.xml +++ b/packages/SystemUI/res-product/values-ru/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Вы несколько раз (<xliff:g id="NUMBER">%d</xliff:g>) не смогли разблокировать телефон. Рабочий профиль и все его данные будут удалены."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Вы несколько раз (<xliff:g id="NUMBER_0">%1$d</xliff:g>) ввели неверный графический ключ. Осталось попыток: <xliff:g id="NUMBER_1">%2$d</xliff:g>. В случае неудачи вам будет предложено разблокировать планшет с помощью аккаунта электронной почты.\n\nПовторите попытку через <xliff:g id="NUMBER_2">%3$d</xliff:g> сек."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Вы несколько раз (<xliff:g id="NUMBER_0">%1$d</xliff:g>) ввели неверный графический ключ. Осталось попыток: <xliff:g id="NUMBER_1">%2$d</xliff:g>. В случае неудачи вам будет предложено разблокировать телефон с помощью аккаунта электронной почты.\n\nПовторите попытку через <xliff:g id="NUMBER_2">%3$d</xliff:g> сек."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Чтобы посмотреть дополнительные параметры, разблокируйте телефон."</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Чтобы посмотреть дополнительные параметры, разблокируйте планшет."</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Чтобы посмотреть дополнительные параметры, разблокируйте устройство."</string> </resources> diff --git a/packages/SystemUI/res-product/values-si/strings.xml b/packages/SystemUI/res-product/values-si/strings.xml index 4db177599fdd..efb2cdef258e 100644 --- a/packages/SystemUI/res-product/values-si/strings.xml +++ b/packages/SystemUI/res-product/values-si/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"ඔබ දුරකථනය අගුළු හැරීමට <xliff:g id="NUMBER">%d</xliff:g> වරක් වැරදියට උත්සාහ කර ඇත. කාර්යාල පැතිකඩ ඉවත් කරනු ඇති අතර, එය සියලු පැතිකඩ දත්ත මකනු ඇත."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"ඔබ අගුළු ඇරිමේ රටාව <xliff:g id="NUMBER_0">%1$d</xliff:g> වතාවක් වැරදියට ඇඳ ඇත. තවත් අසාර්ථක උත්සාහ <xliff:g id="NUMBER_1">%2$d</xliff:g> කින් පසුව, ඊ-තැපැල් ගිණුම භාවිතා කරමින් ඔබගේ ටැබ්ලටයේ අගුළු ඇරීමට ඔබට පවසනු ඇත.\n\n නැවත තත්පර <xliff:g id="NUMBER_2">%3$d</xliff:g> කින් උත්සාහ කරන්න."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"ඔබ වැරදියට <xliff:g id="NUMBER_0">%1$d</xliff:g> වතාවක් ඔබගේ අගුළු හැරීමේ රටාව ඇඳ ඇත. අසාර්ථක උත්සහ කිරීම් <xliff:g id="NUMBER_1">%2$d</xliff:g> න් පසුව, ඔබගේ ඊ-තැපැල් ලිපිනය භාවිතයෙන් ඔබගේ දුරකථනය අගුළු හැරීමට ඔබගෙන් අසයි.\n\n තත්පර <xliff:g id="NUMBER_2">%3$d</xliff:g> න් පසුව නැවත උත්සහ කරන්න."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"තව විකල්ප සඳහා ඔබේ දුරකථනය අගුලු හරින්න"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"තව විකල්ප සඳහා ඔබේ ටැබ්ලට් පරිගණකය අගුලු හරින්න"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"තව විකල්ප සඳහා ඔබේ උපාංගය අගුලු හරින්න"</string> </resources> diff --git a/packages/SystemUI/res-product/values-sk/strings.xml b/packages/SystemUI/res-product/values-sk/strings.xml index 748ab6afacae..a7b6f0a56274 100644 --- a/packages/SystemUI/res-product/values-sk/strings.xml +++ b/packages/SystemUI/res-product/values-sk/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Telefón ste sa pokúsili <xliff:g id="NUMBER">%d</xliff:g>‑krát nesprávne odomknúť. Pracovný profil bude odstránený spolu so všetkými údajmi."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"<xliff:g id="NUMBER_0">%1$d</xliff:g>‑krát ste nesprávne nakreslili svoj bezpečnostný vzor. Po <xliff:g id="NUMBER_1">%2$d</xliff:g> ďalších neúspešných pokusoch sa zobrazí výzva na odomknutie tabletu pomocou e‑mailového účtu.\n\n Skúste to znova o <xliff:g id="NUMBER_2">%3$d</xliff:g> s."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Už ste <xliff:g id="NUMBER_0">%1$d</xliff:g>‑krát nesprávne nakreslili svoj bezpečnostný vzor. Po <xliff:g id="NUMBER_1">%2$d</xliff:g> ďalších neúspešných pokusoch sa zobrazí výzva na odomknutie telefónu pomocou e‑mailového účtu.\n\n Skúste to znova o <xliff:g id="NUMBER_2">%3$d</xliff:g> s."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Ak chcete zobraziť ďalšie možnosti, odomknite telefón"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Ak chcete zobraziť ďalšie možnosti, odomknite tablet"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Ak chcete zobraziť ďalšie možnosti, odomknite zariadenie"</string> </resources> diff --git a/packages/SystemUI/res-product/values-sl/strings.xml b/packages/SystemUI/res-product/values-sl/strings.xml index 3e73415ad67f..db55db823982 100644 --- a/packages/SystemUI/res-product/values-sl/strings.xml +++ b/packages/SystemUI/res-product/values-sl/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Telefon ste neuspešno poskusili odkleniti <xliff:g id="NUMBER">%d</xliff:g>-krat. Delovni profil bo odstranjen in vsi podatki profila bodo izbrisani."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Vzorec za odklepanje ste <xliff:g id="NUMBER_0">%1$d</xliff:g>-krat napačno vnesli. Če ga neuspešno poskusite vnesti še <xliff:g id="NUMBER_1">%2$d</xliff:g>-krat, boste pozvani, da tablični računalnik odklenete z e-poštnim računom.\n\nPoskusite znova čez <xliff:g id="NUMBER_2">%3$d</xliff:g> s."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Vzorec za odklepanje ste <xliff:g id="NUMBER_0">%1$d</xliff:g>-krat napačno vnesli. Če ga neuspešno poskusite vnesti še <xliff:g id="NUMBER_1">%2$d</xliff:g>-krat, boste pozvani, da telefon odklenete z e-poštnim računom.\n\nPoskusite znova čez <xliff:g id="NUMBER_2">%3$d</xliff:g> s."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Za več možnosti odklenite telefon"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Za več možnosti odklenite tablični računalnik"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Za več možnosti odklenite napravo"</string> </resources> diff --git a/packages/SystemUI/res-product/values-sq/strings.xml b/packages/SystemUI/res-product/values-sq/strings.xml index 936775ff6ef6..cc444c2f91c6 100644 --- a/packages/SystemUI/res-product/values-sq/strings.xml +++ b/packages/SystemUI/res-product/values-sq/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Ke tentuar <xliff:g id="NUMBER">%d</xliff:g> herë pa sukses për ta shkyçur telefonin. Profili i punës do të hiqet, gjë që do të fshijë të gjitha të dhënat e profilit."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Ke vizatuar <xliff:g id="NUMBER_0">%1$d</xliff:g> herë pa sukses motivin tënd të shkyçjes. Pas <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativave të tjera të pasuksesshme, do të të duhet ta shkyçësh tabletin duke përdorur një llogari email-i.\n\n Provo sërish për <xliff:g id="NUMBER_2">%3$d</xliff:g> sekonda."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Ke vizatuar <xliff:g id="NUMBER_0">%1$d</xliff:g> herë pa sukses motivin tënd. Pas <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativave të tjera të pasuksesshme, do të të duhet ta shkyçësh telefonin duke përdorur një llogari email-i.\n\n Provo sërish për <xliff:g id="NUMBER_2">%3$d</xliff:g> sekonda."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Shkyçe telefonin për më shumë opsione"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Shkyçe tabletin për më shumë opsione"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Shkyçe pajisjen për më shumë opsione"</string> </resources> diff --git a/packages/SystemUI/res-product/values-sr/strings.xml b/packages/SystemUI/res-product/values-sr/strings.xml index f7dd4f3fd245..f22d6407a075 100644 --- a/packages/SystemUI/res-product/values-sr/strings.xml +++ b/packages/SystemUI/res-product/values-sr/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Погрешно сте покушали да откључате телефон <xliff:g id="NUMBER">%d</xliff:g> пута. Уклонићемо пословни профил, чиме се бришу сви подаци са профила."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Нетачно сте нацртали шаблон за откључавање <xliff:g id="NUMBER_0">%1$d</xliff:g> пута. Ако погрешно покушате још <xliff:g id="NUMBER_1">%2$d</xliff:g> пута, затражићемо да откључате таблет помоћу имејл налога.\n\n Пробајте поново за <xliff:g id="NUMBER_2">%3$d</xliff:g> сек."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Нетачно сте нацртали шаблон за откључавање <xliff:g id="NUMBER_0">%1$d</xliff:g> пута. Ако погрешно покушате још <xliff:g id="NUMBER_1">%2$d</xliff:g> пута, затражићемо да откључате телефон помоћу имејл налога.\n\n Пробајте поново за <xliff:g id="NUMBER_2">%3$d</xliff:g> сек."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Откључајте телефон за још опција"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Откључајте таблет за још опција"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Откључајте уређај за још опција"</string> </resources> diff --git a/packages/SystemUI/res-product/values-sv/strings.xml b/packages/SystemUI/res-product/values-sv/strings.xml index 9f60a1685695..f6059e0294f1 100644 --- a/packages/SystemUI/res-product/values-sv/strings.xml +++ b/packages/SystemUI/res-product/values-sv/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Du har försökt låsa upp telefonen på ett felaktigt sätt <xliff:g id="NUMBER">%d</xliff:g> gånger. Jobbprofilen tas bort och all profildata raderas."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Du har ritat ditt grafiska lösenord fel <xliff:g id="NUMBER_0">%1$d</xliff:g> gånger. Efter ytterligare <xliff:g id="NUMBER_1">%2$d</xliff:g> försök måste du låsa upp surfplattan med hjälp av ett e-postkonto.\n\n Försök igen om <xliff:g id="NUMBER_2">%3$d</xliff:g> sekunder."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Du har ritat ditt grafiska lösenord fel <xliff:g id="NUMBER_0">%1$d</xliff:g> gånger. Efter ytterligare <xliff:g id="NUMBER_1">%2$d</xliff:g> försök måste du låsa upp telefonen med hjälp av ett e-postkonto.\n\n Försök igen om <xliff:g id="NUMBER_2">%3$d</xliff:g> sekunder."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Lås upp telefonen för fler alternativ"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Lås upp surfplattan för fler alternativ"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Lås upp enheten för fler alternativ"</string> </resources> diff --git a/packages/SystemUI/res-product/values-sw/strings.xml b/packages/SystemUI/res-product/values-sw/strings.xml index db69fb5e7715..171fd9763edb 100644 --- a/packages/SystemUI/res-product/values-sw/strings.xml +++ b/packages/SystemUI/res-product/values-sw/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Umejaribu kufungua simu mara <xliff:g id="NUMBER">%d</xliff:g> bila mafanikio. Wasifu wa kazini utaondolewa, hatua itakayofuta data yote ya wasifu."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Umeweka mchoro usio sahihi wa kufungua skrini mara <xliff:g id="NUMBER_0">%1$d</xliff:g>. Baada ya majaribio <xliff:g id="NUMBER_1">%2$d</xliff:g> zaidi bila mafanikio, utaombwa ufungue kompyuta yako kibao kwa kutumia akaunti ya barua pepe.\n\n Jaribu tena baada ya sekunde <xliff:g id="NUMBER_2">%3$d</xliff:g>."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Umeweka mchoro usio sahihi wa kufungua skrini mara <xliff:g id="NUMBER_0">%1$d</xliff:g>. Ukikosea mara nyingine <xliff:g id="NUMBER_1">%2$d</xliff:g>, utaombwa ufungue simu yako kwa kutumia akaunti ya barua pepe.\n\n Jaribu tena baada ya sekunde <xliff:g id="NUMBER_2">%3$d</xliff:g>."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Fungua simu yako ili upate chaguo zaidi"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Fungua kompyuta yako kibao ili upate chaguo zaidi"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Fungua kifaa chako ili upate chaguo zaidi"</string> </resources> diff --git a/packages/SystemUI/res-product/values-ta/strings.xml b/packages/SystemUI/res-product/values-ta/strings.xml index 4bb48d96960e..9819e7ced64f 100644 --- a/packages/SystemUI/res-product/values-ta/strings.xml +++ b/packages/SystemUI/res-product/values-ta/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"மொபைலைத் திறக்க, <xliff:g id="NUMBER">%d</xliff:g> முறை தவறாக முயன்றுவிட்டதனால் பணிக் கணக்கு அகற்றப்படும். இதனால் அதிலுள்ள அனைத்துச் சுயவிவரத் தரவும் நீக்கப்படும்."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"திறப்பதற்கான பேட்டர்னை, <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக வரைந்துவிட்டீர்கள். இன்னும் <xliff:g id="NUMBER_1">%2$d</xliff:g> முறை தவறாக வரைந்தால், மின்னஞ்சல் கணக்கைப் பயன்படுத்தி டேப்லெட்டைத் திறக்கும்படி கேட்கப்படுவீர்கள்.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> வினாடிகளில் மீண்டும் முயலவும்."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"திறப்பதற்கான பேட்டர்னை, <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக வரைந்துவிட்டீர்கள். இன்னும் <xliff:g id="NUMBER_1">%2$d</xliff:g> முறை தவறாக வரைந்தால், மின்னஞ்சல் கணக்கைப் பயன்படுத்தி மொபைலைத் திறக்கும்படி கேட்கப்படுவீர்கள்.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> வினாடிகளில் மீண்டும் முயலவும்."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"மேலும் விருப்பங்களுக்கு மொபைலை அன்லாக் செய்யவும்"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"மேலும் விருப்பங்களுக்கு டேப்லெட்டை அன்லாக் செய்யவும்"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"மேலும் விருப்பங்களுக்குச் சாதனத்தை அன்லாக் செய்யவும்"</string> </resources> diff --git a/packages/SystemUI/res-product/values-te/strings.xml b/packages/SystemUI/res-product/values-te/strings.xml index 3ba104cdf5da..1773f9087e0e 100644 --- a/packages/SystemUI/res-product/values-te/strings.xml +++ b/packages/SystemUI/res-product/values-te/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"మీరు ఫోన్ను అన్లాక్ చేయడానికి <xliff:g id="NUMBER">%d</xliff:g> సార్లు తప్పు ప్రయత్నాలు చేశారు. కార్యాలయ ప్రొఫైల్ తీసివేయబడుతుంది, దీని వలన ప్రొఫైల్ డేటా మొత్తం తొలగించబడుతుంది."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"మీరు మీ అన్లాక్ నమూనాను <xliff:g id="NUMBER_0">%1$d</xliff:g> సార్లు తప్పుగా గీసారు. మరో <xliff:g id="NUMBER_1">%2$d</xliff:g> ప్రయత్నాలలో విఫలమైతే, మీరు ఇమెయిల్ ఖాతాను ఉపయోగించి మీ టాబ్లెట్ను అన్లాక్ చేయాల్సి వస్తుంది.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> సెకన్లలో మళ్లీ ప్రయత్నించండి."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"మీరు మీ అన్లాక్ నమూనాను <xliff:g id="NUMBER_0">%1$d</xliff:g> సార్లు తప్పుగా గీసారు. మరో <xliff:g id="NUMBER_1">%2$d</xliff:g> ప్రయత్నాలలో విఫలమైతే, మీరు ఇమెయిల్ ఖాతాను ఉపయోగించి మీ ఫోన్ను అన్లాక్ చేయాల్సి వస్తుంది.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> సెకన్లలో మళ్లీ ప్రయత్నించండి."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"మరిన్ని ఆప్షన్ల కోసం మీ ఫోన్ను అన్లాక్ చేయండి"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"మరిన్ని ఆప్షన్ల కోసం మీ టాబ్లెట్ను అన్లాక్ చేయండి"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"మరిన్ని ఆప్షన్ల కోసం మీ పరికరాన్ని అన్లాక్ చేయండి"</string> </resources> diff --git a/packages/SystemUI/res-product/values-th/strings.xml b/packages/SystemUI/res-product/values-th/strings.xml index 4525ef5d0bf6..bf2261d79abd 100644 --- a/packages/SystemUI/res-product/values-th/strings.xml +++ b/packages/SystemUI/res-product/values-th/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"คุณปลดล็อกโทรศัพท์ไม่ถูกต้อง <xliff:g id="NUMBER">%d</xliff:g> ครั้งแล้ว ระบบจะนำโปรไฟล์งานออก ซึ่งจะเป็นการลบข้อมูลทั้งหมดในโปรไฟล์"</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"คุณวาดรูปแบบการปลดล็อกไม่ถูกต้อง <xliff:g id="NUMBER_0">%1$d</xliff:g> ครั้งแล้ว หากทำไม่สำเร็จอีก <xliff:g id="NUMBER_1">%2$d</xliff:g> ครั้ง ระบบจะขอให้คุณปลดล็อกแท็บเล็ตโดยใช้บัญชีอีเมล\n\n โปรดลองอีกครั้งใน <xliff:g id="NUMBER_2">%3$d</xliff:g> วินาที"</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"คุณวาดรูปแบบการปลดล็อกไม่ถูกต้อง <xliff:g id="NUMBER_0">%1$d</xliff:g> ครั้งแล้ว หากทำไม่สำเร็จอีก <xliff:g id="NUMBER_1">%2$d</xliff:g> ครั้ง ระบบจะขอให้คุณปลดล็อกโทรศัพท์โดยใช้บัญชีอีเมล\n\n โปรดลองอีกครั้งในอีก <xliff:g id="NUMBER_2">%3$d</xliff:g> วินาที"</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"ปลดล็อกโทรศัพท์เพื่อดูตัวเลือกเพิ่มเติม"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"ปลดล็อกแท็บเล็ตเพื่อดูตัวเลือกเพิ่มเติม"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"ปลดล็อกอุปกรณ์เพื่อดูตัวเลือกเพิ่มเติม"</string> </resources> diff --git a/packages/SystemUI/res-product/values-tl/strings.xml b/packages/SystemUI/res-product/values-tl/strings.xml index 8d6931dab05d..a70a3a5c50ab 100644 --- a/packages/SystemUI/res-product/values-tl/strings.xml +++ b/packages/SystemUI/res-product/values-tl/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"<xliff:g id="NUMBER">%d</xliff:g> (na) beses mo nang sinubukang i-unlock ang telepono gamit ang maling password. Aalisin ang profile sa trabaho, na magiging dahilan para ma-delete ang lahat ng data sa profile."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"<xliff:g id="NUMBER_0">%1$d</xliff:g> (na) beses kang nagkamali sa pagguhit ng iyong pattern sa pag-unlock. Pagkatapos ng <xliff:g id="NUMBER_1">%2$d</xliff:g> pang hindi matagumpay na pagsubok, hihilingin sa iyong i-unlock ang tablet mo gamit ang isang email account.\n\n Subukan ulit sa loob ng <xliff:g id="NUMBER_2">%3$d</xliff:g> (na) segundo."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"<xliff:g id="NUMBER_0">%1$d</xliff:g> (na) beses kang nagkamali sa pagguhit ng iyong pattern sa pag-unlock. Pagkatapos ng <xliff:g id="NUMBER_1">%2$d</xliff:g> pang hindi matagumpay na pagsubok, hihilingin sa iyong i-unlock ang telepono mo gamit ang isang email account.\n\n Subukan ulit sa loob ng <xliff:g id="NUMBER_2">%3$d</xliff:g> (na) segundo."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"I-unlock ang iyong telepono para sa higit pang opsyon"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"I-unlock ang iyong tablet para sa higit pang opsyon"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"I-unlock ang iyong device para sa higit pang opsyon"</string> </resources> diff --git a/packages/SystemUI/res-product/values-tr/strings.xml b/packages/SystemUI/res-product/values-tr/strings.xml index 44d7cac2f237..5eb7e91e6943 100644 --- a/packages/SystemUI/res-product/values-tr/strings.xml +++ b/packages/SystemUI/res-product/values-tr/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Telefonun kilidini <xliff:g id="NUMBER">%d</xliff:g> kez hatalı bir şekilde açmayı denediniz. İş profili kaldırılacak ve tüm profil verileri silinecektir."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Kilit açma deseninizi <xliff:g id="NUMBER_0">%1$d</xliff:g> kez hatalı çizdiniz. <xliff:g id="NUMBER_1">%2$d</xliff:g> başarısız deneme daha yaparsanız tabletinizin kilidini bir e-posta hesabı kullanarak açmanız istenir.\n<xliff:g id="NUMBER_2">%3$d</xliff:g>\n saniye içinde tekrar deneyin."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Kilit açma deseninizi <xliff:g id="NUMBER_0">%1$d</xliff:g> kez yanlış çizdiniz. <xliff:g id="NUMBER_1">%2$d</xliff:g> başarısız deneme daha yaparsanız telefonunuzu bir e-posta hesabı kullanarak açmanız istenir.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> saniye içinde tekrar deneyin."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Diğer seçenekler için telefonunuzun kilidini açın"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Diğer seçenekler için tabletinizin kilidini açın"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Diğer seçenekler için cihazınızın kilidini açın"</string> </resources> diff --git a/packages/SystemUI/res-product/values-uk/strings.xml b/packages/SystemUI/res-product/values-uk/strings.xml index db3ba081ba63..098f8e792bf4 100644 --- a/packages/SystemUI/res-product/values-uk/strings.xml +++ b/packages/SystemUI/res-product/values-uk/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Кількість невдалих спроб розблокувати телефон: <xliff:g id="NUMBER">%d</xliff:g>. Буде видалено робочий профіль і всі його дані."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Ключ розблокування неправильно намальовано стільки разів: <xliff:g id="NUMBER_0">%1$d</xliff:g>. Залишилося спроб: <xliff:g id="NUMBER_1">%2$d</xliff:g>. У разі невдачі з\'явиться запит розблокувати планшет за допомогою облікового запису електронної пошти.\n\n Повторіть спробу за <xliff:g id="NUMBER_2">%3$d</xliff:g> с."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Ключ розблокування неправильно намальовано стільки разів: <xliff:g id="NUMBER_0">%1$d</xliff:g>. Залишилося спроб: <xliff:g id="NUMBER_1">%2$d</xliff:g>. У разі невдачі з\'явиться запит розблокувати телефон за допомогою облікового запису електронної пошти.\n\n Повторіть спробу за <xliff:g id="NUMBER_2">%3$d</xliff:g> с."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Розблокуйте телефон, щоб переглянути інші параметри"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Розблокуйте планшет, щоб переглянути інші параметри"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Розблокуйте пристрій, щоб переглянути інші параметри"</string> </resources> diff --git a/packages/SystemUI/res-product/values-ur/strings.xml b/packages/SystemUI/res-product/values-ur/strings.xml index 294ad4fa75a9..298a72902d25 100644 --- a/packages/SystemUI/res-product/values-ur/strings.xml +++ b/packages/SystemUI/res-product/values-ur/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"آپ نے فون کو غیر مقفل کرنے کیلئے <xliff:g id="NUMBER">%d</xliff:g> بار غلط طریقے سے کوشش کی ہے۔ دفتری پروفائل ہٹا دی جائے گی، جس سے پروفائل کا سبھی ڈیٹا حذف ہو جائے گا۔"</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"آپ نے اپنا غیر مقفل کرنے کا پیٹرن <xliff:g id="NUMBER_0">%1$d</xliff:g> بار غلط طریقے سے ڈرا کیا ہے۔ <xliff:g id="NUMBER_1">%2$d</xliff:g> مزید ناکام کوششوں کے بعد، آپ سے ایک ای میل اکاؤنٹ استعمال کر کے اپنا ٹیبلیٹ غیر مقفل کرنے کو کہا جائے گا۔\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> سیکنڈ میں دوبارہ کوشش کریں۔"</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"آپ نے اپنا غیر مقفل کرنے کا پیٹرن <xliff:g id="NUMBER_0">%1$d</xliff:g> بار غلط طریقے سے ڈرا کیا ہے۔ <xliff:g id="NUMBER_1">%2$d</xliff:g> مزید ناکام کوششوں کے بعد، آپ سے ایک ای میل اکاؤنٹ استعمال کر کے اپنا فون غیر مقفل کرنے کو کہا جائے گا۔\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> سیکنڈ میں دوبارہ کوشش کریں۔"</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"مزید اختیارات کے لیے اپنا فون غیر مقفل کریں"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"مزید اختیارات کے لیے اپنا ٹیبلیٹ غیر مقفل کریں"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"مزید اختیارات کے لیے اپنا آلہ غیر مقفل کریں"</string> </resources> diff --git a/packages/SystemUI/res-product/values-uz/strings.xml b/packages/SystemUI/res-product/values-uz/strings.xml index bc23963abc24..d9c0acdc22f6 100644 --- a/packages/SystemUI/res-product/values-uz/strings.xml +++ b/packages/SystemUI/res-product/values-uz/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Siz telefonni qulfdan chiqarish uchun <xliff:g id="NUMBER">%d</xliff:g> marta xato urinish qildingiz. Endi ish profili oʻchirib tashlanadi va undagi barcha maʼlumotlar ham oʻchib ketadi."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Grafik kalit <xliff:g id="NUMBER_0">%1$d</xliff:g> marta xato chizildi. <xliff:g id="NUMBER_1">%2$d</xliff:g> marta muvaffaqiyatsiz urinishdan keyin sizdan emailingizdan foydalanib, planshet qulfini ochishingiz soʻraladi.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> soniyadan keyin yana urinib koʻring."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Grafik kalit <xliff:g id="NUMBER_0">%1$d</xliff:g> marta xato chizildi. <xliff:g id="NUMBER_1">%2$d</xliff:g> marta muvaffaqiyatsiz urinishdan keyin sizdan emailngizdan foydalanib, telefon qulfini ochishingiz soʻraladi.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> soniyadan keyin qayta urinib koʻring."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Boshqa parametrlar uchun telefoningiz qulfini oching"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Boshqa parametrlar uchun planshetingiz qulfini oching"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Boshqa parametrlar uchun qurilmangiz qulfini oching"</string> </resources> diff --git a/packages/SystemUI/res-product/values-vi/strings.xml b/packages/SystemUI/res-product/values-vi/strings.xml index a15ee87ca98f..d6fdf9f6bdd2 100644 --- a/packages/SystemUI/res-product/values-vi/strings.xml +++ b/packages/SystemUI/res-product/values-vi/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Bạn đã mở khóa điện thoại sai <xliff:g id="NUMBER">%d</xliff:g> lần. Hồ sơ công việc sẽ bị xóa, tức là tất cả dữ liệu hồ sơ sẽ bị xóa."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Bạn đã vẽ không chính xác hình mở khóa <xliff:g id="NUMBER_0">%1$d</xliff:g> lần. Sau <xliff:g id="NUMBER_1">%2$d</xliff:g> lần thử không thành công nữa, bạn sẽ được yêu cầu mở khóa máy tính bảng bằng tài khoản email.\n\n Hãy thử lại sau <xliff:g id="NUMBER_2">%3$d</xliff:g> giây."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Bạn đã vẽ không chính xác hình mở khóa <xliff:g id="NUMBER_0">%1$d</xliff:g> lần. Sau <xliff:g id="NUMBER_1">%2$d</xliff:g> lần thử không thành công nữa, bạn sẽ được yêu cầu mở khóa điện thoại bằng tài khoản email.\n\n Hãy thử lại sau <xliff:g id="NUMBER_2">%3$d</xliff:g> giây."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Mở khóa điện thoại của bạn để xem thêm tùy chọn"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Mở khóa máy tính bảng của bạn để xem thêm tùy chọn"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Mở khóa thiết bị của bạn để xem thêm tùy chọn"</string> </resources> diff --git a/packages/SystemUI/res-product/values-zh-rCN/strings.xml b/packages/SystemUI/res-product/values-zh-rCN/strings.xml index b15b6dd272c0..19196eb6d4aa 100644 --- a/packages/SystemUI/res-product/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res-product/values-zh-rCN/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"您尝试解锁手机后失败的次数已达 <xliff:g id="NUMBER">%d</xliff:g> 次。系统将移除此工作资料,而这将删除所有的工作资料数据。"</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"您已 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次画错解锁图案。如果再尝试 <xliff:g id="NUMBER_1">%2$d</xliff:g> 次后仍不成功,系统就会要求您使用自己的电子邮件帐号解锁平板电脑。\n\n请在 <xliff:g id="NUMBER_2">%3$d</xliff:g> 秒后重试。"</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"您已 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次画错解锁图案。如果再尝试 <xliff:g id="NUMBER_1">%2$d</xliff:g> 次后仍不成功,系统就会要求您使用自己的电子邮件帐号解锁手机。\n\n请在 <xliff:g id="NUMBER_2">%3$d</xliff:g> 秒后重试。"</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"解锁手机即可查看更多选项"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"解锁平板电脑即可查看更多选项"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"解锁设备即可查看更多选项"</string> </resources> diff --git a/packages/SystemUI/res-product/values-zh-rHK/strings.xml b/packages/SystemUI/res-product/values-zh-rHK/strings.xml index e625a1a80500..27eda7705f20 100644 --- a/packages/SystemUI/res-product/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res-product/values-zh-rHK/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"您嘗試解鎖手機已失敗 <xliff:g id="NUMBER">%d</xliff:g> 次。系統將移除此工作設定檔,而所有設定檔資料亦會一併刪除。"</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"您已畫錯解鎖圖案 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次。如果之後再嘗試 <xliff:g id="NUMBER_1">%2$d</xliff:g> 次仍未成功,系統會要求您透過電郵帳戶解鎖平板電腦。\n\n請在 <xliff:g id="NUMBER_2">%3$d</xliff:g> 秒後再試一次。"</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"您已畫錯解鎖圖案 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次。如果之後再嘗試 <xliff:g id="NUMBER_1">%2$d</xliff:g> 次仍未成功,系統會要求您透過電郵帳戶解鎖手機。\n\n請在 <xliff:g id="NUMBER_2">%3$d</xliff:g> 秒後再試一次。"</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"解鎖手機以存取更多選項"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"解鎖平板電腦以存取更多選項"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"解鎖裝置以存取更多選項"</string> </resources> diff --git a/packages/SystemUI/res-product/values-zh-rTW/strings.xml b/packages/SystemUI/res-product/values-zh-rTW/strings.xml index 5810ac96f3eb..e484b663bb54 100644 --- a/packages/SystemUI/res-product/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res-product/values-zh-rTW/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"你嘗試解鎖手機已失敗 <xliff:g id="NUMBER">%d</xliff:g> 次。你的工作資料夾將遭到移除,所有設定檔資料也會一併遭到刪除。"</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"你的解鎖圖案已畫錯 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次,目前還剩 <xliff:g id="NUMBER_1">%2$d</xliff:g> 次機會。如果失敗次數超過限制,系統會要求你透過電子郵件帳戶將平板電腦解鎖。\n\n請在 <xliff:g id="NUMBER_2">%3$d</xliff:g> 秒後再試一次。"</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"你的解鎖圖案已畫錯 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次,目前還剩 <xliff:g id="NUMBER_1">%2$d</xliff:g> 次機會。如果失敗次數超過限制,系統會要求你透過電子郵件帳戶將手機解鎖。\n\n請在 <xliff:g id="NUMBER_2">%3$d</xliff:g> 秒後再試一次。"</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"解鎖手機可查看更多選項"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"解鎖平板電腦可查看更多選項"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"解鎖裝置可查看更多選項"</string> </resources> diff --git a/packages/SystemUI/res-product/values-zu/strings.xml b/packages/SystemUI/res-product/values-zu/strings.xml index 595447c5e556..e6c140a76bdf 100644 --- a/packages/SystemUI/res-product/values-zu/strings.xml +++ b/packages/SystemUI/res-product/values-zu/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Uzame ngokungalungile ukuvula ifoni izikhathi ezingu-<xliff:g id="NUMBER">%d</xliff:g>. Iphrofayela yomsebenzi izosuswa, okuzosusa yonke idatha yephrofayela."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Udwebe ngokungalungile iphethini yakho yokuvula ngezikhathi ezingu-<xliff:g id="NUMBER_0">%1$d</xliff:g>. Ngemuva kwemizamo engaphumelelanga kaningi engu-<xliff:g id="NUMBER_1">%2$d</xliff:g>, uzocelwa ukuthi uvule ithebulethi yakho usebenzisa i-akhawunti ye-imeyili.\n\nZama futhi kumasekhondi angu-<xliff:g id="NUMBER_2">%3$d</xliff:g>."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Ukulayisha ungenisa iphathini yakho yokuvula ngendlela engalungile izikhathi ezi-<xliff:g id="NUMBER_0">%1$d</xliff:g> Emva kweminye imizamo engu-<xliff:g id="NUMBER_1">%2$d</xliff:g>, uzocelwa ukuvula ifoni yakho usebenzisa ukungena ngemvume ku-Google\n\n Zame futhi emumva kwengu- <xliff:g id="NUMBER_2">%3$d</xliff:g> imizuzwana."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Vula ifoni yakho ukuthola izinketho ezengeziwe"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Vula ithebulethi yakho ukuthola izinketho ezengeziwe"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Vula idivayisi yakho ukuthola izinketho ezengeziwe"</string> </resources> diff --git a/packages/SystemUI/res/drawable/dismiss_circle_background.xml b/packages/SystemUI/res/drawable/dismiss_circle_background.xml index e311c520d3d6..7809c8398c2d 100644 --- a/packages/SystemUI/res/drawable/dismiss_circle_background.xml +++ b/packages/SystemUI/res/drawable/dismiss_circle_background.xml @@ -21,8 +21,8 @@ <stroke android:width="1dp" - android:color="#66FFFFFF" /> + android:color="#AAFFFFFF" /> - <solid android:color="#B3000000" /> + <solid android:color="#77000000" /> </shape>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/floating_dismiss_gradient.xml b/packages/SystemUI/res/drawable/floating_dismiss_gradient.xml new file mode 100644 index 000000000000..8f7fb1011cf4 --- /dev/null +++ b/packages/SystemUI/res/drawable/floating_dismiss_gradient.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2020 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<shape + xmlns:android="http://schemas.android.com/apk/res/android" + android:shape="rectangle"> + <gradient + android:angle="270" + android:startColor="#00000000" + android:endColor="#77000000" + android:type="linear" /> +</shape>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/floating_dismiss_gradient_transition.xml b/packages/SystemUI/res/drawable/floating_dismiss_gradient_transition.xml new file mode 100644 index 000000000000..6a0695e817c7 --- /dev/null +++ b/packages/SystemUI/res/drawable/floating_dismiss_gradient_transition.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2020 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<transition xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:drawable="@color/transparent" /> + <item android:drawable="@drawable/floating_dismiss_gradient" /> +</transition>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/ic_create_bubble.xml b/packages/SystemUI/res/drawable/ic_create_bubble.xml index d58e9a347a2f..4abbc8179b4d 100644 --- a/packages/SystemUI/res/drawable/ic_create_bubble.xml +++ b/packages/SystemUI/res/drawable/ic_create_bubble.xml @@ -15,11 +15,11 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" + android:width="20dp" + android:height="20dp" android:viewportWidth="24" android:viewportHeight="24"> <path android:fillColor="#FF000000" - android:pathData="M22,12C22,12 22,12 22,12C22,12 22,12 22,12c0,0.56 -0.06,1.1 -0.15,1.64l-1.97,-0.33c0.15,-0.91 0.15,-1.84 -0.02,-2.75c-0.01,-0.03 -0.01,-0.07 -0.02,-0.1c-0.03,-0.18 -0.08,-0.36 -0.13,-0.54c-0.02,-0.08 -0.04,-0.16 -0.06,-0.24c-0.04,-0.14 -0.09,-0.27 -0.14,-0.41c-0.04,-0.12 -0.08,-0.24 -0.13,-0.35c-0.04,-0.09 -0.08,-0.18 -0.13,-0.27c-0.07,-0.15 -0.14,-0.3 -0.22,-0.45c-0.03,-0.05 -0.06,-0.09 -0.08,-0.14c-0.72,-1.26 -1.77,-2.31 -3.03,-3.03c-0.05,-0.03 -0.09,-0.06 -0.14,-0.08c-0.15,-0.08 -0.3,-0.15 -0.45,-0.22c-0.09,-0.04 -0.18,-0.09 -0.27,-0.13c-0.11,-0.05 -0.23,-0.09 -0.35,-0.13c-0.14,-0.05 -0.27,-0.1 -0.41,-0.14c-0.08,-0.02 -0.16,-0.04 -0.23,-0.06c-0.18,-0.05 -0.36,-0.1 -0.54,-0.13c-0.03,-0.01 -0.07,-0.01 -0.1,-0.01c-0.95,-0.17 -1.93,-0.17 -2.88,0c-0.03,0.01 -0.07,0.01 -0.1,0.01c-0.18,0.04 -0.36,0.08 -0.54,0.13C9.85,4.3 9.77,4.32 9.69,4.34C9.55,4.38 9.42,4.44 9.28,4.49C9.17,4.53 9.05,4.57 8.93,4.61C8.84,4.65 8.75,4.7 8.66,4.74c-0.15,0.07 -0.3,0.14 -0.45,0.22C8.16,4.98 8.12,5.01 8.07,5.04C5.64,6.42 4,9.02 4,12c0,2.74 1.39,5.16 3.49,6.6c0.01,0.01 0.03,0.02 0.04,0.03c0.16,0.11 0.33,0.2 0.49,0.3c0.06,0.04 0.12,0.08 0.19,0.11c0.13,0.07 0.27,0.13 0.4,0.19c0.11,0.05 0.21,0.1 0.32,0.15c0.1,0.04 0.2,0.07 0.29,0.11c0.15,0.06 0.31,0.11 0.46,0.16c0.05,0.02 0.11,0.03 0.17,0.04c1.11,0.31 2.27,0.35 3.4,0.18l0.35,1.98c-0.54,0.09 -1.08,0.14 -1.62,0.14V22c-0.65,0 -1.28,-0.07 -1.9,-0.19c-0.01,0 -0.01,0 -0.02,0c-0.25,-0.05 -0.49,-0.11 -0.73,-0.18c-0.08,-0.02 -0.16,-0.04 -0.23,-0.06c-0.19,-0.06 -0.37,-0.13 -0.55,-0.19c-0.13,-0.05 -0.26,-0.09 -0.39,-0.14c-0.13,-0.05 -0.25,-0.12 -0.38,-0.18c-0.18,-0.08 -0.35,-0.16 -0.53,-0.25c-0.07,-0.04 -0.14,-0.08 -0.21,-0.13c-0.22,-0.12 -0.43,-0.25 -0.64,-0.39c-0.01,-0.01 -0.02,-0.02 -0.04,-0.03c-0.51,-0.35 -1,-0.74 -1.45,-1.2l0,0C3.12,17.26 2,14.76 2,12c0,-2.76 1.12,-5.26 2.93,-7.07l0,0c0.45,-0.45 0.93,-0.84 1.44,-1.19C6.39,3.73 6.4,3.72 6.42,3.71c0.2,-0.14 0.41,-0.26 0.62,-0.38c0.08,-0.05 0.15,-0.09 0.23,-0.14c0.17,-0.09 0.33,-0.16 0.5,-0.24c0.13,-0.06 0.27,-0.13 0.4,-0.19C8.3,2.71 8.42,2.67 8.55,2.63c0.19,-0.07 0.38,-0.14 0.58,-0.2c0.07,-0.02 0.14,-0.03 0.21,-0.05C10.18,2.14 11.07,2 12,2c0.65,0 1.29,0.07 1.91,0.19c0,0 0,0 0,0c0.25,0.05 0.5,0.11 0.75,0.18c0.07,0.02 0.14,0.03 0.22,0.06c0.19,0.06 0.38,0.13 0.57,0.2c0.12,0.05 0.25,0.09 0.37,0.14c0.14,0.06 0.27,0.12 0.4,0.18c0.17,0.08 0.34,0.16 0.51,0.25c0.08,0.04 0.15,0.09 0.23,0.14c0.21,0.12 0.42,0.24 0.62,0.38c0.01,0.01 0.03,0.02 0.04,0.03c0.51,0.35 0.99,0.74 1.45,1.19c0.24,0.24 0.47,0.49 0.68,0.75c0.04,0.04 0.06,0.09 0.1,0.13c0.17,0.22 0.34,0.45 0.5,0.68c0.01,0.01 0.02,0.03 0.03,0.04c0.69,1.05 1.17,2.21 1.42,3.44c0,0 0,0.01 0,0.01c0.06,0.29 0.1,0.58 0.13,0.87c0.01,0.04 0.01,0.09 0.02,0.13C21.98,11.32 22,11.66 22,12zM18.5,15c-1.93,0 -3.5,1.57 -3.5,3.5s1.57,3.5 3.5,3.5s3.5,-1.57 3.5,-3.5S20.43,15 18.5,15z"/> -</vector>
\ No newline at end of file + android:pathData="M23,5v8h-2V5H3v14h10v2v0H3c-1.1,0 -2,-0.9 -2,-2V5c0,-1.1 0.9,-2 2,-2h18C22.1,3 23,3.9 23,5zM10,8v2.59L5.71,6.29L4.29,7.71L8.59,12H6v2h6V8H10zM19,15c-1.66,0 -3,1.34 -3,3s1.34,3 3,3s3,-1.34 3,-3S20.66,15 19,15z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/dismiss_target_x.xml b/packages/SystemUI/res/drawable/ic_music_note.xml index 3672efffe139..30959a870a02 100644 --- a/packages/SystemUI/res/drawable/dismiss_target_x.xml +++ b/packages/SystemUI/res/drawable/ic_music_note.xml @@ -1,4 +1,3 @@ -<?xml version="1.0" encoding="utf-8"?> <!-- ~ Copyright (C) 2020 The Android Open Source Project ~ @@ -14,15 +13,12 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - -<!-- 'X' icon. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24.0dp" - android:height="24.0dp" - android:viewportWidth="24.0" - android:viewportHeight="24.0"> + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> <path - android:pathData="M19.000000,6.400000l-1.400000,-1.400000 -5.600000,5.600000 -5.600000,-5.600000 -1.400000,1.400000 5.600000,5.600000 -5.600000,5.600000 1.400000,1.400000 5.600000,-5.600000 5.600000,5.600000 1.400000,-1.400000 -5.600000,-5.600000z" - android:fillColor="#FFFFFFFF" - android:strokeColor="#FF000000"/> -</vector>
\ No newline at end of file + android:fillColor="#FF000000" + android:pathData="M12,3v10.55c-0.59,-0.34 -1.27,-0.55 -2,-0.55 -2.21,0 -4,1.79 -4,4s1.79,4 4,4 4,-1.79 4,-4V7h4V3h-6z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/ic_stop_bubble.xml b/packages/SystemUI/res/drawable/ic_stop_bubble.xml index 11bc741a4f17..6cf67a77ff55 100644 --- a/packages/SystemUI/res/drawable/ic_stop_bubble.xml +++ b/packages/SystemUI/res/drawable/ic_stop_bubble.xml @@ -15,11 +15,11 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" + android:width="20dp" + android:height="20dp" android:viewportWidth="24" android:viewportHeight="24"> <path android:fillColor="#FF000000" - android:pathData="M21.98,18.32l-3.3,-3.3C20.47,15.11 21.89,16.53 21.98,18.32zM8.66,4.74C8.75,4.7 8.84,4.65 8.93,4.61c0.11,-0.05 0.23,-0.09 0.35,-0.13c0.14,-0.05 0.27,-0.1 0.41,-0.14C9.77,4.32 9.85,4.3 9.92,4.28c0.18,-0.05 0.36,-0.1 0.54,-0.13c0.03,-0.01 0.07,-0.01 0.1,-0.01c0.95,-0.17 1.93,-0.17 2.88,0c0.03,0.01 0.07,0.01 0.1,0.01c0.18,0.04 0.36,0.08 0.54,0.13c0.08,0.02 0.16,0.04 0.23,0.06c0.14,0.04 0.27,0.09 0.41,0.14c0.12,0.04 0.23,0.08 0.35,0.13c0.09,0.04 0.18,0.09 0.27,0.13c0.15,0.07 0.3,0.14 0.45,0.22c0.05,0.03 0.09,0.06 0.14,0.08c1.26,0.72 2.31,1.77 3.03,3.03c0.03,0.05 0.06,0.09 0.08,0.14c0.08,0.15 0.15,0.3 0.22,0.45c0.04,0.09 0.09,0.18 0.13,0.27c0.05,0.11 0.09,0.23 0.13,0.35c0.05,0.13 0.1,0.27 0.14,0.41c0.02,0.08 0.04,0.16 0.06,0.24c0.05,0.18 0.1,0.36 0.13,0.54c0.01,0.03 0.01,0.07 0.02,0.1c0.16,0.91 0.17,1.84 0.02,2.75l1.97,0.33C21.94,13.1 22,12.56 22,12c0,0 0,0 0,0s0,0 0,0c0,-0.34 -0.02,-0.68 -0.05,-1.01c0,-0.04 -0.01,-0.09 -0.02,-0.13c-0.03,-0.29 -0.07,-0.58 -0.13,-0.87c0,0 0,-0.01 0,-0.01c-0.25,-1.23 -0.73,-2.39 -1.42,-3.44c-0.01,-0.01 -0.02,-0.03 -0.03,-0.04c-0.15,-0.23 -0.32,-0.46 -0.5,-0.68c-0.03,-0.04 -0.06,-0.09 -0.1,-0.13c-0.21,-0.26 -0.44,-0.51 -0.68,-0.75c-0.45,-0.45 -0.94,-0.84 -1.45,-1.19c-0.01,-0.01 -0.03,-0.02 -0.04,-0.03c-0.2,-0.14 -0.41,-0.26 -0.62,-0.38c-0.08,-0.04 -0.15,-0.09 -0.23,-0.14c-0.17,-0.09 -0.34,-0.17 -0.51,-0.25c-0.13,-0.06 -0.26,-0.13 -0.4,-0.18c-0.12,-0.05 -0.25,-0.09 -0.37,-0.14c-0.19,-0.07 -0.38,-0.14 -0.57,-0.2c-0.07,-0.02 -0.14,-0.04 -0.22,-0.06c-0.25,-0.07 -0.5,-0.13 -0.75,-0.18c0,0 0,0 0,0C13.29,2.07 12.65,2 12,2c-0.93,0 -1.82,0.14 -2.67,0.37C9.26,2.39 9.19,2.41 9.12,2.43c-0.2,0.06 -0.39,0.13 -0.58,0.2C8.42,2.67 8.3,2.71 8.18,2.76c-0.14,0.06 -0.27,0.12 -0.4,0.19C7.61,3.03 7.44,3.1 7.27,3.19C7.19,3.24 7.12,3.29 7.04,3.33C7.03,3.34 7.02,3.34 7.01,3.35l1.48,1.48C8.55,4.8 8.6,4.77 8.66,4.74zM2.71,1.29L1.29,2.71l2.97,2.97C2.85,7.4 2,9.6 2,12c0,2.76 1.12,5.26 2.93,7.07l0,0c0.45,0.45 0.94,0.85 1.45,1.2c0.01,0.01 0.02,0.02 0.04,0.03c0.21,0.14 0.42,0.27 0.64,0.39c0.07,0.04 0.14,0.09 0.21,0.13c0.17,0.09 0.35,0.17 0.53,0.25c0.13,0.06 0.25,0.12 0.38,0.18c0.13,0.05 0.26,0.1 0.39,0.14c0.18,0.07 0.36,0.14 0.55,0.19c0.08,0.02 0.16,0.04 0.23,0.06c0.24,0.07 0.48,0.13 0.73,0.18c0.01,0 0.01,0 0.02,0C10.72,21.93 11.35,22 12,22v-0.01c0.54,0 1.08,-0.05 1.62,-0.14l-0.35,-1.98c-1.13,0.18 -2.29,0.13 -3.4,-0.18c-0.06,-0.02 -0.11,-0.03 -0.17,-0.04c-0.16,-0.05 -0.31,-0.11 -0.46,-0.16c-0.1,-0.04 -0.2,-0.07 -0.29,-0.11c-0.11,-0.05 -0.22,-0.1 -0.32,-0.15c-0.13,-0.06 -0.27,-0.12 -0.4,-0.19c-0.06,-0.03 -0.13,-0.08 -0.19,-0.11c-0.17,-0.1 -0.33,-0.19 -0.49,-0.3c-0.01,-0.01 -0.03,-0.02 -0.04,-0.03C5.39,17.16 4,14.74 4,12c0,-1.85 0.64,-3.54 1.7,-4.89l9.73,9.73C15.16,17.33 15,17.9 15,18.5c0,1.93 1.57,3.5 3.5,3.5c0.6,0 1.17,-0.16 1.66,-0.43l1.13,1.13l1.41,-1.41L2.71,1.29z"/> + android:pathData="M11.29,14.71L7,10.41V13H5V7h6v2H8.41l4.29,4.29L11.29,14.71zM21,3H3C1.9,3 1,3.9 1,5v14c0,1.1 0.9,2 2,2h10v0v-2H3V5h18v8h2V5C23,3.9 22.1,3 21,3zM19,15c-1.66,0 -3,1.34 -3,3s1.34,3 3,3s3,-1.34 3,-3S20.66,15 19,15z"/> </vector> diff --git a/packages/SystemUI/res/layout/controls_detail_dialog.xml b/packages/SystemUI/res/layout/controls_detail_dialog.xml index d61122fd47dd..ee5315ad782f 100644 --- a/packages/SystemUI/res/layout/controls_detail_dialog.xml +++ b/packages/SystemUI/res/layout/controls_detail_dialog.xml @@ -42,6 +42,7 @@ android:layout_height="1dp" /> <ImageView android:id="@+id/control_detail_open_in_app" + android:contentDescription="@string/controls_open_app" android:src="@drawable/ic_open_in_new" android:background="?android:attr/selectableItemBackgroundBorderless" android:tint="@color/control_primary_text" diff --git a/packages/SystemUI/res/layout/quick_settings_footer.xml b/packages/SystemUI/res/layout/quick_settings_footer.xml index 846c5386dd06..15f398aa52e6 100644 --- a/packages/SystemUI/res/layout/quick_settings_footer.xml +++ b/packages/SystemUI/res/layout/quick_settings_footer.xml @@ -23,7 +23,7 @@ android:paddingStart="@dimen/qs_footer_padding_start" android:paddingEnd="@dimen/qs_footer_padding_end" android:gravity="center_vertical" - android:background="?android:attr/colorPrimary" > + android:background="@android:color/transparent"> <TextView android:id="@+id/footer_text" @@ -32,7 +32,7 @@ android:gravity="start" android:layout_weight="1" android:textAppearance="@style/TextAppearance.QS.TileLabel" - android:textColor="?android:attr/textColorSecondary"/> + style="@style/qs_security_footer"/> <ImageView android:id="@+id/footer_icon" @@ -40,6 +40,6 @@ android:layout_height="@dimen/qs_footer_icon_size" android:contentDescription="@null" android:src="@drawable/ic_info_outline" - android:tint="?android:attr/textColorSecondary"/> + style="@style/qs_security_footer"/> </LinearLayout> diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index 06fa15494857..45d4cb4c191d 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Wys boaan die gespreksafdeling, verskyn as \'n swewende borrel, wys profielfoto op sluitskerm"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Instellings"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioriteit"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> steun nie gesprekskenmerke nie"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Geen onlangse borrels nie"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Onlangse borrels en borrels wat toegemaak is, sal hier verskyn"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Hierdie kennisgewings kan nie gewysig word nie."</string> @@ -1014,11 +1013,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Stelselnavigasie is opgedateer. Gaan na Instellings toe om veranderinge te maak."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Gaan na Instellings toe om stelselnavigasie op te dateer"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Bystandmodus"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"Gesprek is op prioriteit gestel"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Prioriteitgesprekke sal:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Wys boaan gespreksafdeling"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Wys profielprent op slotskerm"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Verskyn as \'n swewende borrel bo-oor programme"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Onderbreek Moenie Steur Nie"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Het dit"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Instellings"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Vergrotingoorleggervenster"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Vergrotingvenster"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Vergrotingvensterkontroles"</string> diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index e8df135c8aea..a88be367da78 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"በውይይት ክፍል አናት ላይ ያሳያል፣ እንደ ተንሳፋፊ አረፋ ብቅ ይላል፣ በቆልፍ ማያ ገጽ ላይ የመገለጫ ሥዕልን ያሳያል"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ቅንብሮች"</string> <string name="notification_priority_title" msgid="2079708866333537093">"ቅድሚያ"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> የውይይት ባህሪያትን አይደግፍም"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"ምንም የቅርብ ጊዜ አረፋዎች የሉም"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"የቅርብ ጊዜ አረፋዎች እና የተሰናበቱ አረፋዎች እዚህ ብቅ ይላሉ"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"እነዚህ ማሳወቂያዎች ሊሻሻሉ አይችሉም።"</string> @@ -1014,11 +1013,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"የስርዓት ዳሰሳ ተዘምኗል። ለውጦችን ለማድረግ ወደ ቅንብሮች ይሂዱ።"</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"የስርዓት ዳሰሳን ለማዘመን ወደ ቅንብሮች ይሂዱ"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ተጠባባቂ"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"ልወጣ ወደ ቅድሚያ ተቀናብሯል"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"ቅድሚያ የሚሰጣቸው ልወጣዎች እነዚህን ያደርጋሉ፦"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"በውይይት ክፍል አናት ላይ አአሳይ"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"የመገለጫ ስዕልን በማያ ገጽ ቁልፍ ላይ አሳይ"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"በመተግበሪያዎች ላይ እንደ ተንሳፋፊ አረፋ ሆኖ ይታያሉ"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"አትረብሽን አቋርጥ"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"ገባኝ"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"ቅንብሮች"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"የማጉያ ንብርብር መስኮት"</string> <string name="magnification_window_title" msgid="4863914360847258333">"የማጉያ መስኮት"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"የማጉያ መስኮት መቆጣጠሪያዎች"</string> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index 38e3c20c48e0..2a0af5df1490 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -604,21 +604,21 @@ <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"تفعيل"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"إيقاف"</string> <string name="accessibility_output_chooser" msgid="7807898688967194183">"تبديل جهاز الاستماع"</string> - <string name="screen_pinning_title" msgid="9058007390337841305">"تم تثبيت التطبيق"</string> + <string name="screen_pinning_title" msgid="9058007390337841305">"تم تثبيت الشاشة على التطبيق"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"يؤدي هذا إلى استمرار عرض الشاشة المُختارة إلى أن تتم إزالة تثبيتها. المس مع الاستمرار الزرين \"رجوع\" و\"نظرة عامة\" لإزالة التثبيت."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"يؤدي هذا إلى استمرار عرض الشاشة المُختارة إلى أن تتم إزالة تثبيتها. المس مع الاستمرار الزرين \"رجوع\" و\"الشاشة الرئيسية\" لإزالة التثبيت."</string> <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"يؤدي هذا إلى استمرار عرض الشاشة المُختارة إلى أن تتم إزالة تثبيتها. مرّر الشاشة بسرعة للأعلى مع الاستمرار لإزالة تثبيت الشاشة."</string> <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"يؤدي هذا إلى استمرار عرض الشاشة المُختارة إلى أن تتم إزالة تثبيتها. المس مع الاستمرار زر \"نظرة عامة\" لإزالة التثبيت."</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"يؤدي هذا إلى استمرار عرض الشاشة المُختارة إلى أن تتم إزالة تثبيتها. المس مع الاستمرار زر \"الشاشة الرئيسية\" لإزالة التثبيت."</string> <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"يمكن الوصول إلى البيانات الشخصية (مثلاً جهات الاتصال ومحتوى الرسائل الإلكترونية)"</string> - <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"يمكن للتطبيق المثبَّت فتح تطبيقات أخرى."</string> - <string name="screen_pinning_toast" msgid="8177286912533744328">"لإزالة تثبيت هذا التطبيق، المس مع الاستمرار زرّي \"رجوع\" و\"نظرة عامة\"."</string> - <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"لإزالة تثبيت هذا التطبيق، المس مع الاستمرار زرّي \"رجوع\" و\"الشاشة الرئيسية\"."</string> - <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"مرّر الشاشة بسرعة للأعلى مع الاستمرار لإزالة تثبيت هذا التطبيق."</string> + <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"عند تثبيت الشاشة على تطبيق معيّن، سيظل بإمكان التطبيق فتح تطبيقات أخرى."</string> + <string name="screen_pinning_toast" msgid="8177286912533744328">"لإلغاء تثبيت الشاشة على هذا التطبيق، المس مع الاستمرار زرّي \"الرجوع\" و\"لمحة عامة\" (رمز المربّع)."</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"لإلغاء تثبيت الشاشة على هذا التطبيق، المس مع الاستمرار زرّي \"الرجوع\" و\"الشاشة الرئيسية\"."</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"لإلغاء تثبيت الشاشة على هذا التطبيق، اسحب بسرعة للأعلى مع إبقاء الإصبع على الشاشة."</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"حسنًا"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"لا، شكرًا"</string> - <string name="screen_pinning_start" msgid="7483998671383371313">"تم تثبيت التطبيق."</string> - <string name="screen_pinning_exit" msgid="4553787518387346893">"تمت إزالة تثبيت التطبيق"</string> + <string name="screen_pinning_start" msgid="7483998671383371313">"تم تثبيت الشاشة على التطبيق."</string> + <string name="screen_pinning_exit" msgid="4553787518387346893">"تم إلغاء تثبيت الشاشة"</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"هل تريد إخفاء <xliff:g id="TILE_LABEL">%1$s</xliff:g>؟"</string> <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"سيظهر مرة أخرى عند تمكينه في الإعدادات المرة التالية."</string> <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"إخفاء"</string> @@ -725,14 +725,13 @@ <string name="notification_bubble_title" msgid="8330481035191903164">"فقاعة"</string> <string name="notification_channel_summary_low" msgid="4860617986908931158">"بدون صوت أو اهتزاز"</string> <string name="notification_conversation_summary_low" msgid="1734433426085468009">"بدون صوت أو اهتزاز وتظهر في موضع أسفل في قسم المحادثات"</string> - <string name="notification_channel_summary_default" msgid="3282930979307248890">"يمكن الرن أو الاهتزاز بناءً على إعدادات الهاتف"</string> - <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"يمكن الرن أو الاهتزاز بناءً على إعدادات الهاتف. تظهر المحادثات من <xliff:g id="APP_NAME">%1$s</xliff:g> كفقاعات تلقائيًا."</string> + <string name="notification_channel_summary_default" msgid="3282930979307248890">"يمكن إصدار رنين أو اهتزاز بناءً على إعدادات الهاتف"</string> + <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"يمكن إصدار رنين أو اهتزاز بناءً على إعدادات الهاتف. تظهر المحادثات من <xliff:g id="APP_NAME">%1$s</xliff:g> كفقاعات تلقائيًا."</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"يلفِت هذا الإشعار انتباهك لهذا المحتوى باستخدام اختصار عائم."</string> <string name="notification_channel_summary_priority" msgid="7952654515769021553">"تظهر في أعلى قسم المحادثات وتظهر كفقاعة عائمة وتعرض صورة الملف الشخصي على شاشة القفل"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"الإعدادات"</string> <string name="notification_priority_title" msgid="2079708866333537093">"الأولوية"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"لا يدعم تطبيق <xliff:g id="APP_NAME">%1$s</xliff:g> ميزات المحادثات."</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"ليس هناك فقاعات محادثات"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"ستظهر هنا أحدث فقاعات المحادثات وفقاعات المحادثات التي تم إغلاقها."</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"يتعذّر تعديل هذه الإشعارات."</string> @@ -1034,11 +1033,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"تم تحديث التنقل داخل النظام. لإجراء التغييرات، يُرجى الانتقال إلى \"الإعدادات\"."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"الانتقال إلى \"الإعدادات\" لتعديل التنقل داخل النظام"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"وضع الاستعداد"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"تم ضبط المحادثة على أنها ذات أولوية"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"المحادثات ذات الأولوية:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"تظهر في أعلى قسم المحادثات"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"تظهر صورة الملف الشخصي على شاشة القفل"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"تظهر كفقاعة عائمة فوق التطبيقات"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"لا تتقيّد بميزة \"عدم الإزعاج\""</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"حسنًا"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"الإعدادات"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"نافذة تراكب التكبير"</string> <string name="magnification_window_title" msgid="4863914360847258333">"نافذة التكبير"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"عناصر التحكم في نافذة التكبير"</string> diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index 9b36f9a1a235..e3fd2cb16ec2 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"বাৰ্তালাপ শাখাটোৰ শীৰ্ষত দেখুৱায়, ওপঙা বাবল হিচাপে দেখা পোৱা যায়, লক স্ক্ৰীনত প্ৰ’ফাইলৰ চিত্ৰ প্ৰদৰ্শন কৰে"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ছেটিংসমূহ"</string> <string name="notification_priority_title" msgid="2079708866333537093">"অগ্ৰাধিকাৰ"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g>এ বাৰ্তালাপৰ সুবিধাসমূহ সমৰ্থন নকৰে"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"কোনো শেহতীয়া bubbles নাই"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"শেহতীয়া bubbles আৰু অগ্ৰাহ্য কৰা bubbles ইয়াত প্ৰদর্শিত হ\'ব"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"এই জাননীসমূহ সংশোধন কৰিব নোৱাৰি।"</string> @@ -1014,11 +1013,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"ছিষ্টেম নেভিগেশ্বন আপডে’ট কৰা হ’ল। সলনি কৰিবলৈ ছেটিংসমূহ-লৈ যাওক।"</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"ছিষ্টেম নেভিগেশ্বন আপডে’ট কৰিবলৈ ছেটিংসমূহ-লৈ যাওক"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ষ্টেণ্ডবাই"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"বাৰ্তালাপসমূহ অগ্ৰাধিকাৰপ্ৰাপ্ত হিচাপে ছেট কৰা হৈছে"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"অগ্ৰাধিকাৰপ্ৰাপ্ত বাৰ্তালাপসমূহে এইসমূহ কৰিব:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"বাৰ্তালাপ শাখাটোৰ শীৰ্ষত দেখুৱাওক"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"লক স্ক্ৰীনত প্ৰ\'ফাইল-চিত্ৰ দেখুৱাওক"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"এপ্সমূহৰ ওপৰত ওপঙা বাবল হিচাপে দেখা পোৱা যাব"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"অসুবিধা নিদিব সুবিধাটোত ব্যাঘাত জন্মাওক"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"বুজি পালোঁ"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"ছেটিংসমূহ"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"বিবৰ্ধন অ’ভাৰলে’ৰ ৱিণ্ড’"</string> <string name="magnification_window_title" msgid="4863914360847258333">"বিবৰ্ধন ৱিণ্ড’"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"বিবৰ্ধন ৱিণ্ড’ৰ নিয়ন্ত্ৰণসমূহ"</string> diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index 502044e3b9d9..0adee8c23d0e 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Söhbət bölməsinin yuxarısında göstərilir, üzən qabarcıq kimi görünür, kilid ekranında profil şəkli göstərir"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Ayarlar"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritet"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> söhbət funksiyalarını dəstəkləmir"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Yumrucuqlar yoxdur"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Son yumrucuqlar və buraxılmış yumrucuqlar burada görünəcək"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Bu bildirişlər dəyişdirilə bilməz."</string> @@ -1014,11 +1013,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Sistem naviqasiyası yeniləndi. Dəyişiklik etmək üçün Ayarlara daxil olun."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Sistem naviqasiyasını yeniləmək üçün Ayarlara keçin"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Gözləmə rejimi"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"Söhbət prioritet olaraq ayarlanıb"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Prioritet söhbətlər bunları edəcək:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Söhbət bölməsinin yuxarısında göstərilir"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Kilid ekranında profil şəkli göstərilir"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Tətbiqlərin üzərində üzən qabarcıq kimi görünəcək"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Narahat Etməyin rejimində göstərilsin"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Anladım"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Ayarlar"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Böyütmə Üst-üstə Düşən Pəncərəsi"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Böyütmə Pəncərəsi"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Böyütmə Pəncərəsi Kontrolları"</string> diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index 00e375c70614..868d1cb64b0b 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -722,8 +722,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Prikazuje se u vrhu odeljka za konverzacije kao plutajući oblačić, prikazuje sliku profila na zaključanom ekranu"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Podešavanja"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritet"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> ne podržava funkcije konverzacije"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nema nedavnih oblačića"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Ovde se prikazuju nedavni i odbačeni oblačići"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Ova obaveštenja ne mogu da se menjaju."</string> @@ -1019,11 +1018,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Navigacija sistema je ažurirana. Da biste uneli izmene, idite u Podešavanja."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Idite u Podešavanja da biste ažurirali navigaciju sistema"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Stanje pripravnosti"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"Konverzacija je podešena na prioritetnu"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Prioritetne konverzacije će:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Prikazuje se u vrhu odeljka za konverzacije"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Prikazuje sliku profila na zaključanom ekranu"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Prikazuju se plutajući oblačići preko aplikacija"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Ometa podešavanje Ne uznemiravaj"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Važi"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Podešavanja"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Preklopni prozor za uvećanje"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Prozor za uvećanje"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Kontrole prozora za uvećanje"</string> @@ -1060,7 +1062,7 @@ <string name="controls_pin_wrong" msgid="6162694056042164211">"Pogrešan PIN"</string> <string name="controls_pin_verifying" msgid="3755045989392131746">"Verifikuje se…"</string> <string name="controls_pin_instructions" msgid="6363309783822475238">"Unesite PIN"</string> - <string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Probajte pomoću drugog PIN-a"</string> + <string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Probajte drugi PIN"</string> <string name="controls_confirmation_confirming" msgid="2596071302617310665">"Potvrđuje se…"</string> <string name="controls_confirmation_message" msgid="7744104992609594859">"Potvrdite promenu za: <xliff:g id="DEVICE">%s</xliff:g>"</string> <string name="controls_structure_tooltip" msgid="4355922222944447867">"Prevucite da biste videli još"</string> @@ -1074,5 +1076,5 @@ <string name="controls_in_progress" msgid="4421080500238215939">"U toku"</string> <string name="controls_added_tooltip" msgid="4842812921719153085">"Zadržite dugme za uključivanje da biste videli nove kontrole"</string> <string name="controls_menu_add" msgid="4447246119229920050">"Dodaj kontrole"</string> - <string name="controls_menu_edit" msgid="890623986951347062">"Izmenite kontrole"</string> + <string name="controls_menu_edit" msgid="890623986951347062">"Izmeni kontrole"</string> </resources> diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index cb3aed5fc089..04cd56a5c9e7 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -725,8 +725,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Паказваецца ўверсе раздзела размоў у выглядзе ўсплывальнага апавяшчэння, а на экране блакіроўкі – у выглядзе відарыса профілю"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Налады"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Прыярытэт"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> не падтрымлівае функцыі размовы"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Няма нядаўніх усплывальных апавяшчэнняў"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Нядаўнія і адхіленыя ўсплывальныя апавяшчэнні будуць паказаны тут"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Гэтыя апавяшчэнні нельга змяніць."</string> @@ -1024,11 +1023,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Навігацыя ў сістэме абноўлена. Каб унесці змяненні, перайдзіце ў Налады."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Перайдзіце ў Налады, каб абнавіць параметры навігацыі ў сістэме"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Рэжым чакання"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"Размова пазначана як прыярытэтная"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Прыярытэтныя размовы будуць:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Паказваюцца ўверсе раздзела размоў"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Паказваюць відарыс профілю на экране блакіроўкі"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Паказваюцца як рухомыя апавяшчэнні паверх праграм"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Паказваюцца ў рэжыме \"Не турбаваць\""</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Зразумела"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Налады"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Акно-накладка з павелічэннем"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Акно павелічэння"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Налады акна павелічэння"</string> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index 66613490a073..034217cc01f4 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Показва се като плаващо балонче в горната част на секцията с разговори и показва снимката на потребителския профил на заключения екран"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Настройки"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Приоритет"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> не поддържа функциите за разговор"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Няма скорошни балончета"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Скорошните и отхвърлените балончета ще се показват тук"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Тези известия не могат да бъдат променяни."</string> @@ -1014,11 +1013,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Режимът за навигиране в системата е актуализиран. За да извършите промени, отворете настройките."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Отворете настройките, за да актуализирате режима за навигиране в системата"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Режим на готовност"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"Разговорът е зададен като приоритетен"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Приоритетните разговори ще:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Показване върху секцията с разговори"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Показване на снимката на потр. профил на закл. екран"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Показва се като плаващо балонче върху приложенията"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Прекъсване на режима „Не безпокойте“"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Разбрах"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Настройки"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Прозорец с наслагване за ниво на мащаба"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Прозорец за ниво на мащаба"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Контроли за прозореца за ниво на мащаба"</string> diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index 74d903cf61c8..7482dfef749a 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"কথোপকথন বিভাগের উপরে ভাসমান বাবলের মতো দেখা যাবে, লক স্ক্রিনে প্রোফাইল ছবি দেখাবে"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"সেটিংস"</string> <string name="notification_priority_title" msgid="2079708866333537093">"অগ্রাধিকার"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g>-এ কথোপকথন ফিচার কাজ করে না"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"কোনও সাম্প্রতিক বাবল নেই"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"সাম্প্রতিক ও বাতিল করা বাবল এখানে দেখা যাবে"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"এই বিজ্ঞপ্তিগুলি পরিবর্তন করা যাবে না।"</string> @@ -1014,11 +1013,17 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"সিস্টেম নেভিগেশন আপডেট হয়েছে। পরিবর্তন করার জন্য সেটিংসে যান।"</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"সিস্টেম নেভিগেশন আপডেট করতে সেটিংসে যান"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"স্ট্যান্ডবাই"</string> + <!-- no translation found for priority_onboarding_title (2893070698479227616) --> + <skip /> + <!-- no translation found for priority_onboarding_behavior (5342816047020432929) --> + <skip /> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"কথোপকথনের বিভাগের উপরে দেখান"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"লক স্ক্রিনে প্রোফাইল ছবি দেখান"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"অ্যাপের উপরে একটি ভাসমান বুদবুদ হিসেবে দেখা যাবে"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"বিরক্ত করবে না মোডে ব্যাঘাত ঘটাতে পারে"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"বুঝেছি"</string> + <!-- no translation found for priority_onboarding_settings_button_title (6663601574303585927) --> + <skip /> <string name="magnification_overlay_title" msgid="6584179429612427958">"ওভারলে উইন্ডো বড় করে দেখা"</string> <string name="magnification_window_title" msgid="4863914360847258333">"উইন্ডো বড় করে দেখা"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"উইন্ডো কন্ট্রোল বড় করে দেখা"</string> diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index 67515f7aad08..c049c5f08498 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -724,8 +724,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Prikazuje se na vrhu odjeljka za razgovor, pojavljuje se kao plutajući oblačić, prikazuje sliku profila na zaključanom ekranu"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Postavke"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritetni"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> ne podržava funkcije razgovora"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nema nedavnih oblačića"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Nedavni i odbačeni oblačići će se pojaviti ovdje"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Ta obavještenja se ne mogu izmijeniti."</string> @@ -1021,16 +1020,19 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Navigiranje sistemom je ažurirano. Da izvršite promjene, idite u Postavke."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Idite u Postavke da ažurirate navigiranje sistemom"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Stanje mirovanja"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"Razgovor je postavljen kao prioritetan"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Prioritetni razgovori će:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Prikazuje se na vrhu odjeljka za razgovor"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Prikazuje sliku profila na zaključanom ekranu"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Izgleda kao plutajući oblačić iznad aplikacija"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Prekida način rada Ne ometaj"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Razumijem"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Postavke"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Preklopni prozor za uvećavanje"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Prozor za uvećavanje"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Kontrole prozora za uvećavanje"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Kontrole uređaja"</string> - <string name="quick_controls_subtitle" msgid="1667408093326318053">"Dodavanje kontrola za povezane uređaje"</string> + <string name="quick_controls_subtitle" msgid="1667408093326318053">"Dodajte kontrole za povezane uređaje"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"Postavite kontrole uređaja"</string> <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"Držite dugme za uključivanje da pristupite kontrolama"</string> <string name="controls_providers_title" msgid="6879775889857085056">"Odaberite aplikaciju da dodate kontrole"</string> @@ -1058,7 +1060,7 @@ <string name="controls_dialog_message" msgid="342066938390663844">"Predlaže <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Kontrole su ažurirane"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN sadrži slova ili simbole"</string> - <string name="controls_pin_verify" msgid="3452778292918877662">"Potvrdite <xliff:g id="DEVICE">%s</xliff:g>"</string> + <string name="controls_pin_verify" msgid="3452778292918877662">"Potvrdite uređaj <xliff:g id="DEVICE">%s</xliff:g>"</string> <string name="controls_pin_wrong" msgid="6162694056042164211">"Pogrešan PIN"</string> <string name="controls_pin_verifying" msgid="3755045989392131746">"Potvrđivanje…"</string> <string name="controls_pin_instructions" msgid="6363309783822475238">"Unesite PIN"</string> @@ -1075,6 +1077,6 @@ <string name="controls_error_failed" msgid="960228639198558525">"Greška, pokušajte ponovo"</string> <string name="controls_in_progress" msgid="4421080500238215939">"U toku"</string> <string name="controls_added_tooltip" msgid="4842812921719153085">"Zadržite dugme za uključivanje da vidite nove kontrole"</string> - <string name="controls_menu_add" msgid="4447246119229920050">"Dodavanje kontrola"</string> - <string name="controls_menu_edit" msgid="890623986951347062">"Uređivanje kontrola"</string> + <string name="controls_menu_add" msgid="4447246119229920050">"Dodaj kontrole"</string> + <string name="controls_menu_edit" msgid="890623986951347062">"Uredi kontrole"</string> </resources> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index bca1fa21b51e..506429c2cf79 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -330,7 +330,7 @@ <item quantity="one"><xliff:g id="NUMBER_0">%s</xliff:g> notificació més a l\'interior.</item> </plurals> <string name="notification_summary_message_format" msgid="5158219088501909966">"<xliff:g id="CONTACT_NAME">%1$s</xliff:g>: <xliff:g id="MESSAGE_CONTENT">%2$s</xliff:g>"</string> - <string name="status_bar_notification_inspect_item_title" msgid="6818779631806163080">"Configuració de les notificacions"</string> + <string name="status_bar_notification_inspect_item_title" msgid="6818779631806163080">"Configuració de notificacions"</string> <string name="status_bar_notification_app_settings_title" msgid="5050006438806013903">"Configuració de l\'aplicació <xliff:g id="APP_NAME">%s</xliff:g>"</string> <string name="accessibility_rotation_lock_off" msgid="3880436123632448930">"La pantalla girarà automàticament."</string> <string name="accessibility_rotation_lock_on_landscape" msgid="936972553861524360">"La pantalla està bloquejada en orientació horitzontal."</string> @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Es mostra com a bombolla flotant a la part superior de la secció de converses i mostra la foto de perfil a la pantalla de bloqueig"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Configuració"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritat"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> no admet les funcions de converses"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"No hi ha bombolles recents"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Les bombolles recents i les ignorades es mostraran aquí"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Aquestes notificacions no es poden modificar."</string> @@ -1014,11 +1013,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"S\'ha actualitzat el sistema de navegació. Per fer canvis, ves a Configuració."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Ves a Configuració per actualitzar el sistema de navegació"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"En espera"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"La conversa s\'ha definit com a prioritària"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Les converses prioritàries:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Mostra a la part superior de la secció de converses"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Mostra la foto de perfil a la pantalla de bloqueig"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Es mostra com a bombolla flotant en primer pla"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Interromp el mode No molestis"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Entesos"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Configuració"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Finestra superposada d\'ampliació"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Finestra d\'ampliació"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Finestra de controls d\'ampliació"</string> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index 882c3e819a1b..48ab79e01643 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -725,8 +725,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Zobrazuje se v horní části sekce konverzace a má podobu plovoucí bubliny, zobrazuje profilovou fotku na obrazovce uzamčení"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Nastavení"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Priorita"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"Aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> funkce konverzace nepodporuje"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Žádné nedávné bubliny"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Zde se budou zobrazovat nedávné bubliny a zavřené bubliny"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Tato oznámení nelze upravit."</string> @@ -1024,11 +1023,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Systémová navigace byla aktualizována. Chcete-li provést změny, přejděte do Nastavení."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Přejděte do Nastavení a aktualizujte systémovou navigaci"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Pohotovostní režim"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"Konverzace byla nastavena jako prioritní"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Chování prioritních konverzací:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Zobrazovat v horní části sekce konverzace"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Zobrazovat profilovou fotku na zámku obrazovky"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Zobrazuje se jako plovoucí bublina nad aplikacemi"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Přerušit režim Nerušit"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Rozumím"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Nastavení"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Překryvné zvětšovací okno"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Zvětšovací okno"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Ovládací prvky zvětšovacího okna"</string> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index ecaf84f0b033..8d2d5c5f9adb 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Vises øverst i samtalesektionen, som en svævende boble og med profilbillede på låseskærmen"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Indstillinger"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritet"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> understøtter ikke samtalefunktioner"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Ingen seneste bobler"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Nye bobler og afviste bobler vises her"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Disse notifikationer kan ikke redigeres."</string> @@ -1014,19 +1013,22 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Systemnavigationen blev opdateret. Gå til Indstillinger for at foretage ændringer."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Gå til Indstillinger for at opdatere systemnavigationen"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"Samtalen er angivet som prioritet"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Følgende gælder for prioriterede samtaler:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Vis i toppen af samtalesektionen"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Vis profilbillede på låseskærm"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Vis som en boble oven på apps"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Afbryd Forstyr ikke"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Indstillinger"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Vindue med overlejret forstørrelse"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Vindue med forstørrelse"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Vindue med forstørrelsesstyring"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Enhedsstyring"</string> - <string name="quick_controls_subtitle" msgid="1667408093326318053">"Tilføj betjeningselementer på dine tilsluttede enheder"</string> + <string name="quick_controls_subtitle" msgid="1667408093326318053">"Tilføj styring af dine tilsluttede enheder"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"Konfigurer enhedsstyring"</string> <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"Hold afbryderknappen nede for at få adgang til dine betjeningselementer"</string> - <string name="controls_providers_title" msgid="6879775889857085056">"Vælg en app for at tilføje betjeningselementer"</string> + <string name="controls_providers_title" msgid="6879775889857085056">"Vælg en app for at tilføje styring"</string> <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380"> <item quantity="one"><xliff:g id="NUMBER_1">%s</xliff:g> styringselement er tilføjet.</item> <item quantity="other"><xliff:g id="NUMBER_1">%s</xliff:g> styringselementer er tilføjet.</item> @@ -1067,6 +1069,6 @@ <string name="controls_error_failed" msgid="960228639198558525">"Der opstod en fejl. Prøv igen"</string> <string name="controls_in_progress" msgid="4421080500238215939">"I gang"</string> <string name="controls_added_tooltip" msgid="4842812921719153085">"Hold afbryderknappen nede for at se nye betjeningselementer"</string> - <string name="controls_menu_add" msgid="4447246119229920050">"Tilføj betjeningselementer"</string> - <string name="controls_menu_edit" msgid="890623986951347062">"Rediger betjeningselementer"</string> + <string name="controls_menu_add" msgid="4447246119229920050">"Tilføj styring"</string> + <string name="controls_menu_edit" msgid="890623986951347062">"Rediger styring"</string> </resources> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index 0d7197766b6c..50cb3f3f498e 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -593,20 +593,20 @@ <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"deaktivieren"</string> <string name="accessibility_output_chooser" msgid="7807898688967194183">"Ausgabegerät wechseln"</string> <string name="screen_pinning_title" msgid="9058007390337841305">"App ist auf dem Bildschirm fixiert"</string> - <string name="screen_pinning_description" msgid="8699395373875667743">"Der Bildschirm bleibt so lange eingeblendet, bis du die Fixierung aufhebst. Berühre und halte dazu \"Zurück\" und \"Übersicht\"."</string> - <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Der Bildschirm wird so lange angezeigt, bis du die Fixierung aufhebst. Berühre und halte dazu \"Zurück\" und \"Startbildschirm\"."</string> - <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"Der Bildschirm wird so lange angezeigt, bis du die Fixierung aufhebst. Dazu wischst du nach oben und hältst den Bildschirm gedrückt"</string> - <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"Der Bildschirm bleibt so lange eingeblendet, bis du die Fixierung aufhebst. Berühre und halte dazu \"Übersicht\"."</string> - <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"Der Bildschirm wird so lange angezeigt, bis du die Fixierung aufhebst. Berühre und halte dazu \"Startbildschirm\"."</string> - <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"Zugriff auf personenbezogene Daten wie beispielsweise Kontakte oder E-Mails ist möglich."</string> - <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"Eine auf dem Bildschirm fixierte App kann ggf. andere Apps öffnen."</string> + <string name="screen_pinning_description" msgid="8699395373875667743">"Die App bleibt so lange auf dem Bildschirm fixiert, bis du die Fixierung aufhebst. Berühre und halte dazu \"Zurück\" und \"Übersicht\"."</string> + <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Die App bleibt so lange auf dem Bildschirm fixiert, bis du die Fixierung aufhebst. Berühre und halte dazu \"Zurück\" und \"Startbildschirm\"."</string> + <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"Die App bleibt so lange auf dem Bildschirm fixiert, bis du die Fixierung aufhebst. Wische dazu nach oben und halte den Bildschirm gedrückt."</string> + <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"Die App bleibt so lange auf dem Bildschirm fixiert, bis du die Fixierung aufhebst. Berühre und halte dazu \"Übersicht\"."</string> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"Die App bleibt so lange auf dem Bildschirm fixiert, bis du die Fixierung aufhebst. Berühre und halte dazu \"Startbildschirm\"."</string> + <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"Möglicherweise kann auf personenbezogene Daten (Kontakte, E-Mails usw.) zugegriffen werden."</string> + <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"Die fixierte App kann ggf. andere Apps öffnen."</string> <string name="screen_pinning_toast" msgid="8177286912533744328">"Zum Aufheben der Fixierung dieser App \"Zurück\" und \"Übersicht\" halten"</string> <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"Zum Aufheben der Fixierung dieser App \"Zurück\" und \"Startbildschirm\" halten"</string> - <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"Zum Loslösen der App nach oben wischen und halten"</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"Zum Aufheben der Fixierung nach oben wischen und halten"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"Ok"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"Nein danke"</string> - <string name="screen_pinning_start" msgid="7483998671383371313">"Auf dem Bildschirm fixierte App"</string> - <string name="screen_pinning_exit" msgid="4553787518387346893">"Vom Bildschirm gelöste App"</string> + <string name="screen_pinning_start" msgid="7483998671383371313">"Bildschirm wurde fixiert"</string> + <string name="screen_pinning_exit" msgid="4553787518387346893">"Bildschirmfixierung aufgehoben"</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> ausblenden?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"Sie wird wieder eingeblendet, wenn du sie in den Einstellungen erneut aktivierst."</string> <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"Ausblenden"</string> @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Wird oben im Bereich \"Unterhaltungen\" als unverankerte Bubble mit einem Profilbild auf dem Sperrbildschirm angezeigt"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Einstellungen"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Priorität"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> unterstützt keine Funktionen für Unterhaltungen"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Keine kürzlich geschlossenen Bubbles"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Hier werden aktuelle und geschlossene Bubbles angezeigt"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Diese Benachrichtigungen können nicht geändert werden."</string> @@ -1014,16 +1013,19 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Systemsteuerungseinstellungen wurden angepasst. Änderungen kannst du in den Einstellungen vornehmen."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Gehe zu den Einstellungen, um die Systemsteuerung anzupassen"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"Unterhaltung als vorrangig eingestuft"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Vorrangige Unterhaltungen:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Oben im Bereich \"Unterhaltungen\" anzeigen"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Profilbild auf Sperrbildschirm anzeigen"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Unverankertes Infofeld über anderen Apps"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"\"Bitte nicht stören\" unterbrechen"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Einstellungen"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Overlay-Vergrößerungsfenster"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Vergrößerungsfenster"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Einstellungen für Vergrößerungsfenster"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Gerätesteuerung"</string> - <string name="quick_controls_subtitle" msgid="1667408093326318053">"Karten für deine verbundenen Geräte hinzufügen"</string> + <string name="quick_controls_subtitle" msgid="1667408093326318053">"Steuerelemente für verbundene Geräte hinzufügen"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"Gerätesteuerung einrichten"</string> <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"Halte die Ein-/Aus-Taste gedrückt, um auf die Steuerelemente zuzugreifen."</string> <string name="controls_providers_title" msgid="6879775889857085056">"App zum Hinzufügen von Steuerelementen auswählen"</string> @@ -1039,7 +1041,7 @@ <string name="accessibility_control_change_unfavorite" msgid="6997408061750740327">"Zum Entfernen aus Favoriten"</string> <string name="accessibility_control_move" msgid="8980344493796647792">"Auf Position <xliff:g id="NUMBER">%d</xliff:g> verschieben"</string> <string name="controls_favorite_default_title" msgid="967742178688938137">"Steuerelemente"</string> - <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Karten auswählen, auf die man über das Ein-/Aus-Menü zugreifen kann"</string> + <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Steuerelemente auswählen, auf die man über das Ein-/Aus-Menü zugreifen kann"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Zum Verschieben von Steuerelementen halten und ziehen"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Alle Steuerelemente entfernt"</string> <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Änderungen nicht gespeichert"</string> @@ -1067,6 +1069,6 @@ <string name="controls_error_failed" msgid="960228639198558525">"Fehler – versuch es noch mal"</string> <string name="controls_in_progress" msgid="4421080500238215939">"Läuft"</string> <string name="controls_added_tooltip" msgid="4842812921719153085">"Zum Anzeigen der Karten für neue Geräte Ein-/Aus-Taste gedrückt halten"</string> - <string name="controls_menu_add" msgid="4447246119229920050">"Gerätekarten hinzufügen"</string> - <string name="controls_menu_edit" msgid="890623986951347062">"Gerätekarten bearbeiten"</string> + <string name="controls_menu_add" msgid="4447246119229920050">"Steuerelemente hinzufügen"</string> + <string name="controls_menu_edit" msgid="890623986951347062">"Steuerelemente bearbeiten"</string> </resources> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index ca8e555a6738..6a32d57f950c 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Εμφανίζεται στο επάνω μέρος της ενότητας συζητήσεων, προβάλλεται ως κινούμενο συννεφάκι, εμφανίζει τη φωτογραφία προφίλ στην οθόνη κλειδώματος"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Ρυθμίσεις"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Προτεραιότητα"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> δεν υποστηρίζει τις λειτουργίες συζήτησης"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Δεν υπάρχουν πρόσφατα συννεφάκια"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Τα πρόσφατα συννεφάκια και τα συννεφάκια που παραβλέψατε θα εμφανίζονται εδώ."</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Δεν είναι δυνατή η τροποποίηση αυτών των ειδοποιήσεων"</string> @@ -1014,11 +1013,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Η πλοήγηση συστήματος ενημερώθηκε. Για να κάνετε αλλαγές, μεταβείτε στις Ρυθμίσεις."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Μεταβείτε στις Ρυθμίσεις για να ενημερώσετε την πλοήγηση συστήματος"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Κατάσταση αναμονής"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"Ορίστηκε ως συζήτηση προτεραιότητας"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Οι συζητήσεις προτεραιότητας θα:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Εμφάνιση στο επάνω μέρος της ενότητας συνομιλιών"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Εμφάνιση εικόνας προφίλ στην οθόνη κλειδώματος"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Κινούμενο συννεφάκι στο επάνω μέρος των εφαρμογών"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Διακοπή λειτουργίας Μην ενοχλείτε"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Το κατάλαβα"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Ρυθμίσεις"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Παράθυρο επικάλυψης μεγέθυνσης"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Παράθυρο μεγέθυνσης"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Στοιχεία ελέγχου παραθύρου μεγέθυνσης"</string> diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index eb71c5673ae4..35f09af553d4 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Shows at top of conversation section, appears as floating bubble, displays profile picture on lock screen"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Settings"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Priority"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> doesn’t support conversation features"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"No recent bubbles"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Recent bubbles and dismissed bubbles will appear here"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"These notifications can\'t be modified."</string> @@ -1014,11 +1013,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"System navigation updated. To make changes, go to Settings."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Go to Settings to update system navigation"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"Conversation set to priority"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Priority conversations will:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Show at top of conversation section"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Show profile picture on lock screen"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Appear as a floating bubble on top of apps"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Interrupt Do Not Disturb"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Settings"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Magnification overlay window"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Magnification window"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Magnification window controls"</string> diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml index fbc603a07451..8c8db6aefcbd 100644 --- a/packages/SystemUI/res/values-en-rCA/strings.xml +++ b/packages/SystemUI/res/values-en-rCA/strings.xml @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Shows at top of conversation section, appears as floating bubble, displays profile picture on lock screen"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Settings"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Priority"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> doesn’t support conversation features"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"No recent bubbles"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Recent bubbles and dismissed bubbles will appear here"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"These notifications can\'t be modified."</string> @@ -1014,11 +1013,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"System navigation updated. To make changes, go to Settings."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Go to Settings to update system navigation"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"Conversation set to priority"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Priority conversations will:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Show at top of conversation section"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Show profile picture on lock screen"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Appear as a floating bubble on top of apps"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Interrupt Do Not Disturb"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Settings"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Magnification overlay window"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Magnification window"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Magnification window controls"</string> diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index eb71c5673ae4..35f09af553d4 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Shows at top of conversation section, appears as floating bubble, displays profile picture on lock screen"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Settings"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Priority"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> doesn’t support conversation features"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"No recent bubbles"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Recent bubbles and dismissed bubbles will appear here"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"These notifications can\'t be modified."</string> @@ -1014,11 +1013,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"System navigation updated. To make changes, go to Settings."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Go to Settings to update system navigation"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"Conversation set to priority"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Priority conversations will:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Show at top of conversation section"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Show profile picture on lock screen"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Appear as a floating bubble on top of apps"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Interrupt Do Not Disturb"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Settings"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Magnification overlay window"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Magnification window"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Magnification window controls"</string> diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index eb71c5673ae4..35f09af553d4 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Shows at top of conversation section, appears as floating bubble, displays profile picture on lock screen"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Settings"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Priority"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> doesn’t support conversation features"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"No recent bubbles"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Recent bubbles and dismissed bubbles will appear here"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"These notifications can\'t be modified."</string> @@ -1014,11 +1013,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"System navigation updated. To make changes, go to Settings."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Go to Settings to update system navigation"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"Conversation set to priority"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Priority conversations will:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Show at top of conversation section"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Show profile picture on lock screen"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Appear as a floating bubble on top of apps"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Interrupt Do Not Disturb"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Settings"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Magnification overlay window"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Magnification window"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Magnification window controls"</string> diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml index 5e021c51fcca..e514ccbd8e83 100644 --- a/packages/SystemUI/res/values-en-rXC/strings.xml +++ b/packages/SystemUI/res/values-en-rXC/strings.xml @@ -1013,11 +1013,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"System navigation updated. To make changes, go to Settings."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Go to Settings to update system navigation"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"Conversation set to priority"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Priority conversations will:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Show at top of conversation section"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Show profile picture on lock screen"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Appear as a floating bubble on top of apps"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Interrupt Do Not Disturb"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Got it"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Settings"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Magnification Overlay Window"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Magnification Window"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Magnification Window Controls"</string> @@ -1061,7 +1064,8 @@ <string name="controls_media_close_session" msgid="9023534788828414585">"Close this media session"</string> <string name="controls_error_timeout" msgid="794197289772728958">"Inactive, check app"</string> <string name="controls_error_retryable" msgid="864025882878378470">"Error, retrying…"</string> - <string name="controls_error_removed" msgid="6299213591234723805">"Device removed"</string> + <!-- no translation found for controls_error_removed (6299213591234723805) --> + <skip /> <string name="controls_error_generic" msgid="352500456918362905">"Can’t load status"</string> <string name="controls_error_failed" msgid="960228639198558525">"Error, try again"</string> <string name="controls_in_progress" msgid="4421080500238215939">"In progress"</string> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index 5b3aada2d74e..b1a742700297 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Aparece en la parte superior de la sección de conversaciones, en forma de burbuja flotante, y muestra la foto de perfil en la pantalla de bloqueo"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Configuración"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioridad"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> no admite funciones de conversación"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"No hay burbujas recientes"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Las burbujas recientes y las que se descartaron aparecerán aquí"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"No se pueden modificar estas notificaciones."</string> @@ -1014,11 +1013,17 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Se actualizó el sistema de navegación. Para hacer cambios, ve a Configuración."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Ve a Configuración para actualizar la navegación del sistema"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"En espera"</string> + <!-- no translation found for priority_onboarding_title (2893070698479227616) --> + <skip /> + <!-- no translation found for priority_onboarding_behavior (5342816047020432929) --> + <skip /> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Se muestran en la parte superior de conversaciones"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Muestran una foto de perfil en pantalla de bloqueo"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Aparecen como burbujas flotantes encima de apps"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Suspender No interrumpir"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Entendido"</string> + <!-- no translation found for priority_onboarding_settings_button_title (6663601574303585927) --> + <skip /> <string name="magnification_overlay_title" msgid="6584179429612427958">"Ventana superpuesta de ampliación"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Ventana de ampliación"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Controles de ampliación de la ventana"</string> @@ -1040,7 +1045,7 @@ <string name="accessibility_control_move" msgid="8980344493796647792">"Mover a la posición <xliff:g id="NUMBER">%d</xliff:g>"</string> <string name="controls_favorite_default_title" msgid="967742178688938137">"Controles"</string> <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Elige los controles a los que quieres acceder desde el menú de encendido"</string> - <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Mantén presionado y arrastra para reorganizar los controles"</string> + <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Mantén presionado y arrastra un control para reubicarlo"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Se quitaron todos los controles"</string> <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"No se guardaron los cambios"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"No se cargó la lista completa de controles."</string> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 4c574c2872f5..f210fbb48fec 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -514,7 +514,7 @@ <string name="notification_section_header_gentle" msgid="6804099527336337197">"Silenciadas"</string> <string name="notification_section_header_alerting" msgid="5581175033680477651">"Notificaciones"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversaciones"</string> - <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Borrar todas las notificaciones silenciadas"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Borrar todas las notificaciones silenciosas"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notificaciones pausadas por el modo No molestar"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Empezar ahora"</string> <string name="empty_shade_text" msgid="8935967157319717412">"No hay notificaciones"</string> @@ -598,11 +598,11 @@ <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"Se mantiene visible hasta que dejas de fijarla. Para ello, desliza el dedo hacia arriba y mantén pulsado."</string> <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"La pantalla se mantiene visible hasta que dejas de fijarla. Para ello, mantén pulsado el botón Aplicaciones recientes."</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"La pantalla se mantiene visible hasta que dejas de fijarla. Para ello, mantén pulsado el botón Inicio."</string> - <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"Quizá se pueda acceder a datos personales, como contactos o el contenido de correos."</string> + <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"Es posible que se revelen datos personales, como contactos o el contenido de correos."</string> <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"Se pueden abrir otras aplicaciones desde aplicaciones fijadas."</string> <string name="screen_pinning_toast" msgid="8177286912533744328">"Para dejar de fijar esta aplicación, mantén pulsados los botones Atrás y Aplicaciones recientes"</string> <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"Para dejar de fijar esta aplicación, mantén pulsados los botones Atrás e Inicio"</string> - <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"Para dejar de fijar esta aplicación, desliza el dedo hacia arriba y mantén pulsada la pantalla"</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"Para dejar de fijar esta aplicación, desliza el dedo hacia arriba y mantenlo pulsado"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"Entendido"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"No, gracias"</string> <string name="screen_pinning_start" msgid="7483998671383371313">"Aplicación fijada"</string> @@ -709,18 +709,17 @@ <string name="inline_turn_off_notifications" msgid="8543989584403106071">"Desactivar notificaciones"</string> <string name="inline_keep_showing_app" msgid="4393429060390649757">"¿Quieres seguir viendo las notificaciones de esta aplicación?"</string> <string name="notification_silence_title" msgid="8608090968400832335">"Silencio"</string> - <string name="notification_alert_title" msgid="3656229781017543655">"Predeterminada"</string> + <string name="notification_alert_title" msgid="3656229781017543655">"Predeterminado"</string> <string name="notification_bubble_title" msgid="8330481035191903164">"Burbuja"</string> <string name="notification_channel_summary_low" msgid="4860617986908931158">"Sin sonido ni vibración"</string> <string name="notification_conversation_summary_low" msgid="1734433426085468009">"Sin sonido ni vibración y se muestra más abajo en la sección de conversaciones"</string> - <string name="notification_channel_summary_default" msgid="3282930979307248890">"Según los ajustes definidos en el teléfono, es posible que suene o vibre"</string> - <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Según los ajustes definidos en el teléfono, es posible que suene o vibre. Las conversaciones de <xliff:g id="APP_NAME">%1$s</xliff:g> aparecen como burbujas de forma predeterminada."</string> + <string name="notification_channel_summary_default" msgid="3282930979307248890">"Es posible que suene o vibre según los ajustes del teléfono"</string> + <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Es posible que suene o vibre según los ajustes del teléfono. Las conversaciones de <xliff:g id="APP_NAME">%1$s</xliff:g> aparecen como burbujas de forma predeterminada."</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Llama tu atención con un acceso directo flotante a este contenido."</string> <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Se muestra en la parte superior de la sección de conversaciones en forma de burbuja flotante, y la imagen de perfil aparece en la pantalla de bloqueo"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Ajustes"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioridad"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"No se pueden usar funciones de conversación con <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"No hay burbujas recientes"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Las burbujas recientes y las cerradas aparecerán aquí"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Estas notificaciones no se pueden modificar."</string> @@ -1014,16 +1013,19 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Se ha actualizado la navegación del sistema. Para hacer cambios, ve a Ajustes."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Ve a Ajustes para actualizar la navegación del sistema"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"En espera"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"Conversación marcada como prioritaria"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Las conversaciones prioritarias:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Se muestran en la parte superior de la sección de conversaciones"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Muestran tu imagen de perfil en la pantalla de bloqueo"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Aparecen como burbuja sobre las aplicaciones"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Interrumpen el modo No molestar"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Entendido"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Ajustes"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Ventana de superposición de ampliación"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Ventana de ampliación"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Ventana de controles de ampliación"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Control de dispositivos"</string> - <string name="quick_controls_subtitle" msgid="1667408093326318053">"Añade controles a tus dispositivos conectados"</string> + <string name="quick_controls_subtitle" msgid="1667408093326318053">"Añade controles para tus dispositivos conectados"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"Configurar control de dispositivos"</string> <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"Mantén pulsado el botón de encendido para acceder a tus controles"</string> <string name="controls_providers_title" msgid="6879775889857085056">"Elige una aplicación para añadir controles"</string> @@ -1050,7 +1052,7 @@ <string name="controls_dialog_message" msgid="342066938390663844">"Sugerido por <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Controles actualizados"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"El PIN contiene letras o símbolos"</string> - <string name="controls_pin_verify" msgid="3452778292918877662">"Verificar <xliff:g id="DEVICE">%s</xliff:g>"</string> + <string name="controls_pin_verify" msgid="3452778292918877662">"Verifica <xliff:g id="DEVICE">%s</xliff:g>"</string> <string name="controls_pin_wrong" msgid="6162694056042164211">"PIN incorrecto"</string> <string name="controls_pin_verifying" msgid="3755045989392131746">"Verificando…"</string> <string name="controls_pin_instructions" msgid="6363309783822475238">"Introduce el PIN"</string> diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml index 9e90e5edeec9..0d640e13cee7 100644 --- a/packages/SystemUI/res/values-et/strings.xml +++ b/packages/SystemUI/res/values-et/strings.xml @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Kuvatakse vestluste jaotise ülaosas hõljuva mullina ja lukustuskuval kuvatakse profiilipilt"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Seaded"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioriteetne"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> ei toeta vestlusfunktsioone"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Hiljutisi mulle pole"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Siin kuvatakse hiljutised ja suletud mullid."</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Neid märguandeid ei saa muuta."</string> @@ -1014,11 +1013,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Süsteemis navigeerimine on värskendatud. Muutmiseks avage jaotis Seaded."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Süsteemi navigeerimise värskendamiseks avage jaotis Seaded"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Ooterežiim"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"Vestlus määrati prioriteetseks"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Prioriteetsed vestlused teevad järgmist."</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Kuvatakse vestluste jaotise kohal"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Lukustuskuval kuvatakse profiilipilt"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Kuvatakse rakenduste kohal hõljuva mullina"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Funktsioon Mitte segada katkestatakse"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Selge"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Seaded"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Suurendamisakna ülekate"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Suurendamisaken"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Suurendamisakna juhtelemendid"</string> @@ -1040,8 +1042,8 @@ <string name="accessibility_control_move" msgid="8980344493796647792">"Teisalda asendisse <xliff:g id="NUMBER">%d</xliff:g>"</string> <string name="controls_favorite_default_title" msgid="967742178688938137">"Juhtnupud"</string> <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Valige toitemenüüs saadaolevad juhtelemendid"</string> - <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Juhtnuppude ümberpaigutamiseks hoidke neid all ja lohistage"</string> - <string name="controls_favorite_removed" msgid="5276978408529217272">"Kõik juhtnupud eemaldati"</string> + <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Juhtelementide ümberpaigutamiseks hoidke neid all ja lohistage"</string> + <string name="controls_favorite_removed" msgid="5276978408529217272">"Kõik juhtelemendid eemaldati"</string> <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Muudatusi ei salvestatud"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Kõikide juhtelementide loendit ei saanud laadida."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Muu"</string> diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index ac3bd8704617..1cb3148f73eb 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -711,16 +711,15 @@ <string name="notification_silence_title" msgid="8608090968400832335">"Isila"</string> <string name="notification_alert_title" msgid="3656229781017543655">"Balio lehenetsia"</string> <string name="notification_bubble_title" msgid="8330481035191903164">"Burbuila"</string> - <string name="notification_channel_summary_low" msgid="4860617986908931158">"Ez du jotzen tonua edo egiten dar-dar"</string> - <string name="notification_conversation_summary_low" msgid="1734433426085468009">"Ez du jotzen tonua edo egiten dar-dar, eta elkarrizketaren atalaren behealdean agertzen da"</string> + <string name="notification_channel_summary_low" msgid="4860617986908931158">"Ez du tonurik jotzen edo dar-dar egiten"</string> + <string name="notification_conversation_summary_low" msgid="1734433426085468009">"Ez du tonurik jotzen edo dar-dar egiten, eta elkarrizketaren atalaren behealdean agertzen da"</string> <string name="notification_channel_summary_default" msgid="3282930979307248890">"Tonua jo edo dar-dar egin dezake, telefonoaren ezarpenen arabera"</string> <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Tonua jo edo dar-dar egin dezake, telefonoaren ezarpenen arabera. Modu lehenetsian, <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioko elkarrizketak burbuila gisa agertzen dira."</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Eduki honetarako lasterbide gainerakor bat eskaintzen dizu, arretarik gal ez dezazun."</string> <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Burbuila gisa agertzen da elkarrizketen atalaren goialdean, eta profileko argazkia bistaratzen du pantaila blokeatuta dagoenean"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Ezarpenak"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Lehentasuna"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak ez ditu onartzen elkarrizketetarako eginbideak"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Ez dago azkenaldiko burbuilarik"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Azken burbuilak eta baztertutakoak agertuko dira hemen"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Jakinarazpen horiek ezin dira aldatu."</string> @@ -1014,11 +1013,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Eguneratu da sistemaren nabigazioa. Aldaketak egiteko, joan Ezarpenak atalera."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Sistemaren nabigazioa eguneratzeko, joan Ezarpenak atalera"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Egonean"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"Lehentasunezko gisa ezarritako elkarrizketa"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Hau gertatuko da lehentasunezko elkarrizketekin:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Erakutsi elkarrizketen atalaren goialdean"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Erakutsi profileko argazkia pantaila blokeatuan"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Burbuila gainerakor gisa agertuko da aplikazioen gainean"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Eten ez molestatzeko modua"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Ados"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Ezarpenak"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Lupa-leiho gainjarria"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Lupa-leihoa"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Lupa-leihoaren aukerak"</string> @@ -1041,7 +1043,7 @@ <string name="controls_favorite_default_title" msgid="967742178688938137">"Kontrolatzeko aukerak"</string> <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Aukeratu itzaltzeko menutik atzitu nahi dituzun kontrolatzeko aukerak"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Kontrolatzeko aukerak antolatzeko, eduki itzazu sakatuta, eta arrastatu"</string> - <string name="controls_favorite_removed" msgid="5276978408529217272">"Kontrolatzeko aukera guztiak kendu dira"</string> + <string name="controls_favorite_removed" msgid="5276978408529217272">"Kendu dira kontrolatzeko aukera guztiak"</string> <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Ez dira gorde aldaketak"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Ezin izan da kargatu kontrol guztien zerrenda."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Beste bat"</string> @@ -1054,7 +1056,7 @@ <string name="controls_pin_wrong" msgid="6162694056042164211">"PIN okerra"</string> <string name="controls_pin_verifying" msgid="3755045989392131746">"Egiaztatzen…"</string> <string name="controls_pin_instructions" msgid="6363309783822475238">"Idatzi PIN kodea"</string> - <string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Saiatu beste PIN kode batekin"</string> + <string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Saiatu beste PIN batekin"</string> <string name="controls_confirmation_confirming" msgid="2596071302617310665">"Berresten…"</string> <string name="controls_confirmation_message" msgid="7744104992609594859">"Berretsi <xliff:g id="DEVICE">%s</xliff:g> gailuaren aldaketa"</string> <string name="controls_structure_tooltip" msgid="4355922222944447867">"Pasatu hatza aukera gehiago ikusteko"</string> @@ -1067,6 +1069,6 @@ <string name="controls_error_failed" msgid="960228639198558525">"Errorea. Saiatu berriro."</string> <string name="controls_in_progress" msgid="4421080500238215939">"Abian"</string> <string name="controls_added_tooltip" msgid="4842812921719153085">"Eduki sakatuta etengailua kontrolatzeko aukera berriak ikusteko"</string> - <string name="controls_menu_add" msgid="4447246119229920050">"Gehitu kontrolatzeko aukerak"</string> - <string name="controls_menu_edit" msgid="890623986951347062">"Editatu kontrolatzeko aukerak"</string> + <string name="controls_menu_add" msgid="4447246119229920050">"Gehitu aukerak"</string> + <string name="controls_menu_edit" msgid="890623986951347062">"Editatu aukerak"</string> </resources> diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index 207d4a208158..986015ed378c 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"در بالای بخش مکالمه بهصورت حبابک شناور نشان داده میشود و تصویر نمایه را در صفحه قفل نمایش میدهد"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"تنظیمات"</string> <string name="notification_priority_title" msgid="2079708866333537093">"اولویت"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> از ویژگیهای مکالمه پشتیبانی نمیکند"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"هیچ ابزارک اعلان جدیدی وجود ندارد"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"ابزارک اعلان اخیر و ابزارک اعلان ردشده اینجا ظاهر خواهند شد"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"این اعلانها قابل اصلاح نیستند."</string> @@ -1014,11 +1013,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"پیمایش سیستم بهروزرسانی شد. برای انجام تغییرات به «تنظیمات» بروید."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"برای بهروزرسانی پیمایش سیستم، به «تنظیمات» بروید"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"آمادهبهکار"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"مکالمه روی اولویت تنظیم شده است"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"مکالمههای اولویتدار:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"نمایش در بالای بخش مکالمه"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"نمایش تصویر نمایه در صفحه قفل"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"بهشکل ابزارک اعلان شناور روی برنامهها ظاهر میشود"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"وقفه در «مزاحم نشوید»"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"متوجهام"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"تنظیمات"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"پنجره همپوشانی بزرگنمایی"</string> <string name="magnification_window_title" msgid="4863914360847258333">"پنجره بزرگنمایی"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"کنترلهای پنجره بزرگنمایی"</string> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index ed6768caf75e..be04730bc3a9 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Näkyy keskusteluosion yläosassa kelluvana kuplana, profiilikuva näkyy lukitusnäytöllä"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Asetukset"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Tärkeä"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> ei tue keskusteluominaisuuksia"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Ei viimeaikaisia kuplia"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Viimeaikaiset ja äskettäin ohitetut kuplat näkyvät täällä"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Näitä ilmoituksia ei voi muokata"</string> @@ -1014,11 +1013,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Järjestelmän navigointitapa vaihdettu. Voit muuttaa sitä asetuksista."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Vaihda järjestelmän navigointitapaa asetuksista"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Virransäästötila"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"Tärkeäksi merkitty keskustelu"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Tärkeät keskustelut"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Näkyy keskustelukohdan yläosassa"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Profiilikuva näkyy lukitusnäytöllä"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Näkyy kelluvana kuplana sovellusten päällä"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Keskeyttää Älä häiritse ‑tilan"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Selvä"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Asetukset"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Suurennuksen peittoikkuna"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Suurennusikkuna"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Suurennusikkunan ohjaimet"</string> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index e1d5cca477e5..a80e2d3970db 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"S\'affiche en haut de la section des conversations sous forme de bulle flottante et affiche la photo du profil sur l\'écran de verrouillage"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Paramètres"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Priorité"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> ne prend pas en charge les fonctionnalités de conversation"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Aucune bulle récente"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Les bulles récentes et les bulles ignorées s\'afficheront ici"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Ces notifications ne peuvent pas être modifiées"</string> @@ -1014,17 +1013,20 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"La navigation système a été mise à jour. Pour apporter des modifications, accédez au menu Paramètres."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Accédez au menu Paramètres pour mettre à jour la navigation système"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Veille"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"La conversation a été définie comme prioritaire"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Les conversations prioritaires :"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Afficher dans le haut de la section des conversations"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Afficher la photo de profil sur l\'écran verrouillé"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Sous forme de bulle flottante, par-dessus les applis"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Interrompre le mode Ne pas déranger"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Paramètres"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Fenêtre d\'agrandissement superposée"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Fenêtre d\'agrandissement"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Commandes pour la fenêtre d\'agrandissement"</string> - <string name="quick_controls_title" msgid="6839108006171302273">"Commandes de contrôle des appareils"</string> + <string name="quick_controls_title" msgid="6839108006171302273">"Commandes des appareils"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"Ajoutez des commandes pour vos appareils connectés"</string> - <string name="quick_controls_setup_title" msgid="8901436655997849822">"Configurer les commandes de contrôle des appareils"</string> + <string name="quick_controls_setup_title" msgid="8901436655997849822">"Configurer les commandes des appareils"</string> <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"Maintenez l\'interrupteur enfoncé pour accéder à vos commandes"</string> <string name="controls_providers_title" msgid="6879775889857085056">"Sélectionnez l\'application pour laquelle ajouter des commandes"</string> <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380"> @@ -1045,7 +1047,7 @@ <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Modifications non enregistrées"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Impossible de charger la liste des commandes."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Autre"</string> - <string name="controls_dialog_title" msgid="2343565267424406202">"Ajouter aux commandes de contrôle des appareils"</string> + <string name="controls_dialog_title" msgid="2343565267424406202">"Ajouter aux commandes des appareils"</string> <string name="controls_dialog_ok" msgid="2770230012857881822">"Ajouter"</string> <string name="controls_dialog_message" msgid="342066938390663844">"Suggestion de <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Commandes mises à jour"</string> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index faaccc6c113d..b95cf5790f13 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -592,29 +592,21 @@ <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"activer"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"désactiver"</string> <string name="accessibility_output_chooser" msgid="7807898688967194183">"Changer de périphérique de sortie"</string> - <!-- no translation found for screen_pinning_title (9058007390337841305) --> - <skip /> + <string name="screen_pinning_title" msgid="9058007390337841305">"L\'application est épinglée"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Cet écran est épinglé jusqu\'à l\'annulation de l\'opération. Pour annuler l\'épinglage, appuyez de manière prolongée sur les boutons Retour et Aperçu."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Cet écran est épinglé jusqu\'à l\'annulation de l\'opération. Pour annuler l\'épinglage, appuyez de manière prolongée sur les boutons \"Retour\" et \"Accueil\"."</string> <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"Cet écran est épinglé jusqu\'à l\'annulation de l\'opération. Pour annuler l\'épinglage, balayez l\'écran vers le haut et gardez le doigt dessus."</string> <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"Cet écran est épinglé jusqu\'à l\'annulation de l\'opération. Pour annuler l\'épinglage, appuyez de manière prolongée sur le bouton Aperçu."</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"Cet écran est épinglé jusqu\'à l\'annulation de l\'opération. Pour annuler l\'épinglage, appuyez de manière prolongée sur le bouton \"Accueil\"."</string> - <!-- no translation found for screen_pinning_exposes_personal_data (8189852022981524789) --> - <skip /> - <!-- no translation found for screen_pinning_can_open_other_apps (7529756813231421455) --> - <skip /> - <!-- no translation found for screen_pinning_toast (8177286912533744328) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (6850978077443052594) --> - <skip /> - <!-- no translation found for screen_pinning_toast_gesture_nav (170699893395336705) --> - <skip /> + <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"Les données à caractère personnel, comme les contacts et le contenu des e-mails, sont susceptibles d\'être accessibles."</string> + <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"D\'autres applications peuvent être ouvertes depuis une application épinglée."</string> + <string name="screen_pinning_toast" msgid="8177286912533744328">"Pour que cette application ne soit plus épinglée, appuyez de manière prolongée sur les boutons \"Retour\" et \"Aperçu\""</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"Pour que cette application ne soit plus épinglée, appuyez de manière prolongée sur les boutons \"Retour\" et \"Accueil\""</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"Pour que cette application ne soit plus épinglée, balayez l\'écran vers le haut et maintenez votre doigt dessus"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"OK"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"Non, merci"</string> - <!-- no translation found for screen_pinning_start (7483998671383371313) --> - <skip /> - <!-- no translation found for screen_pinning_exit (4553787518387346893) --> - <skip /> + <string name="screen_pinning_start" msgid="7483998671383371313">"Application épinglée"</string> + <string name="screen_pinning_exit" msgid="4553787518387346893">"L\'application n\'est plus épinglée"</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"Masquer <xliff:g id="TILE_LABEL">%1$s</xliff:g> ?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"Cet élément réapparaîtra la prochaine fois que vous l\'activerez dans les paramètres."</string> <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"Masquer"</string> @@ -727,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"S\'affiche en haut de la section des conversations, apparaît sous forme de bulle flottante, affiche la photo de profil sur l\'écran de verrouillage"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Paramètres"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritaire"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> n\'est pas compatible avec les fonctionnalités de conversation"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Aucune bulle récente"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Les bulles récentes et ignorées s\'afficheront ici"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Impossible de modifier ces notifications."</string> @@ -1022,11 +1013,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Navigation système mise à jour. Pour apporter des modifications, accédez aux paramètres."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Accédez aux paramètres pour mettre à jour la navigation système"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Mode Veille imminent"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"Conversation définie comme prioritaire"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Les conversations prioritaires :"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"En haut de la liste des conversations"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Photo de profil sur l\'écran de verrouillage"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Sous forme d\'info-bulle au-dessus des applications"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Interrompre Ne pas déranger"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Paramètres"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Fenêtre de superposition de l\'agrandissement"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Fenêtre d\'agrandissement"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Fenêtre des commandes d\'agrandissement"</string> @@ -1048,7 +1042,7 @@ <string name="accessibility_control_move" msgid="8980344493796647792">"Déplacer l\'élément à la position <xliff:g id="NUMBER">%d</xliff:g>"</string> <string name="controls_favorite_default_title" msgid="967742178688938137">"Commandes"</string> <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Sélectionnez les commandes auxquelles vous souhaitez accéder depuis le menu de démarrage"</string> - <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Appuyer et faire glisser pour réorganiser les commandes"</string> + <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Appuyez et faites glisser pour réorganiser les commandes"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Toutes les commandes ont été supprimées"</string> <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Les modifications n\'ont pas été enregistrées"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Impossible de charger toutes les commandes."</string> diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index ef8223059404..960e4169d4c6 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Móstrase na parte superior da sección de conversas en forma de burbulla flotante e aparece a imaxe do perfil na pantalla de bloqueo"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Configuración"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioridade"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> non admite funcións de conversa"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Non hai burbullas recentes"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"As burbullas recentes e ignoradas aparecerán aquí."</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Estas notificacións non se poden modificar."</string> @@ -1014,11 +1013,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Actualizouse a navegación do sistema. Para facer cambios, vai a Configuración."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Para actualizar a navegación do sistema, vai a Configuración"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Modo de espera"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"A conversa definiuse como prioritaria"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"As conversas prioritarias farán o seguinte:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Mostrar na parte superior da sección de conversas"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Mostrar imaxe do perfil na pantalla de bloqueo"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Mostrar como burbulla flotante sobre outras apps"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Interromper modo Non molestar"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Entendido"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Configuración"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Ampliación da ventá de superposición"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Ventá de superposición"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Controis de ampliación da ventá"</string> diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index cb1e26e44500..4936b7b7c2da 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -592,29 +592,21 @@ <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"ચાલુ કરો"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"બંધ કરો"</string> <string name="accessibility_output_chooser" msgid="7807898688967194183">"આઉટપુટ ઉપકરણ સ્વિચ કરો"</string> - <!-- no translation found for screen_pinning_title (9058007390337841305) --> - <skip /> + <string name="screen_pinning_title" msgid="9058007390337841305">"ઍપને પિન કરેલી છે"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"તમે જ્યાં સુધી અનપિન કરશો નહીં ત્યાં સુધી આ તેને દૃશ્યક્ષમ રાખે છે. અનપિન કરવા માટે પાછળ અને ઝલકને સ્પર્શ કરી રાખો."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"તમે જ્યાં સુધી અનપિન કરશો નહીં ત્યાં સુધી આ તેને દૃશ્યક્ષમ રાખે છે. અનપિન કરવા માટે પાછળ અને હોમને સ્પર્શ કરી રાખો."</string> <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"તમે જ્યાં સુધી અનપિન નહીં કરો ત્યાં સુધી આ તેને દૃશ્યક્ષમ રાખે છે. ઉપરની તરફ સ્વાઇપ કરો અને અનપિન કરવા માટે દબાવી રાખો."</string> <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"તમે જ્યાં સુધી અનપિન કરશો નહીં ત્યાં સુધી આ તેને દૃશ્યક્ષમ રાખે છે. અનપિન કરવા માટે ઝલકને સ્પર્શ કરી રાખો."</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"તમે જ્યાં સુધી અનપિન કરશો નહીં ત્યાં સુધી આ તેને દૃશ્યક્ષમ રાખે છે. અનપિન કરવા માટે હોમને સ્પર્શ કરી રાખો."</string> - <!-- no translation found for screen_pinning_exposes_personal_data (8189852022981524789) --> - <skip /> - <!-- no translation found for screen_pinning_can_open_other_apps (7529756813231421455) --> - <skip /> - <!-- no translation found for screen_pinning_toast (8177286912533744328) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (6850978077443052594) --> - <skip /> - <!-- no translation found for screen_pinning_toast_gesture_nav (170699893395336705) --> - <skip /> + <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"વ્યક્તિગત ડેટા ઍક્સેસ કરી શકાતો હોઈ શકે (જેમ કે સંપર્કો અને ઇમેઇલનું કન્ટેન્ટ)."</string> + <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"પિન કરેલી ઍપ અન્ય ઍપને ખોલી શકે છે."</string> + <string name="screen_pinning_toast" msgid="8177286912533744328">"આ ઍપને અનપિન કરવા માટે, પાછળ અને ઓવરવ્યૂ બટનને સ્પર્શ કરી રાખો"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"આ ઍપને અનપિન કરવા માટે, પાછળ અને હોમ બટનને સ્પર્શ કરી રાખો"</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"આ ઍપને અનપિન કરવા માટે, ઉપર સ્વાઇપ કરીને બટન દબાવી રાખો"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"સમજાઈ ગયું"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"ના, આભાર"</string> - <!-- no translation found for screen_pinning_start (7483998671383371313) --> - <skip /> - <!-- no translation found for screen_pinning_exit (4553787518387346893) --> - <skip /> + <string name="screen_pinning_start" msgid="7483998671383371313">"ઍપ પિન કરી"</string> + <string name="screen_pinning_exit" msgid="4553787518387346893">"ઍપ અનપિન કરી"</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> ને છુપાવીએ?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"તે સેટિંગ્સમાં તમે તેને ચાલુ કરશો ત્યારે આગલી વખતે ફરીથી દેખાશે."</string> <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"છુપાવો"</string> @@ -727,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"એને વાતચીત વિભાગની ટોચ પર બતાવે છે, તરતા બબલ તરીકે દેખાય છે, લૉક સ્ક્રીન પર પ્રોફાઇલ ફોટા તરીકે બતાવે છે"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"સેટિંગ"</string> <string name="notification_priority_title" msgid="2079708866333537093">"પ્રાધાન્યતા"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> વાતચીતની સુવિધાઓને સપોર્ટ આપતી નથી"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"તાજેતરના કોઈ બબલ નથી"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"એકદમ નવા બબલ અને છોડી દીધેલા બબલ અહીં દેખાશે"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"આ નોટિફિકેશનમાં કોઈ ફેરફાર થઈ શકશે નહીં."</string> @@ -1022,11 +1013,17 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"સિસ્ટમ નૅવિગેશન અપડેટ કર્યું. ફેરફારો કરવા માટે, સેટિંગ પર જાઓ."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"સિસ્ટમ નૅવિગેશનને અપડેટ કરવા માટે સેટિંગ પર જાઓ"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"સ્ટૅન્ડબાય"</string> + <!-- no translation found for priority_onboarding_title (2893070698479227616) --> + <skip /> + <!-- no translation found for priority_onboarding_behavior (5342816047020432929) --> + <skip /> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"વાતચીત વિભાગની ટોચ પર બતાવો"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"લૉક સ્ક્રીન પર પ્રોફાઇલ ફોટો બતાવો"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"ઍપની ટોચ પર તરતા બબલ તરીકે દેખાય છે"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"ખલેલ પાડશો નહીં સેટિંગમાં હસ્તક્ષેપ કરી શકે છે"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"સમજાઈ ગયું"</string> + <!-- no translation found for priority_onboarding_settings_button_title (6663601574303585927) --> + <skip /> <string name="magnification_overlay_title" msgid="6584179429612427958">"વિસ્તૃતીકરણ ઓવરલે વિંડો"</string> <string name="magnification_window_title" msgid="4863914360847258333">"વિસ્તૃતીકરણ વિંડો"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"વિસ્તૃતીકરણ વિંડોના નિયંત્રણો"</string> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index 5e4d8df089da..1fcfcc4746d9 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -721,8 +721,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"इससे बातचीत की सुविधा, सेक्शन में सबसे ऊपर और फ़्लोटिंग बबल के तौर पर दिखती है. साथ ही, लॉक स्क्रीन पर प्रोफ़ाइल फ़ोटो दिखती है"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"सेटिंग"</string> <string name="notification_priority_title" msgid="2079708866333537093">"प्राथमिकता"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> पर बातचीत की सुविधाएं काम नहीं करतीं"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"हाल ही के बबल्स मौजूद नहीं हैं"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"हाल ही के बबल्स और हटाए गए बबल्स यहां दिखेंगे"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"ये सूचनाएं नहीं बदली जा सकती हैं."</string> @@ -1016,11 +1015,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"सिस्टम नेविगेशन अपडेट हो गया. बदलाव करने के लिए \'सेटिंग\' पर जाएं."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"सिस्टम नेविगेशन अपडेट करने के लिए \'सेटिंग\' में जाएं"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"स्टैंडबाई"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"बातचीत को अहम बातचीत के तौर पर सेट किया गया है"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"अहम बातचीत:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"बातचीत सेक्शन में सबसे ऊपर दिखाएं"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"लॉक स्क्रीन पर प्रोफ़ाइल फ़ोटो दिखाएं"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"खास बातचीत फ़्लोटिंग बबल की तरह ऐप्लिकेशन के ऊपर दिखेंगी"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"\'परेशान न करें\' मोड में रुकावट"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"ठीक है"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"सेटिंग"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Magnification Overlay Window"</string> <string name="magnification_window_title" msgid="4863914360847258333">"स्क्रीन को बड़ा करके दिखाने वाली विंडो"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"स्क्रीन को बड़ा करके दिखाने वाली विंडो के नियंत्रण"</string> diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index 46ed282f6c27..c918dca9d337 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -722,8 +722,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Prikazuje se pri vrhu odjeljka razgovora kao pomični oblačić i prikazuje profilnu sliku na zaključanom zaslonu"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Postavke"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritet"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> ne podržava značajke razgovora"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nema nedavnih oblačića"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Ovdje će se prikazivati nedavni i odbačeni oblačići"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Te se obavijesti ne mogu izmijeniti."</string> @@ -1019,11 +1018,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Ažurirana je navigacija sustavom. Možete je promijeniti u Postavkama."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Navigaciju sustavom možete ažurirati u Postavkama"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Stanje mirovanja"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"Razgovor postavljen na prioritetan"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Prioritetni razgovori će sljedeće:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Prikazuje se pri vrhu odjeljka razgovora"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Prikazuje profilnu sliku na zaključanom zaslonu"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Prikazuje se kao lebdeći oblačić iznad aplikacija"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Prekida Ne uznemiravaj"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Shvaćam"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Postavke"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Prozor preklapanja povećavanja"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Prozor za povećavanje"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Kontrole prozora za povećavanje"</string> diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index 924eed0835a0..2a991f1089e3 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"A beszélgetések szakaszának tetején, lebegő buborékként látható, megjeleníti a profilképet a lezárási képernyőn"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Beállítások"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritás"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> nem támogatja a beszélgetési funkciókat"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nincsenek buborékok a közelmúltból"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"A legutóbbi és az elvetett buborékok itt jelennek majd meg"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Ezeket az értesítéseket nem lehet módosítani."</string> @@ -1014,11 +1013,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"A rendszer-navigáció módja megváltozott. Módosításához nyissa meg a Beállításokat."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"A rendszer-navigációs lehetőségeket a Beállításokban módosíthatja"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Készenléti mód"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"Fontosnak beállított beszélgetés"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"A fontos beszélgetések:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"A beszélgetések szakaszának tetején jelennek meg"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Megjelenítik a profilképet a lezárási képernyőn"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Buborékként jelennek meg az alkalmazások felett"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Megszakítják a Ne zavarjanak módot"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Értem"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Beállítások"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Nagyítási fedvény ablaka"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Nagyítás ablaka"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Nagyítási vezérlők ablaka"</string> @@ -1054,7 +1056,7 @@ <string name="controls_pin_wrong" msgid="6162694056042164211">"Helytelen PIN-kód"</string> <string name="controls_pin_verifying" msgid="3755045989392131746">"Ellenőrzés…"</string> <string name="controls_pin_instructions" msgid="6363309783822475238">"PIN-kód megadása"</string> - <string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Próbálkozzon másik PIN-kóddal"</string> + <string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Próbálkozzon másik kóddal"</string> <string name="controls_confirmation_confirming" msgid="2596071302617310665">"Megerősítés…"</string> <string name="controls_confirmation_message" msgid="7744104992609594859">"A(z) <xliff:g id="DEVICE">%s</xliff:g> módosításának megerősítése"</string> <string name="controls_structure_tooltip" msgid="4355922222944447867">"Továbbiak megtekintéséhez csúsztasson"</string> diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index 640f6cfb31c6..908231a72772 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Ցուցադրվում է զրույցների ցանկի վերևում, հայտնվում է լողացող ամպիկի տեսքով, ցուցադրում է պրոֆիլի նկարը կողպէկրանին"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Կարգավորումներ"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Կարևոր"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածը զրույցի գործառույթներ չի աջակցում"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Վերջին ամպիկներ չկան"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Այստեղ կցուցադրվեն վերջերս օգտագործված և փակված ամպիկները, որոնք կկարողանաք հեշտությամբ վերաբացել"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Այս ծանուցումները չեն կարող փոփոխվել:"</string> @@ -746,7 +745,7 @@ <string name="inline_undo" msgid="9026953267645116526">"Հետարկել"</string> <string name="demote" msgid="6225813324237153980">"Նշել այս ծանուցումը որպես ոչ զրույց"</string> <string name="notification_conversation_favorite" msgid="1905240206975921907">"Կարևոր զրույց"</string> - <string name="notification_conversation_unfavorite" msgid="181383708304763807">"Ոչ կարևոր զրույց"</string> + <string name="notification_conversation_unfavorite" msgid="181383708304763807">"Կարևոր զրույց չէ"</string> <string name="notification_conversation_mute" msgid="268951550222925548">"Լռեցված"</string> <string name="notification_conversation_unmute" msgid="2692255619510896710">"Միացնել ծանուցումների ձայնը"</string> <string name="notification_conversation_bubble" msgid="2242180995373949022">"Ցուցադրել ամպիկը"</string> @@ -1014,11 +1013,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Համակարգի նավիգացիան թարմացվեց: Փոփոխություններ անելու համար անցեք կարգավորումներ:"</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Թարմացրեք համակարգի նավիգացիան կարգավորումներում"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Սպասման ռեժիմ"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"Զրույցը նշված է որպես կարևոր"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Կարևոր զրույցները՝"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Ցուցադրել զրույցների ցանկի վերևում"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Ցուցադրել պրոֆիլի նկարը կողպէկրանին"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Հայտնվում են որպես լողացող ամպիկ հավելվածների վրայից"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Ընդհատել «Չանհանգստացնել» ռեժիմը"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Եղավ"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Կարգավորումներ"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Խոշորացման պատուհանի վրադրում"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Խոշորացման պատուհան"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Խոշորացման պատուհանի կառավարման տարրեր"</string> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index c101829211f6..2e11e423575f 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -194,7 +194,7 @@ <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Data tiga batang."</string> <string name="accessibility_data_signal_full" msgid="283507058258113551">"Sinyal data penuh."</string> <string name="accessibility_wifi_name" msgid="4863440268606851734">"Terhubung ke <xliff:g id="WIFI">%s</xliff:g>."</string> - <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Tersambung ke <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> + <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Terhubung ke <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> <string name="accessibility_cast_name" msgid="7344437925388773685">"Terhubung ke <xliff:g id="CAST">%s</xliff:g>."</string> <string name="accessibility_no_wimax" msgid="2014864207473859228">"Tidak ada WiMAX."</string> <string name="accessibility_wimax_one_bar" msgid="2996915709342221412">"WiMAX satu batang."</string> @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Muncul di atas bagian percakapan, ditampilkan sebagai balon yang mengambang, menampilkan gambar profil di layar kunci"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Setelan"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritas"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> tidak mendukung fitur percakapan"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Tidak ada balon baru-baru ini"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Balon yang baru dipakai dan balon yang telah ditutup akan muncul di sini"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Notifikasi ini tidak dapat diubah."</string> @@ -1014,11 +1013,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Navigasi sistem diupdate. Untuk melakukan perubahan, buka Setelan."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Buka Setelan untuk mengupdate navigasi sistem"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Siaga"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"Percakapan disetel ke prioritas"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Percakapan prioritas akan:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Muncul di atas bagian percakapan"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Menampilkan gambar profil di layar kunci"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Muncul sebagai balon mengambang di atas aplikasi"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Mengganggu fitur Jangan Ganggu"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Oke"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Setelan"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Jendela Overlay Pembesaran"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Jendela Pembesaran"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Kontrol Jendela Pembesaran"</string> diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml index 29c145f0d635..773bda713760 100644 --- a/packages/SystemUI/res/values-is/strings.xml +++ b/packages/SystemUI/res/values-is/strings.xml @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Birtist efst í samtalshluta, birtist sem fljótandi blaðra, birtir prófílmynd á lásskjánum"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Áfram"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Forgangur"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> styður ekki samtalseiginleika"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Engar nýlegar blöðrur"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Nýlegar blöðrur og blöðrur sem þú hefur lokað birtast hér"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Ekki er hægt að breyta þessum tilkynningum."</string> @@ -1014,11 +1013,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Kerfisstjórnun uppfærð. Þú getur breytt þessu í stillingunum."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Farðu í stillingar til að uppfæra kerfisstjórnun"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Biðstaða"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"Samtal sett í forgang"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Forgangssamtöl munu:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Sýna yfir samtalshluta"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Sýna prófílmynd á lásskjá"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Birta sem fljótandi blöðru yfir forritum"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Stöðva „Ónáðið ekki“"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Ég skil"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Stillingar"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Stækkun yfirglugga"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Stækkunargluggi"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Stækkunarstillingar glugga"</string> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index ff1fb6794b59..0844284ac7a4 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -701,7 +701,7 @@ <string name="inline_deliver_silently_button" msgid="2714314213321223286">"Invia in modalità silenziosa"</string> <string name="inline_block_button" msgid="479892866568378793">"Blocca"</string> <string name="inline_keep_button" msgid="299631874103662170">"Continua a mostrare"</string> - <string name="inline_minimize_button" msgid="1474436209299333445">"Riduci a icona"</string> + <string name="inline_minimize_button" msgid="1474436209299333445">"Riduci"</string> <string name="inline_silent_button_silent" msgid="525243786649275816">"Modalità silenziosa"</string> <string name="inline_silent_button_stay_silent" msgid="2129254868305468743">"Continua con notifiche silenziose"</string> <string name="inline_silent_button_alert" msgid="5705343216858250354">"Avvisi"</string> @@ -709,18 +709,17 @@ <string name="inline_turn_off_notifications" msgid="8543989584403106071">"Disattiva notifiche"</string> <string name="inline_keep_showing_app" msgid="4393429060390649757">"Continuare a ricevere notifiche da questa app?"</string> <string name="notification_silence_title" msgid="8608090968400832335">"Modalità silenziosa"</string> - <string name="notification_alert_title" msgid="3656229781017543655">"Livello predefinito"</string> + <string name="notification_alert_title" msgid="3656229781017543655">"Modalità predefinita"</string> <string name="notification_bubble_title" msgid="8330481035191903164">"Fumetto"</string> <string name="notification_channel_summary_low" msgid="4860617986908931158">"Nessun suono o vibrazione"</string> <string name="notification_conversation_summary_low" msgid="1734433426085468009">"Nessun suono o vibrazione e appare più in basso nella sezione delle conversazioni"</string> - <string name="notification_channel_summary_default" msgid="3282930979307248890">"Potrebbero essere attivati lo squillo o la vibrazione in base alle impostazioni del telefono"</string> - <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Potrebbero essere attivati lo squillo o la vibrazione in base alle impostazioni del telefono. Conversazioni dalla bolla <xliff:g id="APP_NAME">%1$s</xliff:g> per impostazione predefinita."</string> + <string name="notification_channel_summary_default" msgid="3282930979307248890">"Può suonare o vibrare in base alle impostazioni del telefono"</string> + <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Può suonare o vibrare in base alle impostazioni del telefono. Conversazioni dalla bolla <xliff:g id="APP_NAME">%1$s</xliff:g> per impostazione predefinita."</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Mantiene la tua attenzione con una scorciatoia mobile a questi contenuti."</string> <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Viene mostrata in cima alla sezione delle conversazioni, appare sotto forma di bolla mobile, mostra l\'immagine del profilo nella schermata di blocco"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Impostazioni"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Priorità"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> non supporta le funzionalità delle conversazioni"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nessuna bolla recente"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Le bolle recenti e ignorate verranno visualizzate qui"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Impossibile modificare queste notifiche."</string> @@ -1014,11 +1013,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Navigazione del sistema aggiornata. Per apportare modifiche, usa le Impostazioni."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Usa le Impostazioni per aggiornare la navigazione del sistema"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"Conversazione impostata come prioritaria"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Le conversazioni prioritarie:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Appaiono in cima alla sezione delle conversazioni"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Mostrano immagine profilo in schermata di blocco"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Vengono mostrate come bolle mobili sopra le app"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Interrompono la modalità Non disturbare"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Impostazioni"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Finestra overlay ingrandimento"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Finestra ingrandimento"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Finestra controlli di ingrandimento"</string> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index 20006e5ed618..f23254abdc69 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -725,8 +725,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"מוצגת בחלק העליון של קטע התראות השיחה, מופיעה בבועה צפה, תוצג תמונת פרופיל במסך הנעילה"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"הגדרות"</string> <string name="notification_priority_title" msgid="2079708866333537093">"עדיפות"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"האפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> לא תומכת בתכונות השיחה"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"אין בועות מהזמן האחרון"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"בועות אחרונות ובועות שנסגרו יופיעו כאן"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"לא ניתן לשנות את ההתראות האלה."</string> @@ -1024,11 +1023,17 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"הניווט במערכת עודכן. אפשר לערוך שינויים דרך ההגדרות."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"יש לעבור להגדרות כדי לעדכן את הניווט במערכת"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"המתנה"</string> + <!-- no translation found for priority_onboarding_title (2893070698479227616) --> + <skip /> + <!-- no translation found for priority_onboarding_behavior (5342816047020432929) --> + <skip /> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"מופיעות בחלק העליון של קטע השיחות"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"מציגות תמונת פרופיל במסך הנעילה"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"מופיעות כבועה צפה מעל האפליקציות שלך"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"גוברות על ההגדרה \'נא לא להפריע\'"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"הבנתי"</string> + <!-- no translation found for priority_onboarding_settings_button_title (6663601574303585927) --> + <skip /> <string name="magnification_overlay_title" msgid="6584179429612427958">"חלון ליצירת שכבת-על להגדלה"</string> <string name="magnification_window_title" msgid="4863914360847258333">"חלון הגדלה"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"בקרות של חלון ההגדלה"</string> diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index 1aa40327ee4e..6e7555a9d32c 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -592,29 +592,21 @@ <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"有効にする"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"無効にする"</string> <string name="accessibility_output_chooser" msgid="7807898688967194183">"出力デバイスを選択"</string> - <!-- no translation found for screen_pinning_title (9058007390337841305) --> - <skip /> + <string name="screen_pinning_title" msgid="9058007390337841305">"アプリは固定されています"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"固定を解除するまで画面が常に表示されるようになります。[戻る] と [最近] を同時に押し続けると固定が解除されます。"</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"固定を解除するまで画面が常に表示されるようになります。[戻る] と [ホーム] を同時に押し続けると固定が解除されます。"</string> <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"固定を解除するまで常に表示されます。上にスワイプして長押しすると固定が解除されます。"</string> <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"固定を解除するまで画面が常に表示されるようになります。[最近] を押し続けると固定が解除されます。"</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"固定を解除するまで画面が常に表示されるようになります。[ホーム] を押し続けると固定が解除されます。"</string> - <!-- no translation found for screen_pinning_exposes_personal_data (8189852022981524789) --> - <skip /> - <!-- no translation found for screen_pinning_can_open_other_apps (7529756813231421455) --> - <skip /> - <!-- no translation found for screen_pinning_toast (8177286912533744328) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (6850978077443052594) --> - <skip /> - <!-- no translation found for screen_pinning_toast_gesture_nav (170699893395336705) --> - <skip /> + <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"個人データ(連絡先やメールの内容など)にアクセスできる可能性があります。"</string> + <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"固定したアプリが他のアプリを開く可能性があります。"</string> + <string name="screen_pinning_toast" msgid="8177286912533744328">"このアプリの固定を解除するには [戻る] ボタンと [最近] ボタンを長押しします"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"このアプリの固定を解除するには [戻る] ボタンと [ホーム] ボタンを長押しします"</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"このアプリの固定を解除するには、上にスワイプして長押しします"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"はい"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"いいえ"</string> - <!-- no translation found for screen_pinning_start (7483998671383371313) --> - <skip /> - <!-- no translation found for screen_pinning_exit (4553787518387346893) --> - <skip /> + <string name="screen_pinning_start" msgid="7483998671383371313">"固定したアプリ"</string> + <string name="screen_pinning_exit" msgid="4553787518387346893">"固定を解除したアプリ"</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"<xliff:g id="TILE_LABEL">%1$s</xliff:g>を非表示にしますか?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"次回、設定でONにすると再表示されます。"</string> <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"非表示"</string> @@ -727,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"会話セクションの一番上にふきだしとして表示され、プロフィール写真がロック画面に表示されます"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"設定"</string> <string name="notification_priority_title" msgid="2079708866333537093">"優先度"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> は会話機能に対応していません"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"最近閉じたバブルはありません"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"最近表示されたバブルや閉じたバブルが、ここに表示されます"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"これらの通知は変更できません。"</string> @@ -1022,11 +1013,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"システム ナビゲーションを更新しました。変更するには [設定] に移動してください。"</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"システム ナビゲーションを更新するには [設定] に移動してください"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"スタンバイ"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"優先度を高く設定された会話"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"優先度の高い会話では、次のようになります。"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"会話セクションの一番上にバブルで表示"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"ロック画面にプロフィール写真を表示"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"他のアプリに重ねてフローティング バブルとして表示"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"サイレント モードに割り込み"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"設定"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"拡大オーバーレイ ウィンドウ"</string> <string name="magnification_window_title" msgid="4863914360847258333">"拡大ウィンドウ"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"拡大ウィンドウ コントロール"</string> diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml index e8795eeffa17..4aea87bc4938 100644 --- a/packages/SystemUI/res/values-ka/strings.xml +++ b/packages/SystemUI/res/values-ka/strings.xml @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"გამოჩნდება მიმოწერების სექციის ზედა ნაწილში მოლივლივე ბუშტის სახით, აჩვენებს პროფილის სურათს ჩაკეტილ ეკრანზე"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"პარამეტრები"</string> <string name="notification_priority_title" msgid="2079708866333537093">"პრიორიტეტი"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g>-ს არ აქვს მიმოწერის ფუნქციების მხარდაჭერა"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"ბოლო დროს გამოყენებული ბუშტები არ არის"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"აქ გამოჩნდება ბოლოდროინდელი ბუშტები და უარყოფილი ბუშტები"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"ამ შეტყობინებების შეცვლა შეუძლებელია."</string> @@ -1014,11 +1013,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"სისტემური ნავიგაცია განახლდა. ცვლილებების შესატანად გადადით პარამეტრებზე."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"სისტემური ნავიგაციის გასაახლებლად გადადით პარამეტრებზე"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"მოლოდინის რეჟიმი"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"მიმოწერა დაყენებულია პრიორიტეტად"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"პრიორიტეტული მიმოწერები:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"მიმოწერის სექციის ზემოთ ჩვენება"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"ჩაკეტილ ეკრანზე პროფილის სურათის ჩვენება"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"გამოჩნდება მოლივლივე ბუშტის სახით აპების ზემოდან"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"„არ შემაწუხოთ“ რეჟიმის შეწყვეტა"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"გასაგებია"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"პარამეტრები"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"გადიდების გადაფარვის ფანჯარა"</string> <string name="magnification_window_title" msgid="4863914360847258333">"გადიდების ფანჯარა"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"გადიდების კონტროლის ფანჯარა"</string> diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index 27308e84def0..bb4ee6b0916e 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -602,7 +602,7 @@ <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"Бекітілген қолданба басқа қолданбаларды ашуы мүмкін."</string> <string name="screen_pinning_toast" msgid="8177286912533744328">"Бұл қолданбаны босату үшін \"Артқа\" және \"Шолу\" түймелерін түртіп, ұстап тұрыңыз."</string> <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"Бұл қолданбаны босату үшін \"Артқа\" және \"Негізгі бет\" түймелерін түртіп, ұстап тұрыңыз."</string> - <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"Бұл қолданбасы босату үшін жоғары сырғытып, ұстап тұрыңыз."</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"Бұл қолданбаны босату үшін жоғары сырғытып, ұстап тұрыңыз."</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"Түсінікті"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"Жоқ, рақмет"</string> <string name="screen_pinning_start" msgid="7483998671383371313">"Қолданба бекітілді."</string> @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Әңгімелер бөлімінің жоғарғы жағында тұрады, қалқыма хабар түрінде шығады, құлыптаулы экранда профиль суретін көрсетеді"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Параметрлер"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Маңыздылығы"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> әңгімелесу функцияларын қолдамайды."</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Жақындағы қалқыма хабарлар жоқ"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Жақында ашылған және жабылған қалқыма хабарлар осы жерде көрсетіледі."</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Бұл хабарландыруларды өзгерту мүмкін емес."</string> @@ -1014,11 +1013,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Жүйе навигациясы жаңартылды. Өзгерту енгізу үшін \"Параметрлер\" бөліміне өтіңіз."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Жүйе навигациясын жаңарту үшін \"Параметрлер\" бөліміне өтіңіз."</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Күту режимі"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"Әңгіме маңызды деп белгіленді"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Маңызды әңгімелердің әрекеті:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Сөйлесу бөлімінің жоғарғы жағында көрсетіледі."</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Профиль суреті құлыптаулы экранда көрсетіледі."</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Қолданбалар терезесінің бергі жағынан қалқыма хабарлар түрінде көрсетіледі."</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"\"Мазаламау\" режимінде көрсетіледі."</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Түсінікті"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Параметрлер"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Ұлғайту терезесін қабаттастыру"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Ұлғайту терезесі"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Ұлғайту терезесінің басқару элементтері"</string> diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml index 3d6cfa16366e..c00549c71fb1 100644 --- a/packages/SystemUI/res/values-km/strings.xml +++ b/packages/SystemUI/res/values-km/strings.xml @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"បង្ហាញនៅខាងលើផ្នែកសន្ទនា បង្ហាញជាពពុះអណ្ដែត បង្ហាញរូបភាពកម្រងព័ត៌មាននៅលើអេក្រង់ចាក់សោ"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ការកំណត់"</string> <string name="notification_priority_title" msgid="2079708866333537093">"អាទិភាព"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> មិនអាចប្រើមុខងារសន្ទនាបានទេ"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"មិនមានពពុះថ្មីៗទេ"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"ពពុះថ្មីៗ និងពពុះដែលបានបិទនឹងបង្ហាញនៅទីនេះ"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"មិនអាចកែប្រែការជូនដំណឹងទាំងនេះបានទេ។"</string> @@ -1014,19 +1013,22 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"បានធ្វើបច្ចុប្បន្នភាពការរុករកក្នុងប្រព័ន្ធ។ ដើម្បីធ្វើការផ្លាស់ប្ដូរ សូមចូលទៅកាន់ការកំណត់។"</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"ចូលទៅកាន់ការកំណត់ ដើម្បីធ្វើបច្ចុប្បន្នភាពការរុករកក្នុងប្រព័ន្ធ"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ផ្អាកដំណើរការ"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"បានកំណត់ការសន្ទនាជាអាទិភាព"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"ការសន្ទនាជាអាទិភាពនឹង៖"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"បង្ហាញនៅខាងលើផ្នែកសន្ទនា"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"បង្ហាញរូបភាពកម្រងព័ត៌មាននៅលើអេក្រង់ចាក់សោ"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"បង្ហាញជាពពុះអណ្ដែតនៅផ្នែកខាងលើនៃកម្មវិធី"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"ផ្អាកមុខងារកុំរំខាន"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"យល់ហើយ"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"ការកំណត់"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"វិនដូត្រួតគ្នាលើការពង្រីក"</string> <string name="magnification_window_title" msgid="4863914360847258333">"វិនដូការពង្រីក"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"វិនដូគ្រប់គ្រងការពង្រីក"</string> <string name="quick_controls_title" msgid="6839108006171302273">"ផ្ទាំងគ្រប់គ្រងឧបករណ៍"</string> - <string name="quick_controls_subtitle" msgid="1667408093326318053">"បញ្ចូលការគ្រប់គ្រងសម្រាប់ឧបករណ៍ដែលបានភ្ជាប់របស់អ្នក"</string> + <string name="quick_controls_subtitle" msgid="1667408093326318053">"បញ្ចូលផ្ទាំងគ្រប់គ្រងសម្រាប់ឧបករណ៍ដែលអ្នកបានភ្ជាប់"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"រៀបចំផ្ទាំងគ្រប់គ្រងឧបករណ៍"</string> <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"សង្កត់ប៊ូតុងថាមពលឱ្យជាប់ ដើម្បីចូលប្រើការគ្រប់គ្រងរបស់អ្នក"</string> - <string name="controls_providers_title" msgid="6879775889857085056">"ជ្រើសរើសកម្មវិធី ដើម្បីបញ្ចូលការគ្រប់គ្រង"</string> + <string name="controls_providers_title" msgid="6879775889857085056">"ជ្រើសរើសកម្មវិធីដែលត្រូវបញ្ចូលផ្ទាំងគ្រប់គ្រង"</string> <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380"> <item quantity="other">បានបញ្ចូលការគ្រប់គ្រង <xliff:g id="NUMBER_1">%s</xliff:g>។</item> <item quantity="one">បានបញ្ចូលការគ្រប់គ្រង <xliff:g id="NUMBER_0">%s</xliff:g>។</item> @@ -1039,9 +1041,9 @@ <string name="accessibility_control_change_unfavorite" msgid="6997408061750740327">"ដកចេញពីសំណព្វ"</string> <string name="accessibility_control_move" msgid="8980344493796647792">"ផ្លាស់ទីទៅតាំងទី <xliff:g id="NUMBER">%d</xliff:g>"</string> <string name="controls_favorite_default_title" msgid="967742178688938137">"ការគ្រប់គ្រង"</string> - <string name="controls_favorite_subtitle" msgid="6604402232298443956">"ជ្រើសរើសការគ្រប់គ្រង ដើម្បីចូលប្រើពីម៉ឺនុយថាមពល"</string> - <string name="controls_favorite_rearrange" msgid="5616952398043063519">"ចុចឱ្យជាប់ រួចអូសដើម្បីរៀបចំការគ្រប់គ្រងឡើងវិញ"</string> - <string name="controls_favorite_removed" msgid="5276978408529217272">"បានលុបការគ្រប់គ្រងទាំងអស់ហើយ"</string> + <string name="controls_favorite_subtitle" msgid="6604402232298443956">"ជ្រើសរើសផ្ទាំងគ្រប់គ្រងដែលត្រូវចូលប្រើពីម៉ឺនុយថាមពល"</string> + <string name="controls_favorite_rearrange" msgid="5616952398043063519">"ចុចឱ្យជាប់ រួចអូសដើម្បីរៀបចំផ្ទាំងគ្រប់គ្រងឡើងវិញ"</string> + <string name="controls_favorite_removed" msgid="5276978408529217272">"បានដកផ្ទាំងគ្រប់គ្រងទាំងអស់ហើយ"</string> <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"មិនបានរក្សាទុកការផ្លាស់ប្ដូរទេ"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"មិនអាចផ្ទុកបញ្ជីនៃការគ្រប់គ្រងទាំងអស់បានទេ។"</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"ផ្សេងៗ"</string> @@ -1067,6 +1069,6 @@ <string name="controls_error_failed" msgid="960228639198558525">"មានបញ្ហា សូមព្យាយាមម្តងទៀត"</string> <string name="controls_in_progress" msgid="4421080500238215939">"កំពុងដំណើរការ"</string> <string name="controls_added_tooltip" msgid="4842812921719153085">"សង្កត់ប៊ូតុងថាមពល ដើម្បីមើលឃើញការគ្រប់គ្រងថ្មីៗ"</string> - <string name="controls_menu_add" msgid="4447246119229920050">"បញ្ចូលការគ្រប់គ្រង"</string> - <string name="controls_menu_edit" msgid="890623986951347062">"កែការគ្រប់គ្រង"</string> + <string name="controls_menu_add" msgid="4447246119229920050">"បញ្ចូលផ្ទាំងគ្រប់គ្រង"</string> + <string name="controls_menu_edit" msgid="890623986951347062">"កែផ្ទាំងគ្រប់គ្រង"</string> </resources> diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index b21d50394a32..7b707b5b61d9 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -592,29 +592,21 @@ <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"ಸಕ್ರಿಯಗೊಳಿಸಿ"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ"</string> <string name="accessibility_output_chooser" msgid="7807898688967194183">"ಔಟ್ಪುಟ್ ಸಾಧನವನ್ನು ಬದಲಿಸಿ"</string> - <!-- no translation found for screen_pinning_title (9058007390337841305) --> - <skip /> + <string name="screen_pinning_title" msgid="9058007390337841305">"ಆ್ಯಪ್ ಅನ್ನು ಪಿನ್ ಮಾಡಲಾಗಿದೆ"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"ನೀವು ಅನ್ಪಿನ್ ಮಾಡುವವರೆಗೆ ಅದನ್ನು ವೀಕ್ಷಣೆಯಲ್ಲಿಡುತ್ತದೆ. ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಹಿಡಿದುಕೊಳ್ಳಿ ಹಾಗೂ ಅನ್ಪಿನ್ ಮಾಡಲು ಅವಲೋಕಿಸಿ."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"ನೀವು ಅನ್ಪಿನ್ ಮಾಡುವವರೆಗೆ ಅದನ್ನು ವೀಕ್ಷಣೆಯಲ್ಲಿಡುತ್ತದೆ. ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಹಿಡಿದುಕೊಳ್ಳಿ ಹಾಗೂ ಅನ್ಪಿನ್ ಮಾಡಲು ಮುಖಪುಟಕ್ಕೆ ಹಿಂತಿರುಗಿ."</string> <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"ನೀವು ಅನ್ಪಿನ್ ಮಾಡುವವರೆಗೆ ಅದನ್ನು ವೀಕ್ಷಣೆಯಲ್ಲಿಡುತ್ತದೆ. ಮೇಲೆ ಸ್ವೈಪ್ ಮಾಡಿ ಮತ್ತು ಅನ್ಪಿನ್ ಮಾಡಲು ಹೋಲ್ಡ್ ಮಾಡಿ."</string> <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"ನೀವು ಅನ್ಪಿನ್ ಮಾಡುವವರೆಗೆ ಅದನ್ನು ವೀಕ್ಷಣೆಯಲ್ಲಿಡುತ್ತದೆ. ಅನ್ಪಿನ್ ಮಾಡಲು ಅವಲೋಕನವನ್ನು ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಹೋಲ್ಡ್ ಮಾಡಿ."</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"ನೀವು ಅನ್ಪಿನ್ ಮಾಡುವವರೆಗೆ ಅದನ್ನು ವೀಕ್ಷಣೆಯಲ್ಲಿಡುತ್ತದೆ. ಅನ್ಪಿನ್ ಮಾಡಲು ಮುಖಪುಟವನ್ನು ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಒತ್ತಿಹಿಡಿಯಿರಿ."</string> - <!-- no translation found for screen_pinning_exposes_personal_data (8189852022981524789) --> - <skip /> - <!-- no translation found for screen_pinning_can_open_other_apps (7529756813231421455) --> - <skip /> - <!-- no translation found for screen_pinning_toast (8177286912533744328) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (6850978077443052594) --> - <skip /> - <!-- no translation found for screen_pinning_toast_gesture_nav (170699893395336705) --> - <skip /> + <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"ವೈಯಕ್ತಿಕ ಡೇಟಾವನ್ನು ಪ್ರವೇಶಿಸಬಹುದು (ಉದಾ, ಸಂಪರ್ಕಗಳು ಮತ್ತು ಇಮೇಲ್ ವಿಷಯ)."</string> + <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"ಪಿನ್ ಮಾಡಲಾದ ಆ್ಯಪ್ ಇತರ ಆ್ಯಪ್ಗಳನ್ನು ತೆರೆಯಬಹುದು."</string> + <string name="screen_pinning_toast" msgid="8177286912533744328">"ಈ ಆ್ಯಪ್ ಅನ್ನು ಅನ್ಪಿನ್ ಮಾಡಲು, ಹಿಂದಕ್ಕೆ ಮತ್ತು ಸಮಗ್ರ ನೋಟ ಬಟನ್ಗಳನ್ನು ಸ್ಪರ್ಶಿಸಿ & ಒತ್ತಿಹಿಡಿಯಿರಿ"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"ಈ ಆ್ಯಪ್ ಅನ್ನು ಅನ್ಪಿನ್ ಮಾಡಲು, ಹಿಂದಕ್ಕೆ ಮತ್ತು ಮುಖಪುಟ ಬಟನ್ಗಳನ್ನು ಸ್ಪರ್ಶಿಸಿ & ಒತ್ತಿಹಿಡಿಯಿರಿ"</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"ಈ ಆ್ಯಪ್ ಅನ್ನು ಅನ್ಪಿನ್ ಮಾಡಲು, ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ & ಒತ್ತಿಹಿಡಿಯಿರಿ"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"ತಿಳಿಯಿತು"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"ಧನ್ಯವಾದಗಳು"</string> - <!-- no translation found for screen_pinning_start (7483998671383371313) --> - <skip /> - <!-- no translation found for screen_pinning_exit (4553787518387346893) --> - <skip /> + <string name="screen_pinning_start" msgid="7483998671383371313">"ಆ್ಯಪ್ ಪಿನ್ ಮಾಡಲಾಗಿದೆ"</string> + <string name="screen_pinning_exit" msgid="4553787518387346893">"ಆ್ಯಪ್ ಅನ್ಪಿನ್ ಮಾಡಲಾಗಿದೆ"</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> ಮರೆಮಾಡುವುದೇ?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"ನೀವು ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಅದನ್ನು ಆನ್ ಮಾಡಿದಾಗ ಅದು ಮರುಕಾಣಿಸಿಕೊಳ್ಳುತ್ತದೆ."</string> <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"ಮರೆಮಾಡಿ"</string> @@ -727,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"ಸಂಭಾಷಣೆ ವಿಭಾಗದ ಮೇಲ್ಭಾಗದಲ್ಲಿ ತೇಲುವ ಬಬಲ್ ಆಗಿ ಗೋಚರಿಸುತ್ತದೆ ಮತ್ತು ಪ್ರೊಫೈಲ್ ಚಿತ್ರವನ್ನು ಲಾಕ್ಸ್ಕ್ರೀನ್ ಮೇಲೆ ಗೋಚರಿಸುತ್ತದೆ"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ಸೆಟ್ಟಿಂಗ್ಗಳು"</string> <string name="notification_priority_title" msgid="2079708866333537093">"ಆದ್ಯತೆ"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"ಸಂವಾದ ಫೀಚರ್ಗಳನ್ನು <xliff:g id="APP_NAME">%1$s</xliff:g> ಬೆಂಬಲಿಸುವುದಿಲ್ಲ"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"ಯಾವುದೇ ಇತ್ತೀಚಿನ ಬಬಲ್ಸ್ ಇಲ್ಲ"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"ಇತ್ತೀಚಿನ ಬಬಲ್ಸ್ ಮತ್ತು ವಜಾಗೊಳಿಸಿದ ಬಬಲ್ಸ್ ಇಲ್ಲಿ ಗೋಚರಿಸುತ್ತವೆ"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"ಈ ಅಧಿಸೂಚನೆಗಳನ್ನು ಮಾರ್ಪಡಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ."</string> @@ -1022,11 +1013,17 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"ಸಿಸ್ಟಂ ನ್ಯಾವಿಗೇಷನ ಅಪ್ಡೇಟ್ ಮಾಡಲಾಗಿದೆ ಬದಲಾವಣೆಗಳನ್ನು ಮಾಡಲು, ಸೆಟ್ಟಿಂಗ್ಗಳಿಗೆ ಹೋಗಿ."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"ಸಿಸ್ಟಂ ನ್ಯಾವಿಗೇಷನ್ ಅಪ್ಡೇಟ್ ಮಾಡಲು ಸೆಟ್ಟಿಂಗ್ಗಳಿಗೆ ಹೋಗಿ"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ಸ್ಟ್ಯಾಂಡ್ಬೈ"</string> + <!-- no translation found for priority_onboarding_title (2893070698479227616) --> + <skip /> + <!-- no translation found for priority_onboarding_behavior (5342816047020432929) --> + <skip /> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"ಸಂಭಾಷಣೆ ವಿಭಾಗದ ಮೇಲ್ಭಾಗದಲ್ಲಿ ತೋರಿಸಿ"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"ಲಾಕ್ ಸ್ಕ್ರೀನ್ ಮೇಲೆ ಪ್ರೊಫೈಲ್ ಚಿತ್ರವನ್ನು ತೋರಿಸಿ"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"ಆ್ಯಪ್ಗಳ ಮೇಲ್ಭಾಗದಲ್ಲಿ ತೇಲುವ ಬಬಲ್ನಂತೆ ಗೋಚರಿಸಲಿ"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"ಅಡಚಣೆ ಮಾಡಬೇಡ ಅನ್ನು ಅಡ್ಡಿಪಡಿಸಿ"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"ಅರ್ಥವಾಯಿತು"</string> + <!-- no translation found for priority_onboarding_settings_button_title (6663601574303585927) --> + <skip /> <string name="magnification_overlay_title" msgid="6584179429612427958">"ವರ್ಧನೆಯ ಓವರ್ಲೇ ವಿಂಡೋ"</string> <string name="magnification_window_title" msgid="4863914360847258333">"ವರ್ಧನೆಯ ವಿಂಡೋ"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"ವರ್ಧನೆಯ ವಿಂಡೋ ನಿಯಂತ್ರಣಗಳು"</string> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index 91c58b03693f..263c4dd56037 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"대화 섹션 상단의 플로팅 대화창 또는 잠금 화면의 프로필 사진으로 표시됩니다."</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"설정"</string> <string name="notification_priority_title" msgid="2079708866333537093">"우선순위"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> 앱은 대화 기능을 지원하지 않습니다."</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"최근에 닫은 대화창 없음"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"최근 대화창과 내가 닫은 대화창이 여기에 표시됩니다."</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"이 알림은 수정할 수 없습니다."</string> @@ -1014,17 +1013,20 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"시스템 탐색이 업데이트되었습니다. 변경하려면 설정으로 이동하세요."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"설정으로 이동하여 시스템 탐색을 업데이트하세요."</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"대기"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"대화가 우선순위 대화로 설정됨"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"우선순위 대화에서 다음과 같은 동작을 합니다."</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"대화 섹션의 상단에 표시"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"잠금 화면에서 프로필 사진 표시"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"앱 상단에서 플로팅 대화창으로 표시"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"방해 금지 모드 무시"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"확인"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"설정"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"확대 오버레이 창"</string> <string name="magnification_window_title" msgid="4863914360847258333">"확대 창"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"확대 창 컨트롤"</string> - <string name="quick_controls_title" msgid="6839108006171302273">"기기 제어"</string> + <string name="quick_controls_title" msgid="6839108006171302273">"기기 컨트롤"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"연결된 기기의 컨트롤을 추가합니다."</string> - <string name="quick_controls_setup_title" msgid="8901436655997849822">"기기 제어 설정"</string> + <string name="quick_controls_setup_title" msgid="8901436655997849822">"기기 컨트롤 설정"</string> <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"전원 버튼을 길게 눌러 컨트롤에 액세스하세요."</string> <string name="controls_providers_title" msgid="6879775889857085056">"컨트롤을 추가할 앱을 선택하세요"</string> <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380"> @@ -1039,13 +1041,13 @@ <string name="accessibility_control_change_unfavorite" msgid="6997408061750740327">"즐겨찾기에서 삭제"</string> <string name="accessibility_control_move" msgid="8980344493796647792">"다음 위치로 이동: <xliff:g id="NUMBER">%d</xliff:g>"</string> <string name="controls_favorite_default_title" msgid="967742178688938137">"제어"</string> - <string name="controls_favorite_subtitle" msgid="6604402232298443956">"전원 메뉴에서 액세스할 컨트롤을 선택합니다."</string> + <string name="controls_favorite_subtitle" msgid="6604402232298443956">"전원 메뉴에서 액세스할 컨트롤 선택"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"길게 누르고 드래그하여 컨트롤 재정렬"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"모든 컨트롤 삭제됨"</string> <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"변경사항이 저장되지 않음"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"전체 컨트롤 목록을 로드할 수 없습니다."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"기타"</string> - <string name="controls_dialog_title" msgid="2343565267424406202">"기기 제어에 추가"</string> + <string name="controls_dialog_title" msgid="2343565267424406202">"기기 컨트롤에 추가"</string> <string name="controls_dialog_ok" msgid="2770230012857881822">"추가"</string> <string name="controls_dialog_message" msgid="342066938390663844">"<xliff:g id="APP">%s</xliff:g>에서 제안"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"컨트롤 업데이트됨"</string> diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index 1b046764f4a0..dcd10cc566f7 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Жазышуу бөлүмүнүн жогорку жагында калкып чыкма билдирме түрүндө көрүнүп, профиль сүрөтү кулпуланган экрандан чагылдырылат"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Жөндөөлөр"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Маанилүүлүгү"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> жазышуу функцияларын колдоого албайт"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Акыркы калкып чыкма билдирмелер жок"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Кайра жөнөтүлгөн жана жабылган калкып чыкма билдирмелер ушул жерде көрүнөт"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Бул билдирмелерди өзгөртүүгө болбойт."</string> @@ -857,7 +856,7 @@ <string name="left_icon" msgid="5036278531966897006">"¨Солго¨ сүрөтчөсү"</string> <string name="right_icon" msgid="1103955040645237425">"¨Оңго¨ сүрөтчөсү"</string> <string name="drag_to_add_tiles" msgid="8933270127508303672">"Керектүү элементтерди сүйрөп келиңиз"</string> - <string name="drag_to_rearrange_tiles" msgid="2143204300089638620">"Элементтердин иретин өзгөртүү үчүн кармап туруп, сүйрөңүз"</string> + <string name="drag_to_rearrange_tiles" msgid="2143204300089638620">"Элементтердин иретин өзгөртүү үчүн, кармап туруп, сүйрөңүз"</string> <string name="drag_to_remove_tiles" msgid="4682194717573850385">"Алып салуу үчүн бул жерге сүйрөңүз"</string> <string name="drag_to_remove_disabled" msgid="933046987838658850">"Сизге жок дегенде <xliff:g id="MIN_NUM_TILES">%1$d</xliff:g> мозаика керек"</string> <string name="qs_edit" msgid="5583565172803472437">"Түзөтүү"</string> @@ -1014,19 +1013,22 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Тутум чабыттоосу жаңырды. Өзгөртүү үчүн, Жөндөөлөргө өтүңүз."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Тутум чабыттоосун жаңыртуу үчүн Жөндөөлөргө өтүңүз"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Көшүү режими"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"Жазышуу маанилүү болуп коюлду"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Маанилүү жазышуулардын төмөнкүдөй артыкчылыктары бар:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Жазышуу бөлүмүнүн үстүндө көрсөтүү"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Профилдин сүрөтүн кулпуланган экранда көрсөтүү"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Калкым чыкма билдирме катары көрсөтүү"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"\"Тынчымды алба\" режими үзгүлтүккө учурайт"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Түшүндүм"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Жөндөөлөр"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Чоңойтуу терезесин үстүнө коюу"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Чоңойтуу терезеси"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Чоңойтуу терезесин башкаруу каражаттары"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Түзмөктү башкаруу элементтери"</string> - <string name="quick_controls_subtitle" msgid="1667408093326318053">"Байланыштырылган түзмөктөрүңүз үчүн көзөмөлдөрдү кошуңуз"</string> + <string name="quick_controls_subtitle" msgid="1667408093326318053">"Байланышкан түзмөктөрүңүздү башкаруу элементтерин кошуңуз"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"Түзмөктү башкаруу элементтерин жөндөө"</string> <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"Көзөмөлдөргө өтүү үчүн, күйгүзүү/өчүрүү баскычын басып туруңуз"</string> - <string name="controls_providers_title" msgid="6879775889857085056">"Көзөмөлдөрдү кошуу үчүн колдонмо тандаңыз"</string> + <string name="controls_providers_title" msgid="6879775889857085056">"Башкаруу элементтери кошула турган колдонмону тандаңыз"</string> <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380"> <item quantity="other"><xliff:g id="NUMBER_1">%s</xliff:g> көзөмөл кошулду.</item> <item quantity="one"><xliff:g id="NUMBER_0">%s</xliff:g> көзөмөл кошулду.</item> @@ -1039,8 +1041,8 @@ <string name="accessibility_control_change_unfavorite" msgid="6997408061750740327">"сүйүктүүлөрдөн чыгаруу"</string> <string name="accessibility_control_move" msgid="8980344493796647792">"<xliff:g id="NUMBER">%d</xliff:g>-позицияга жылдыруу"</string> <string name="controls_favorite_default_title" msgid="967742178688938137">"Башкаруу элементтери"</string> - <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Күйгүзүү/өчүрүү баскычынын менюсу үчүн көзөмөлдөрдү тандаңыз"</string> - <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Башкаруу элементтеринин иретин өзгөртүү үчүн кармап туруп, сүйрөңүз"</string> + <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Күйгүзүү/өчүрүү баскычынын менюсунда жеткиликтүү боло турган башкаруу элементтерин тандаңыз."</string> + <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Башкаруу элементтеринин иретин өзгөртүү үчүн, кармап туруп, сүйрөңүз"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Бардык башкаруу элементтери өчүрүлдү"</string> <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Өзгөртүүлөр сакталган жок"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Бардык көзөмөлдөрдүн тизмеси жүктөлгөн жок."</string> @@ -1049,7 +1051,7 @@ <string name="controls_dialog_ok" msgid="2770230012857881822">"Кошуу"</string> <string name="controls_dialog_message" msgid="342066938390663844">"<xliff:g id="APP">%s</xliff:g> сунуштайт"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Башкаруу элементтери жаңырды"</string> - <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN код тамгаларды же символдорду камтыйт"</string> + <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN код тамгалардан же символдордон турат"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"<xliff:g id="DEVICE">%s</xliff:g> түзмөгүн ырастаңыз"</string> <string name="controls_pin_wrong" msgid="6162694056042164211">"PIN код туура эмес"</string> <string name="controls_pin_verifying" msgid="3755045989392131746">"Ырасталууда…"</string> @@ -1067,6 +1069,6 @@ <string name="controls_error_failed" msgid="960228639198558525">"Ката, кайталап көрүңүз"</string> <string name="controls_in_progress" msgid="4421080500238215939">"Аткарылууда"</string> <string name="controls_added_tooltip" msgid="4842812921719153085">"Башкаруу элементтерин көрүү үчүн күйгүзүү/өчүрүү баскычын коё бербей басып туруңуз"</string> - <string name="controls_menu_add" msgid="4447246119229920050">"Көзөмөлдөө функцияларын кошуу"</string> - <string name="controls_menu_edit" msgid="890623986951347062">"Көзөмөлдөө функцияларын түзөтүү"</string> + <string name="controls_menu_add" msgid="4447246119229920050">"Башкаруу элементтерин кошуу"</string> + <string name="controls_menu_edit" msgid="890623986951347062">"Башкаруу элементтерин түзөтүү"</string> </resources> diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml index 62649f5550bd..a7e9d8d3a810 100644 --- a/packages/SystemUI/res/values-lo/strings.xml +++ b/packages/SystemUI/res/values-lo/strings.xml @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"ສະແດງຢູ່ເທິງສຸດຂອງພາກສ່ວນການສົນທະນາ, ປາກົດເປັນ bubble ແບບລອຍ, ສະແດງຮູບໂປຣໄຟລ໌ຢູ່ໜ້າຈໍລັອກ"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ຕັ້ງຄ່າ"</string> <string name="notification_priority_title" msgid="2079708866333537093">"ສຳຄັນ"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> ບໍ່ຮອງຮັບຄຸນສົມບັດການສົນທະນາ"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"ບໍ່ມີຟອງຫຼ້າສຸດ"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"ຟອງຫຼ້າສຸດ ແລະ ຟອງທີ່ປິດໄປຈະປາກົດຢູ່ບ່ອນນີ້"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"ບໍ່ສາມາດແກ້ໄຂການແຈ້ງເຕືອນເຫຼົ່ານີ້ໄດ້."</string> @@ -1014,11 +1013,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"ອັບເດດການນຳທາງລະບົບແລ້ວ. ເພື່ອປ່ຽນແປງ, ກະລຸນາໄປທີ່ການຕັ້ງຄ່າ."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"ໄປທີ່ການຕັ້ງຄ່າເພື່ອອັບເດດການນຳທາງລະບົບ"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ສະແຕນບາຍ"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"ຕັ້ງການສົນທະນາເປັນສຳຄັນແລ້ວ"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"ການສົນທະນາສຳຄັນຈະ:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"ສະແດງຢູ່ເທິງສຸດຂອງພາກສ່ວນການສົນທະນາ"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"ສະແດງຮູບໂປຣໄຟລ໌ຢູ່ໜ້າຈໍລັອກ"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"ປາກົດເປັນ bubble ລອຍຢູ່ເໜືອແອັບ"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"ລົບກວນໂໝດຫ້າມລົບກວນ"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"ເຂົ້າໃຈແລ້ວ"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"ການຕັ້ງຄ່າ"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"ໜ້າຈໍວາງທັບການຂະຫຍາຍ"</string> <string name="magnification_window_title" msgid="4863914360847258333">"ໜ້າຈໍການຂະຫຍາຍ"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"ການຄວບຄຸມໜ້າຈໍການຂະຫຍາຍ"</string> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index 589b011a4651..a0903193dd83 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -725,8 +725,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Rodoma pokalbių skilties viršuje, rodoma kaip slankusis burbulas, pateikiama profilio nuotrauka užrakinimo ekrane"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Nustatymai"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritetas"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"Programa „<xliff:g id="APP_NAME">%1$s</xliff:g>“ nepalaiko pokalbių funkcijų"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nėra naujausių burbulų"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Naujausi ir atsisakyti burbulus bus rodomi čia"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Šių pranešimų keisti negalima."</string> @@ -1024,11 +1023,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Sistemos naršymo funkcijos atnaujintos. Jei norite pakeisti, eikite į skiltį „Nustatymai“."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Eikite į skiltį „Nustatymai“, kad atnaujintumėte sistemos naršymo funkcijas"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Budėjimo laikas"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"Pokalbis nustatytas į prioritetinį"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Prioritetiniai pokalbiai bus:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Rodyti pokalbių skilties viršuje"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Rodyti profilio nuotrauką užrakinimo ekrane"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Rodyti kaip slankųjį debesėlį programų viršuje"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Pertraukti netrukdymo režimą"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Supratau"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Nustatymai"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Didinimo perdangos langas"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Didinimo langas"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Didinimo lango valdikliai"</string> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index c3d461975eaa..f107de9c14c6 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -722,8 +722,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Parādās sarunu sadaļas augšdaļā un kā peldošs burbulis, kā arī bloķēšanas ekrānā tiek rādīts profila attēls"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Iestatījumi"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritārs"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"Lietotnē <xliff:g id="APP_NAME">%1$s</xliff:g> netiek atbalstītas sarunu funkcijas."</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nav nesen aizvērtu burbuļu"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Šeit būs redzami nesen rādītie burbuļi un aizvērtie burbuļi"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Šos paziņojumus nevar modificēt."</string> @@ -1019,11 +1018,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Sistēmas navigācija ir atjaunināta. Lai veiktu izmaiņas, atveriet iestatījumus."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Atveriet iestatījumus, lai atjauninātu sistēmas navigāciju"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Gaidstāve"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"Saruna iestatīta kā prioritāra"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Prioritārās sarunas:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Tiek rādītas sarunu sadaļas augšdaļā"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Tiek rādīts profila attēls bloķēšanas ekrānā"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Tiek rādītas kā peldošs burbulis virs lietotnēm"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Var tikt rādītas režīmā “Netraucēt”"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Labi"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Iestatījumi"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Palielināšanas pārklājuma logs"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Palielināšanas logs"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Palielināšanas loga vadīklas"</string> diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml index 96266805d127..0361eed3c2de 100644 --- a/packages/SystemUI/res/values-mk/strings.xml +++ b/packages/SystemUI/res/values-mk/strings.xml @@ -511,7 +511,7 @@ <string name="manage_notifications_text" msgid="6885645344647733116">"Управувајте"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Историја"</string> <string name="notification_section_header_incoming" msgid="5295312809341711367">"Дојдовни"</string> - <string name="notification_section_header_gentle" msgid="6804099527336337197">"Тивко"</string> + <string name="notification_section_header_gentle" msgid="6804099527336337197">"Безгласно"</string> <string name="notification_section_header_alerting" msgid="5581175033680477651">"Известувања"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Разговори"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Избриши ги сите тивки известувања"</string> @@ -702,13 +702,13 @@ <string name="inline_block_button" msgid="479892866568378793">"Блокирај"</string> <string name="inline_keep_button" msgid="299631874103662170">"Продолжи да ги прикажуваш"</string> <string name="inline_minimize_button" msgid="1474436209299333445">"Минимизирај"</string> - <string name="inline_silent_button_silent" msgid="525243786649275816">"Тивко"</string> + <string name="inline_silent_button_silent" msgid="525243786649275816">"Безгласно"</string> <string name="inline_silent_button_stay_silent" msgid="2129254868305468743">"Продолжи со безгласно прикажување"</string> <string name="inline_silent_button_alert" msgid="5705343216858250354">"Предупредувај"</string> <string name="inline_silent_button_keep_alerting" msgid="6577845442184724992">"Продолжи да ме предупредуваш"</string> <string name="inline_turn_off_notifications" msgid="8543989584403106071">"Исклучи известувања"</string> <string name="inline_keep_showing_app" msgid="4393429060390649757">"Дали да продолжат да се прикажуваат известувања од апликацијава?"</string> - <string name="notification_silence_title" msgid="8608090968400832335">"Тивко"</string> + <string name="notification_silence_title" msgid="8608090968400832335">"Безгласно"</string> <string name="notification_alert_title" msgid="3656229781017543655">"Стандардно"</string> <string name="notification_bubble_title" msgid="8330481035191903164">"Балонче"</string> <string name="notification_channel_summary_low" msgid="4860617986908931158">"Без звук или вибрации"</string> @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Се појавува на горниот дел од секцијата на разговорот во вид на лебдечко меурче, покажувајќи ја профилната слика на заклучениот екран"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Поставки"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Приоритет"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> не поддржува функции за разговор"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Нема неодамнешни балончиња"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Неодамнешните и отфрлените балончиња ќе се појавуваат тука"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Овие известувања не може да се изменат"</string> @@ -1014,11 +1013,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Навигацијата на системот е ажурирана. За да извршите промени, одете во „Поставки“."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Одете во „Поставки“ за да ја ажурирате навигацијата на системот"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Подготвеност"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"Разговорот е поставен како приоритетен"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Приорететните разговори ќе:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Се прикажува најгоре во делот со разговори"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Се прикажува профилна слика на заклучен екран"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Се појавува како лебдечко балонче врз апликациите"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Прекинува „Не вознемирувај“"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Сфатив"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Поставки"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Прозорец за преклопување на зголемувањето"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Прозорец за зголемување"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Контроли на прозорец за зголемување"</string> diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index 4ac0d4f6e508..5c80eb32a9b8 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"സംഭാഷണ വിഭാഗത്തിന് മുകളിലായി കാണിക്കുന്നു, ഫ്ലോട്ടിംഗ് ബബിളായി ദൃശ്യമാകുന്നു, ലോക്ക് സ്ക്രീനിൽ പ്രൊഫൈൽ ചിത്രം പ്രദർശിപ്പിക്കുന്നു"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ക്രമീകരണം"</string> <string name="notification_priority_title" msgid="2079708866333537093">"മുൻഗണന"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> സംഭാഷണ സവിശേഷതകളെ പിന്തുണയ്ക്കുന്നില്ല"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"അടുത്തിടെയുള്ള ബബിളുകൾ ഒന്നുമില്ല"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"അടുത്തിടെയുള്ള ബബിളുകൾ, ഡിസ്മിസ് ചെയ്ത ബബിളുകൾ എന്നിവ ഇവിടെ ദൃശ്യമാവും"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"ഈ അറിയിപ്പുകൾ പരിഷ്ക്കരിക്കാനാവില്ല."</string> @@ -1014,11 +1013,17 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"സിസ്റ്റം നാവിഗേഷൻ അപ്ഡേറ്റ് ചെയ്തു. മാറ്റങ്ങൾ വരുത്താൻ ക്രമീകരണത്തിലേക്ക് പോവുക."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"സിസ്റ്റം നാവിഗേഷൻ അപ്ഡേറ്റ് ചെയ്യാൻ ക്രമീകരണത്തിലേക്ക് പോവുക"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"സ്റ്റാൻഡ്ബൈ"</string> + <!-- no translation found for priority_onboarding_title (2893070698479227616) --> + <skip /> + <!-- no translation found for priority_onboarding_behavior (5342816047020432929) --> + <skip /> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"സംഭാഷണ വിഭാഗത്തിന്റെ മുകളിൽ കാണിക്കുക"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"ലോക്ക് സ്ക്രീനിൽ പ്രൊഫൈൽ ചിത്രം കാണിക്കുക"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"ആപ്പുകളുടെ മുകളിൽ ഫ്ലോട്ടിംഗ് ബബിൾ ആയി ദൃശ്യമാകും"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"\'ശല്യപ്പെടുത്തരുത്\' തടസ്സപ്പെടുത്തുക"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"മനസ്സിലായി"</string> + <!-- no translation found for priority_onboarding_settings_button_title (6663601574303585927) --> + <skip /> <string name="magnification_overlay_title" msgid="6584179429612427958">"മാഗ്നിഫിക്കേഷൻ ഓവർലേ വിൻഡോ"</string> <string name="magnification_window_title" msgid="4863914360847258333">"മാഗ്നിഫിക്കേഷൻ വിൻഡോ"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"മാഗ്നിഫിക്കേഷൻ വിൻഡോ നിയന്ത്രണങ്ങൾ"</string> @@ -1040,7 +1045,7 @@ <string name="accessibility_control_move" msgid="8980344493796647792">"<xliff:g id="NUMBER">%d</xliff:g>-ാം സ്ഥാനത്തേയ്ക്ക് നീക്കുക"</string> <string name="controls_favorite_default_title" msgid="967742178688938137">"നിയന്ത്രണങ്ങൾ"</string> <string name="controls_favorite_subtitle" msgid="6604402232298443956">"പവർ മെനുവിൽ നിന്ന് ആക്സസ് ചെയ്യേണ്ട നിയന്ത്രണങ്ങൾ തിരഞ്ഞെടുക്കുക"</string> - <string name="controls_favorite_rearrange" msgid="5616952398043063519">"നിയന്ത്രണങ്ങൾ പുനഃക്രമീകരിക്കാൻ പിടിച്ച് വലിച്ചിടുക"</string> + <string name="controls_favorite_rearrange" msgid="5616952398043063519">"നിയന്ത്രണങ്ങൾ പുനഃക്രമീകരിക്കാൻ അമർത്തിപ്പിടിച്ച് വലിച്ചിടുക"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"എല്ലാ നിയന്ത്രണങ്ങളും നീക്കം ചെയ്തു"</string> <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"മാറ്റങ്ങൾ സംരക്ഷിച്ചിട്ടില്ല"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"എല്ലാ നിയന്ത്രണങ്ങളുടെയും ലിസ്റ്റ് ലോഡ് ചെയ്യാനായില്ല."</string> diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml index fa8b1a5fd26e..f04df527dfe5 100644 --- a/packages/SystemUI/res/values-mn/strings.xml +++ b/packages/SystemUI/res/values-mn/strings.xml @@ -713,14 +713,13 @@ <string name="notification_bubble_title" msgid="8330481035191903164">"Бөмбөлөг"</string> <string name="notification_channel_summary_low" msgid="4860617986908931158">"Дуу эсвэл чичиргээ байхгүй"</string> <string name="notification_conversation_summary_low" msgid="1734433426085468009">"Дуу эсвэл чичиргээ байхгүй бөгөөд харицан ярианы хэсгийн доод талд харагдана"</string> - <string name="notification_channel_summary_default" msgid="3282930979307248890">"Утасны тохиргоонд тулгуурлан хонх дуугаргах буюу эсхүл чичирхийлж болзошгүй"</string> - <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Утасны тохиргоонд тулгуурлан хонх дуугаргах буюу эсхүл чичирхийлж болзошгүй. <xliff:g id="APP_NAME">%1$s</xliff:g>-н харилцан яриаг өгөгдмөл тохиргооны дагуу бөмбөлөг болгоно."</string> + <string name="notification_channel_summary_default" msgid="3282930979307248890">"Утасны тохиргоонд тулгуурлан хонх дуугаргах эсвэл чичирхийлж болзошгүй"</string> + <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Утасны тохиргоонд тулгуурлан хонх дуугаргах эсвэл чичирхийлж болзошгүй. <xliff:g id="APP_NAME">%1$s</xliff:g>-н харилцан яриаг өгөгдмөл тохиргооны дагуу бөмбөлөг болгоно."</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Энэ контентын хөвөн гарч ирэх товчлолтойгоор таны анхаарлыг татдаг."</string> <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Харилцан ярианы хэсгийн дээд талд хөвж буй бөмбөлөг хэлбэрээр харагдах бөгөөд профайлын зургийг түгжигдсэн дэлгэцэд үзүүлнэ"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Тохиргоо"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Ач холбогдол"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> нь харилцан ярианы онцлогуудыг дэмждэггүй"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Саяхны бөмбөлөг алга байна"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Саяхны бөмбөлгүүд болон үл хэрэгссэн бөмбөлгүүд энд харагдана"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Эдгээр мэдэгдлийг өөрчлөх боломжгүй."</string> @@ -1014,11 +1013,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Системийн навигацыг шинэчиллээ. Өөрчлөхийн тулд Тохиргоо руу очно уу."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Системийн навигацыг шинэчлэхийн тулд Тохиргоо руу очно уу"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Зогсолтын горим"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"Харилцан яриаг чухал гэж тохируулсан"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Чухал харилцан яриа нь:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Харилцан ярианы хэсгийн дээд талд харуулна"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Түгжигдсэн дэлгэц дээр профайлын зургийг харуулна"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Аппуудын дээр хөвөгч бөмбөлөг хэлбэрээр харагдана"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Бүү саад бол онцлогийг үл хэрэгсэн тасалдуулна"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Ойлголоо"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Тохиргоо"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Томруулалтыг давхарласан цонх"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Томруулалтын цонх"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Томруулалтын цонхны хяналт"</string> diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index 0a8360bb2b7e..8994141167e3 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -592,29 +592,21 @@ <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"सुरू करा"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"बंद करा"</string> <string name="accessibility_output_chooser" msgid="7807898688967194183">"आउटपुट डिव्हाइस स्विच करा"</string> - <!-- no translation found for screen_pinning_title (9058007390337841305) --> - <skip /> + <string name="screen_pinning_title" msgid="9058007390337841305">"ॲप पिन केले आहे"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"तुम्ही अनपिन करेर्यंत हे यास दृश्यामध्ये ठेवते. अनपिन करण्यासाठी परत आणि विहंगावलोकनास स्पर्श करा आणि धरून ठेवा."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"तुम्ही अनपिन करेर्यंत हे त्याला दृश्यामध्ये ठेवते. अनपिन करण्यासाठी मागे आणि होम वर स्पर्श करा आणि धरून ठेवा."</string> <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"हे तुम्ही अनपिन करेपर्यंत दृश्यमान ठेवते. वरती स्वाइप करा आणि अनपिन करण्यासाठी धरून ठेवा."</string> <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"तुम्ही अनपिन करेर्यंत हे यास दृश्यामध्ये ठेवते. अनपिन करण्यासाठी विहंगावलोकनास स्पर्श करा आणि धरून ठेवा."</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"तुम्ही अनपिन करेपर्यंत हे त्यास दृश्यामध्ये ठेवते. अनपिन करण्यासाठी होमला स्पर्श करा आणि धरून ठेवा."</string> - <!-- no translation found for screen_pinning_exposes_personal_data (8189852022981524789) --> - <skip /> - <!-- no translation found for screen_pinning_can_open_other_apps (7529756813231421455) --> - <skip /> - <!-- no translation found for screen_pinning_toast (8177286912533744328) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (6850978077443052594) --> - <skip /> - <!-- no translation found for screen_pinning_toast_gesture_nav (170699893395336705) --> - <skip /> + <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"वैयक्तिक डेटा अॅक्सेस केला जाऊ शकतो (जसे की संपर्क आणि ईमेल आशय)."</string> + <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"पिन केलेले ॲप इतर ॲप्स उघडू शकते."</string> + <string name="screen_pinning_toast" msgid="8177286912533744328">"हे ॲप अनपिन करण्यासाठी, मागे आणि अवलोकन बटणांना स्पर्श करून धरून ठेवा"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"हे ॲप अनपिन करण्यासाठी, मागे आणि होम बटणांना स्पर्श करून धरून ठेवा"</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"हे ॲप अनपिन करण्यासाठी, वर स्वाइप करा आणि धरून ठेवा"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"समजले"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"नाही, नको"</string> - <!-- no translation found for screen_pinning_start (7483998671383371313) --> - <skip /> - <!-- no translation found for screen_pinning_exit (4553787518387346893) --> - <skip /> + <string name="screen_pinning_start" msgid="7483998671383371313">"पिन केलेले ॲप"</string> + <string name="screen_pinning_exit" msgid="4553787518387346893">"अनपिन केलेले ॲप"</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> लपवायचे?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"तुम्ही सेटिंग्जमध्ये ते पुढील वेळी सुरू कराल तेव्हा ते पुन्हा दिसेल."</string> <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"लपवा"</string> @@ -721,14 +713,13 @@ <string name="notification_bubble_title" msgid="8330481035191903164">"बबल"</string> <string name="notification_channel_summary_low" msgid="4860617986908931158">"आवाज किंवा व्हायब्रेशन नाही"</string> <string name="notification_conversation_summary_low" msgid="1734433426085468009">"आवाज किंवा व्हायब्रेशन नाही आणि संभाषण विभागात सर्वात तळाशी दिसते"</string> - <string name="notification_channel_summary_default" msgid="3282930979307248890">"फोन सेटिंग्जच्या आधारावर रिंग किंवा व्हायब्रेट होऊ शकतो"</string> + <string name="notification_channel_summary_default" msgid="3282930979307248890">"फोन सेटिंग्जनुसार फोन रिंग किंवा व्हायब्रेट होऊ शकतो"</string> <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"फोन सेटिंग्जच्या आधारावर रिंग किंवा व्हायब्रेट होऊ शकतो. <xliff:g id="APP_NAME">%1$s</xliff:g> मधील संभाषणे बाय डीफॉल्ट बबल होतात."</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"या आशयाच्या फ्लोटिंग शॉर्टकटसह तुमचे लक्ष केंद्रित करते."</string> <string name="notification_channel_summary_priority" msgid="7952654515769021553">"संभाषण विभागात सर्वात वरती फ्लोटिंग बबल म्हणून दिसते, लॉक स्क्रीनवर प्रोफाइल पिक्चर दाखवते"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"सेटिंग्ज"</string> <string name="notification_priority_title" msgid="2079708866333537093">"प्राधान्य"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> हे संभाषण वैशिष्ट्यांना सपोर्ट करत नाही"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"अलीकडील कोणतेही बबल नाहीत"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"अलीकडील बबल आणि डिसमिस केलेले बबल येथे दिसतील"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"या सूचनांमध्ये सुधारणा केली जाऊ शकत नाही."</string> @@ -1022,11 +1013,17 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"सिस्टम नेव्हिगेशन अपडेट केले. बदल करण्यासाठी, सेटिंग्जवर जा."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"सिस्टम नेव्हिगेशन अपडेट करण्यासाठी सेटिंग्जवर जा"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"स्टँडबाय"</string> + <!-- no translation found for priority_onboarding_title (2893070698479227616) --> + <skip /> + <!-- no translation found for priority_onboarding_behavior (5342816047020432929) --> + <skip /> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"संभाषण विभागाच्या सर्वात वरती दाखवा"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"लॉक स्क्रीनवर प्रोफाइल फोटो दाखवा"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"ॲप्सच्या सर्वात वरती फ्लोटिंग बबल म्हणून दिसतील"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"व्यत्यय आणू नका मध्ये अडथळा आणतील"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"समजले"</string> + <!-- no translation found for priority_onboarding_settings_button_title (6663601574303585927) --> + <skip /> <string name="magnification_overlay_title" msgid="6584179429612427958">"मॅग्निफिकेशन ओव्हरले विंडो"</string> <string name="magnification_window_title" msgid="4863914360847258333">"मॅग्निफिकेशन विंडो"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"मॅग्निफिकेशन विंडो नियंत्रणे"</string> @@ -1057,7 +1054,7 @@ <string name="controls_dialog_ok" msgid="2770230012857881822">"जोडा"</string> <string name="controls_dialog_message" msgid="342066938390663844">"<xliff:g id="APP">%s</xliff:g> ने सुचवले आहे"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"नियंत्रणे अपडेट केली आहेत"</string> - <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"पिनमध्ये अक्षरांचा किंवा चिन्हांचा समावेश असतो"</string> + <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"पिनमध्ये अक्षरे किंवा चिन्हे आहेत"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"<xliff:g id="DEVICE">%s</xliff:g> ची पडताळणी करा"</string> <string name="controls_pin_wrong" msgid="6162694056042164211">"चुकीचा पिन"</string> <string name="controls_pin_verifying" msgid="3755045989392131746">"पडताळणी करत आहे…"</string> diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index ef8198a3f378..a251c3d8b9c8 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Ditunjukkan di sebelah atas bahagian perbualan, muncul sebagai gelembung terapung, memaparkan gambar profil pada skrin kunci"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Tetapan"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Keutamaan"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> tidak menyokong ciri perbualan"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Tiada gelembung terbaharu"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Gelembung baharu dan gelembung yang diketepikan akan dipaparkan di sini"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Pemberitahuan ini tidak boleh diubah suai."</string> @@ -1014,11 +1013,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Navigasi sistem dikemas kini. Untuk membuat perubahan, pergi ke Tetapan."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Pergi ke Tetapan untuk mengemas kini navigasi sistem"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Tunggu sedia"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"Perbualan ditetapkan kepada keutamaan"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Perbualan keutamaan akan:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Tunjukkan di atas bahagian perbualan"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Tunjukkan gambar profil pada skrin kunci"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Dipaparkan sebagai gelembung terapung di atas apl"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Ganggu ciri Jangan Ganggu"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Tetapan"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Tetingkap Tindanan Pembesaran"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Tetingkap Pembesaran"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Kawalan Tetingkap Pembesaran"</string> diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml index 96c35781204e..810388db843c 100644 --- a/packages/SystemUI/res/values-my/strings.xml +++ b/packages/SystemUI/res/values-my/strings.xml @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"စကားဝိုင်းကဏ္ဍ၏ ထိပ်ပိုင်းတွင် ပြပြီး ပူဖောင်းကွက်အဖြစ် မြင်ရသည်၊ လော့ခ်ချထားချိန် မျက်နှာပြင်တွင် ပရိုဖိုင်ပုံကို ပြသည်"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ဆက်တင်များ"</string> <string name="notification_priority_title" msgid="2079708866333537093">"ဦးစားပေး"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> က စကားဝိုင်းဝန်ဆောင်မှုများကို မပံ့ပိုးပါ"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"လတ်တလော ပူဖောင်းကွက်များ မရှိပါ"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"လတ်တလော ပူဖောင်းကွက်များနှင့် ပိတ်လိုက်သော ပူဖောင်းကွက်များကို ဤနေရာတွင် မြင်ရပါမည်"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"ဤအကြောင်းကြားချက်များကို ပြုပြင်၍ မရပါ။"</string> @@ -1014,16 +1013,19 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"စနစ်လမ်းညွှန်ခြင်း အပ်ဒိတ်လုပ်ပြီးပါပြီ။ အပြောင်းအလဲများ ပြုလုပ်ရန် \'ဆက်တင်များ\' သို့သွားပါ။"</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"စနစ်လမ်းညွှန်ခြင်း အပ်ဒိတ်လုပ်ရန် \'ဆက်တင်များ\' သို့သွားပါ"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"အသင့်အနေအထား"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"စကားဝိုင်းကို ဦးစားပေးအဖြစ် သတ်မှတ်ထားသည်"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"ဦးစားပေး စကားဝိုင်းသည်-"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"စကားဝိုင်းကဏ္ဍ၏ အပေါ်ဘက်တွင်ပြရန်"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"လော့ခ်မျက်နှာပြင်တွင် ပရိုဖိုင်ပုံကို ပြရန်"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"အက်ပ်အပေါ်တွင် မျောနေသောပူဖောင်းကွက်အဖြစ် ပေါ်မည်"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"\'မနှောင့်ယှက်ရ\' ကို ကြားဖြတ်ခြင်း"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Ok"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"ဆက်တင်များ"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"ဝင်းဒိုး ထပ်ပိုးလွှာ ချဲ့ခြင်း"</string> <string name="magnification_window_title" msgid="4863914360847258333">"ဝင်းဒိုး ချဲ့ခြင်း"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"ဝင်းဒိုး ထိန်းချုပ်မှုများ ချဲ့ခြင်း"</string> <string name="quick_controls_title" msgid="6839108006171302273">"စက်ထိန်းစနစ်"</string> - <string name="quick_controls_subtitle" msgid="1667408093326318053">"သင့်ချိတ်ဆက်ထားသော စက်များအတွက် ထိန်းချုပ်မှုများ ထည့်ပါ"</string> + <string name="quick_controls_subtitle" msgid="1667408093326318053">"ချိတ်ဆက်စက်များအတွက် ထိန်းချုပ်မှုများထည့်ပါ"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"စက်ထိန်းစနစ် ထည့်သွင်းခြင်း"</string> <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"သင့်ထိန်းချုပ်မှုများကို အသုံးပြုရန် \'ပါဝါ\' ခလုတ်ကို ဖိထားပါ"</string> <string name="controls_providers_title" msgid="6879775889857085056">"ထိန်းချုပ်မှုများထည့်ရန် အက်ပ်ရွေးခြင်း"</string> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index 241b6c383bb0..b208cf2c63e6 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Vises øverst i samtaledelen, vises som en flytende boble, viser profilbildet på låseskjermen"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Innstillinger"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritet"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> støtter ikke samtalefunksjoner"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Ingen nylige bobler"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Nylige bobler og avviste bobler vises her"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Disse varslene kan ikke endres."</string> @@ -1014,11 +1013,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Systemnavigeringen er oppdatert. For å gjøre endringer, gå til Innstillinger."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Gå til Innstillinger for å oppdatere systemnavigeringen"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Ventemodus"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"Samtalen er satt som prioritert"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Dette skjer med prioriterte samtaler:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Vis øverst i samtaledelen"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Vis profilbildet på låseskjermen"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Vises som en svevende boble over apper"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Overstyr «Ikke forstyrr»"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Greit"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Innstillinger"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Overleggsvindu for forstørring"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Forstørringsvindu"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Kontroller for forstørringsvindu"</string> diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index ccce091745b0..abfb4c870825 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -592,29 +592,21 @@ <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"सक्षम पार्नुहोस्"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"असक्षम पार्नुहोस्"</string> <string name="accessibility_output_chooser" msgid="7807898688967194183">"आउटपुट यन्त्र बदल्नुहोस्"</string> - <!-- no translation found for screen_pinning_title (9058007390337841305) --> - <skip /> + <string name="screen_pinning_title" msgid="9058007390337841305">"एप पिन गरिएको छ"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"तपाईंले अनपिन नगरेसम्म यसले त्यसलाई दृश्यमा कायम राख्छ। अनपिन गर्न पछाडि र परिदृश्य बटनलाई छोइराख्नुहोस्।"</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"तपाईंले अनपिन नगरेसम्म यसले त्यसलाई दृश्यमा कायम राख्छ। अनपिन गर्न पछाडि र गृह नामक बटनहरूलाई छोइराख्नुहोस्।"</string> <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"तपाईंले अनपिन नगरेसम्म यस कार्यले यसलाई दृश्यमा राख्छ। अनपिन गर्न माथितिर स्वाइप गरी होल्ड गर्नुहोस्।"</string> <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"तपाईंले अनपिन नगरेसम्म यसले त्यसलाई दृश्यमा कायम राख्छ। अनपिन गर्न परिदृश्य बटनलाई छोइराख्नुहोस्।"</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"तपाईंले अनपिन नगरेसम्म यसले त्यसलाई दृश्यमा कायम राख्छ। अनपिन गर्न गृह नामक बटनलाई छोइराख्नुहोस्।"</string> - <!-- no translation found for screen_pinning_exposes_personal_data (8189852022981524789) --> - <skip /> - <!-- no translation found for screen_pinning_can_open_other_apps (7529756813231421455) --> - <skip /> - <!-- no translation found for screen_pinning_toast (8177286912533744328) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (6850978077443052594) --> - <skip /> - <!-- no translation found for screen_pinning_toast_gesture_nav (170699893395336705) --> - <skip /> + <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"स्क्रिनमा व्यक्तिगत डेटा (जस्तै सम्पर्क ठेगाना र इमेलको सामग्री) देखिन सक्छ।"</string> + <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"पिन गरिएको एपले अन्य एप खोल्न सक्छ।"</string> + <string name="screen_pinning_toast" msgid="8177286912533744328">"यो एप अनपनि गर्न पछाडि र विवरण नामक बटनहरूलाई छोइराख्नुहोस्"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"यो एप अनपनि गर्न पछाडि र होम बटनलाई छोइराख्नुहोस्"</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"यो एप अनपिन गर्न माथितिर स्वाइप गरी स्क्रिनमा छोइराख्नुहोस्"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"बुझेँ"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"धन्यवाद पर्दैन"</string> - <!-- no translation found for screen_pinning_start (7483998671383371313) --> - <skip /> - <!-- no translation found for screen_pinning_exit (4553787518387346893) --> - <skip /> + <string name="screen_pinning_start" msgid="7483998671383371313">"एप पिन गरियो"</string> + <string name="screen_pinning_exit" msgid="4553787518387346893">"एप अनपिन गरियो"</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"लुकाउनुहुन्छ <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"यो तपाईं सेटिङ् मा यो बारी अर्को समय देखापर्नेछ।"</string> <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"लुकाउनुहोस्"</string> @@ -727,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"वार्तालाप खण्डको सिरानमा देखा पर्छ, तैरने बबलका रूपमा देखा पर्छ, लक स्क्रिनमा प्रोफाइल तस्बिर देखाइन्छ"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"सेटिङ"</string> <string name="notification_priority_title" msgid="2079708866333537093">"प्राथमिकता"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> मा वार्तालापसम्बन्धी सुविधा प्रयोग गर्न मिल्दैन"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"हालैका बबलहरू छैनन्"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"हालैका बबल र खारेज गरिएका बबलहरू यहाँ देखिने छन्"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"यी सूचनाहरू परिमार्जन गर्न मिल्दैन।"</string> @@ -1022,11 +1013,17 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"प्रणालीको नेभिगेसन अद्यावधिक गरियो। परिवर्तन गर्न सेटिङमा जानुहोस्।"</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"प्रणालीको नेभिगेसन अद्यावधिक गर्न सेटिङमा जानुहोस्"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"स्ट्यान्डबाई"</string> + <!-- no translation found for priority_onboarding_title (2893070698479227616) --> + <skip /> + <!-- no translation found for priority_onboarding_behavior (5342816047020432929) --> + <skip /> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"वार्तालाप खण्डको सिरानमा देखाइयोस्"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"लक स्क्रिनमा प्रोफाइल तस्बिर देखाइयोस्"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"एपहरूमाथि तैरिने बबलका रूपमा देखाइयोस्"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"बाधा नपुऱ्याउनुहोस् मोडलाई बेवास्ता गरियोस्"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"बुझेँ"</string> + <!-- no translation found for priority_onboarding_settings_button_title (6663601574303585927) --> + <skip /> <string name="magnification_overlay_title" msgid="6584179429612427958">"म्याग्निफिकेसन ओभरले विन्डो"</string> <string name="magnification_window_title" msgid="4863914360847258333">"म्याग्निफिकेसन विन्डो"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"म्याग्निफिकेसन विन्डोका नियन्त्रणहरू"</string> diff --git a/packages/SystemUI/res/values-night/styles.xml b/packages/SystemUI/res/values-night/styles.xml index 4fdeb6fa4a92..50261e1b2139 100644 --- a/packages/SystemUI/res/values-night/styles.xml +++ b/packages/SystemUI/res/values-night/styles.xml @@ -29,4 +29,9 @@ <item name="android:textColor">?android:attr/textColorPrimary</item> </style> + <style name="qs_security_footer" parent="@style/qs_theme"> + <item name="android:textColor">#B3FFFFFF</item> <!-- 70% white --> + <item name="android:tint">#FFFFFFFF</item> + </style> + </resources> diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index 3b70c39eb5f5..f578c2dcbb6f 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Wordt bovenaan het gedeelte met gesprekken weergegeven, verschijnt als zwevende bubbel, geeft de profielfoto weer op het vergrendelingsscherm"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Instellingen"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioriteit"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> ondersteunt geen gespreksfuncties"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Geen recente bubbels"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Recente bubbels en gesloten bubbels worden hier weergegeven"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Deze meldingen kunnen niet worden aangepast."</string> @@ -1014,11 +1013,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Systeemnavigatie geüpdatet. Als je wijzigingen wilt aanbrengen, ga je naar Instellingen."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Ga naar Instellingen om de systeemnavigatie te updaten"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Stand-by"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"Gesprek ingesteld als prioriteit"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Bij prioriteitsgesprekken gebeurt het volgende:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Worden bovenaan het gespreksgedeelte weergegeven"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Tonen profielafbeelding op vergrendelingsscherm"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Worden als zwevende ballon weergegeven vóór apps"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Onderbreken \'Niet storen\'"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Instellingen"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Overlay voor vergrotingsvenster"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Vergrotingsvenster"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Bediening van vergrotingsvenster"</string> @@ -1054,7 +1056,7 @@ <string name="controls_pin_wrong" msgid="6162694056042164211">"Onjuiste pincode"</string> <string name="controls_pin_verifying" msgid="3755045989392131746">"Verifiëren…"</string> <string name="controls_pin_instructions" msgid="6363309783822475238">"Geef de pincode op"</string> - <string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Een andere pincode proberen"</string> + <string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Andere pincode proberen"</string> <string name="controls_confirmation_confirming" msgid="2596071302617310665">"Bevestigen…"</string> <string name="controls_confirmation_message" msgid="7744104992609594859">"Bevestig de wijziging voor <xliff:g id="DEVICE">%s</xliff:g>"</string> <string name="controls_structure_tooltip" msgid="4355922222944447867">"Swipe om meer te zien"</string> diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml index cd24e358ba31..27a04dda60b5 100644 --- a/packages/SystemUI/res/values-or/strings.xml +++ b/packages/SystemUI/res/values-or/strings.xml @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"ବାର୍ତ୍ତାଳାପ ବିଭାଗର ଶୀର୍ଷରେ ଦେଖାଏ, ଭାସମାନ ବବଲ୍ ଭାବେ ଦେଖାଯାଏ, ଲକ୍ ସ୍କ୍ରିନରେ ପ୍ରୋଫାଇଲ୍ ଛବି ଡିସପ୍ଲେ କରେ"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ସେଟିଂସ୍"</string> <string name="notification_priority_title" msgid="2079708866333537093">"ପ୍ରାଥମିକତା"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> ବାର୍ତ୍ତାଳାପ ଫିଚରଗୁଡ଼ିକୁ ସମର୍ଥନ କରେ ନାହିଁ"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"ବର୍ତ୍ତମାନ କୌଣସି ବବଲ୍ ନାହିଁ"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"ବର୍ତ୍ତମାନର ଏବଂ ଖାରଜ କରାଯାଇଥିବା ବବଲଗୁଡ଼ିକ ଏଠାରେ ଦେଖାଯିବ"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"ଏହି ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ପରିବର୍ତ୍ତନ କରିହେବ ନାହିଁ।"</string> @@ -1014,11 +1013,17 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"ସିଷ୍ଟମ୍ ନାଭିଗେସନ୍ ଅପ୍ଡେଟ୍ ହୋଇଛି। ପରିବର୍ତ୍ତନ କରିବା ପାଇଁ, ସେଟିଂସ୍କୁ ଯାଆନ୍ତୁ।"</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"ସିଷ୍ଟମ୍ ନାଭିଗେସନ୍ ଅପ୍ଡେଟ୍ କରିବା ପାଇଁ ସେଟିଂସ୍କୁ ଯାଆନ୍ତୁ"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ଷ୍ଟାଣ୍ଡବାଏ"</string> + <!-- no translation found for priority_onboarding_title (2893070698479227616) --> + <skip /> + <!-- no translation found for priority_onboarding_behavior (5342816047020432929) --> + <skip /> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"ବାର୍ତ୍ତାଳାପ ବିଭାଗର ଶୀର୍ଷରେ ଦେଖାନ୍ତୁ"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"ଲକ୍ ସ୍କ୍ରିନରେ ପ୍ରୋଫାଇଲ୍ ଛବି ଦେଖାନ୍ତୁ"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"ଆପଗୁଡ଼ିକ ଉପରେ ଫ୍ଲୋଟିଂ ବବଲ୍ ପରି ଦେଖାଯିବ"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"\'ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\' ମୋଡରେ ବାଧା"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"ବୁଝିଗଲି"</string> + <!-- no translation found for priority_onboarding_settings_button_title (6663601574303585927) --> + <skip /> <string name="magnification_overlay_title" msgid="6584179429612427958">"ମ୍ୟାଗ୍ନିଫିକେସନ୍ ଓଭର୍ଲେ ୱିଣ୍ଡୋ"</string> <string name="magnification_window_title" msgid="4863914360847258333">"ମ୍ୟାଗ୍ନିଫିକେସନ୍ ୱିଣ୍ଡୋ"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"ମ୍ୟାଗ୍ନିଫିକେସନ୍ ୱିଣ୍ଡୋ ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକ"</string> @@ -1049,7 +1054,7 @@ <string name="controls_dialog_ok" msgid="2770230012857881822">"ଯୋଗ କରନ୍ତୁ"</string> <string name="controls_dialog_message" msgid="342066938390663844">"<xliff:g id="APP">%s</xliff:g> ଦ୍ଵାରା ପ୍ରସ୍ତାବିତ"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକ ଅପଡେଟ୍ କରାଯାଇଛି"</string> - <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PINରେ ଅକ୍ଷର କିମ୍ୱା ସଙ୍କେତଗୁଡ଼ିକ ଥାଏ"</string> + <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PINରେ ଅକ୍ଷର କିମ୍ୱା ପ୍ରତୀକଗୁଡ଼ିକ ଥାଏ"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"<xliff:g id="DEVICE">%s</xliff:g> ଯାଞ୍ଚ କରନ୍ତୁ"</string> <string name="controls_pin_wrong" msgid="6162694056042164211">"ଭୁଲ PIN"</string> <string name="controls_pin_verifying" msgid="3755045989392131746">"ଯାଞ୍ଚ କରାଯାଉଛି…"</string> diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index 22b1029ea26a..b8bf05b96b2d 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"ਗੱਲਬਾਤ ਸੈਕਸ਼ਨ ਦੇ ਸਿਖਰ \'ਤੇ ਦਿਖਾਈਆਂ ਜਾਂਦੀਆਂ ਹਨ, ਬਬਲ ਵਜੋਂ ਦਿਸਦੀਆਂ ਹਨ, ਲਾਕ ਸਕ੍ਰੀਨ \'ਤੇ ਪ੍ਰੋਫਾਈਲ ਤਸਵੀਰ ਦਿਖਾਈ ਜਾਂਦੀ ਹੈ"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ਸੈਟਿੰਗਾਂ"</string> <string name="notification_priority_title" msgid="2079708866333537093">"ਤਰਜੀਹ"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਐਪ ਗੱਲਬਾਤ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦੀ"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"ਕੋਈ ਹਾਲੀਆ ਬਬਲ ਨਹੀਂ"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"ਹਾਲੀਆ ਬਬਲ ਅਤੇ ਖਾਰਜ ਕੀਤੇ ਬਬਲ ਇੱਥੇ ਦਿਸਣਗੇ"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"ਇਹਨਾਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਸੋਧਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ।"</string> @@ -1014,11 +1013,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"ਸਿਸਟਮ ਨੈਵੀਗੇਸ਼ਨ ਅੱਪਡੇਟ ਹੋ ਗਿਆ। ਤਬਦੀਲੀਆਂ ਕਰਨ ਲਈ, ਸੈਟਿੰਗਾਂ \'ਤੇ ਜਾਓ।"</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"ਸਿਸਟਮ ਨੈਵੀਗੇਸ਼ਨ ਨੂੰ ਅੱਪਡੇਟ ਕਰਨ ਲਈ ਸੈਟਿੰਗਾਂ \'ਤੇ ਜਾਓ"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ਸਟੈਂਡਬਾਈ"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"ਗੱਲਬਾਤ ਨੂੰ ਤਰਜੀਹੀ ਗੱਲਬਾਤ ਵਜੋਂ ਸੈੱਟ ਕੀਤਾ ਗਿਆ"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"ਤਰਜੀਹੀ ਗੱਲਾਂਬਾਤਾਂ ਇਹ ਹੋਣਗੀਆਂ:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"ਗੱਲਬਾਤ ਸੈਕਸ਼ਨ ਦੇ ਸਿਖਰ \'ਤੇ ਦਿਖਾਓ"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"ਲਾਕ ਸਕ੍ਰੀਨ \'ਤੇ ਪ੍ਰੋਫਾਈਲ ਤਸਵੀਰ ਦਿਖਾਓ"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"ਐਪਾਂ ਦੇ ਸਿਖਰ \'ਤੇ ਫਲੋਟਿੰਗ ਬਬਲ ਵਜੋਂ ਦਿਸਦੀਆਂ ਹਨ"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"\'ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ\' ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਵਿਘਨ ਪੈ ਸਕਦਾ ਹੈ"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"ਸਮਝ ਲਿਆ"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"ਸੈਟਿੰਗਾਂ"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"ਵੱਡਦਰਸ਼ੀਕਰਨ ਓਵਰਲੇ Window"</string> <string name="magnification_window_title" msgid="4863914360847258333">"ਵੱਡਦਰਸ਼ੀਕਰਨ Window"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"ਵੱਡਦਰਸ਼ੀਕਰਨ Window ਦੇ ਕੰਟਰੋਲ"</string> @@ -1026,7 +1028,7 @@ <string name="quick_controls_subtitle" msgid="1667408093326318053">"ਆਪਣੇ ਕਨੈਕਟ ਕੀਤੇ ਡੀਵਾਈਸਾਂ ਲਈ ਕੰਟਰੋਲ ਸ਼ਾਮਲ ਕਰੋ"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"ਡੀਵਾਈਸ ਕੰਟਰੋਲਾਂ ਦਾ ਸੈੱਟਅੱਪ ਕਰੋ"</string> <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"ਆਪਣੇ ਕੰਟਰੋਲਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਲਈ ਪਾਵਰ ਬਟਨ ਦਬਾ ਕੇ ਰੱਖੋ"</string> - <string name="controls_providers_title" msgid="6879775889857085056">"ਕੰਟਰੋਲਾਂ ਨੂੰ ਸ਼ਾਮਲ ਕਰਨ ਲਈ ਐਪ ਚੁਣੋ"</string> + <string name="controls_providers_title" msgid="6879775889857085056">"ਕੰਟਰੋਲ ਸ਼ਾਮਲ ਕਰਨ ਲਈ ਐਪ ਚੁਣੋ"</string> <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380"> <item quantity="one"><xliff:g id="NUMBER_1">%s</xliff:g> ਕੰਟਰੋਲ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ।</item> <item quantity="other"><xliff:g id="NUMBER_1">%s</xliff:g> ਕੰਟਰੋਲ ਸ਼ਾਮਲ ਕੀਤੇ ਗਏ।</item> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index cea8ece68e94..8b56f8d259fd 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -725,8 +725,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Wyświetla się jako pływający dymek u góry sekcji rozmów, pokazuje zdjęcie profilowe na ekranie blokady"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Ustawienia"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Priorytet"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"Aplikacja <xliff:g id="APP_NAME">%1$s</xliff:g> nie obsługuje funkcji rozmów"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Brak ostatnich dymków"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Tutaj będą pojawiać się ostatnie i odrzucone dymki"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Tych powiadomień nie można zmodyfikować."</string> @@ -1024,16 +1023,19 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Nawigacja w systemie została zaktualizowana. Aby wprowadzić zmiany, otwórz Ustawienia."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Otwórz Ustawienia, by zaktualizować nawigację w systemie"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Tryb gotowości"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"Rozmowę ustawiono jako priorytetową"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Rozmowy priorytetowe:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Wyświetlają się u góry sekcji rozmów"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Pokazują zdjęcie profilowe na ekranie blokady"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Wyświetlane jako pływający dymek nad aplikacjami"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Ignorują tryb Nie przeszkadzać"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Ustawienia"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Okno nakładki powiększenia"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Okno powiększenia"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Elementy sterujące okna powiększenia"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Sterowanie urządzeniami"</string> - <string name="quick_controls_subtitle" msgid="1667408093326318053">"Dodaj elementy sterujące do połączonych urządzeń"</string> + <string name="quick_controls_subtitle" msgid="1667408093326318053">"Dodaj elementy sterujące połączonymi urządzeniami"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"Konfigurowanie sterowania urządzeniami"</string> <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"Przytrzymaj przycisk zasilania, aby uzyskać dostęp do elementów sterujących"</string> <string name="controls_providers_title" msgid="6879775889857085056">"Wybierz aplikację, do której chcesz dodać elementy sterujące"</string> @@ -1066,7 +1068,7 @@ <string name="controls_pin_wrong" msgid="6162694056042164211">"Nieprawidłowy kod PIN"</string> <string name="controls_pin_verifying" msgid="3755045989392131746">"Sprawdzam…"</string> <string name="controls_pin_instructions" msgid="6363309783822475238">"Wpisz kod PIN"</string> - <string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Spróbuj użyć innego kodu PIN"</string> + <string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Wpisz inny kod PIN"</string> <string name="controls_confirmation_confirming" msgid="2596071302617310665">"Potwierdzam…"</string> <string name="controls_confirmation_message" msgid="7744104992609594859">"Potwierdź zmianę dotyczącą urządzenia <xliff:g id="DEVICE">%s</xliff:g>"</string> <string name="controls_structure_tooltip" msgid="4355922222944447867">"Przesuń palcem, by zobaczyć więcej"</string> diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index 00a33d26e173..5a2005ef1b5f 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Aparece na parte superior de uma seção de conversa, em forma de balão, mostrando a foto do perfil na tela de bloqueio"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Configurações"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioridade"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> não é compatível com recursos de conversão"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nenhum balão recente"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Os balões recentes e dispensados aparecerão aqui"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Não é possível modificar essas notificações."</string> @@ -1014,16 +1013,19 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Navegação no sistema atualizada. Se quiser alterá-la, acesse as configurações."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Acesse as configurações para atualizar a navegação no sistema"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Em espera"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"A conversa foi definida como prioritária"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"As conversas prioritárias:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Aparecer na parte superior da seção de conversa"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Mostrar foto do perfil na tela de bloqueio"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Aparecer como balões flutuantes sobre outros apps"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Interromper o \"Não perturbe\""</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Ok"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Configurações"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Janela de sobreposição de ampliação"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Janela de ampliação"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Controles da janela de ampliação"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Controles do dispositivo"</string> - <string name="quick_controls_subtitle" msgid="1667408093326318053">"Adiciona controles para os dispositivos conectados"</string> + <string name="quick_controls_subtitle" msgid="1667408093326318053">"Adiciona controles aos dispositivos conectados"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"Configurar controles do dispositivo"</string> <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"Toque no botão liga/desliga e mantenha-o pressionado para acessar seus controles"</string> <string name="controls_providers_title" msgid="6879775889857085056">"Escolha um app para adicionar controles"</string> @@ -1040,7 +1042,7 @@ <string name="accessibility_control_move" msgid="8980344493796647792">"Mover para a posição <xliff:g id="NUMBER">%d</xliff:g>"</string> <string name="controls_favorite_default_title" msgid="967742178688938137">"Controles"</string> <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Escolha os controles para acessar pelo menu do botão liga/desliga"</string> - <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Mantenha a tela pressionada e arraste para reorganizar os controles"</string> + <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Toque no controle, mantenha-o pressionado e arraste para reorganizar as posições."</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Todos os controles foram removidos"</string> <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"As mudanças não foram salvas"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Não foi possível carregar a lista de controles."</string> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index fadd23478789..dec586ef5d29 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Aparece na parte superior da secção de conversas, surge como um balão flutuante e apresenta a imagem do perfil no ecrã de bloqueio."</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Definições"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioridade"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"A app <xliff:g id="APP_NAME">%1$s</xliff:g> não suporta funcionalidades de conversa."</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nenhum balão recente"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Os balões recentes e ignorados vão aparecer aqui."</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Não é possível modificar estas notificações."</string> @@ -1014,11 +1013,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"A navegação no sistema foi atualizada. Para efetuar alterações, aceda às Definições."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Aceda às Definições para atualizar a navegação no sistema."</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Modo de espera"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"Conversa definida como prioritária"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"As conversas com prioridade irão:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Aparecem na parte superior da secção de conversas."</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Mostram a imagem do perfil no ecrã de bloqueio."</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Aparecem como balões flutuantes por cima de apps."</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Interrompem o modo Não incomodar."</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Definições"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Janela de sobreposição da ampliação"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Janela de ampliação"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Controlos da janela de ampliação"</string> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index 00a33d26e173..5a2005ef1b5f 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Aparece na parte superior de uma seção de conversa, em forma de balão, mostrando a foto do perfil na tela de bloqueio"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Configurações"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioridade"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> não é compatível com recursos de conversão"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nenhum balão recente"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Os balões recentes e dispensados aparecerão aqui"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Não é possível modificar essas notificações."</string> @@ -1014,16 +1013,19 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Navegação no sistema atualizada. Se quiser alterá-la, acesse as configurações."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Acesse as configurações para atualizar a navegação no sistema"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Em espera"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"A conversa foi definida como prioritária"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"As conversas prioritárias:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Aparecer na parte superior da seção de conversa"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Mostrar foto do perfil na tela de bloqueio"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Aparecer como balões flutuantes sobre outros apps"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Interromper o \"Não perturbe\""</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Ok"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Configurações"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Janela de sobreposição de ampliação"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Janela de ampliação"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Controles da janela de ampliação"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Controles do dispositivo"</string> - <string name="quick_controls_subtitle" msgid="1667408093326318053">"Adiciona controles para os dispositivos conectados"</string> + <string name="quick_controls_subtitle" msgid="1667408093326318053">"Adiciona controles aos dispositivos conectados"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"Configurar controles do dispositivo"</string> <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"Toque no botão liga/desliga e mantenha-o pressionado para acessar seus controles"</string> <string name="controls_providers_title" msgid="6879775889857085056">"Escolha um app para adicionar controles"</string> @@ -1040,7 +1042,7 @@ <string name="accessibility_control_move" msgid="8980344493796647792">"Mover para a posição <xliff:g id="NUMBER">%d</xliff:g>"</string> <string name="controls_favorite_default_title" msgid="967742178688938137">"Controles"</string> <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Escolha os controles para acessar pelo menu do botão liga/desliga"</string> - <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Mantenha a tela pressionada e arraste para reorganizar os controles"</string> + <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Toque no controle, mantenha-o pressionado e arraste para reorganizar as posições."</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Todos os controles foram removidos"</string> <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"As mudanças não foram salvas"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Não foi possível carregar a lista de controles."</string> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index 0ee2593cbc5b..ee844d0b1a59 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -722,8 +722,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Se afișează în partea de sus a secțiunii de conversație, apare ca un balon flotant, afișează fotografia de profil pe ecranul de blocare"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Setări"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritate"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> nu acceptă funcții pentru conversații"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nu există baloane recente"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Baloanele recente și baloanele respinse vor apărea aici"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Aceste notificări nu pot fi modificate."</string> @@ -1019,11 +1018,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Navigarea în sistem a fost actualizată. Pentru a face modificări, accesați Setările."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Accesați Setările pentru a actualiza navigarea în sistem"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"Conversația a fost setată ca prioritară"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Conversațiile cu prioritate vor:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Apar în partea de sus a secțiunii de conversație"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Afișează fotografia de profil pe ecranul de blocare"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Apar ca un balon flotant deasupra aplicațiilor"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Întrerup modul Nu deranja"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Setări"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Fereastra de suprapunere pentru mărire"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Fereastra de mărire"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Comenzi pentru fereastra de mărire"</string> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index b7cb75a092c1..902d948815e5 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -725,8 +725,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Появляется в верхней части списка разговоров и как всплывающий чат, а также показывает фото профиля на заблокированном экране"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Настройки"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Приоритет"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"Приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" не поддерживает функции разговоров."</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Нет недавних всплывающих чатов"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Здесь будут появляться недавние и закрытые всплывающие чаты."</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Эти уведомления нельзя изменить."</string> @@ -1024,11 +1023,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Параметры навигации в системе обновлены. Чтобы изменить их, перейдите в настройки."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Чтобы обновить параметры навигации в системе, перейдите в настройки."</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Переход в режим ожидания"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"Разговор помечен как важный"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Важные разговоры:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Показывать в верхней части списка разговоров"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Показывать фото профиля на заблокированном экране"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Показывать как всплывающий чат над приложениями"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Показывать в режиме \"Не беспокоить\""</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"ОК"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Настройки"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Наложение окна увеличения"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Окно увеличения"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Настройки окна увеличения"</string> @@ -1079,6 +1081,6 @@ <string name="controls_error_failed" msgid="960228639198558525">"Ошибка. Повторите попытку."</string> <string name="controls_in_progress" msgid="4421080500238215939">"Выполняется"</string> <string name="controls_added_tooltip" msgid="4842812921719153085">"Удерживайте кнопку питания, чтобы увидеть новые элементы управления"</string> - <string name="controls_menu_add" msgid="4447246119229920050">"Добавить элементы управления"</string> - <string name="controls_menu_edit" msgid="890623986951347062">"Изменить элементы управления"</string> + <string name="controls_menu_add" msgid="4447246119229920050">"Добавить эл-ты управления"</string> + <string name="controls_menu_edit" msgid="890623986951347062">"Изменить эл-ты управления"</string> </resources> diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml index 3843754c2d7d..c49843cac397 100644 --- a/packages/SystemUI/res/values-si/strings.xml +++ b/packages/SystemUI/res/values-si/strings.xml @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"සංවාද කොටසේ ඉහළම පෙන්වයි, බුබුළක් ලෙස දිස් වේ, අගුලු තිරයේ පැතිකඩ පින්තූරය සංදර්ශනය වේ"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"සැකසීම්"</string> <string name="notification_priority_title" msgid="2079708866333537093">"ප්රමුඛතාව"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> සංවාද විශේෂාංගවලට සහාය නොදක්වයි"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"මෑත බුබුලු නැත"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"මෑත බුබුලු සහ ඉවත ලූ බුබුලු මෙහි දිස් වනු ඇත"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"මෙම දැනුම්දීම් වෙනස් කළ නොහැක."</string> @@ -1014,11 +1013,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"පද්ධති සංචලනය යාවත්කාලීන කළා. වෙනස්කම් සිදු කිරීමට, සැකසීම් වෙත යන්න."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"පද්ධති සංචලනය යාවත්කාලීන කිරීමට සැකසීම් වෙත යන්න"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"පොරොත්තු"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"සංවාදය ප්රමුඛතාව වෙත සකසන ලදී"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"ප්රමුඛතා සංවාද:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"සංවාද කොටසේ ඉහළ දී පෙන්වන්න"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"පැතිකඩ පින්තූරය අගුලු තිරය මත පෙන්වන්න"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"යෙදුම්වල ඉහළම පාවෙන බුබුලක් ලෙස දිස් වේ"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"බාධා නොකරන්න හට බාධා කරන්න"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"තේරුණා"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"සැකසීම්"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"විශාලන උඩැතිරි කවුළුව"</string> <string name="magnification_window_title" msgid="4863914360847258333">"විශාලන කවුළුව"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"විශාලනය කිරීමේ කවුළු පාලන"</string> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index 20dd9006b3ee..920fdd13be90 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -718,15 +718,14 @@ <string name="notification_alert_title" msgid="3656229781017543655">"Predvolené"</string> <string name="notification_bubble_title" msgid="8330481035191903164">"Bublina"</string> <string name="notification_channel_summary_low" msgid="4860617986908931158">"Žiadny zvuk ani vibrácie"</string> - <string name="notification_conversation_summary_low" msgid="1734433426085468009">"Žiadny zvuk ani vibrácie a zobrazuje sa v dolnej sekcii konverzácie"</string> - <string name="notification_channel_summary_default" msgid="3282930979307248890">"Môže zvoniť alebo vibrovať podľa nastavení telefónu"</string> + <string name="notification_conversation_summary_low" msgid="1734433426085468009">"Žiadny zvuk ani vibrácie a zobrazuje sa nižšie v sekcii konverzácií"</string> + <string name="notification_channel_summary_default" msgid="3282930979307248890">"Zvoní či vibruje podľa nastavení telefónu"</string> <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Môže zvoniť alebo vibrovať podľa nastavení telefónu. Predvolene sa zobrazia konverzácie z bubliny <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Upúta vás plávajúcim odkazom na tento obsah."</string> - <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Nájdete ju v hornej sekcii konverzácie ako plávajúcu bublinu a zobrazuje profilovú fotku na uzamknutej obrazovke"</string> + <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Nájdete ju hore v sekcii konverzácií ako plávajúcu bublinu, zobrazuje profilovú fotku na uzamknutej obrazovke"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Nastavenia"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Priorita"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> nepodporuje funkcie konverzácie"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Žiadne nedávne bubliny"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Tu sa budú zobrazovať nedávne a zavreté bubliny"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Tieto upozornenia sa nedajú upraviť."</string> @@ -1024,19 +1023,22 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Navigácia v systéme bola aktualizovaná. Ak chcete vykonať zmeny, prejdite do Nastavení."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Prejdite do Nastavení a aktualizujte navigáciu v systéme"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Pohotovostný režim"</string> - <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Zobrazovať v hornej sekcii konverzácie"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"Konverzácia je nastavená ako prioritná"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Správanie prioritných konverzácií:"</string> + <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Zobrazovať hore v sekcii konverzácií"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Zobrazovať profilovú fotku na uzamknutej obrazovke"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Zobrazovať ako plávajúce bubliny nad aplikáciami"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Prerušovať režim bez vyrušení"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Dobre"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Nastavenia"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Okno prekrytia priblíženia"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Okno priblíženia"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Ovládacie prvky okna priblíženia"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Ovládanie zariadení"</string> - <string name="quick_controls_subtitle" msgid="1667408093326318053">"Pridajte ovládacie prvky pre svoje pripojené zariadenia"</string> + <string name="quick_controls_subtitle" msgid="1667408093326318053">"Pridajte si ovládače pripojených zariadení"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"Nastavenie ovládania zariadení"</string> <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"Pridržaním vypínača získate prístup k ovládacím prvkom"</string> - <string name="controls_providers_title" msgid="6879775889857085056">"Výberom aplikácie pridajte ovládacie prvky"</string> + <string name="controls_providers_title" msgid="6879775889857085056">"Vyberte aplikáciu, ktorej ovládače si chcete pridať"</string> <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380"> <item quantity="few">Boli pridané <xliff:g id="NUMBER_1">%s</xliff:g> ovládacie prvky.</item> <item quantity="many"><xliff:g id="NUMBER_1">%s</xliff:g> controls added.</item> @@ -1051,9 +1053,9 @@ <string name="accessibility_control_change_unfavorite" msgid="6997408061750740327">"odstránite z obľúbených"</string> <string name="accessibility_control_move" msgid="8980344493796647792">"Presunúť na pozíciu <xliff:g id="NUMBER">%d</xliff:g>"</string> <string name="controls_favorite_default_title" msgid="967742178688938137">"Ovládacie prvky"</string> - <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Vyberte si ovládacie prvky, ku ktorým chcete mať prístup v ponuke vypínača"</string> - <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Ovládacie prvky môžete usporiadať pridržaním a presunutím"</string> - <string name="controls_favorite_removed" msgid="5276978408529217272">"Všetky ovládacie prvky boli odstránené"</string> + <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Vyberte si ovládače, ktoré budú prístupné v ponuke vypínača"</string> + <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Polohu každého ovládača môžete zmeniť jeho pridržaním a presunutím"</string> + <string name="controls_favorite_removed" msgid="5276978408529217272">"Všetky ovládače boli odstránené"</string> <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Zmeny neboli uložené"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Zoznam všetkých ovl. prvkov sa nepodarilo načítať."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Iné"</string> @@ -1061,12 +1063,12 @@ <string name="controls_dialog_ok" msgid="2770230012857881822">"Pridať"</string> <string name="controls_dialog_message" msgid="342066938390663844">"Navrhuje <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Ovládanie bolo aktualizované"</string> - <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"Kód PIN obsahuje písmená alebo symboly"</string> - <string name="controls_pin_verify" msgid="3452778292918877662">"Overiť <xliff:g id="DEVICE">%s</xliff:g>"</string> + <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN obsahuje písmená či symboly"</string> + <string name="controls_pin_verify" msgid="3452778292918877662">"<xliff:g id="DEVICE">%s</xliff:g>, overenie"</string> <string name="controls_pin_wrong" msgid="6162694056042164211">"Nesprávny PIN"</string> <string name="controls_pin_verifying" msgid="3755045989392131746">"Overuje sa…"</string> <string name="controls_pin_instructions" msgid="6363309783822475238">"Zadajte PIN"</string> - <string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Vyskúšajte iný kód PIN"</string> + <string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Skúste iný PIN"</string> <string name="controls_confirmation_confirming" msgid="2596071302617310665">"Potvrdzuje sa…"</string> <string name="controls_confirmation_message" msgid="7744104992609594859">"Potvrdenie zmeny zariadenia <xliff:g id="DEVICE">%s</xliff:g>"</string> <string name="controls_structure_tooltip" msgid="4355922222944447867">"Potiahnutím zobrazíte ďalšie položky"</string> @@ -1079,6 +1081,6 @@ <string name="controls_error_failed" msgid="960228639198558525">"Chyba, skúste to znova"</string> <string name="controls_in_progress" msgid="4421080500238215939">"Prebieha"</string> <string name="controls_added_tooltip" msgid="4842812921719153085">"Pridržaním vypínača zobrazíte nové ovládacie prvky"</string> - <string name="controls_menu_add" msgid="4447246119229920050">"Pridať ovládacie prvky"</string> - <string name="controls_menu_edit" msgid="890623986951347062">"Upraviť ovládacie prvky"</string> + <string name="controls_menu_add" msgid="4447246119229920050">"Pridať ovládače"</string> + <string name="controls_menu_edit" msgid="890623986951347062">"Upraviť ovládače"</string> </resources> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index 42f1151d6a2c..0b6d3a77281c 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -725,8 +725,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Prikaz na vrhu razdelka s pogovorom in v plavajočem oblačku, prikaz profilne slike na zaklenjenem zaslonu"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Nastavitve"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prednost"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> ne podpira pogovornih funkcij"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Ni nedavnih oblačkov"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Tukaj bodo prikazani tako nedavni kot tudi opuščeni oblački"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Za ta obvestila ni mogoče spremeniti nastavitev."</string> @@ -1024,11 +1023,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Krmarjenje po sistemu je posodobljeno. Če želite opraviti spremembe, odprite nastavitve."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Če želite posodobiti krmarjenje po sistemu, odprite nastavitve"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Stanje pripravljenosti"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"Pogovor je nastavljen kot prednosten"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Prednostni pogovori bodo:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Prikazano na vrhu razdelka s pogovorom"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Prikaz profilne slike na zaklenjenem zaslonu"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Prikazano kot lebdeč oblaček čez druge aplikacije"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Preglasi način »ne moti«"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"V redu"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Nastavitve"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Prekrivno povečevalno okno"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Povečevalno okno"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Kontrolniki povečevalnega okna"</string> diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index b2d23c12fa65..a5147505ce5d 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Shfaqet në krye të seksionit të bisedës dhe shfaqet si flluskë pluskuese, shfaq fotografinë e profilit në ekranin e kyçjes"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Cilësimet"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Përparësia"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> nuk mbështet veçoritë e bisedës"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nuk ka flluska të fundit"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Flluskat e fundit dhe flluskat e hequra do të shfaqen këtu"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Këto njoftime nuk mund të modifikohen."</string> @@ -1014,11 +1013,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Navigimi i sistemit u përditësua. Për të bërë ndryshime, shko te \"Cilësimet\"."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Shko te \"Cilësimet\" për të përditësuar navigimin e sistemit"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Në gatishmëri"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"Biseda u caktua me përparësi"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Bisedat me përparësi do të:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Shfaq në krye të seksionit të bisedës"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Shfaq figurën e profilit në ekranin e kyçjes"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Shfaq si flluskë pluskuese mbi aplikacione"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Ndërprit \"Mos shqetëso\""</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"E kuptova"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Cilësimet"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Dritarja e mbivendosjes së zmadhimit"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Dritarja e zmadhimit"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Kontrollet e dritares së zmadhimit"</string> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index 070ca211b04a..7855ec197f20 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -722,8 +722,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Приказује се у врху одељка за конверзације као плутајући облачић, приказује слику профила на закључаном екрану"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Подешавања"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Приоритет"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> не подржава функције конверзације"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Нема недавних облачића"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Овде се приказују недавни и одбачени облачићи"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Ова обавештења не могу да се мењају."</string> @@ -1019,11 +1018,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Навигација система је ажурирана. Да бисте унели измене, идите у Подешавања."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Идите у Подешавања да бисте ажурирали навигацију система"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Стање приправности"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"Конверзација је подешена на приоритетну"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Приоритетне конверзације ће:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Приказује се у врху одељка за конверзације"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Приказује слику профила на закључаном екрану"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Приказују се плутајући облачићи преко апликација"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Омета подешавање Не узнемиравај"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Важи"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Подешавања"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Преклопни прозор за увећање"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Прозор за увећање"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Контроле прозора за увећање"</string> @@ -1060,7 +1062,7 @@ <string name="controls_pin_wrong" msgid="6162694056042164211">"Погрешан PIN"</string> <string name="controls_pin_verifying" msgid="3755045989392131746">"Верификује се…"</string> <string name="controls_pin_instructions" msgid="6363309783822475238">"Унесите PIN"</string> - <string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Пробајте помоћу другог PIN-а"</string> + <string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Пробајте други PIN"</string> <string name="controls_confirmation_confirming" msgid="2596071302617310665">"Потврђује се…"</string> <string name="controls_confirmation_message" msgid="7744104992609594859">"Потврдите промену за: <xliff:g id="DEVICE">%s</xliff:g>"</string> <string name="controls_structure_tooltip" msgid="4355922222944447867">"Превуците да бисте видели још"</string> @@ -1074,5 +1076,5 @@ <string name="controls_in_progress" msgid="4421080500238215939">"У току"</string> <string name="controls_added_tooltip" msgid="4842812921719153085">"Задржите дугме за укључивање да бисте видели нове контроле"</string> <string name="controls_menu_add" msgid="4447246119229920050">"Додај контроле"</string> - <string name="controls_menu_edit" msgid="890623986951347062">"Измените контроле"</string> + <string name="controls_menu_edit" msgid="890623986951347062">"Измени контроле"</string> </resources> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index 9eb2ead0725f..e6fb28e22385 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Visas högst upp bland konversationerna som en flytande bubbla, visar profilbilden på låsskärmen"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Inställningar"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritet"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> har inte stöd för konversationsfunktioner"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Inga nya bubblor"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"De senaste bubblorna och ignorerade bubblor visas här"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Det går inte att ändra de här aviseringarna."</string> @@ -1014,11 +1013,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Systemnavigeringen har uppdaterats. Öppna inställningarna om du vill ändra något."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Öppna inställningarna och uppdatera systemnavigeringen"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Viloläge"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"Konversationen har angetts som prioriterad"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Följande gäller för prioriterade konversationer:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Visa högst upp bland konversationerna"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Visa profilbild på låsskärmen"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Visa som en flytande bubbla ovanpå appar"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Avbryt Stör ej"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Inställningar"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Överlagrat förstoringsfönster"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Förstoringsfönster"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Inställningar för förstoringsfönster"</string> diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index 8ebf50771dcf..c7962f91e1e9 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -600,8 +600,8 @@ <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"Hali hii huifanya ionekane hadi utakapoibandua. Gusa na ushikilie kitufe cha Mwanzo ili ubandue."</string> <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"Data binafsi inaweza kufikiwa (kama vile maudhui ya barua pepe na anwani)."</string> <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"Programu iliyobandikwa inaweza kufungua programu zingine."</string> - <string name="screen_pinning_toast" msgid="8177286912533744328">"Ili ubandue programu hii, gusa na ushikilie kitufe cha Nyuma na Muhtasari"</string> - <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"Ili ubandue programu hii, gusa na ushikilie kitufe cha Nyuma na Ukurasa wa Mwanzo"</string> + <string name="screen_pinning_toast" msgid="8177286912533744328">"Ili ubandue programu hii, gusa na ushikilie vitufe vya Nyuma na Muhtasari"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"Ili ubandue programu hii, gusa na ushikilie vitufe vya Nyuma na Ukurasa wa Mwanzo"</string> <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"Ili ubandue programu hii, telezesha kidole juu na ushikilie"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"Nimeelewa"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"Hapana"</string> @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Huonyeshwa kwenye sehemu ya juu ya mazungumzo, huonekana kama kiputo, huonyesha picha ya wasifu kwenye skrini iliyofungwa"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Mipangilio"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Kipaumbele"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> haitumii vipengele vya mazungumzo"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Hakuna viputo vya hivi majuzi"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Viputo vya hivi karibuni na vile vilivyoondolewa vitaonekana hapa"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Arifa hizi haziwezi kubadilishwa."</string> @@ -1014,16 +1013,19 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Umesasisha usogezaji kwenye mfumo. Ili ubadilishe, nenda kwenye Mipangilio."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Nenda kwenye mipangilio ili usasishe usogezaji kwenye mfumo"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Hali tuli"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"Mazungumzo yamepewa kipaumbele"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Mazungumzo yaliyopewa kipaumbele:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Onyesha kwenye sehemu ya juu ya mazungumzo"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Onyesha picha ya wasifu kwenye skrini iliyofungwa"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Yataonekana kama kiputo kinachoelea juu ya programu"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Katiza kipengele cha Usinisumbue"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Nimeelewa"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Mipangilio"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Dirisha la Kuwekelea Linalokuza"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Dirisha la Ukuzaji"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Vidhibiti vya Dirisha la Ukuzaji"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Vidhibiti vya vifaa"</string> - <string name="quick_controls_subtitle" msgid="1667408093326318053">"Weka vidhibiti vya vifaa vyako vilivyounganishwa"</string> + <string name="quick_controls_subtitle" msgid="1667408093326318053">"Weka vidhibiti vya vifaa ulivyounganisha"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"Weka mipangilio ya vidhibiti vya vifaa"</string> <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"Shikilia Kitufe cha kuwasha/kuzima ili ufikie vidhibiti vyako"</string> <string name="controls_providers_title" msgid="6879775889857085056">"Chagua programu ili uweke vidhibiti"</string> @@ -1040,7 +1042,7 @@ <string name="accessibility_control_move" msgid="8980344493796647792">"Sogeza kwenye nafasi ya <xliff:g id="NUMBER">%d</xliff:g>"</string> <string name="controls_favorite_default_title" msgid="967742178688938137">"Vidhibiti"</string> <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Chagua vidhibiti vya kufikia ukitumia menyu ya kuwasha/kuzima"</string> - <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Shikilia na uburute ili upange upya vidhibiti"</string> + <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Shikilia na uburute ili upange vidhibiti upya"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Umeondoa vidhibiti vyote"</string> <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Mabadiliko hayajahifadhiwa"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Imeshindwa kupakia orodha ya vidhibiti vyote."</string> diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index 8824b9b346cc..edd8bde78cb6 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -598,15 +598,15 @@ <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"பின் செய்திருப்பதை அகற்றும் வரை இதைச் செயல்பாட்டில் வைத்திருக்கும். அதை அகற்றுவதற்கு மேல்நோக்கி ஸ்வைப் செய்து பிடித்திருக்கவும்."</string> <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"பொருத்தியதை அகற்றும் வரை இதைக் காட்சியில் வைக்கும். அகற்ற, மேலோட்டப் பார்வையைத் தொட்டுப் பிடிக்கவும்."</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"இதற்கான பின்னை அகற்றும் வரை, இந்தப் பயன்முறை செயல்பாட்டிலேயே இருக்கும். அகற்றுவதற்கு, முகப்புப் பொத்தானைத் தொட்டுப் பிடிக்கவும்."</string> - <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"(தொடர்புகள், மின்னஞ்சலின் உள்ளடக்கம் போன்ற) தனிப்பட்ட தரவு அணுகப்படக்கூடும்."</string> + <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"தனிப்பட்ட தரவு அணுகப்படக்கூடும் (தொடர்புகள், மின்னஞ்சலின் உள்ளடக்கம் போன்றவை)."</string> <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"பின் செய்யப்பட்டிருக்கும் ஆப்ஸ் பிற ஆப்ஸைத் திறக்கக்கூடும்."</string> - <string name="screen_pinning_toast" msgid="8177286912533744328">"இந்த ஆப்ஸை அகற்ற, பின்செல் மற்றும் மேலோட்டப் பார்வை பட்டன்களைத் தொட்டுப் பிடித்திருக்கவும்"</string> - <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"இந்த ஆப்ஸை அகற்ற, பின்செல் மற்றும் முகப்பு பட்டன்களைத் தொட்டுப் பிடித்திருக்கவும்"</string> - <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"இந்த ஆப்ஸை அகற்ற, மேல்நோக்கி ஸ்வைப் செய்தவாறு பிடித்திருக்கவும்"</string> + <string name="screen_pinning_toast" msgid="8177286912533744328">"இந்த ஆப்ஸைப் பின்னிலிருந்து அகற்ற, \'பின்செல்\' மற்றும் \'மேலோட்டப் பார்வை\' பட்டன்களைத் தொட்டுப் பிடித்திருக்கவும்"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"இந்த ஆப்ஸைப் பின்னிலிருந்து அகற்ற, \'பின்செல்\' மற்றும் \'முகப்பு\' பட்டன்களைத் தொட்டுப் பிடித்திருக்கவும்"</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"இந்த ஆப்ஸைப் பின்னிலிருந்து அகற்ற, மேல்நோக்கி ஸ்வைப் செய்தவாறு பிடித்திருக்கவும்"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"புரிந்தது"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"வேண்டாம்"</string> <string name="screen_pinning_start" msgid="7483998671383371313">"ஆப்ஸ் பின் செய்யப்பட்டது"</string> - <string name="screen_pinning_exit" msgid="4553787518387346893">"ஆப்ஸ் அகற்றப்பட்டது"</string> + <string name="screen_pinning_exit" msgid="4553787518387346893">"ஆப்ஸ் பின்னிலிருந்து அகற்றப்பட்டது"</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"<xliff:g id="TILE_LABEL">%1$s</xliff:g>ஐ மறைக்கவா?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"அடுத்த முறை அமைப்புகளில் மீண்டும் இயக்கும்போது, இது மீண்டும் தோன்றும்."</string> <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"மறை"</string> @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"உரையாடல் பிரிவின் மேற்பகுதியில் மிதக்கும் குமிழாகத் தோன்றும். பூட்டுத் திரையின் மேல் சுயவிவரப் படத்தைக் காட்டும்"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"அமைப்புகள்"</string> <string name="notification_priority_title" msgid="2079708866333537093">"முன்னுரிமை"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"உரையாடல் அம்சங்களை <xliff:g id="APP_NAME">%1$s</xliff:g> ஆதரிக்காது"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"சமீபத்திய குமிழ்கள் இல்லை"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"சமீபத்திய குமிழ்களும் நிராகரிக்கப்பட்ட குமிழ்களும் இங்கே தோன்றும்"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"இந்த அறிவிப்புகளை மாற்ற இயலாது."</string> @@ -1014,11 +1013,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"சிஸ்டம் நேவிகேஷன் மாற்றப்பட்டது. மாற்றங்களைச் செய்ய ‘அமைப்புகளுக்குச்’ செல்லவும்."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"சிஸ்டம் நேவிகேஷனை மாற்ற ’அமைப்புகளுக்குச்’ செல்லவும்"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"இயக்க நேரம்"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"முன்னுரிமை அளிக்கப்பட்ட உரையாடலாக அமைக்கப்பட்டது"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"முன்னுரிமை அளிக்கப்பட்ட உரையாடல்கள் இவ்வாறு இருக்கும்:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"உரையாடல் பிரிவின் மேல் காட்டும்"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"பூட்டுத் திரையின் மேல் சுயவிவரப் படத்தைக் காட்டும்"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"ஆப்ஸின் மேல் மிதக்கும் குமிழாகத் தோன்றும்"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"\'தொந்தரவு செய்ய வேண்டாம்\' அம்சத்தைக் குறுக்கிடும்"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"சரி"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"அமைப்புகள்"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Magnification Overlay Window"</string> <string name="magnification_window_title" msgid="4863914360847258333">"பெரிதாக்கல் சாளரம்"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"பெரிதாக்கல் சாளரக் கட்டுப்பாடுகள்"</string> diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index bc9519402db5..a08d0d487b6a 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"సంభాషణ విభాగం ఎగువన ఉంటుంది, తేలుతున్న బబుల్లాగా కనిపిస్తుంది, లాక్ స్క్రీన్పై ప్రొఫైల్ ఫోటోను ప్రదర్శిస్తుంది"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"సెట్టింగ్లు"</string> <string name="notification_priority_title" msgid="2079708866333537093">"ప్రాధాన్యత"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> సంభాషణ ఫీచర్లను సపోర్ట్ చేయదు"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"ఇటీవలి బబుల్స్ ఏవీ లేవు"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"ఇటీవలి బబుల్స్, తీసివేసిన బబుల్స్ ఇక్కడ కనిపిస్తాయి"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"ఈ నోటిఫికేషన్లను సవరించడం వీలుపడదు."</string> @@ -1014,11 +1013,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"సిస్టమ్ నావిగేషన్ అప్డేట్ చేయబడింది. మార్పులు చేయడానికి, సెట్టింగ్లకు వెళ్లండి."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"సిస్టమ్ నావిగేషన్ను అప్డేట్ చేయడానికి సెట్టింగ్లకు వెళ్లండి"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"స్టాండ్బై"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"సంభాషణ ప్రధానమైనదిగా సెట్ చేయబడింది"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"ప్రధాన సంభాషణలు ఇక్కడ కనిపిస్తాయి:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"సంభాషణ విభాగంలో ఎగువున చూపబడుతుంది"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"లాక్ స్క్రీన్ మీద ప్రొఫైల్ ఫోటో చూపబడుతుంది"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"యాప్ల పైన తేలియాడే బబుల్లాగా కనిపిస్తాయి"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"\'అంతరాయం కలిగించవద్దు\' మోడ్కు అంతరాయం"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"అర్థమైంది"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"సెట్టింగ్లు"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"మాగ్నిఫికేషన్ ఓవర్లే విండో"</string> <string name="magnification_window_title" msgid="4863914360847258333">"మాగ్నిఫికేషన్ విండో"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"మాగ్నిఫికేషన్ నియంత్రణల విండో"</string> @@ -1040,7 +1042,7 @@ <string name="accessibility_control_move" msgid="8980344493796647792">"<xliff:g id="NUMBER">%d</xliff:g> పొజిషన్కు తరలించండి"</string> <string name="controls_favorite_default_title" msgid="967742178688938137">"నియంత్రణలు"</string> <string name="controls_favorite_subtitle" msgid="6604402232298443956">"పవర్ మెనూ నుండి యాక్సెస్ చేయడానికి నియంత్రణలను ఎంచుకోండి"</string> - <string name="controls_favorite_rearrange" msgid="5616952398043063519">"నియంత్రణల క్రమం మార్చడానికి పట్టుకుని&amp, లాగండి"</string> + <string name="controls_favorite_rearrange" msgid="5616952398043063519">"నియంత్రణల క్రమం మార్చడానికి దేనినైనా పట్టుకుని, లాగి వదిలేయండి"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"అన్ని నియంత్రణలు తీసివేయబడ్డాయి"</string> <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"మార్పులు సేవ్ చేయబడలేదు"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"అన్ని నియంత్రణలు గల జాబితాను లోడ్ చేయలేకపోయాము."</string> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index ae40e83d3985..5638f2a51596 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"แสดงที่ด้านบนของส่วนการสนทนา ปรากฏเป็นบับเบิลแบบลอย แสดงรูปโปรไฟล์บนหน้าจอล็อก"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"การตั้งค่า"</string> <string name="notification_priority_title" msgid="2079708866333537093">"ลำดับความสำคัญ"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> ไม่รองรับฟีเจอร์การสนทนา"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"ไม่มีบับเบิลเมื่อเร็วๆ นี้"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"บับเบิลที่แสดงและที่ปิดไปเมื่อเร็วๆ นี้จะปรากฏที่นี่"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"แก้ไขการแจ้งเตือนเหล่านี้ไม่ได้"</string> @@ -1014,11 +1013,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"อัปเดตการไปยังส่วนต่างๆ ของระบบแล้ว หากต้องการเปลี่ยนแปลง ให้ไปที่การตั้งค่า"</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"ไปที่การตั้งค่าเพื่ออัปเดตการไปยังส่วนต่างๆ ของระบบ"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"สแตนด์บาย"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"ตั้งค่าเป็นการสนทนาสำคัญแล้ว"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"การสนทนาสำคัญจะ:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"แสดงที่ด้านบนของส่วนการสนทนา"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"แสดงรูปโปรไฟล์บนหน้าจอล็อก"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"แสดงเป็นบับเบิลที่ลอยอยู่เหนือแอป"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"แสดงในโหมดห้ามรบกวน"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"รับทราบ"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"การตั้งค่า"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"หน้าต่างการขยายที่วางซ้อน"</string> <string name="magnification_window_title" msgid="4863914360847258333">"หน้าต่างการขยาย"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"การควบคุมหน้าต่างการขยาย"</string> @@ -1040,7 +1042,7 @@ <string name="accessibility_control_move" msgid="8980344493796647792">"ย้ายไปที่ตำแหน่ง <xliff:g id="NUMBER">%d</xliff:g>"</string> <string name="controls_favorite_default_title" msgid="967742178688938137">"การควบคุม"</string> <string name="controls_favorite_subtitle" msgid="6604402232298443956">"เลือกตัวควบคุมที่ต้องการให้เข้าถึงได้จากเมนูเปิด/ปิด"</string> - <string name="controls_favorite_rearrange" msgid="5616952398043063519">"กดตัวควบคุมค้างไว้แล้วลากเพื่อจัดเรียงใหม่"</string> + <string name="controls_favorite_rearrange" msgid="5616952398043063519">"แตะตัวควบคุมค้างไว้แล้วลากเพื่อจัดเรียงใหม่"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"นำตัวควบคุมทั้งหมดออกแล้ว"</string> <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"ยังไม่ได้บันทึกการเปลี่ยนแปลง"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"โหลดรายการตัวควบคุมทั้งหมดไม่ได้"</string> diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index b7ff2b6d12ca..b9b379c5833a 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Makikita sa itaas ng seksyon ng pag-uusap, lumalabas bilang floating bubble, ipinapakita sa lock screen ang larawan sa profile"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Mga Setting"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Priyoridad"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"Hindi sinusuportahan ng <xliff:g id="APP_NAME">%1$s</xliff:g> ang mga feature ng pag-uusap"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Walang kamakailang bubble"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Lalabas dito ang mga kamakailang bubble at na-dismiss na bubble"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Hindi puwedeng baguhin ang mga notification na ito."</string> @@ -1014,11 +1013,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Na-update na ang pag-navigate ng system. Para gumawa ng mga pagbabago, pumunta sa Mga Setting."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Pumunta sa Mga Setting para i-update ang pag-navigate sa system"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Naka-standby"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"Ginawang priyoridad ang pag-uusap"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Ang mga priyoridad na pag-uusap ay:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Ipakita sa itaas ng seksyon ng pag-uusap"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Ipakita ang larawan sa profile sa lock screen"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Ipakitang floating bubble sa ibabaw ng mga app"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Ihinto ang Huwag Istorbohin"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Mga Setting"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Window ng Overlay sa Pag-magnify"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Window ng Pag-magnify"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Mga Kontrol sa Pag-magnify ng Window"</string> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index 4cf3bcf62d8a..48268e7aa888 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Görüşme bölümünün üstünde gösterilir, kayan baloncuk olarak görünür, kilit ekranında profil resmini görüntüler"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Ayarlar"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Öncelik"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g>, sohbet özelliklerini desteklemiyor"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Son kapatılan baloncuk yok"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Son baloncuklar ve kapattığınız baloncuklar burada görünür"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Bu bildirimler değiştirilemez."</string> @@ -1014,11 +1013,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Sistemde gezinme yöntemi güncellendi. Değişiklik yapmak için Ayarlar\'a gidin."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Sistemde gezinme yöntemini güncellemek için Ayarlar\'a gidin"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Beklemeye alınıyor"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"Görüşme öncelikli olarak ayarlandı"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Öncelikli görüşmeler:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Görüşme bölümünün üstünde gösterilir"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Kilit ekranında profil resmi gösterilir"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Uygulamaların üzerinde kayan balon olarak görünür"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Rahatsız Etmeyin\'i keser"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Anladım"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Ayarlar"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Yer Paylaşımlı Büyütme Penceresi"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Büyütme Penceresi"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Büyütme Penceresi Kontrolleri"</string> @@ -1039,7 +1041,7 @@ <string name="accessibility_control_change_unfavorite" msgid="6997408061750740327">"favorilerden kaldırın"</string> <string name="accessibility_control_move" msgid="8980344493796647792">"<xliff:g id="NUMBER">%d</xliff:g>. konuma taşı"</string> <string name="controls_favorite_default_title" msgid="967742178688938137">"Kontroller"</string> - <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Güç menüsünden erişmek için denetimleri seçin"</string> + <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Güç menüsünden erişmek istediğiniz denetimleri seçin"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Kontrolleri yeniden düzenlemek için basılı tutup sürükleyin"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Tüm kontroller kaldırıldı"</string> <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Değişiklikler kaydedilmedi"</string> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index 49e35d2e27d4..38a478cfb85d 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -419,7 +419,7 @@ <string name="quick_settings_cellular_detail_data_limit" msgid="1791389609409211628">"Обмеження: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="7957253810481086455">"Застереження: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_work_mode_label" msgid="2754212289804324685">"Робочий профіль"</string> - <string name="quick_settings_night_display_label" msgid="8180030659141778180">"Нічний режим"</string> + <string name="quick_settings_night_display_label" msgid="8180030659141778180">"Нічний екран"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="3358706312129866626">"Вмикається ввечері"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4063448287758262485">"До сходу сонця"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="3584738542293528235">"Вмикається о <xliff:g id="TIME">%s</xliff:g>"</string> @@ -725,8 +725,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"З\'являється вгорі розділу розмов у спливаючому сповіщенні та показує зображення профілю на заблокованому екрані"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Налаштування"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Пріоритет"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> не підтримує функції розмов"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Немає нещодавніх спливаючих чатів"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Тут з\'являтимуться нещодавні й закриті спливаючі чати"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Ці сповіщення не можна змінити."</string> @@ -1024,15 +1023,18 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Навігацію в системі оновлено. Щоб внести зміни, перейдіть у налаштування."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Перейдіть у налаштування, щоб оновити навігацію в системі"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Режим очікування"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"Розмову призначено важливою"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Важливі розмови:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"З\'являються вгорі розділу розмов"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Показують фото профілю на заблокованому екрані"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"З\'являються як спливаючі чати поверх додатків"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Переривають режим \"Не турбувати\""</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Налаштування"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Вікно збільшення з накладанням"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Вікно збільшення"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Елементи керування вікна збільшення"</string> - <string name="quick_controls_title" msgid="6839108006171302273">"Елементи керування пристроями"</string> + <string name="quick_controls_title" msgid="6839108006171302273">"Керування пристроями"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"Додайте елементи керування для підключених пристроїв"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"Налаштувати елементи керування пристроями"</string> <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"Щоб відкрити елементи керування, утримуйте кнопку живлення"</string> @@ -1051,7 +1053,7 @@ <string name="accessibility_control_change_unfavorite" msgid="6997408061750740327">"видалити з вибраного"</string> <string name="accessibility_control_move" msgid="8980344493796647792">"Перемістити на позицію <xliff:g id="NUMBER">%d</xliff:g>"</string> <string name="controls_favorite_default_title" msgid="967742178688938137">"Елементи керування"</string> - <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Виберіть, які елементи керування будуть у меню \"Живлення\""</string> + <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Виберіть, які елементи керування будуть у меню кнопки живлення"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Щоб змінити порядок елементів керування, перетягуйте їх"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Усі елементи керування вилучено"</string> <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Зміни не збережено"</string> @@ -1062,7 +1064,7 @@ <string name="controls_dialog_message" msgid="342066938390663844">"Запропоновано додатком <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Елементи керування оновлено"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN-код містить літери чи символи"</string> - <string name="controls_pin_verify" msgid="3452778292918877662">"<xliff:g id="DEVICE">%s</xliff:g>: підтвердити"</string> + <string name="controls_pin_verify" msgid="3452778292918877662">"<xliff:g id="DEVICE">%s</xliff:g>"</string> <string name="controls_pin_wrong" msgid="6162694056042164211">"Неправильний PIN-код"</string> <string name="controls_pin_verifying" msgid="3755045989392131746">"Підтвердження…"</string> <string name="controls_pin_instructions" msgid="6363309783822475238">"Введіть PIN-код"</string> diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml index fb91b52354be..ac99a7ba21e6 100644 --- a/packages/SystemUI/res/values-ur/strings.xml +++ b/packages/SystemUI/res/values-ur/strings.xml @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"گفتگو کے سیکشن کے اوپری حصے پر دکھاتا ہے، تیرتے بلبلے کی طرح ظاہر ہوتا ہے، لاک اسکرین پر پروفائل تصویر دکھاتا ہے"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ترتیبات"</string> <string name="notification_priority_title" msgid="2079708866333537093">"ترجیح"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> گفتگو کی خصوصیات کو سپورٹ نہیں کرتا ہے"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"کوئی حالیہ بلبلہ نہیں"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"حالیہ بلبلے اور برخاست شدہ بلبلے یہاں ظاہر ہوں گے"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"ان اطلاعات کی ترمیم نہیں کی جا سکتی۔"</string> @@ -1014,11 +1013,17 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"سسٹم نیویگیشن اپ ڈیٹ کیا گیا۔ تبدیلیاں کرنے کے لیے، ترتیبات پر جائیں۔"</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"سسٹم نیویگیشن اپ ڈیٹ کرنے کے لیے ترتیبات پر جائیں"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"اسٹینڈ بائی"</string> + <!-- no translation found for priority_onboarding_title (2893070698479227616) --> + <skip /> + <!-- no translation found for priority_onboarding_behavior (5342816047020432929) --> + <skip /> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"گفتگو کے سیکشن میں سب سے اوپر دکھائیں"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"مقفل سکرین پر پروفائل کی تصویر دکھائیں"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"ایپس کے سب سے اوپر فلوٹنگ بلبلہ کے طور پر ظاہر ہوں"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"ڈسٹرب نہ کریں میں مداخلت کریں"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"سمجھ آ گئی"</string> + <!-- no translation found for priority_onboarding_settings_button_title (6663601574303585927) --> + <skip /> <string name="magnification_overlay_title" msgid="6584179429612427958">"میگنیفیکیشن اوورلے ونڈو"</string> <string name="magnification_window_title" msgid="4863914360847258333">"میگنیفکیشن ونڈو"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"میگنیفکیشن ونڈو کنٹرولز"</string> @@ -1050,11 +1055,11 @@ <string name="controls_dialog_message" msgid="342066938390663844">"<xliff:g id="APP">%s</xliff:g> کی طرف سے تجویز کردہ"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"کنٹرولز اپ ڈیٹ کیے گئے"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN میں حروف یا علامات شامل ہیں"</string> - <string name="controls_pin_verify" msgid="3452778292918877662">"<xliff:g id="DEVICE">%s</xliff:g> کی تصدیق کریں"</string> + <string name="controls_pin_verify" msgid="3452778292918877662">"<xliff:g id="DEVICE">%s</xliff:g> کی تصدیق کریں"</string> <string name="controls_pin_wrong" msgid="6162694056042164211">"غلط PIN"</string> <string name="controls_pin_verifying" msgid="3755045989392131746">"توثیق ہو رہی ہے…"</string> - <string name="controls_pin_instructions" msgid="6363309783822475238">"PIN درج کریں"</string> - <string name="controls_pin_instructions_retry" msgid="1566667581012131046">"کوئی دوسرا PIN آزمائیں"</string> + <string name="controls_pin_instructions" msgid="6363309783822475238">"PIN درج کریں"</string> + <string name="controls_pin_instructions_retry" msgid="1566667581012131046">"کوئی دوسرا PIN آزمائیں"</string> <string name="controls_confirmation_confirming" msgid="2596071302617310665">"توثیق کی جا رہی ہے…"</string> <string name="controls_confirmation_message" msgid="7744104992609594859">"<xliff:g id="DEVICE">%s</xliff:g> کی تبدیلی کی توثیق کریں"</string> <string name="controls_structure_tooltip" msgid="4355922222944447867">"مزید دیکھنے کیلئے سوائپ کریں"</string> diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml index 0aeb3271deb0..518f60c5cfec 100644 --- a/packages/SystemUI/res/values-uz/strings.xml +++ b/packages/SystemUI/res/values-uz/strings.xml @@ -436,7 +436,7 @@ <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Ilovalarni almashtirish uchun ekranni tepaga suring"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Ilovalarni tezkor almashtirish uchun o‘ngga torting"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Umumiy nazar rejimini almashtirish"</string> - <string name="expanded_header_battery_charged" msgid="5307907517976548448">"Batareya quvvati to‘ldi"</string> + <string name="expanded_header_battery_charged" msgid="5307907517976548448">"Quvvat oldi"</string> <string name="expanded_header_battery_charging" msgid="1717522253171025549">"Quvvat olmoqda"</string> <string name="expanded_header_battery_charging_with_time" msgid="757991461445765011">"<xliff:g id="CHARGING_TIME">%s</xliff:g>da to‘ladi"</string> <string name="expanded_header_battery_not_charging" msgid="809409140358955848">"Quvvat olmayapti"</string> @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Suhbatlar ruknining tepasida qalqib chiquvchi bulutcha shaklida chiqadi, ekran qulfida profil rasmi chiqadi"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Sozlamalar"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Muhim"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> ilovasida suhbat funksiyalari ishlamaydi"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Avvalgi bulutchalar topilmadi"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Bu yerda oxirgi va yopilgan bulutcha shaklidagi bildirishnomalar chiqadi"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Bu bildirishnomalarni tahrirlash imkonsiz."</string> @@ -1014,16 +1013,19 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Tizim navigatsiyasi yangilandi. Buni Sozlamalar orqali oʻzgartirishingiz mumkin."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Tizim navigatsiyasini yangilash uchun Sozlamalarni oching"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Kutib turing"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"Suhbat muhim deb belgilandi"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Muhim suhbatlar quyidagi amallarni bajaradi:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Suhbatlar ruknining tepasida chiqarish"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Ekran qulfida profil rasmini chiqarish"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Ilovalar ustida bulutchali xabar sifatida chiqadi"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Bezovta qilinmasin rejimida chiqarish"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Sozlamalar"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Kattalashtirish oynasining ustidan ochilishi"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Kattalashtirish oynasi"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Kattalashtirish oynasi sozlamalari"</string> - <string name="quick_controls_title" msgid="6839108006171302273">"Qurilma boshqaruv elementlari"</string> - <string name="quick_controls_subtitle" msgid="1667408093326318053">"Ulangan qurilmalarga boshqaruv elementlarini kiriting"</string> + <string name="quick_controls_title" msgid="6839108006171302273">"Qurilmalarni boshqarish"</string> + <string name="quick_controls_subtitle" msgid="1667408093326318053">"Ulangan qurilmalar uchun boshqaruv elementlari"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"Qurilma boshqaruv elementlarini sozlash"</string> <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"Boshqaruv elementlariga kirish uchun oʻchirib-yoqish tugmasini bosib turing"</string> <string name="controls_providers_title" msgid="6879775889857085056">"Boshqaruv elementlarini kiritish uchun ilovani tanlang"</string> @@ -1049,7 +1051,7 @@ <string name="controls_dialog_ok" msgid="2770230012857881822">"Kiritish"</string> <string name="controls_dialog_message" msgid="342066938390663844">"<xliff:g id="APP">%s</xliff:g> taklif etgan"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Boshqaruv elementlari yangilandi"</string> - <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN kod harflar va belgilardan iborat boʻladi"</string> + <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"Harflar yoki maxsus belgilardan iborat PIN kod"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"Tekshirish: <xliff:g id="DEVICE">%s</xliff:g>"</string> <string name="controls_pin_wrong" msgid="6162694056042164211">"PIN kod xato"</string> <string name="controls_pin_verifying" msgid="3755045989392131746">"Tekshirilmoqda…"</string> @@ -1067,6 +1069,6 @@ <string name="controls_error_failed" msgid="960228639198558525">"Xato, qayta urining"</string> <string name="controls_in_progress" msgid="4421080500238215939">"Bajarilmoqda"</string> <string name="controls_added_tooltip" msgid="4842812921719153085">"Yangi boshqaruv elementlari bilan tanishish uchun quvvat tugmasini bosib turing"</string> - <string name="controls_menu_add" msgid="4447246119229920050">"Boshqaruv elementlarini kiritish"</string> - <string name="controls_menu_edit" msgid="890623986951347062">"Boshqaruv elementlarini tahrirlash"</string> + <string name="controls_menu_add" msgid="4447246119229920050">"Element kiritish"</string> + <string name="controls_menu_edit" msgid="890623986951347062">"Elementlarni tahrirlash"</string> </resources> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 8000686a8fb1..00e0cf7a1136 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -598,8 +598,8 @@ <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"Màn hình tiếp tục hiển thị cho tới khi bạn bỏ ghim. Hãy vuốt lên và giữ để bỏ ghim."</string> <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"Thao tác này sẽ duy trì hiển thị màn hình cho đến khi bạn bỏ ghim. Hãy chạm và giữ Tổng quan để bỏ ghim."</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"Thao tác này sẽ duy trì hiển thị màn hình cho đến khi bạn bỏ ghim. Hãy chạm và giữ nút Màn hình chính để bỏ ghim."</string> - <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"Bạn có thể truy cập được vào dữ liệu cá nhân (chẳng hạn như danh bạ và nội dung email)."</string> - <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"Ứng dụng đã ghim có thể mở ứng dụng khác."</string> + <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"Dữ liệu cá nhân có thể bị truy cập (chẳng hạn như danh bạ và nội dung email)."</string> + <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"Ứng dụng đã ghim có thể mở các ứng dụng khác."</string> <string name="screen_pinning_toast" msgid="8177286912533744328">"Để bỏ ghim ứng dụng này, hãy chạm và giữ nút Quay lại và nút Tổng quan"</string> <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"Để bỏ ghim ứng dụng này, hãy chạm và giữ nút Quay lại và nút Màn hình chính"</string> <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"Để bỏ ghim ứng dụng này, hãy vuốt lên và giữ"</string> @@ -713,14 +713,13 @@ <string name="notification_bubble_title" msgid="8330481035191903164">"Bong bóng"</string> <string name="notification_channel_summary_low" msgid="4860617986908931158">"Không phát âm thanh hoặc rung"</string> <string name="notification_conversation_summary_low" msgid="1734433426085468009">"Không phát âm thanh hoặc rung và xuất hiện phía dưới trong phần cuộc trò chuyện"</string> - <string name="notification_channel_summary_default" msgid="3282930979307248890">"Có thể đổ chuông hoặc rung tùy theo phần cài đặt trên điện thoại"</string> - <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Có thể đổ chuông hoặc rung tùy theo phần cài đặt trên điện thoại. Theo mặc định, các cuộc trò chuyện từ <xliff:g id="APP_NAME">%1$s</xliff:g> được phép hiển thị dưới dạng bong bóng."</string> + <string name="notification_channel_summary_default" msgid="3282930979307248890">"Có thể đổ chuông hoặc rung tùy theo chế độ cài đặt trên điện thoại"</string> + <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Có thể đổ chuông hoặc rung tùy theo chế độ cài đặt trên điện thoại. Theo mặc định, các cuộc trò chuyện từ <xliff:g id="APP_NAME">%1$s</xliff:g> được phép hiển thị dưới dạng bong bóng."</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Luôn chú ý vào nội dung này bằng phím tắt nổi."</string> <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Hiển thị cuộc trò chuyện ở đầu phần cuộc trò chuyện và dưới dạng bong bóng nổi, hiển thị ảnh hồ sơ trên màn hình khóa"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Cài đặt"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Mức độ ưu tiên"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> không hỗ trợ các tính năng trò chuyện"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Không có bong bóng trò chuyện nào gần đây"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Bong bóng trò chuyện đã đóng và bong bóng trò chuyện gần đây sẽ xuất hiện ở đây"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Không thể sửa đổi các thông báo này."</string> @@ -1014,11 +1013,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Đã cập nhật chế độ di chuyển trên hệ thống. Để thay đổi, hãy chuyển đến phần Cài đặt."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Chuyển đến phần Cài đặt để cập nhật chế độ di chuyển trên hệ thống"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Chế độ chờ"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"Đặt cuộc trò chuyện thành ưu tiên"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Cuộc trò chuyện ưu tiên sẽ:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Hiển thị ở đầu phần cuộc trò chuyện"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Hiển thị ảnh hồ sơ trên màn hình khóa"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Hiện ở dạng bong bóng nổi ở trên cùng của ứng dụng"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Làm gián đoạn chế độ Không làm phiền"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"OK"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Cài đặt"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Cửa sổ lớp phủ phóng to"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Cửa sổ phóng to"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Các tùy chọn điều khiển cửa sổ phóng to"</string> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index 1d5a73dd54c6..2664830bc71a 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -711,16 +711,15 @@ <string name="notification_silence_title" msgid="8608090968400832335">"静音"</string> <string name="notification_alert_title" msgid="3656229781017543655">"默认"</string> <string name="notification_bubble_title" msgid="8330481035191903164">"气泡"</string> - <string name="notification_channel_summary_low" msgid="4860617986908931158">"不发出提示音也不振动"</string> - <string name="notification_conversation_summary_low" msgid="1734433426085468009">"不发出提示音也不振动,显示在对话部分的靠下位置"</string> + <string name="notification_channel_summary_low" msgid="4860617986908931158">"不发出提示音,也不振动"</string> + <string name="notification_conversation_summary_low" msgid="1734433426085468009">"不发出提示音,也不振动;显示在对话部分的靠下位置"</string> <string name="notification_channel_summary_default" msgid="3282930979307248890">"可能会响铃或振动(取决于手机设置)"</string> <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"可能会响铃或振动(取决于手机设置)。默认情况下,来自<xliff:g id="APP_NAME">%1$s</xliff:g>的对话会以对话泡的形式显示。"</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"通过可链接到这项内容的浮动快捷方式吸引您的注意。"</string> <string name="notification_channel_summary_priority" msgid="7952654515769021553">"以悬浮对话泡形式显示在对话部分顶部,如果设备处于锁定状态,在锁定屏幕上显示个人资料照片"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"设置"</string> <string name="notification_priority_title" msgid="2079708866333537093">"优先"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g>不支持对话功能"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"最近没有对话泡"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"此处会显示最近的对话泡和已关闭的对话泡"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"无法修改这些通知。"</string> @@ -1014,19 +1013,22 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"系统导航已更新。要进行更改,请转到“设置”。"</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"转到“设置”即可更新系统导航"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"待机"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"已设置为优先对话"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"优先对话将:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"显示在对话部分顶部"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"在锁定屏幕上显示个人资料照片"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"以悬浮对话泡的形式显示在应用之上"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"中断勿扰模式"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"知道了"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"设置"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"放大叠加窗口"</string> <string name="magnification_window_title" msgid="4863914360847258333">"放大窗口"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"放大窗口控件"</string> - <string name="quick_controls_title" msgid="6839108006171302273">"设备控制器"</string> + <string name="quick_controls_title" msgid="6839108006171302273">"设备控件"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"为您所连接的设备添加控件"</string> - <string name="quick_controls_setup_title" msgid="8901436655997849822">"设置设备控制器"</string> + <string name="quick_controls_setup_title" msgid="8901436655997849822">"设置设备控件"</string> <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"按住电源按钮即可访问您的控件"</string> - <string name="controls_providers_title" msgid="6879775889857085056">"选择应用以添加控件"</string> + <string name="controls_providers_title" msgid="6879775889857085056">"选择要添加控制器的应用"</string> <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380"> <item quantity="other">已添加 <xliff:g id="NUMBER_1">%s</xliff:g> 个控件。</item> <item quantity="one">已添加 <xliff:g id="NUMBER_0">%s</xliff:g> 个控件。</item> @@ -1045,7 +1047,7 @@ <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"未保存更改"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"无法加载所有控件的列表。"</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"其他"</string> - <string name="controls_dialog_title" msgid="2343565267424406202">"添加到设备控制器"</string> + <string name="controls_dialog_title" msgid="2343565267424406202">"添加到设备控件"</string> <string name="controls_dialog_ok" msgid="2770230012857881822">"添加"</string> <string name="controls_dialog_message" msgid="342066938390663844">"来自<xliff:g id="APP">%s</xliff:g>的建议"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"控件已更新"</string> diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index 53479842563c..34b76904d8ef 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"在對話部分的頂部以浮動對話氣泡顯示,並在上鎖畫面顯示個人檔案相片"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"設定"</string> <string name="notification_priority_title" msgid="2079708866333537093">"重要"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」不支援對話功能"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"沒有最近曾使用的小視窗"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"最近使用和關閉的小視窗會在這裡顯示"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"無法修改這些通知。"</string> @@ -1014,11 +1013,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"系統導覽已更新。如需變更,請前往「設定」。"</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"前往「設定」更新系統導覽"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"待機"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"對話已設為優先"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"優先對話將會:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"在對話部分的頂部顯示"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"在上鎖畫面顯示個人檔案相片"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"在應用程式上以浮動小視窗顯示"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"中斷「請勿騷擾」"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"知道了"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"設定"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"放大重疊視窗"</string> <string name="magnification_window_title" msgid="4863914360847258333">"放大視窗"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"放大視窗控制項"</string> @@ -1026,7 +1028,7 @@ <string name="quick_controls_subtitle" msgid="1667408093326318053">"為已連接的裝置新增控制項"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"設定裝置控制"</string> <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"按住「開關」按鈕便可存取控制項"</string> - <string name="controls_providers_title" msgid="6879775889857085056">"選擇應用程式以新增控制項"</string> + <string name="controls_providers_title" msgid="6879775889857085056">"選擇要新增控制項的應用程式"</string> <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380"> <item quantity="other">已新增 <xliff:g id="NUMBER_1">%s</xliff:g> 個控制項。</item> <item quantity="one">已新增 <xliff:g id="NUMBER_0">%s</xliff:g> 個控制項。</item> @@ -1039,7 +1041,7 @@ <string name="accessibility_control_change_unfavorite" msgid="6997408061750740327">"取消收藏"</string> <string name="accessibility_control_move" msgid="8980344493796647792">"移至位置 <xliff:g id="NUMBER">%d</xliff:g>"</string> <string name="controls_favorite_default_title" msgid="967742178688938137">"控制項"</string> - <string name="controls_favorite_subtitle" msgid="6604402232298443956">"從電源選單選擇要存取的控制項"</string> + <string name="controls_favorite_subtitle" msgid="6604402232298443956">"選擇可從電源選單使用的控制項"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"按住並拖曳便可重新排列控制項"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"已移除所有控制項"</string> <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"未儲存變更"</string> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index 104aaa4d9b03..5f3911a29178 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -598,10 +598,10 @@ <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"這會讓目前的螢幕畫面保持顯示狀態,直到取消固定為止。向上滑動並按住即可取消固定。"</string> <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"這會讓目前的螢幕畫面保持顯示狀態,直到取消固定為止。按住 [總覽] 按鈕即可取消固定。"</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"這會讓應用程式顯示在螢幕上,直到取消固定為止。按住主螢幕按鈕即可取消固定。"</string> - <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"該應用程式或許可存取個人資料 (例如聯絡人和電子郵件內容)。"</string> - <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"已設為固定的應用程式或許可以開啟其他應用程式。"</string> - <string name="screen_pinning_toast" msgid="8177286912533744328">"如要取消固定這個應用程式,請輕觸並按住「返回」按鈕和「總覽」按鈕"</string> - <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"如要取消固定這個應用程式,請輕觸並按住「返回」按鈕和主畫面按鈕"</string> + <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"個人資料 (例如聯絡人和電子郵件內容) 可能會遭存取。"</string> + <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"已設為固定的應用程式或許仍可開啟其他應用程式。"</string> + <string name="screen_pinning_toast" msgid="8177286912533744328">"如要取消固定這個應用程式,請按住「返回」按鈕和「總覽」按鈕"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"如要取消固定這個應用程式,請按住「返回」按鈕和主畫面按鈕"</string> <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"如要取消固定這個應用程式,請向上滑動並按住"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"知道了"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"不用了,謝謝"</string> @@ -713,14 +713,13 @@ <string name="notification_bubble_title" msgid="8330481035191903164">"泡泡"</string> <string name="notification_channel_summary_low" msgid="4860617986908931158">"不震動或發出聲音"</string> <string name="notification_conversation_summary_low" msgid="1734433426085468009">"不震動或發出聲音,並顯示在對話部分的下方"</string> - <string name="notification_channel_summary_default" msgid="3282930979307248890">"可能會根據手機的設定響鈴或震動"</string> + <string name="notification_channel_summary_default" msgid="3282930979307248890">"根據手機的設定響鈴或震動"</string> <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"可能會根據手機的設定響鈴或震動。根據預設,來自「<xliff:g id="APP_NAME">%1$s</xliff:g>」的對話會以對話框形式顯示。"</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"利用浮動式捷徑快速存取這項內容。"</string> <string name="notification_channel_summary_priority" msgid="7952654515769021553">"以浮動對話框的形式顯示在對話部分的頂端。如果裝置處於鎖定狀態,則在螢幕鎖定畫面上顯示個人資料相片"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"設定"</string> <string name="notification_priority_title" msgid="2079708866333537093">"優先"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」不支援對話功能"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"最近沒有任何對話框"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"最近的對話框和已關閉的對話框會顯示在這裡"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"無法修改這些通知。"</string> @@ -1014,11 +1013,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"系統操作機制已更新。如要進行變更,請前往「設定」。"</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"請前往「設定」更新系統操作機制"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"待機"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"將對話設為優先"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"優先對話會:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"顯示在對話部分的頂端"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"在螢幕鎖定畫面上顯示個人資料相片"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"以浮動對話框形式顯示在應用程式最上層"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"中斷零打擾模式"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"我知道了"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"設定"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"放大重疊視窗"</string> <string name="magnification_window_title" msgid="4863914360847258333">"放大視窗"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"放大視窗控制項"</string> diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index 292d6db3b7a2..9b56c2039c44 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -719,8 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Iboniswa ngenhla kwesigaba sengxoxo, ivela njengebhamuza elintantayo, ibonisa isithombe sephrofayela kukukhiya isikrini"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Izilungiselelo"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Okubalulekile"</string> - <!-- no translation found for no_shortcut (8257177117568230126) --> - <skip /> + <string name="no_shortcut" msgid="8257177117568230126">"I-<xliff:g id="APP_NAME">%1$s</xliff:g> ayisekeli izici zengxoxo"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Awekho amabhamuza akamuva"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Amabhamuza akamuva namabhamuza asusiwe azobonakala lapha."</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Lezi zaziso azikwazi ukushintshwa."</string> @@ -1014,11 +1013,14 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Ukuzulazula kwesistimu kubuyekeziwe. Ukuze wenze ushintsho, hamba kokuthi Izilungiselelo."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Hamba kuzilungiselelo ukuze ubuyekeze ukuzulazula kwesistimu"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Ilindile"</string> + <string name="priority_onboarding_title" msgid="2893070698479227616">"Izingxoxo zisethwe kweziza kuqala"</string> + <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Izingxoxo eziza kuqala zizo:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Kubonakala esigabeni esiphezulu sengxoxo"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Kubonakala esithombeni sephrofayela esikrinini esikhiyiwe"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Kubonakala njengebhamuza elintantayo phezu kwezinhlelo zokusebenza"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Thikameza Ukungaphazamisi"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Ngiyezwa"</string> + <string name="priority_onboarding_settings_button_title" msgid="6663601574303585927">"Amasethingi"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Iwindi Lembondela Lesikhulisi"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Iwindi Lesikhulisi"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Izilawuli Zewindi Lesikhulisi"</string> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index c46460853683..73d8e9a0d8a7 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -974,7 +974,9 @@ <dimen name="recents_quick_scrub_onboarding_margin_start">8dp</dimen> <!-- The height of the gradient indicating the dismiss edge when moving a PIP. --> - <dimen name="floating_dismiss_gradient_height">176dp</dimen> + <dimen name="floating_dismiss_gradient_height">250dp</dimen> + + <dimen name="floating_dismiss_bottom_margin">50dp</dimen> <!-- The bottom margin of the PIP drag to dismiss info text shown when moving a PIP. --> <dimen name="pip_dismiss_text_bottom_margin">24dp</dimen> diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 39237ac246eb..0314fc89d33a 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -2781,6 +2781,8 @@ <!-- Close the controls associated with a specific media session [CHAR_LIMIT=NONE] --> <string name="controls_media_close_session">Close this media session</string> + <!-- Label for button to resume media playback [CHAR_LIMIT=NONE] --> + <string name="controls_media_resume">Resume</string> <!-- Error message indicating that a control timed out while waiting for an update [CHAR_LIMIT=30] --> <string name="controls_error_timeout">Inactive, check app</string> @@ -2788,7 +2790,13 @@ a retry will be attempted [CHAR LIMIT=30] --> <string name="controls_error_retryable">Error, retrying\u2026</string> <!-- Error message indicating that the control is no longer available in the application [CHAR LIMIT=30] --> - <string name="controls_error_removed">Device removed</string> + <string name="controls_error_removed">Not found</string> + <!-- Title for dialog indicating that the control is no longer available in the application [CHAR LIMIT=30] --> + <string name="controls_error_removed_title">Control is unavailable</string> + <!-- Message body for dialog indicating that the control is no longer available in the application [CHAR LIMIT=NONE] --> + <string name="controls_error_removed_message">Couldn\u2019t access <xliff:g id="device" example="Backdoor lock">%1$s</xliff:g>. Check the <xliff:g id="application" example="Google Home">%2$s</xliff:g> app to make sure the control is still available and that the app settings haven\u2019t changed.</string> + <!-- Text for button to open the corresponding application [CHAR_LIMIT=20] --> + <string name="controls_open_app">Open app</string> <!-- Error message indicating that an unspecified error occurred while getting the status [CHAR LIMIT=30] --> <string name="controls_error_generic">Can\u2019t load status</string> <!-- Error message indicating that a control action failed [CHAR_LIMIT=30] --> diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml index ed36bdbe1e7e..39f78bf46028 100644 --- a/packages/SystemUI/res/values/styles.xml +++ b/packages/SystemUI/res/values/styles.xml @@ -387,6 +387,11 @@ <item name="android:homeAsUpIndicator">@drawable/ic_arrow_back</item> </style> + <style name="qs_security_footer" parent="@style/qs_theme"> + <item name="android:textColor">?android:attr/textColorSecondary</item> + <item name="android:tint">?android:attr/textColorSecondary</item> + </style> + <style name="systemui_theme_remote_input" parent="@android:style/Theme.DeviceDefault.Light"> <item name="android:colorAccent">@color/remote_input_accent</item> </style> diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListener.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListener.java index 796aaeefb62f..44372d76bb23 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListener.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListener.java @@ -115,6 +115,6 @@ public abstract class TaskStackChangeListener { /** @see ITaskStackListener#onRecentTaskListFrozenChanged(boolean) */ public void onRecentTaskListFrozenChanged(boolean frozen) { } - /** @see ITaskStackListener#onActivityRotation()*/ - public void onActivityRotation() { } + /** @see ITaskStackListener#onActivityRotation(int)*/ + public void onActivityRotation(int displayId) { } } diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListeners.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListeners.java index 13f7993f57d4..f214648d89f1 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListeners.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListeners.java @@ -238,8 +238,9 @@ public class TaskStackChangeListeners extends TaskStackListener { } @Override - public void onActivityRotation() { - mHandler.obtainMessage(H.ON_ACTIVITY_ROTATION).sendToTarget(); + public void onActivityRotation(int displayId) { + mHandler.obtainMessage(H.ON_ACTIVITY_ROTATION, displayId, 0 /* unused */) + .sendToTarget(); } private final class H extends Handler { @@ -435,7 +436,7 @@ public class TaskStackChangeListeners extends TaskStackListener { } case ON_ACTIVITY_ROTATION: { for (int i = mTaskStackListeners.size() - 1; i >= 0; i--) { - mTaskStackListeners.get(i).onActivityRotation(); + mTaskStackListeners.get(i).onActivityRotation(msg.arg1); } break; } diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java index be82a2d5325b..5674fdd3bb36 100644 --- a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java +++ b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java @@ -28,6 +28,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.widget.LockPatternUtils; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.ViewMediatorCallback; +import com.android.systemui.bubbles.BubbleController; import com.android.systemui.dagger.DaggerSystemUIRootComponent; import com.android.systemui.dagger.DependencyProvider; import com.android.systemui.dagger.SystemUIRootComponent; @@ -164,7 +165,8 @@ public class SystemUIFactory { wakeUpCoordinator, keyguardBypassController, Dependency.get(NotificationMediaManager.class), Dependency.get(NotificationListener.class), - Dependency.get(DozeParameters.class)); + Dependency.get(DozeParameters.class), + Dependency.get(BubbleController.class)); } @Module diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java b/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java index a876dee0e52d..a7533adc795e 100644 --- a/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java +++ b/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java @@ -40,8 +40,11 @@ import android.widget.ImageView; import com.android.internal.app.AssistUtils; import com.android.internal.app.IVoiceInteractionSessionListener; import com.android.internal.app.IVoiceInteractionSessionShowCallback; +import com.android.internal.logging.InstanceId; +import com.android.internal.logging.InstanceIdSequence; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; +import com.android.internal.util.FrameworkStatsLog; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.settingslib.applications.InterestingConfigChanges; import com.android.systemui.R; @@ -121,6 +124,7 @@ public class AssistManager { private static final long TIMEOUT_SERVICE = 2500; private static final long TIMEOUT_ACTIVITY = 1000; + private static final int INSTANCE_ID_MAX = 1 << 20; protected final Context mContext; private final WindowManager mWindowManager; @@ -130,6 +134,8 @@ public class AssistManager { private final AssistHandleBehaviorController mHandleController; private final UiController mUiController; protected final Lazy<SysUiState> mSysUiState; + protected final InstanceIdSequence mInstanceIdSequence = + new InstanceIdSequence(INSTANCE_ID_MAX); private AssistOrbContainer mView; private final DeviceProvisionedController mDeviceProvisionedController; @@ -299,7 +305,8 @@ public class AssistManager { int phoneState = mPhoneStateMonitor.getPhoneState(); args.putInt(INVOCATION_PHONE_STATE_KEY, phoneState); args.putLong(INVOCATION_TIME_MS_KEY, SystemClock.elapsedRealtime()); - logStartAssist(invocationType, phoneState); + logStartAssist(/* instanceId = */ null, invocationType, phoneState); + logStartAssistLegacy(invocationType, phoneState); startAssistInternal(args, assistComponent, isService); } @@ -499,7 +506,35 @@ public class AssistManager { return toLoggingSubType(invocationType, mPhoneStateMonitor.getPhoneState()); } - protected void logStartAssist(int invocationType, int phoneState) { + protected void logStartAssist( + @Nullable InstanceId instanceId, int invocationType, int deviceState) { + InstanceId currentInstanceId = + instanceId == null ? mInstanceIdSequence.newInstanceId() : instanceId; + ComponentName assistantComponent = + mAssistUtils.getAssistComponentForUser(UserHandle.USER_CURRENT); + int assistantUid = 0; + try { + assistantUid = + mContext.getPackageManager() + .getApplicationInfo( + assistantComponent.getPackageName(), + /* flags = */ 0) + .uid; + } catch (PackageManager.NameNotFoundException e) { + Log.e(TAG, "Unable to find Assistant UID", e); + } + + FrameworkStatsLog.write( + FrameworkStatsLog.ASSISTANT_INVOCATION_REPORTED, + AssistantInvocationEvent.Companion.eventIdFromLegacyInvocationType(invocationType), + assistantUid, + assistantComponent.flattenToString(), + currentInstanceId.getId(), + AssistantInvocationEvent.Companion.deviceStateFromLegacyDeviceState(deviceState), + mHandleController.areHandlesShowing()); + } + + protected void logStartAssistLegacy(int invocationType, int phoneState) { MetricsLogger.action( new LogMaker(MetricsEvent.ASSISTANT) .setType(MetricsEvent.TYPE_OPEN) diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistantInvocationEvent.kt b/packages/SystemUI/src/com/android/systemui/assist/AssistantInvocationEvent.kt new file mode 100644 index 000000000000..1de7b8423617 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/assist/AssistantInvocationEvent.kt @@ -0,0 +1,119 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.assist + +import com.android.internal.logging.UiEvent +import com.android.internal.logging.UiEventLogger +import com.android.internal.util.FrameworkStatsLog.ASSISTANT_INVOCATION_REPORTED__DEVICE_STATE__AOD1 +import com.android.internal.util.FrameworkStatsLog.ASSISTANT_INVOCATION_REPORTED__DEVICE_STATE__AOD2 +import com.android.internal.util.FrameworkStatsLog.ASSISTANT_INVOCATION_REPORTED__DEVICE_STATE__APP_DEFAULT +import com.android.internal.util.FrameworkStatsLog.ASSISTANT_INVOCATION_REPORTED__DEVICE_STATE__APP_FULLSCREEN +import com.android.internal.util.FrameworkStatsLog.ASSISTANT_INVOCATION_REPORTED__DEVICE_STATE__APP_IMMERSIVE +import com.android.internal.util.FrameworkStatsLog.ASSISTANT_INVOCATION_REPORTED__DEVICE_STATE__BOUNCER +import com.android.internal.util.FrameworkStatsLog.ASSISTANT_INVOCATION_REPORTED__DEVICE_STATE__LAUNCHER_ALL_APPS +import com.android.internal.util.FrameworkStatsLog.ASSISTANT_INVOCATION_REPORTED__DEVICE_STATE__LAUNCHER_HOME +import com.android.internal.util.FrameworkStatsLog.ASSISTANT_INVOCATION_REPORTED__DEVICE_STATE__LAUNCHER_OVERVIEW +import com.android.internal.util.FrameworkStatsLog.ASSISTANT_INVOCATION_REPORTED__DEVICE_STATE__UNKNOWN_DEVICE_STATE +import com.android.internal.util.FrameworkStatsLog.ASSISTANT_INVOCATION_REPORTED__DEVICE_STATE__UNLOCKED_LOCKSCREEN + +enum class AssistantInvocationEvent(private val id: Int) : UiEventLogger.UiEventEnum { + @UiEvent(doc = "Assistant invoked by unknown method") + ASSISTANT_INVOCATION_UNKNOWN(442), + + @UiEvent(doc = "Assistant invoked by touch gesture") + ASSISTANT_INVOCATION_TOUCH_GESTURE(443), + + @UiEvent(doc = "Assistant invoked by alternate touch gesture") + ASSISTANT_INVOCATION_TOUCH_GESTURE_ALT(444), + + @UiEvent(doc = "Assistant invoked by hotword") + ASSISTANT_INVOCATION_HOTWORD(445), + + @UiEvent(doc = "Assistant invoked by tapping quick search bar icon") + ASSISTANT_INVOCATION_QUICK_SEARCH_BAR(446), + + @UiEvent(doc = "Assistant invoked by home button long press") + ASSISTANT_INVOCATION_HOME_LONG_PRESS(447), + + @UiEvent(doc = "Assistant invoked by physical gesture") + ASSISTANT_INVOCATION_PHYSICAL_GESTURE(448); + + override fun getId(): Int { + return id + } + + companion object { + fun eventIdFromLegacyInvocationType(legacyInvocationType: Int): Int { + return when (legacyInvocationType) { + AssistManager.INVOCATION_TYPE_GESTURE -> + ASSISTANT_INVOCATION_TOUCH_GESTURE + + AssistManager.INVOCATION_TYPE_OTHER -> + ASSISTANT_INVOCATION_PHYSICAL_GESTURE + + AssistManager.INVOCATION_TYPE_VOICE -> + ASSISTANT_INVOCATION_HOTWORD + + AssistManager.INVOCATION_TYPE_QUICK_SEARCH_BAR -> + ASSISTANT_INVOCATION_QUICK_SEARCH_BAR + + AssistManager.INVOCATION_HOME_BUTTON_LONG_PRESS -> + ASSISTANT_INVOCATION_HOME_LONG_PRESS + + else -> + ASSISTANT_INVOCATION_UNKNOWN + }.id + } + + fun deviceStateFromLegacyDeviceState(legacyDeviceState: Int): Int { + return when (legacyDeviceState) { + PhoneStateMonitor.PHONE_STATE_AOD1 -> + ASSISTANT_INVOCATION_REPORTED__DEVICE_STATE__AOD1 + + PhoneStateMonitor.PHONE_STATE_AOD2 -> + ASSISTANT_INVOCATION_REPORTED__DEVICE_STATE__AOD2 + + PhoneStateMonitor.PHONE_STATE_BOUNCER -> + ASSISTANT_INVOCATION_REPORTED__DEVICE_STATE__BOUNCER + + PhoneStateMonitor.PHONE_STATE_UNLOCKED_LOCKSCREEN -> + ASSISTANT_INVOCATION_REPORTED__DEVICE_STATE__UNLOCKED_LOCKSCREEN + + PhoneStateMonitor.PHONE_STATE_HOME -> + ASSISTANT_INVOCATION_REPORTED__DEVICE_STATE__LAUNCHER_HOME + + PhoneStateMonitor.PHONE_STATE_OVERVIEW -> + ASSISTANT_INVOCATION_REPORTED__DEVICE_STATE__LAUNCHER_OVERVIEW + + PhoneStateMonitor.PHONE_STATE_ALL_APPS -> + ASSISTANT_INVOCATION_REPORTED__DEVICE_STATE__LAUNCHER_ALL_APPS + + PhoneStateMonitor.PHONE_STATE_APP_DEFAULT -> + ASSISTANT_INVOCATION_REPORTED__DEVICE_STATE__APP_DEFAULT + + PhoneStateMonitor.PHONE_STATE_APP_IMMERSIVE -> + ASSISTANT_INVOCATION_REPORTED__DEVICE_STATE__APP_IMMERSIVE + + PhoneStateMonitor.PHONE_STATE_APP_FULLSCREEN -> + ASSISTANT_INVOCATION_REPORTED__DEVICE_STATE__APP_FULLSCREEN + + else -> + ASSISTANT_INVOCATION_REPORTED__DEVICE_STATE__UNKNOWN_DEVICE_STATE + } + } + } +}
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/assist/PhoneStateMonitor.java b/packages/SystemUI/src/com/android/systemui/assist/PhoneStateMonitor.java index 9de6854a6024..652ce6f04db0 100644 --- a/packages/SystemUI/src/com/android/systemui/assist/PhoneStateMonitor.java +++ b/packages/SystemUI/src/com/android/systemui/assist/PhoneStateMonitor.java @@ -50,16 +50,16 @@ import dagger.Lazy; @Singleton public final class PhoneStateMonitor { - private static final int PHONE_STATE_AOD1 = 1; - private static final int PHONE_STATE_AOD2 = 2; - private static final int PHONE_STATE_BOUNCER = 3; - private static final int PHONE_STATE_UNLOCKED_LOCKSCREEN = 4; - private static final int PHONE_STATE_HOME = 5; - private static final int PHONE_STATE_OVERVIEW = 6; - private static final int PHONE_STATE_ALL_APPS = 7; - private static final int PHONE_STATE_APP_DEFAULT = 8; - private static final int PHONE_STATE_APP_IMMERSIVE = 9; - private static final int PHONE_STATE_APP_FULLSCREEN = 10; + public static final int PHONE_STATE_AOD1 = 1; + public static final int PHONE_STATE_AOD2 = 2; + public static final int PHONE_STATE_BOUNCER = 3; + public static final int PHONE_STATE_UNLOCKED_LOCKSCREEN = 4; + public static final int PHONE_STATE_HOME = 5; + public static final int PHONE_STATE_OVERVIEW = 6; + public static final int PHONE_STATE_ALL_APPS = 7; + public static final int PHONE_STATE_APP_DEFAULT = 8; + public static final int PHONE_STATE_APP_IMMERSIVE = 9; + public static final int PHONE_STATE_APP_FULLSCREEN = 10; private static final String[] DEFAULT_HOME_CHANGE_ACTIONS = new String[] { PackageManagerWrapper.ACTION_PREFERRED_ACTIVITY_CHANGED, diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/Bubble.java b/packages/SystemUI/src/com/android/systemui/bubbles/Bubble.java index 15eda0689101..97a73043aa08 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/Bubble.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/Bubble.java @@ -21,6 +21,7 @@ import static android.view.Display.INVALID_DISPLAY; import static com.android.internal.annotations.VisibleForTesting.Visibility.PRIVATE; +import android.annotation.DimenRes; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.Notification; @@ -104,27 +105,39 @@ class Bubble implements BubbleViewProvider { private Path mDotPath; private int mFlags; + @NonNull + private UserHandle mUser; + @NonNull + private String mPackageName; + private int mDesiredHeight; + @DimenRes + private int mDesiredHeightResId; + /** * Create a bubble with limited information based on given {@link ShortcutInfo}. * Note: Currently this is only being used when the bubble is persisted to disk. */ - Bubble(@NonNull final String key, @NonNull final ShortcutInfo shortcutInfo) { + Bubble(@NonNull final String key, @NonNull final ShortcutInfo shortcutInfo, + final int desiredHeight, final int desiredHeightResId) { Objects.requireNonNull(key); Objects.requireNonNull(shortcutInfo); mShortcutInfo = shortcutInfo; mKey = key; mFlags = 0; + mUser = shortcutInfo.getUserHandle(); + mPackageName = shortcutInfo.getPackage(); + mDesiredHeight = desiredHeight; + mDesiredHeightResId = desiredHeightResId; } /** Used in tests when no UI is required. */ @VisibleForTesting(visibility = PRIVATE) - Bubble(NotificationEntry e, - BubbleController.NotificationSuppressionChangedListener listener) { - mEntry = e; + Bubble(@NonNull final NotificationEntry e, + @Nullable final BubbleController.NotificationSuppressionChangedListener listener) { + Objects.requireNonNull(e); mKey = e.getKey(); - mLastUpdated = e.getSbn().getPostTime(); mSuppressionListener = listener; - mFlags = e.getSbn().getNotification().flags; + setEntry(e); } @Override @@ -137,17 +150,14 @@ class Bubble implements BubbleViewProvider { return mEntry; } - @Nullable + @NonNull public UserHandle getUser() { - if (mEntry != null) return mEntry.getSbn().getUser(); - if (mShortcutInfo != null) return mShortcutInfo.getUserHandle(); - return null; + return mUser; } + @NonNull public String getPackageName() { - return mEntry == null - ? mShortcutInfo == null ? null : mShortcutInfo.getPackage() - : mEntry.getSbn().getPackageName(); + return mPackageName; } @Override @@ -318,9 +328,18 @@ class Bubble implements BubbleViewProvider { /** * Sets the entry associated with this bubble. */ - void setEntry(NotificationEntry entry) { + void setEntry(@NonNull final NotificationEntry entry) { + Objects.requireNonNull(entry); + Objects.requireNonNull(entry.getSbn()); mEntry = entry; mLastUpdated = entry.getSbn().getPostTime(); + mFlags = entry.getSbn().getNotification().flags; + mPackageName = entry.getSbn().getPackageName(); + mUser = entry.getSbn().getUser(); + if (entry.getBubbleMetadata() != null) { + mDesiredHeight = entry.getBubbleMetadata().getDesiredHeight(); + mDesiredHeightResId = entry.getBubbleMetadata().getDesiredHeightResId(); + } } /** @@ -434,28 +453,30 @@ class Bubble implements BubbleViewProvider { return mFlyoutMessage; } + int getRawDesiredHeight() { + return mDesiredHeight; + } + + int getRawDesiredHeightResId() { + return mDesiredHeightResId; + } + float getDesiredHeight(Context context) { - if (mEntry == null) return 0; - Notification.BubbleMetadata data = mEntry.getBubbleMetadata(); - boolean useRes = data.getDesiredHeightResId() != 0; + boolean useRes = mDesiredHeightResId != 0; if (useRes) { - return getDimenForPackageUser(context, data.getDesiredHeightResId(), - mEntry.getSbn().getPackageName(), - mEntry.getSbn().getUser().getIdentifier()); + return getDimenForPackageUser(context, mDesiredHeightResId, mPackageName, + mUser.getIdentifier()); } else { - return data.getDesiredHeight() - * context.getResources().getDisplayMetrics().density; + return mDesiredHeight * context.getResources().getDisplayMetrics().density; } } String getDesiredHeightString() { - if (mEntry == null) return String.valueOf(0); - Notification.BubbleMetadata data = mEntry.getBubbleMetadata(); - boolean useRes = data.getDesiredHeightResId() != 0; + boolean useRes = mDesiredHeightResId != 0; if (useRes) { - return String.valueOf(data.getDesiredHeightResId()); + return String.valueOf(mDesiredHeightResId); } else { - return String.valueOf(data.getDesiredHeight()); + return String.valueOf(mDesiredHeight); } } diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java index 8a2c101f7057..cf793f021a29 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java @@ -578,6 +578,18 @@ public class BubbleController implements ConfigurationController.ConfigurationLi } /** + * Called when the status bar has become visible or invisible (either permanently or + * temporarily). + */ + public void onStatusBarVisibilityChanged(boolean visible) { + if (mStackView != null) { + // Hide the stack temporarily if the status bar has been made invisible, and the stack + // is collapsed. An expanded stack should remain visible until collapsed. + mStackView.setTemporarilyInvisible(!visible && !isStackExpanded()); + } + } + + /** * Sets whether to perform inflation on the same thread as the caller. This method should only * be used in tests, not in production. */ @@ -869,6 +881,18 @@ public class BubbleController implements ConfigurationController.ConfigurationLi return (isSummary && isSuppressedSummary) || isSuppressedBubble; } + /** + * True if: + * (1) The current notification entry same as selected bubble notification entry and the + * stack is currently expanded. + * + * False otherwise. + */ + public boolean isBubbleExpanded(NotificationEntry entry) { + return isStackExpanded() && mBubbleData != null && mBubbleData.getSelectedBubble() != null + && mBubbleData.getSelectedBubble().getKey().equals(entry.getKey()) ? true : false; + } + void promoteBubbleFromOverflow(Bubble bubble) { bubble.setInflateSynchronously(mInflateSynchronously); setIsBubble(bubble, /* isBubble */ true); @@ -1132,6 +1156,8 @@ public class BubbleController implements ConfigurationController.ConfigurationLi @Override public void applyUpdate(BubbleData.Update update) { + ensureStackViewCreated(); + // Lazy load overflow bubbles from disk loadOverflowBubblesFromDisk(); // Update bubbles in overflow. diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleDataRepository.kt b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleDataRepository.kt index c2b9195c8ba3..d20f40559b5d 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleDataRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleDataRepository.kt @@ -77,7 +77,8 @@ internal class BubbleDataRepository @Inject constructor( var shortcutId = b.shortcutInfo?.id if (shortcutId == null) shortcutId = b.entry?.bubbleMetadata?.shortcutId if (shortcutId == null) return@mapNotNull null - BubbleEntity(userId, b.packageName, shortcutId, b.key) + BubbleEntity(userId, b.packageName, shortcutId, b.key, b.rawDesiredHeight, + b.rawDesiredHeightResId) } } @@ -158,7 +159,8 @@ internal class BubbleDataRepository @Inject constructor( val bubbles = entities.mapNotNull { entity -> shortcutMap[ShortcutKey(entity.userId, entity.packageName)] ?.first { shortcutInfo -> entity.shortcutId == shortcutInfo.id } - ?.let { shortcutInfo -> Bubble(entity.key, shortcutInfo) } + ?.let { shortcutInfo -> Bubble(entity.key, shortcutInfo, entity.desiredHeight, + entity.desiredHeightResId) } } uiScope.launch { cb(bubbles) } } diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java index 790d6a2070a2..c3dcc0b3038c 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java @@ -264,7 +264,8 @@ public class BubbleExpandedView extends LinearLayout { mSettingsIcon = findViewById(R.id.settings_button); mActivityView = new ActivityView(mContext, null /* attrs */, 0 /* defStyle */, - true /* singleTaskInstance */); + true /* singleTaskInstance */, false /* usePublicVirtualDisplay*/, + true /* disableSurfaceViewBackgroundLayer */); // Set ActivityView's alpha value as zero, since there is no view content to be shown. setContentVisibility(false); diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java index dfa71baddb93..95c8d08841df 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java @@ -47,6 +47,7 @@ import android.graphics.PointF; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Region; +import android.graphics.drawable.TransitionDrawable; import android.os.Bundle; import android.provider.Settings; import android.util.Log; @@ -79,6 +80,7 @@ import androidx.dynamicanimation.animation.SpringForce; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ContrastColorUtil; import com.android.internal.widget.ViewClippingUtil; +import com.android.systemui.Interpolators; import com.android.systemui.Prefs; import com.android.systemui.R; import com.android.systemui.bubbles.animation.ExpandedAnimationController; @@ -88,6 +90,7 @@ import com.android.systemui.model.SysUiState; import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.shared.system.SysUiStatsLog; import com.android.systemui.statusbar.notification.collection.NotificationEntry; +import com.android.systemui.statusbar.phone.CollapsedStatusBarFragment; import com.android.systemui.statusbar.phone.NotificationShadeWindowController; import com.android.systemui.util.DismissCircleView; import com.android.systemui.util.FloatingContentCoordinator; @@ -133,6 +136,9 @@ public class BubbleStackView extends FrameLayout /** Percent to darken the bubbles when they're in the dismiss target. */ private static final float DARKEN_PERCENT = 0.3f; + /** Duration of the dismiss scrim fading in/out. */ + private static final int DISMISS_TRANSITION_DURATION_MS = 200; + /** How long to wait, in milliseconds, before hiding the flyout. */ @VisibleForTesting static final int FLYOUT_HIDE_AFTER = 5000; @@ -239,6 +245,9 @@ public class BubbleStackView extends FrameLayout /** Whether a touch gesture, such as a stack/bubble drag or flyout drag, is in progress. */ private boolean mIsGestureInProgress = false; + /** Whether or not the stack is temporarily invisible off the side of the screen. */ + private boolean mTemporarilyInvisible = false; + /** Description of current animation controller state. */ public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { pw.println("Stack view state:"); @@ -261,7 +270,7 @@ public class BubbleStackView extends FrameLayout private boolean mShowingDismiss = false; /** The view to desaturate/darken when magneted to the dismiss target. */ - private View mDesaturateAndDarkenTargetView; + @Nullable private View mDesaturateAndDarkenTargetView; private LayoutInflater mInflater; @@ -643,6 +652,7 @@ public class BubbleStackView extends FrameLayout } }; + private View mDismissTargetCircle; private ViewGroup mDismissTargetContainer; private PhysicsAnimator<View> mDismissTargetAnimator; private PhysicsAnimator.SpringConfig mDismissTargetSpring = new PhysicsAnimator.SpringConfig( @@ -749,25 +759,32 @@ public class BubbleStackView extends FrameLayout mFlyoutTransitionSpring.addEndListener(mAfterFlyoutTransitionSpring); final int targetSize = res.getDimensionPixelSize(R.dimen.dismiss_circle_size); - final View targetView = new DismissCircleView(context); + mDismissTargetCircle = new DismissCircleView(context); final FrameLayout.LayoutParams newParams = new FrameLayout.LayoutParams(targetSize, targetSize); - newParams.gravity = Gravity.CENTER; - targetView.setLayoutParams(newParams); - mDismissTargetAnimator = PhysicsAnimator.getInstance(targetView); + newParams.gravity = Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL; + mDismissTargetCircle.setLayoutParams(newParams); + mDismissTargetAnimator = PhysicsAnimator.getInstance(mDismissTargetCircle); mDismissTargetContainer = new FrameLayout(context); mDismissTargetContainer.setLayoutParams(new FrameLayout.LayoutParams( MATCH_PARENT, getResources().getDimensionPixelSize(R.dimen.floating_dismiss_gradient_height), Gravity.BOTTOM)); + + final int bottomMargin = + getResources().getDimensionPixelSize(R.dimen.floating_dismiss_bottom_margin); + mDismissTargetContainer.setPadding(0, 0, 0, bottomMargin); + mDismissTargetContainer.setClipToPadding(false); mDismissTargetContainer.setClipChildren(false); - mDismissTargetContainer.addView(targetView); + mDismissTargetContainer.addView(mDismissTargetCircle); mDismissTargetContainer.setVisibility(View.INVISIBLE); + mDismissTargetContainer.setBackgroundResource( + R.drawable.floating_dismiss_gradient_transition); addView(mDismissTargetContainer); // Start translated down so the target springs up. - targetView.setTranslationY( + mDismissTargetCircle.setTranslationY( getResources().getDimensionPixelSize(R.dimen.floating_dismiss_gradient_height)); final ContentResolver contentResolver = getContext().getContentResolver(); @@ -776,7 +793,7 @@ public class BubbleStackView extends FrameLayout // Save the MagneticTarget instance for the newly set up view - we'll add this to the // MagnetizedObjects. - mMagneticTarget = new MagnetizedObject.MagneticTarget(targetView, dismissRadius); + mMagneticTarget = new MagnetizedObject.MagneticTarget(mDismissTargetCircle, dismissRadius); mExpandedViewXAnim = new SpringAnimation(mExpandedViewContainer, DynamicAnimation.TRANSLATION_X); @@ -892,7 +909,10 @@ public class BubbleStackView extends FrameLayout // Update the paint and apply it to the bubble container. mDesaturateAndDarkenPaint.setColorFilter(new ColorMatrixColorFilter(animatedMatrix)); - mDesaturateAndDarkenTargetView.setLayerPaint(mDesaturateAndDarkenPaint); + + if (mDesaturateAndDarkenTargetView != null) { + mDesaturateAndDarkenTargetView.setLayerPaint(mDesaturateAndDarkenPaint); + } }); // If the stack itself is touched, it means none of its touchable views (bubbles, flyouts, @@ -908,6 +928,38 @@ public class BubbleStackView extends FrameLayout return true; }); + + animate() + .setInterpolator(Interpolators.PANEL_CLOSE_ACCELERATED) + .setDuration(CollapsedStatusBarFragment.FADE_IN_DURATION); + } + + /** + * Sets whether or not the stack should become temporarily invisible by moving off the side of + * the screen. + * + * If a flyout comes in while it's invisible, it will animate back in while the flyout is + * showing but disappear again when the flyout is gone. + */ + public void setTemporarilyInvisible(boolean invisible) { + mTemporarilyInvisible = invisible; + animateTemporarilyInvisible(); + } + + /** + * Animates onto or off the screen depending on whether we're temporarily invisible, and whether + * a flyout is visible. + */ + private void animateTemporarilyInvisible() { + if (mTemporarilyInvisible && mFlyout.getVisibility() != View.VISIBLE) { + if (mStackAnimationController.isStackOnLeftSide()) { + animate().translationX(-mBubbleSize).start(); + } else { + animate().translationX(mBubbleSize).start(); + } + } else { + animate().translationX(0).start(); + } } private void setUpManageMenu() { @@ -1123,6 +1175,13 @@ public class BubbleStackView extends FrameLayout } mExpandedAnimationController.updateResources(mOrientation, mDisplaySize); mStackAnimationController.updateResources(mOrientation); + + final int targetSize = res.getDimensionPixelSize(R.dimen.dismiss_circle_size); + mDismissTargetCircle.getLayoutParams().width = targetSize; + mDismissTargetCircle.getLayoutParams().height = targetSize; + mDismissTargetCircle.requestLayout(); + + mMagneticTarget.setMagneticFieldRadiusPx(mBubbleSize * 2); } @Override @@ -1846,6 +1905,10 @@ public class BubbleStackView extends FrameLayout private void animateDesaturateAndDarken(View targetView, boolean desaturateAndDarken) { mDesaturateAndDarkenTargetView = targetView; + if (mDesaturateAndDarkenTargetView == null) { + return; + } + if (desaturateAndDarken) { // Use the animated paint for the bubbles. mDesaturateAndDarkenTargetView.setLayerType( @@ -1867,9 +1930,14 @@ public class BubbleStackView extends FrameLayout } private void resetDesaturationAndDarken() { + mDesaturateAndDarkenAnimator.removeAllListeners(); mDesaturateAndDarkenAnimator.cancel(); - mDesaturateAndDarkenTargetView.setLayerType(View.LAYER_TYPE_NONE, null); + + if (mDesaturateAndDarkenTargetView != null) { + mDesaturateAndDarkenTargetView.setLayerType(View.LAYER_TYPE_NONE, null); + mDesaturateAndDarkenTargetView = null; + } } /** Animates in the dismiss target. */ @@ -1884,6 +1952,9 @@ public class BubbleStackView extends FrameLayout mDismissTargetContainer.setZ(Short.MAX_VALUE - 1); mDismissTargetContainer.setVisibility(VISIBLE); + ((TransitionDrawable) mDismissTargetContainer.getBackground()).startTransition( + DISMISS_TRANSITION_DURATION_MS); + mDismissTargetAnimator.cancel(); mDismissTargetAnimator .spring(DynamicAnimation.TRANSLATION_Y, 0f, mDismissTargetSpring) @@ -1901,6 +1972,9 @@ public class BubbleStackView extends FrameLayout mShowingDismiss = false; + ((TransitionDrawable) mDismissTargetContainer.getBackground()).reverseTransition( + DISMISS_TRANSITION_DURATION_MS); + mDismissTargetAnimator .spring(DynamicAnimation.TRANSLATION_Y, mDismissTargetContainer.getHeight(), mDismissTargetSpring) @@ -1972,6 +2046,9 @@ public class BubbleStackView extends FrameLayout // Stop suppressing the dot now that the flyout has morphed into the dot. bubbleView.removeDotSuppressionFlag( BadgedImageView.SuppressionFlag.FLYOUT_VISIBLE); + + mFlyout.setVisibility(INVISIBLE); + animateTemporarilyInvisible(); }; mFlyout.setVisibility(INVISIBLE); @@ -1989,6 +2066,7 @@ public class BubbleStackView extends FrameLayout final Runnable expandFlyoutAfterDelay = () -> { mAnimateInFlyout = () -> { mFlyout.setVisibility(VISIBLE); + animateTemporarilyInvisible(); mFlyoutDragDeltaX = mStackAnimationController.isStackOnLeftSide() ? -mFlyout.getWidth() diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/storage/BubbleEntity.kt b/packages/SystemUI/src/com/android/systemui/bubbles/storage/BubbleEntity.kt index 43482616da2c..355c4b115c8d 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/storage/BubbleEntity.kt +++ b/packages/SystemUI/src/com/android/systemui/bubbles/storage/BubbleEntity.kt @@ -15,11 +15,14 @@ */ package com.android.systemui.bubbles.storage +import android.annotation.DimenRes import android.annotation.UserIdInt data class BubbleEntity( @UserIdInt val userId: Int, val packageName: String, val shortcutId: String, - val key: String + val key: String, + val desiredHeight: Int, + @DimenRes val desiredHeightResId: Int ) diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/storage/BubblePersistentRepository.kt b/packages/SystemUI/src/com/android/systemui/bubbles/storage/BubblePersistentRepository.kt index 7c3271e4b76c..5b4d8c71e5c0 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/storage/BubblePersistentRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/bubbles/storage/BubblePersistentRepository.kt @@ -54,6 +54,7 @@ class BubblePersistentRepository @Inject constructor( fun readFromDisk(): List<BubbleEntity> { synchronized(bubbleFile) { + if (!bubbleFile.exists()) return emptyList() try { return bubbleFile.openRead().use(::readXml) } catch (e: Throwable) { Log.e(TAG, "Failed to open bubble file", e) } diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/storage/BubbleXmlHelper.kt b/packages/SystemUI/src/com/android/systemui/bubbles/storage/BubbleXmlHelper.kt index 1df9f72022f0..a8faf258da07 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/storage/BubbleXmlHelper.kt +++ b/packages/SystemUI/src/com/android/systemui/bubbles/storage/BubbleXmlHelper.kt @@ -31,6 +31,8 @@ private const val ATTR_USER_ID = "uid" private const val ATTR_PACKAGE = "pkg" private const val ATTR_SHORTCUT_ID = "sid" private const val ATTR_KEY = "key" +private const val ATTR_DESIRED_HEIGHT = "h" +private const val ATTR_DESIRED_HEIGHT_RES_ID = "hid" /** * Writes the bubbles in xml format into given output stream. @@ -59,6 +61,8 @@ private fun writeXmlEntry(serializer: XmlSerializer, bubble: BubbleEntity) { serializer.attribute(null, ATTR_PACKAGE, bubble.packageName) serializer.attribute(null, ATTR_SHORTCUT_ID, bubble.shortcutId) serializer.attribute(null, ATTR_KEY, bubble.key) + serializer.attribute(null, ATTR_DESIRED_HEIGHT, bubble.desiredHeight.toString()) + serializer.attribute(null, ATTR_DESIRED_HEIGHT_RES_ID, bubble.desiredHeightResId.toString()) serializer.endTag(null, TAG_BUBBLE) } catch (e: IOException) { throw RuntimeException(e) @@ -86,7 +90,9 @@ private fun readXmlEntry(parser: XmlPullParser): BubbleEntity? { parser.getAttributeWithName(ATTR_USER_ID)?.toInt() ?: return null, parser.getAttributeWithName(ATTR_PACKAGE) ?: return null, parser.getAttributeWithName(ATTR_SHORTCUT_ID) ?: return null, - parser.getAttributeWithName(ATTR_KEY) ?: return null + parser.getAttributeWithName(ATTR_KEY) ?: return null, + parser.getAttributeWithName(ATTR_DESIRED_HEIGHT)?.toInt() ?: return null, + parser.getAttributeWithName(ATTR_DESIRED_HEIGHT_RES_ID)?.toInt() ?: return null ) } diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinator.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinator.kt index 3fab4c868314..429f67fdc706 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinator.kt @@ -55,6 +55,28 @@ interface ControlActionCoordinator { fun drag(isEdge: Boolean) /** + * Send a request to update the value of a device using the [FloatAction]. + * + * @param cvh [ControlViewHolder] for the control + * @param templateId id of the control's template, as given by the service + * @param newValue value to set for the device + */ + fun setValue(cvh: ControlViewHolder, templateId: String, newValue: Float) + + /** + * Actions may have been put on hold while the device is unlocked. Invoke this action if + * present. + */ + fun runPendingAction(controlId: String) + + /** + * User interaction with a control may be blocked for a period of time while actions are being + * executed by the application. When the response returns, run this method to enable further + * user interaction. + */ + fun enableActionOnTouch(controlId: String) + + /** * All long presses will be shown in a 3/4 height bottomsheet panel, in order for the user to * retain context with their favorited controls in the power menu. */ diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinatorImpl.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinatorImpl.kt index 2a40b76eb326..d2501fa8a66b 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinatorImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinatorImpl.kt @@ -21,11 +21,13 @@ import android.content.Context import android.content.Intent import android.content.pm.PackageManager import android.content.pm.ResolveInfo +import android.annotation.MainThread import android.os.Vibrator import android.os.VibrationEffect import android.service.controls.Control import android.service.controls.actions.BooleanAction import android.service.controls.actions.CommandAction +import android.service.controls.actions.FloatAction import android.util.Log import android.view.HapticFeedbackConstants import com.android.systemui.dagger.qualifiers.Main @@ -49,7 +51,12 @@ class ControlActionCoordinatorImpl @Inject constructor( ) : ControlActionCoordinator { private var dialog: Dialog? = null private val vibrator = context.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator - private var lastAction: (() -> Unit)? = null + private var pendingAction: Action? = null + private var actionsInProgress = mutableSetOf<String>() + + companion object { + private const val RESPONSE_TIMEOUT_IN_MILLIS = 3000L + } override fun closeDialogs() { dialog?.dismiss() @@ -57,54 +64,84 @@ class ControlActionCoordinatorImpl @Inject constructor( } override fun toggle(cvh: ControlViewHolder, templateId: String, isChecked: Boolean) { - bouncerOrRun { + bouncerOrRun(Action(cvh.cws.ci.controlId, { cvh.layout.performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK) cvh.action(BooleanAction(templateId, !isChecked)) - } + }, true /* blockable */)) } override fun touch(cvh: ControlViewHolder, templateId: String, control: Control) { - bouncerOrRun { + val blockable = cvh.usePanel() + bouncerOrRun(Action(cvh.cws.ci.controlId, { cvh.layout.performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK) if (cvh.usePanel()) { showDialog(cvh, control.getAppIntent().getIntent()) } else { cvh.action(CommandAction(templateId)) } - } + }, blockable)) } override fun drag(isEdge: Boolean) { - bouncerOrRun { - if (isEdge) { - vibrate(Vibrations.rangeEdgeEffect) - } else { - vibrate(Vibrations.rangeMiddleEffect) - } + if (isEdge) { + vibrate(Vibrations.rangeEdgeEffect) + } else { + vibrate(Vibrations.rangeMiddleEffect) } } + override fun setValue(cvh: ControlViewHolder, templateId: String, newValue: Float) { + bouncerOrRun(Action(cvh.cws.ci.controlId, { + cvh.action(FloatAction(templateId, newValue)) + }, true /* blockable */)) + } + override fun longPress(cvh: ControlViewHolder) { - bouncerOrRun { + bouncerOrRun(Action(cvh.cws.ci.controlId, { // Long press snould only be called when there is valid control state, otherwise ignore cvh.cws.control?.let { cvh.layout.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS) showDialog(cvh, it.getAppIntent().getIntent()) } + }, false /* blockable */)) + } + + override fun runPendingAction(controlId: String) { + if (pendingAction?.controlId == controlId) { + pendingAction?.invoke() + pendingAction = null } } - private fun bouncerOrRun(f: () -> Unit) { + @MainThread + override fun enableActionOnTouch(controlId: String) { + actionsInProgress.remove(controlId) + } + + private fun shouldRunAction(controlId: String) = + if (actionsInProgress.add(controlId)) { + uiExecutor.executeDelayed({ + actionsInProgress.remove(controlId) + }, RESPONSE_TIMEOUT_IN_MILLIS) + true + } else { + false + } + + private fun bouncerOrRun(action: Action) { if (!keyguardStateController.isUnlocked()) { context.sendBroadcast(Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) + + // pending actions will only run after the control state has been refreshed + pendingAction = action + activityStarter.dismissKeyguardThenExecute({ Log.d(ControlsUiController.TAG, "Device unlocked, invoking controls action") globalActionsComponent.handleShowGlobalActionsMenu() - f() true - }, null, true) + }, { pendingAction = null }, true /* afterKeyguardGone */) } else { - f() + action.invoke() } } @@ -133,4 +170,12 @@ class ControlActionCoordinatorImpl @Inject constructor( } } } + + inner class Action(val controlId: String, val f: () -> Unit, val blockable: Boolean) { + fun invoke() { + if (!blockable || shouldRunAction(controlId)) { + f.invoke() + } + } + } } diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt index f07f3168d246..9e7cf1ae6a42 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt @@ -118,6 +118,7 @@ class ControlViewHolder( var behavior: Behavior? = null var lastAction: ControlAction? = null var isLoading = false + var visibleDialog: Dialog? = null private var lastChallengeDialog: Dialog? = null private val onDialogCancel: () -> Unit = { lastChallengeDialog = null } @@ -155,6 +156,8 @@ class ControlViewHolder( controlActionCoordinator.longPress(this@ControlViewHolder) true }) + + controlActionCoordinator.runPendingAction(cws.ci.controlId) } isLoading = false @@ -163,6 +166,8 @@ class ControlViewHolder( } fun actionResponse(@ControlAction.ResponseResult response: Int) { + controlActionCoordinator.enableActionOnTouch(cws.ci.controlId) + // OK responses signal normal behavior, and the app will provide control updates val failedAttempt = lastChallengeDialog != null when (response) { @@ -197,18 +202,24 @@ class ControlViewHolder( fun dismiss() { lastChallengeDialog?.dismiss() lastChallengeDialog = null + visibleDialog?.dismiss() + visibleDialog = null } fun setTransientStatus(tempStatus: String) { val previousText = status.getText() cancelUpdate = uiExecutor.executeDelayed({ - setStatusText(previousText) - updateContentDescription() + animateStatusChange(/* animated */ true, { + setStatusText(previousText, /* immediately */ true) + updateContentDescription() + }) }, UPDATE_DELAY_IN_MILLIS) - setStatusText(tempStatus) - updateContentDescription() + animateStatusChange(/* animated */ true, { + setStatusText(tempStatus, /* immediately */ true) + updateContentDescription() + }) } private fun updateContentDescription() = diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/StatusBehavior.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/StatusBehavior.kt index bf3835dba4fd..6bf189744033 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/StatusBehavior.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/StatusBehavior.kt @@ -16,7 +16,13 @@ package com.android.systemui.controls.ui +import android.app.AlertDialog +import android.app.PendingIntent +import android.content.DialogInterface +import android.content.pm.PackageManager import android.service.controls.Control +import android.view.View +import android.view.WindowManager import com.android.systemui.R @@ -31,7 +37,17 @@ class StatusBehavior : Behavior { val status = cws.control?.status ?: Control.STATUS_UNKNOWN val msg = when (status) { Control.STATUS_ERROR -> R.string.controls_error_generic - Control.STATUS_NOT_FOUND -> R.string.controls_error_removed + Control.STATUS_DISABLED -> R.string.controls_error_timeout + Control.STATUS_NOT_FOUND -> { + cvh.layout.setOnClickListener(View.OnClickListener() { + showNotFoundDialog(cvh, cws) + }) + cvh.layout.setOnLongClickListener(View.OnLongClickListener() { + showNotFoundDialog(cvh, cws) + true + }) + R.string.controls_error_removed + } else -> { cvh.isLoading = true com.android.internal.R.string.loading @@ -40,4 +56,42 @@ class StatusBehavior : Behavior { cvh.setStatusText(cvh.context.getString(msg)) cvh.applyRenderInfo(false, colorOffset) } + + private fun showNotFoundDialog(cvh: ControlViewHolder, cws: ControlWithState) { + val pm = cvh.context.getPackageManager() + val ai = pm.getApplicationInfo(cws.componentName.packageName, PackageManager.GET_META_DATA) + val appLabel = pm.getApplicationLabel(ai) + val builder = AlertDialog.Builder( + cvh.context, + android.R.style.Theme_DeviceDefault_Dialog_Alert + ).apply { + val res = cvh.context.resources + setTitle(res.getString(R.string.controls_error_removed_title)) + setMessage(res.getString( + R.string.controls_error_removed_message, cvh.title.getText(), appLabel)) + setPositiveButton( + R.string.controls_open_app, + DialogInterface.OnClickListener { dialog, _ -> + try { + cws.control?.getAppIntent()?.send() + } catch (e: PendingIntent.CanceledException) { + cvh.setTransientStatus( + cvh.context.resources.getString(R.string.controls_error_failed)) + } + dialog.dismiss() + }) + setNegativeButton( + android.R.string.cancel, + DialogInterface.OnClickListener { dialog, _ -> + dialog.cancel() + } + ) + } + cvh.visibleDialog = builder.create().apply { + getWindow().apply { + setType(WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY) + show() + } + } + } } diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ToggleRangeBehavior.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ToggleRangeBehavior.kt index 4003f41b33dc..02f80e842516 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/ToggleRangeBehavior.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ToggleRangeBehavior.kt @@ -24,7 +24,6 @@ import android.graphics.drawable.Drawable import android.graphics.drawable.LayerDrawable import android.os.Bundle import android.service.controls.Control -import android.service.controls.actions.FloatAction import android.service.controls.templates.ControlTemplate import android.service.controls.templates.RangeTemplate import android.service.controls.templates.TemperatureControlTemplate @@ -293,8 +292,8 @@ class ToggleRangeBehavior : Behavior { cvh.setStatusTextSize(context.getResources() .getDimensionPixelSize(R.dimen.control_status_normal).toFloat()) cvh.setStatusText("$currentStatusText $currentRangeValue", /* immediately */ true) - cvh.action(FloatAction(rangeTemplate.getTemplateId(), - findNearestStep(levelToRangeValue(clipLayer.getLevel())))) + cvh.controlActionCoordinator.setValue(cvh, rangeTemplate.getTemplateId(), + findNearestStep(levelToRangeValue(clipLayer.getLevel()))) } fun findNearestStep(value: Float): Float { diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java index 7e009b459ede..5e5ebe92e559 100644 --- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java +++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java @@ -175,7 +175,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, private static final String GLOBAL_ACTION_KEY_SILENT = "silent"; private static final String GLOBAL_ACTION_KEY_USERS = "users"; private static final String GLOBAL_ACTION_KEY_SETTINGS = "settings"; - private static final String GLOBAL_ACTION_KEY_LOCKDOWN = "lockdown"; + static final String GLOBAL_ACTION_KEY_LOCKDOWN = "lockdown"; private static final String GLOBAL_ACTION_KEY_VOICEASSIST = "voiceassist"; private static final String GLOBAL_ACTION_KEY_ASSIST = "assist"; static final String GLOBAL_ACTION_KEY_RESTART = "restart"; @@ -213,7 +213,9 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, @VisibleForTesting protected final ArrayList<Action> mItems = new ArrayList<>(); @VisibleForTesting - final ArrayList<Action> mOverflowItems = new ArrayList<>(); + protected final ArrayList<Action> mOverflowItems = new ArrayList<>(); + @VisibleForTesting + protected final ArrayList<Action> mPowerItems = new ArrayList<>(); @VisibleForTesting protected ActionsDialog mDialog; @@ -223,6 +225,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, private MyAdapter mAdapter; private MyOverflowAdapter mOverflowAdapter; + private MyPowerOptionsAdapter mPowerAdapter; private boolean mKeyguardShowing = false; private boolean mDeviceProvisioned = false; @@ -584,14 +587,19 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, mItems.clear(); mOverflowItems.clear(); - + mPowerItems.clear(); String[] defaultActions = getDefaultActions(); + + ShutDownAction shutdownAction = new ShutDownAction(); + RestartAction restartAction = new RestartAction(); + ArraySet<String> addedKeys = new ArraySet<String>(); + // make sure emergency affordance action is first, if needed if (mEmergencyAffordanceManager.needsEmergencyAffordance()) { addActionItem(new EmergencyAffordanceAction()); + addedKeys.add(GLOBAL_ACTION_KEY_EMERGENCY); } - ArraySet<String> addedKeys = new ArraySet<String>(); for (int i = 0; i < defaultActions.length; i++) { String actionKey = defaultActions[i]; if (addedKeys.contains(actionKey)) { @@ -599,7 +607,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, continue; } if (GLOBAL_ACTION_KEY_POWER.equals(actionKey)) { - addActionItem(new PowerAction()); + addActionItem(shutdownAction); } else if (GLOBAL_ACTION_KEY_AIRPLANE.equals(actionKey)) { addActionItem(mAirplaneModeOn); } else if (GLOBAL_ACTION_KEY_BUGREPORT.equals(actionKey)) { @@ -618,10 +626,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, } else if (GLOBAL_ACTION_KEY_SETTINGS.equals(actionKey)) { addActionItem(getSettingsAction()); } else if (GLOBAL_ACTION_KEY_LOCKDOWN.equals(actionKey)) { - int userId = getCurrentUser().id; - if (Settings.Secure.getIntForUser(mContentResolver, - Settings.Secure.LOCKDOWN_IN_POWER_MENU, 0, userId) != 0 - && shouldDisplayLockdown(userId)) { + if (shouldDisplayLockdown(getCurrentUser())) { addActionItem(getLockdownAction()); } } else if (GLOBAL_ACTION_KEY_VOICEASSIST.equals(actionKey)) { @@ -629,7 +634,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, } else if (GLOBAL_ACTION_KEY_ASSIST.equals(actionKey)) { addActionItem(getAssistAction()); } else if (GLOBAL_ACTION_KEY_RESTART.equals(actionKey)) { - addActionItem(new RestartAction()); + addActionItem(restartAction); } else if (GLOBAL_ACTION_KEY_SCREENSHOT.equals(actionKey)) { addActionItem(new ScreenshotAction()); } else if (GLOBAL_ACTION_KEY_LOGOUT.equals(actionKey)) { @@ -638,15 +643,32 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, addActionItem(new LogoutAction()); } } else if (GLOBAL_ACTION_KEY_EMERGENCY.equals(actionKey)) { - if (!mEmergencyAffordanceManager.needsEmergencyAffordance()) { - addActionItem(new EmergencyDialerAction()); - } + addActionItem(new EmergencyDialerAction()); } else { Log.e(TAG, "Invalid global action key " + actionKey); } // Add here so we don't add more than one. addedKeys.add(actionKey); } + + // replace power and restart with a single power options action, if needed + if (mItems.contains(shutdownAction) && mItems.contains(restartAction) + && mOverflowItems.size() > 0) { + // transfer shutdown and restart to their own list of power actions + mItems.remove(shutdownAction); + mItems.remove(restartAction); + mPowerItems.add(shutdownAction); + mPowerItems.add(restartAction); + + // add the PowerOptionsAction after Emergency, if present + int powerIndex = addedKeys.contains(GLOBAL_ACTION_KEY_EMERGENCY) ? 1 : 0; + mItems.add(powerIndex, new PowerOptionsAction()); + + // transfer the first overflow action to the main set of items + Action firstOverflowAction = mOverflowItems.get(0); + mOverflowItems.remove(0); + mItems.add(firstOverflowAction); + } } private void onRotate() { @@ -664,6 +686,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, mAdapter = new MyAdapter(); mOverflowAdapter = new MyOverflowAdapter(); + mPowerAdapter = new MyPowerOptionsAdapter(); mDepthController.setShowingHomeControls(true); GlobalActionsPanelPlugin.PanelViewController walletViewController = @@ -676,7 +699,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, walletViewController, mDepthController, mSysuiColorExtractor, mStatusBarService, mNotificationShadeWindowController, controlsAvailable(), uiController, - mSysUiState, this::onRotate, mKeyguardShowing); + mSysUiState, this::onRotate, mKeyguardShowing, mPowerAdapter); boolean walletViewAvailable = walletViewController != null && walletViewController.getPanelContent() != null; if (shouldShowLockMessage(walletViewAvailable)) { @@ -689,7 +712,20 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, return dialog; } - private boolean shouldDisplayLockdown(int userId) { + @VisibleForTesting + protected boolean shouldDisplayLockdown(UserInfo user) { + if (user == null) { + return false; + } + + int userId = user.id; + + // No lockdown option if it's not turned on in Settings + if (Settings.Secure.getIntForUser(mContentResolver, + Settings.Secure.LOCKDOWN_IN_POWER_MENU, 0, userId) == 0) { + return false; + } + // Lockdown is meaningless without a place to go. if (!mKeyguardStateController.isMethodSecure()) { return false; @@ -740,8 +776,32 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, mActivityStarter.startPendingIntentDismissingKeyguard(pendingIntent); } - private final class PowerAction extends SinglePressAction implements LongPressAction { - private PowerAction() { + @VisibleForTesting + protected final class PowerOptionsAction extends SinglePressAction { + private PowerOptionsAction() { + super(R.drawable.ic_lock_power_off, R.string.global_action_power_options); + } + + @Override + public boolean showDuringKeyguard() { + return true; + } + + @Override + public boolean showBeforeProvisioning() { + return true; + } + + @Override + public void onPress() { + if (mDialog != null) { + mDialog.showPowerOptionsMenu(); + } + } + } + + private final class ShutDownAction extends SinglePressAction implements LongPressAction { + private ShutDownAction() { super(R.drawable.ic_lock_power_off, R.string.global_action_power_off); } @@ -772,7 +832,8 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, } } - private abstract class EmergencyAction extends SinglePressAction { + @VisibleForTesting + protected abstract class EmergencyAction extends SinglePressAction { EmergencyAction(int iconResId, int messageResId) { super(iconResId, messageResId); } @@ -1317,7 +1378,10 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, Action item = mAdapter.getItem(position); if (!(item instanceof SilentModeTriStateAction)) { if (mDialog != null) { - mDialog.dismiss(); + // don't dismiss the dialog if we're opening the power options menu + if (!(item instanceof PowerOptionsAction)) { + mDialog.dismiss(); + } } else { Log.w(TAG, "Action clicked while mDialog is null."); } @@ -1334,6 +1398,70 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, /** * The adapter used for items in the overflow menu. */ + public class MyPowerOptionsAdapter extends BaseAdapter { + @Override + public int getCount() { + return mPowerItems.size(); + } + + @Override + public Action getItem(int position) { + return mPowerItems.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + Action action = getItem(position); + if (action == null) { + Log.w(TAG, "No power options action found at position: " + position); + return null; + } + int viewLayoutResource = com.android.systemui.R.layout.controls_more_item; + View view = convertView != null ? convertView + : LayoutInflater.from(mContext).inflate(viewLayoutResource, parent, false); + TextView textView = (TextView) view; + if (action.getMessageResId() != 0) { + textView.setText(action.getMessageResId()); + } else { + textView.setText(action.getMessage()); + } + return textView; + } + + private boolean onLongClickItem(int position) { + final Action action = getItem(position); + if (action instanceof LongPressAction) { + if (mDialog != null) { + mDialog.dismiss(); + } else { + Log.w(TAG, "Action long-clicked while mDialog is null."); + } + return ((LongPressAction) action).onLongPress(); + } + return false; + } + + private void onClickItem(int position) { + Action item = getItem(position); + if (!(item instanceof SilentModeTriStateAction)) { + if (mDialog != null) { + mDialog.dismiss(); + } else { + Log.w(TAG, "Action clicked while mDialog is null."); + } + item.onPress(); + } + } + } + + /** + * The adapter used for items in the power options menu, triggered by the PowerOptionsAction. + */ public class MyOverflowAdapter extends BaseAdapter { @Override public int getCount() { @@ -1373,7 +1501,6 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, final Action action = getItem(position); if (action instanceof LongPressAction) { if (mDialog != null) { - mDialog.hidePowerOverflowMenu(); mDialog.dismiss(); } else { Log.w(TAG, "Action long-clicked while mDialog is null."); @@ -1387,7 +1514,6 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, Action item = getItem(position); if (!(item instanceof SilentModeTriStateAction)) { if (mDialog != null) { - mDialog.hidePowerOverflowMenu(); mDialog.dismiss(); } else { Log.w(TAG, "Action clicked while mDialog is null."); @@ -1495,7 +1621,6 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, } } - public int getMessageResId() { return mMessageResId; } @@ -1846,6 +1971,8 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, mAirplaneState = inAirplaneMode ? ToggleState.On : ToggleState.Off; mAirplaneModeOn.updateState(mAirplaneState); mAdapter.notifyDataSetChanged(); + mOverflowAdapter.notifyDataSetChanged(); + mPowerAdapter.notifyDataSetChanged(); } }; @@ -1928,6 +2055,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, private final Context mContext; private final MyAdapter mAdapter; private final MyOverflowAdapter mOverflowAdapter; + private final MyPowerOptionsAdapter mPowerOptionsAdapter; private final IStatusBarService mStatusBarService; private final IBinder mToken = new Binder(); private MultiListLayout mGlobalActionsLayout; @@ -1943,6 +2071,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, private final NotificationShadeDepthController mDepthController; private final SysUiState mSysUiState; private ListPopupWindow mOverflowPopup; + private ListPopupWindow mPowerOptionsPopup; private final Runnable mOnRotateCallback; private final boolean mControlsAvailable; @@ -1958,11 +2087,13 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, SysuiColorExtractor sysuiColorExtractor, IStatusBarService statusBarService, NotificationShadeWindowController notificationShadeWindowController, boolean controlsAvailable, @Nullable ControlsUiController controlsUiController, - SysUiState sysuiState, Runnable onRotateCallback, boolean keyguardShowing) { + SysUiState sysuiState, Runnable onRotateCallback, boolean keyguardShowing, + MyPowerOptionsAdapter powerAdapter) { super(context, com.android.systemui.R.style.Theme_SystemUI_Dialog_GlobalActions); mContext = context; mAdapter = adapter; mOverflowAdapter = overflowAdapter; + mPowerOptionsAdapter = powerAdapter; mDepthController = depthController; mColorExtractor = sysuiColorExtractor; mStatusBarService = statusBarService; @@ -2076,6 +2207,21 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, } } + private ListPopupWindow createPowerOptionsPopup() { + GlobalActionsPopupMenu popup = new GlobalActionsPopupMenu( + new ContextThemeWrapper( + mContext, + com.android.systemui.R.style.Control_ListPopupWindow + ), false /* isDropDownMode */); + popup.setOnItemClickListener( + (parent, view, position, id) -> mPowerOptionsAdapter.onClickItem(position)); + popup.setOnItemLongClickListener( + (parent, view, position, id) -> mPowerOptionsAdapter.onLongClickItem(position)); + popup.setAnchorView(mGlobalActionsLayout); + popup.setAdapter(mPowerOptionsAdapter); + return popup; + } + private ListPopupWindow createPowerOverflowPopup() { GlobalActionsPopupMenu popup = new GlobalActionsPopupMenu( new ContextThemeWrapper( @@ -2093,16 +2239,16 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, return popup; } + public void showPowerOptionsMenu() { + mPowerOptionsPopup = createPowerOptionsPopup(); + mPowerOptionsPopup.show(); + } + private void showPowerOverflowMenu() { mOverflowPopup = createPowerOverflowPopup(); mOverflowPopup.show(); } - private void hidePowerOverflowMenu() { - mOverflowPopup.dismiss(); - mOverflowPopup = null; - } - private void initializeLayout() { setContentView(com.android.systemui.R.layout.global_actions_grid_v2); fixNavBarClipping(); @@ -2278,6 +2424,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, // close first, as popup windows will not fade during the animation dismissOverflow(false); + dismissPowerOptions(false); if (mControlsUiController != null) mControlsUiController.closeDialogs(false); }); } @@ -2302,6 +2449,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, resetOrientation(); dismissWallet(); dismissOverflow(true); + dismissPowerOptions(true); if (mControlsUiController != null) mControlsUiController.hide(); mNotificationShadeWindowController.setForceHasTopUi(mHadTopUi); mDepthController.updateGlobalDialogVisibility(0, null /* view */); @@ -2326,6 +2474,16 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, } } + private void dismissPowerOptions(boolean immediate) { + if (mPowerOptionsPopup != null) { + if (immediate) { + mPowerOptionsPopup.dismissImmediate(); + } else { + mPowerOptionsPopup.dismiss(); + } + } + } + private void setRotationSuggestionsEnabled(boolean enabled) { try { final int userId = Binder.getCallingUserHandle().getIdentifier(); @@ -2369,6 +2527,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, // ensure dropdown menus are dismissed before re-initializing the dialog dismissWallet(); dismissOverflow(true); + dismissPowerOptions(true); if (mControlsUiController != null) { mControlsUiController.hide(); } diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java index 5595201a670f..f039fc2d84ae 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java +++ b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java @@ -17,12 +17,8 @@ package com.android.systemui.media; import android.app.PendingIntent; -import android.content.ComponentName; import android.content.Context; import android.content.Intent; -import android.content.SharedPreferences; -import android.content.pm.PackageManager; -import android.content.pm.ResolveInfo; import android.content.res.ColorStateList; import android.graphics.Bitmap; import android.graphics.Canvas; @@ -35,7 +31,6 @@ import android.graphics.drawable.RippleDrawable; import android.media.session.MediaController; import android.media.session.MediaSession; import android.media.session.PlaybackState; -import android.service.media.MediaBrowserService; import android.util.Log; import android.view.View; import android.widget.ImageButton; @@ -54,16 +49,17 @@ import com.android.settingslib.Utils; import com.android.settingslib.media.MediaOutputSliceConstants; import com.android.settingslib.widget.AdaptiveIcon; import com.android.systemui.R; +import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.plugins.ActivityStarter; -import com.android.systemui.qs.QSMediaBrowser; import com.android.systemui.util.animation.TransitionLayout; -import com.android.systemui.util.concurrency.DelayableExecutor; import org.jetbrains.annotations.NotNull; import java.util.List; import java.util.concurrent.Executor; +import javax.inject.Inject; + /** * A view controller used for Media Playback. */ @@ -81,7 +77,6 @@ public class MediaControlPanel { private final SeekBarViewModel mSeekBarViewModel; private SeekBarObserver mSeekBarObserver; - private final Executor mForegroundExecutor; protected final Executor mBackgroundExecutor; private final ActivityStarter mActivityStarter; @@ -91,51 +86,23 @@ public class MediaControlPanel { private MediaSession.Token mToken; private MediaController mController; private int mBackgroundColor; - protected ComponentName mServiceComponent; - private boolean mIsRegistered = false; - private String mKey; private int mAlbumArtSize; private int mAlbumArtRadius; - private int mViewWidth; - - public static final String MEDIA_PREFERENCES = "media_control_prefs"; - public static final String MEDIA_PREFERENCE_KEY = "browser_components"; - private SharedPreferences mSharedPrefs; - private boolean mCheckedForResumption = false; - private QSMediaBrowser mQSMediaBrowser; - - private final MediaController.Callback mSessionCallback = new MediaController.Callback() { - @Override - public void onSessionDestroyed() { - Log.d(TAG, "session destroyed"); - mController.unregisterCallback(mSessionCallback); - clearControls(); - } - @Override - public void onPlaybackStateChanged(PlaybackState state) { - final int s = state != null ? state.getState() : PlaybackState.STATE_NONE; - if (s == PlaybackState.STATE_NONE) { - Log.d(TAG, "playback state change will trigger resumption, state=" + state); - clearControls(); - } - } - }; /** * Initialize a new control panel * @param context - * @param foregroundExecutor foreground executor * @param backgroundExecutor background executor, used for processing artwork * @param activityStarter activity starter */ - public MediaControlPanel(Context context, Executor foregroundExecutor, - DelayableExecutor backgroundExecutor, ActivityStarter activityStarter, - MediaHostStatesManager mediaHostStatesManager) { + @Inject + public MediaControlPanel(Context context, @Background Executor backgroundExecutor, + ActivityStarter activityStarter, MediaHostStatesManager mediaHostStatesManager, + SeekBarViewModel seekBarViewModel) { mContext = context; - mForegroundExecutor = foregroundExecutor; mBackgroundExecutor = backgroundExecutor; mActivityStarter = activityStarter; - mSeekBarViewModel = new SeekBarViewModel(backgroundExecutor); + mSeekBarViewModel = seekBarViewModel; mMediaViewController = new MediaViewController(context, mediaHostStatesManager); loadDimens(); } @@ -214,45 +181,18 @@ public class MediaControlPanel { MediaSession.Token token = data.getToken(); mBackgroundColor = data.getBackgroundColor(); if (mToken == null || !mToken.equals(token)) { - if (mQSMediaBrowser != null) { - Log.d(TAG, "Disconnecting old media browser"); - mQSMediaBrowser.disconnect(); - mQSMediaBrowser = null; - } mToken = token; - mServiceComponent = null; - mCheckedForResumption = false; } - mController = new MediaController(mContext, mToken); + if (mToken != null) { + mController = new MediaController(mContext, mToken); + } else { + mController = null; + } ConstraintSet expandedSet = mMediaViewController.getExpandedLayout(); ConstraintSet collapsedSet = mMediaViewController.getCollapsedLayout(); - // Try to find a browser service component for this app - // TODO also check for a media button receiver intended for restarting (b/154127084) - // Only check if we haven't tried yet or the session token changed - final String pkgName = data.getPackageName(); - if (mServiceComponent == null && !mCheckedForResumption) { - Log.d(TAG, "Checking for service component"); - PackageManager pm = mContext.getPackageManager(); - Intent resumeIntent = new Intent(MediaBrowserService.SERVICE_INTERFACE); - List<ResolveInfo> resumeInfo = pm.queryIntentServices(resumeIntent, 0); - // TODO: look into this resumption - if (resumeInfo != null) { - for (ResolveInfo inf : resumeInfo) { - if (inf.serviceInfo.packageName.equals(mController.getPackageName())) { - mBackgroundExecutor.execute(() -> - tryUpdateResumptionList(inf.getComponentInfo().getComponentName())); - break; - } - } - } - mCheckedForResumption = true; - } - - mController.registerCallback(mSessionCallback); - mViewHolder.getPlayer().setBackgroundTintList( ColorStateList.valueOf(mBackgroundColor)); @@ -267,12 +207,22 @@ public class MediaControlPanel { ImageView albumView = mViewHolder.getAlbumView(); // TODO: migrate this to a view with rounded corners instead of baking the rounding // into the bitmap - Drawable artwork = createRoundedBitmap(data.getArtwork()); - albumView.setImageDrawable(artwork); + boolean hasArtwork = data.getArtwork() != null; + if (hasArtwork) { + Drawable artwork = createRoundedBitmap(data.getArtwork()); + albumView.setImageDrawable(artwork); + } + setVisibleAndAlpha(collapsedSet, R.id.album_art, hasArtwork); + setVisibleAndAlpha(expandedSet, R.id.album_art, hasArtwork); // App icon ImageView appIcon = mViewHolder.getAppIcon(); - appIcon.setImageDrawable(data.getAppIcon()); + if (data.getAppIcon() != null) { + appIcon.setImageDrawable(data.getAppIcon()); + } else { + Drawable iconDrawable = mContext.getDrawable(R.drawable.ic_music_note); + appIcon.setImageDrawable(iconDrawable); + } // Song name TextView titleText = mViewHolder.getTitleText(); @@ -294,7 +244,7 @@ public class MediaControlPanel { final Intent intent = new Intent() .setAction(MediaOutputSliceConstants.ACTION_MEDIA_OUTPUT) .putExtra(MediaOutputSliceConstants.EXTRA_PACKAGE_NAME, - mController.getPackageName()) + data.getPackageName()) .putExtra(MediaOutputSliceConstants.KEY_MEDIA_SESSION_TOKEN, mToken); mActivityStarter.startActivity(intent, false, true /* dismissShade */, Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); @@ -350,15 +300,11 @@ public class MediaControlPanel { MediaAction mediaAction = actionIcons.get(i); button.setImageDrawable(mediaAction.getDrawable()); button.setContentDescription(mediaAction.getContentDescription()); - PendingIntent actionIntent = mediaAction.getIntent(); + Runnable action = mediaAction.getAction(); button.setOnClickListener(v -> { - if (actionIntent != null) { - try { - actionIntent.send(); - } catch (PendingIntent.CanceledException e) { - e.printStackTrace(); - } + if (action != null) { + action.run(); } }); boolean visibleInCompat = actionsWhenCollapsed.contains(i); @@ -444,14 +390,6 @@ public class MediaControlPanel { } /** - * Return the original notification's key - * @return The notification key - */ - public String getKey() { - return mKey; - } - - /** * Check whether this player has an attached media session. * @return whether there is a controller with a current media session. */ @@ -485,150 +423,8 @@ public class MediaControlPanel { return (state.getState() == PlaybackState.STATE_PLAYING); } - /** - * Puts controls into a resumption state if possible, or calls removePlayer if no component was - * found that could resume playback - */ - public void clearControls() { - Log.d(TAG, "clearControls to resumption state package=" + getMediaPlayerPackage()); - if (mServiceComponent == null) { - // If we don't have a way to resume, just remove the player altogether - Log.d(TAG, "Removing unresumable controls"); - removePlayer(); - return; - } - resetButtons(); - } - - /** - * Hide the media buttons and show only a restart button - */ - protected void resetButtons() { - if (mViewHolder == null) { - return; - } - // Hide all the old buttons - - ConstraintSet expandedSet = mMediaViewController.getExpandedLayout(); - ConstraintSet collapsedSet = mMediaViewController.getCollapsedLayout(); - for (int i = 1; i < ACTION_IDS.length; i++) { - setVisibleAndAlpha(expandedSet, ACTION_IDS[i], false /*visible */); - setVisibleAndAlpha(collapsedSet, ACTION_IDS[i], false /*visible */); - } - - // Add a restart button - ImageButton btn = mViewHolder.getAction0(); - btn.setOnClickListener(v -> { - Log.d(TAG, "Attempting to restart session"); - if (mQSMediaBrowser != null) { - mQSMediaBrowser.disconnect(); - } - mQSMediaBrowser = new QSMediaBrowser(mContext, new QSMediaBrowser.Callback(){ - @Override - public void onConnected() { - Log.d(TAG, "Successfully restarted"); - } - @Override - public void onError() { - Log.e(TAG, "Error restarting"); - mQSMediaBrowser.disconnect(); - mQSMediaBrowser = null; - } - }, mServiceComponent); - mQSMediaBrowser.restart(); - }); - btn.setImageDrawable(mContext.getResources().getDrawable(R.drawable.lb_ic_play)); - setVisibleAndAlpha(expandedSet, ACTION_IDS[0], true /*visible */); - setVisibleAndAlpha(collapsedSet, ACTION_IDS[0], true /*visible */); - - mSeekBarViewModel.clearController(); - // TODO: fix guts - // View guts = mMediaNotifView.findViewById(R.id.media_guts); - View options = mViewHolder.getOptions(); - - mViewHolder.getPlayer().setOnLongClickListener(v -> { - // Replace player view with close/cancel view -// guts.setVisibility(View.GONE); - options.setVisibility(View.VISIBLE); - return true; // consumed click - }); - mMediaViewController.refreshState(); - } - private void setVisibleAndAlpha(ConstraintSet set, int actionId, boolean visible) { set.setVisibility(actionId, visible? ConstraintSet.VISIBLE : ConstraintSet.GONE); set.setAlpha(actionId, visible ? 1.0f : 0.0f); } - - /** - * Verify that we can connect to the given component with a MediaBrowser, and if so, add that - * component to the list of resumption components - */ - private void tryUpdateResumptionList(ComponentName componentName) { - Log.d(TAG, "Testing if we can connect to " + componentName); - if (mQSMediaBrowser != null) { - mQSMediaBrowser.disconnect(); - } - mQSMediaBrowser = new QSMediaBrowser(mContext, - new QSMediaBrowser.Callback() { - @Override - public void onConnected() { - Log.d(TAG, "yes we can resume with " + componentName); - mServiceComponent = componentName; - updateResumptionList(componentName); - mQSMediaBrowser.disconnect(); - mQSMediaBrowser = null; - } - - @Override - public void onError() { - Log.d(TAG, "Cannot resume with " + componentName); - mServiceComponent = null; - if (!hasMediaSession()) { - // If it's not active and we can't resume, remove - removePlayer(); - } - mQSMediaBrowser.disconnect(); - mQSMediaBrowser = null; - } - }, - componentName); - mQSMediaBrowser.testConnection(); - } - - /** - * Add the component to the saved list of media browser services, checking for duplicates and - * removing older components that exceed the maximum limit - * @param componentName - */ - private synchronized void updateResumptionList(ComponentName componentName) { - // Add to front of saved list - if (mSharedPrefs == null) { - mSharedPrefs = mContext.getSharedPreferences(MEDIA_PREFERENCES, 0); - } - String componentString = componentName.flattenToString(); - String listString = mSharedPrefs.getString(MEDIA_PREFERENCE_KEY, null); - if (listString == null) { - listString = componentString; - } else { - String[] components = listString.split(QSMediaBrowser.DELIMITER); - StringBuilder updated = new StringBuilder(componentString); - int nBrowsers = 1; - for (int i = 0; i < components.length - && nBrowsers < QSMediaBrowser.MAX_RESUMPTION_CONTROLS; i++) { - if (componentString.equals(components[i])) { - continue; - } - updated.append(QSMediaBrowser.DELIMITER).append(components[i]); - nBrowsers++; - } - listString = updated.toString(); - } - mSharedPrefs.edit().putString(MEDIA_PREFERENCE_KEY, listString).apply(); - } - - /** - * Called when a player can't be resumed to give it an opportunity to hide or remove itself - */ - protected void removePlayer() { } } diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaData.kt b/packages/SystemUI/src/com/android/systemui/media/MediaData.kt index a94f6a87d58a..5d28178a3b1b 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaData.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaData.kt @@ -32,17 +32,19 @@ data class MediaData( val artwork: Icon?, val actions: List<MediaAction>, val actionsToShowInCompact: List<Int>, - val packageName: String?, + val packageName: String, val token: MediaSession.Token?, val clickIntent: PendingIntent?, val device: MediaDeviceData?, - val notificationKey: String = "INVALID" + var resumeAction: Runnable?, + val notificationKey: String = "INVALID", + var hasCheckedForResume: Boolean = false ) /** State of a media action. */ data class MediaAction( val drawable: Drawable?, - val intent: PendingIntent?, + val action: Runnable?, val contentDescription: CharSequence? ) diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaDataCombineLatest.kt b/packages/SystemUI/src/com/android/systemui/media/MediaDataCombineLatest.kt index 67cf21ae10b9..11cbc482459a 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaDataCombineLatest.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaDataCombineLatest.kt @@ -32,9 +32,15 @@ class MediaDataCombineLatest @Inject constructor( init { dataSource.addListener(object : MediaDataManager.Listener { - override fun onMediaDataLoaded(key: String, data: MediaData) { - entries[key] = data to entries[key]?.second - update(key) + override fun onMediaDataLoaded(key: String, oldKey: String?, data: MediaData) { + if (oldKey != null && !oldKey.equals(key)) { + val s = entries[oldKey]?.second + entries[key] = data to entries[oldKey]?.second + entries.remove(oldKey) + } else { + entries[key] = data to entries[key]?.second + } + update(key, oldKey) } override fun onMediaDataRemoved(key: String) { remove(key) @@ -43,7 +49,7 @@ class MediaDataCombineLatest @Inject constructor( deviceSource.addListener(object : MediaDeviceManager.Listener { override fun onMediaDeviceChanged(key: String, data: MediaDeviceData?) { entries[key] = entries[key]?.first to data - update(key) + update(key, key) } override fun onKeyRemoved(key: String) { remove(key) @@ -61,13 +67,13 @@ class MediaDataCombineLatest @Inject constructor( */ fun removeListener(listener: MediaDataManager.Listener) = listeners.remove(listener) - private fun update(key: String) { + private fun update(key: String, oldKey: String?) { val (entry, device) = entries[key] ?: null to null if (entry != null && device != null) { val data = entry.copy(device = device) val listenersCopy = listeners.toSet() listenersCopy.forEach { - it.onMediaDataLoaded(key, data) + it.onMediaDataLoaded(key, oldKey, data) } } } diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt b/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt index d94985703083..094c5bef3c18 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt @@ -17,6 +17,7 @@ package com.android.systemui.media import android.app.Notification +import android.app.PendingIntent import android.content.ContentResolver import android.content.Context import android.graphics.Bitmap @@ -25,6 +26,7 @@ import android.graphics.Color import android.graphics.ImageDecoder import android.graphics.drawable.Drawable import android.graphics.drawable.Icon +import android.media.MediaDescription import android.media.MediaMetadata import android.media.session.MediaSession import android.net.Uri @@ -32,8 +34,10 @@ import android.service.notification.StatusBarNotification import android.text.TextUtils import android.util.Log import com.android.internal.graphics.ColorUtils +import com.android.systemui.R import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.dagger.qualifiers.Main +import com.android.systemui.statusbar.NotificationMediaManager import com.android.systemui.statusbar.notification.MediaNotificationProcessor import com.android.systemui.statusbar.notification.NotificationEntryManager import com.android.systemui.statusbar.notification.NotificationEntryManager.UNDEFINED_DISMISS_REASON @@ -58,7 +62,7 @@ private const val LUMINOSITY_THRESHOLD = 0.05f private const val SATURATION_MULTIPLIER = 0.8f private val LOADING = MediaData(false, 0, null, null, null, null, null, - emptyList(), emptyList(), null, null, null, null) + emptyList(), emptyList(), "INVALID", null, null, null, null) fun isMediaNotification(sbn: StatusBarNotification): Boolean { if (!sbn.notification.hasMediaSession()) { @@ -81,34 +85,92 @@ class MediaDataManager @Inject constructor( private val mediaControllerFactory: MediaControllerFactory, private val mediaTimeoutListener: MediaTimeoutListener, private val notificationEntryManager: NotificationEntryManager, + private val mediaResumeListener: MediaResumeListener, @Background private val backgroundExecutor: Executor, @Main private val foregroundExecutor: Executor ) { private val listeners: MutableSet<Listener> = mutableSetOf() private val mediaEntries: LinkedHashMap<String, MediaData> = LinkedHashMap() + private val useMediaResumption: Boolean = Utils.useMediaResumption(context) init { mediaTimeoutListener.timeoutCallback = { token: String, timedOut: Boolean -> setTimedOut(token, timedOut) } addListener(mediaTimeoutListener) + + if (useMediaResumption) { + mediaResumeListener.addTrackToResumeCallback = { desc: MediaDescription, + resumeAction: Runnable, token: MediaSession.Token, appName: String, + appIntent: PendingIntent, packageName: String -> + addResumptionControls(desc, resumeAction, token, appName, appIntent, packageName) + } + mediaResumeListener.resumeComponentFoundCallback = { key: String, action: Runnable? -> + mediaEntries.get(key)?.resumeAction = action + mediaEntries.get(key)?.hasCheckedForResume = true + } + addListener(mediaResumeListener) + } } fun onNotificationAdded(key: String, sbn: StatusBarNotification) { if (Utils.useQsMediaPlayer(context) && isMediaNotification(sbn)) { Assert.isMainThread() - if (!mediaEntries.containsKey(key)) { - mediaEntries.put(key, LOADING) + val oldKey = findExistingEntry(key, sbn.packageName) + if (oldKey == null) { + val temp = LOADING.copy(packageName = sbn.packageName) + mediaEntries.put(key, temp) + } else if (oldKey != key) { + // Move to new key + val oldData = mediaEntries.remove(oldKey)!! + mediaEntries.put(key, oldData) } - loadMediaData(key, sbn) + loadMediaData(key, sbn, oldKey) } else { onNotificationRemoved(key) } } - private fun loadMediaData(key: String, sbn: StatusBarNotification) { + private fun addResumptionControls( + desc: MediaDescription, + action: Runnable, + token: MediaSession.Token, + appName: String, + appIntent: PendingIntent, + packageName: String + ) { + // Resume controls don't have a notification key, so store by package name instead + if (!mediaEntries.containsKey(packageName)) { + val resumeData = LOADING.copy(packageName = packageName, resumeAction = action) + mediaEntries.put(packageName, resumeData) + } backgroundExecutor.execute { - loadMediaDataInBg(key, sbn) + loadMediaDataInBg(desc, action, token, appName, appIntent, packageName) + } + } + + /** + * Check if there is an existing entry that matches the key or package name. + * Returns the key that matches, or null if not found. + */ + private fun findExistingEntry(key: String, packageName: String): String? { + if (mediaEntries.containsKey(key)) { + return key + } + // Check if we already had a resume player + if (mediaEntries.containsKey(packageName)) { + return packageName + } + return null + } + + private fun loadMediaData( + key: String, + sbn: StatusBarNotification, + oldKey: String? + ) { + backgroundExecutor.execute { + loadMediaDataInBg(key, sbn, oldKey) } } @@ -132,7 +194,50 @@ class MediaDataManager @Inject constructor( } } - private fun loadMediaDataInBg(key: String, sbn: StatusBarNotification) { + private fun loadMediaDataInBg( + desc: MediaDescription, + resumeAction: Runnable, + token: MediaSession.Token, + appName: String, + appIntent: PendingIntent, + packageName: String + ) { + if (resumeAction == null) { + Log.e(TAG, "Resume action cannot be null") + return + } + + if (TextUtils.isEmpty(desc.title)) { + Log.e(TAG, "Description incomplete") + return + } + + Log.d(TAG, "adding track from browser: $desc") + + // Album art + var artworkBitmap = desc.iconBitmap + if (artworkBitmap == null && desc.iconUri != null) { + artworkBitmap = loadBitmapFromUri(desc.iconUri!!) + } + val artworkIcon = if (artworkBitmap != null) { + Icon.createWithBitmap(artworkBitmap) + } else { + null + } + + val mediaAction = getResumeMediaAction(resumeAction) + foregroundExecutor.execute { + onMediaDataLoaded(packageName, null, MediaData(true, Color.DKGRAY, appName, + null, desc.subtitle, desc.title, artworkIcon, listOf(mediaAction), listOf(0), + packageName, token, appIntent, null, resumeAction, packageName)) + } + } + + private fun loadMediaDataInBg( + key: String, + sbn: StatusBarNotification, + oldKey: String? + ) { val token = sbn.notification.extras.getParcelable(Notification.EXTRA_MEDIA_SESSION) as MediaSession.Token? val metadata = mediaControllerFactory.create(token).metadata @@ -234,16 +339,23 @@ class MediaDataManager @Inject constructor( } val mediaAction = MediaAction( action.getIcon().loadDrawable(packageContext), - action.actionIntent, + Runnable { + try { + action.actionIntent.send() + } catch (e: PendingIntent.CanceledException) { + Log.d(TAG, "Intent canceled", e) + } + }, action.title) actionIcons.add(mediaAction) } } + val resumeAction: Runnable? = mediaEntries.get(key)?.resumeAction foregroundExecutor.execute { - onMediaDataLoaded(key, MediaData(true, bgColor, app, smallIconDrawable, artist, song, - artWorkIcon, actionIcons, actionsToShowCollapsed, sbn.packageName, token, - notif.contentIntent, null, key)) + onMediaDataLoaded(key, oldKey, MediaData(true, bgColor, app, smallIconDrawable, artist, + song, artWorkIcon, actionIcons, actionsToShowCollapsed, sbn.packageName, token, + notif.contentIntent, null, resumeAction, key)) } } @@ -257,7 +369,7 @@ class MediaDataManager @Inject constructor( val albumArt = loadBitmapFromUri(Uri.parse(uriString)) if (albumArt != null) { Log.d(TAG, "loaded art from $uri") - break + return albumArt } } } @@ -283,27 +395,52 @@ class MediaDataManager @Inject constructor( val source = ImageDecoder.createSource(context.getContentResolver(), uri) return try { - ImageDecoder.decodeBitmap(source) + ImageDecoder.decodeBitmap(source) { + decoder, info, source -> decoder.isMutableRequired = true + } } catch (e: IOException) { e.printStackTrace() null } } - fun onMediaDataLoaded(key: String, data: MediaData) { + private fun getResumeMediaAction(action: Runnable): MediaAction { + return MediaAction( + context.getDrawable(R.drawable.lb_ic_play), + action, + context.getString(R.string.controls_media_resume) + ) + } + + fun onMediaDataLoaded(key: String, oldKey: String?, data: MediaData) { Assert.isMainThread() if (mediaEntries.containsKey(key)) { // Otherwise this was removed already mediaEntries.put(key, data) val listenersCopy = listeners.toSet() listenersCopy.forEach { - it.onMediaDataLoaded(key, data) + it.onMediaDataLoaded(key, oldKey, data) } } } fun onNotificationRemoved(key: String) { Assert.isMainThread() + if (useMediaResumption && mediaEntries.get(key)?.resumeAction != null) { + Log.d(TAG, "Not removing $key because resumable") + // Move to resume key aka package name + val data = mediaEntries.remove(key)!! + val resumeAction = getResumeMediaAction(data.resumeAction!!) + val updated = data.copy(token = null, actions = listOf(resumeAction), + actionsToShowInCompact = listOf(0)) + mediaEntries.put(data.packageName, updated) + // Notify listeners of "new" controls + val listenersCopy = listeners.toSet() + listenersCopy.forEach { + it.onMediaDataLoaded(data.packageName, key, updated) + } + return + } val removed = mediaEntries.remove(key) if (removed != null) { val listenersCopy = listeners.toSet() @@ -316,19 +453,32 @@ class MediaDataManager @Inject constructor( /** * Are there any media notifications active? */ - fun hasActiveMedia() = mediaEntries.isNotEmpty() + fun hasActiveMedia() = mediaEntries.any({ isActive(it.value) }) - fun hasAnyMedia(): Boolean { - // TODO: implement this when we implemented resumption - return hasActiveMedia() + fun isActive(data: MediaData): Boolean { + if (data.token == null) { + return false + } + val controller = mediaControllerFactory.create(data.token) + val state = controller?.playbackState?.state + return state != null && NotificationMediaManager.isActiveState(state) } + /** + * Are there any media entries, including resume controls? + */ + fun hasAnyMedia() = mediaEntries.isNotEmpty() + interface Listener { /** - * Called whenever there's new MediaData Loaded for the consumption in views + * Called whenever there's new MediaData Loaded for the consumption in views. + * + * oldKey is provided to check whether the view has changed keys, which can happen when a + * player has gone from resume state (key is package name) to active state (key is + * notification key) or vice versa. */ - fun onMediaDataLoaded(key: String, data: MediaData) {} + fun onMediaDataLoaded(key: String, oldKey: String?, data: MediaData) {} /** * Called whenever a previously existing Media notification was removed diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaDeviceManager.kt b/packages/SystemUI/src/com/android/systemui/media/MediaDeviceManager.kt index 552fea63a278..2f521ea39242 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaDeviceManager.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaDeviceManager.kt @@ -16,11 +16,8 @@ package com.android.systemui.media -import android.app.Notification import android.content.Context -import android.service.notification.StatusBarNotification import android.media.MediaRouter2Manager -import android.media.session.MediaSession import android.media.session.MediaController import com.android.settingslib.media.LocalMediaManager import com.android.settingslib.media.MediaDevice @@ -38,11 +35,16 @@ class MediaDeviceManager @Inject constructor( private val localMediaManagerFactory: LocalMediaManagerFactory, private val mr2manager: MediaRouter2Manager, private val featureFlag: MediaFeatureFlag, - @Main private val fgExecutor: Executor -) { + @Main private val fgExecutor: Executor, + private val mediaDataManager: MediaDataManager +) : MediaDataManager.Listener { private val listeners: MutableSet<Listener> = mutableSetOf() private val entries: MutableMap<String, Token> = mutableMapOf() + init { + mediaDataManager.addListener(this) + } + /** * Add a listener for changes to the media route (ie. device). */ @@ -53,23 +55,25 @@ class MediaDeviceManager @Inject constructor( */ fun removeListener(listener: Listener) = listeners.remove(listener) - fun onNotificationAdded(key: String, sbn: StatusBarNotification) { - if (featureFlag.enabled && isMediaNotification(sbn)) { + override fun onMediaDataLoaded(key: String, oldKey: String?, data: MediaData) { + if (featureFlag.enabled) { + if (oldKey != null && oldKey != key) { + val oldToken = entries.remove(oldKey) + oldToken?.stop() + } var tok = entries[key] - if (tok == null) { - val token = sbn.notification.extras.getParcelable(Notification.EXTRA_MEDIA_SESSION) - as MediaSession.Token? - val controller = MediaController(context, token) - tok = Token(key, controller, localMediaManagerFactory.create(sbn.packageName)) + if (tok == null && data.token != null) { + val controller = MediaController(context, data.token!!) + tok = Token(key, controller, localMediaManagerFactory.create(data.packageName)) entries[key] = tok tok.start() } } else { - onNotificationRemoved(key) + onMediaDataRemoved(key) } } - fun onNotificationRemoved(key: String) { + override fun onMediaDataRemoved(key: String) { val token = entries.remove(key) token?.stop() token?.let { diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaHost.kt b/packages/SystemUI/src/com/android/systemui/media/MediaHost.kt index e904e935b0e0..2bd8c0cbeab2 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaHost.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaHost.kt @@ -50,7 +50,7 @@ class MediaHost @Inject constructor( } private val listener = object : MediaDataManager.Listener { - override fun onMediaDataLoaded(key: String, data: MediaData) { + override fun onMediaDataLoaded(key: String, oldKey: String?, data: MediaData) { updateViewVisibility() } diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaResumeListener.kt b/packages/SystemUI/src/com/android/systemui/media/MediaResumeListener.kt new file mode 100644 index 000000000000..6bbe0d1651dd --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/media/MediaResumeListener.kt @@ -0,0 +1,252 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.media + +import android.app.PendingIntent +import android.content.BroadcastReceiver +import android.content.ComponentName +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.content.pm.PackageManager +import android.media.MediaDescription +import android.media.session.MediaController +import android.media.session.MediaSession +import android.os.UserHandle +import android.service.media.MediaBrowserService +import android.util.Log +import com.android.systemui.broadcast.BroadcastDispatcher +import com.android.systemui.dagger.qualifiers.Background +import com.android.systemui.util.Utils +import java.util.concurrent.ConcurrentLinkedQueue +import java.util.concurrent.Executor +import javax.inject.Inject +import javax.inject.Singleton + +private const val TAG = "MediaResumeListener" + +private const val MEDIA_PREFERENCES = "media_control_prefs" +private const val MEDIA_PREFERENCE_KEY = "browser_components" + +@Singleton +class MediaResumeListener @Inject constructor( + private val context: Context, + private val broadcastDispatcher: BroadcastDispatcher, + @Background private val backgroundExecutor: Executor +) : MediaDataManager.Listener { + + private val useMediaResumption: Boolean = Utils.useMediaResumption(context) + private val resumeComponents: ConcurrentLinkedQueue<ComponentName> = ConcurrentLinkedQueue() + + lateinit var addTrackToResumeCallback: ( + MediaDescription, + Runnable, + MediaSession.Token, + String, + PendingIntent, + String + ) -> Unit + lateinit var resumeComponentFoundCallback: (String, Runnable?) -> Unit + + private var mediaBrowser: ResumeMediaBrowser? = null + + private val unlockReceiver = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + if (Intent.ACTION_USER_UNLOCKED == intent.action) { + loadMediaResumptionControls() + } + } + } + + private val mediaBrowserCallback = object : ResumeMediaBrowser.Callback() { + override fun addTrack( + desc: MediaDescription, + component: ComponentName, + browser: ResumeMediaBrowser + ) { + val token = browser.token + val appIntent = browser.appIntent + val pm = context.getPackageManager() + var appName: CharSequence = component.packageName + val resumeAction = getResumeAction(component) + try { + appName = pm.getApplicationLabel( + pm.getApplicationInfo(component.packageName, 0)) + } catch (e: PackageManager.NameNotFoundException) { + Log.e(TAG, "Error getting package information", e) + } + + Log.d(TAG, "Adding resume controls $desc") + addTrackToResumeCallback(desc, resumeAction, token, appName.toString(), appIntent, + component.packageName) + } + } + + init { + if (useMediaResumption) { + val unlockFilter = IntentFilter() + unlockFilter.addAction(Intent.ACTION_USER_UNLOCKED) + broadcastDispatcher.registerReceiver(unlockReceiver, unlockFilter, null, UserHandle.ALL) + loadSavedComponents() + } + } + + private fun loadSavedComponents() { + val userContext = context.createContextAsUser(context.getUser(), 0) + val prefs = userContext.getSharedPreferences(MEDIA_PREFERENCES, Context.MODE_PRIVATE) + val listString = prefs.getString(MEDIA_PREFERENCE_KEY, null) + val components = listString?.split(ResumeMediaBrowser.DELIMITER.toRegex()) + ?.dropLastWhile { it.isEmpty() } + components?.forEach { + val info = it.split("/") + val packageName = info[0] + val className = info[1] + val component = ComponentName(packageName, className) + resumeComponents.add(component) + } + Log.d(TAG, "loaded resume components ${resumeComponents.toArray().contentToString()}") + } + + /** + * Load controls for resuming media, if available + */ + private fun loadMediaResumptionControls() { + if (!useMediaResumption) { + return + } + + resumeComponents.forEach { + val browser = ResumeMediaBrowser(context, mediaBrowserCallback, it) + browser.findRecentMedia() + } + broadcastDispatcher.unregisterReceiver(unlockReceiver) // only need to load once + } + + override fun onMediaDataLoaded(key: String, oldKey: String?, data: MediaData) { + if (useMediaResumption) { + // If this had been started from a resume state, disconnect now that it's live + mediaBrowser?.disconnect() + // If we don't have a resume action, check if we haven't already + if (data.resumeAction == null && !data.hasCheckedForResume) { + // TODO also check for a media button receiver intended for restarting (b/154127084) + Log.d(TAG, "Checking for service component for " + data.packageName) + val pm = context.packageManager + val serviceIntent = Intent(MediaBrowserService.SERVICE_INTERFACE) + val resumeInfo = pm.queryIntentServices(serviceIntent, 0) + + val inf = resumeInfo?.filter { + it.serviceInfo.packageName == data.packageName + } + if (inf != null && inf.size > 0) { + backgroundExecutor.execute { + tryUpdateResumptionList(key, inf!!.get(0).componentInfo.componentName) + } + } else { + // No service found + resumeComponentFoundCallback(key, null) + } + } + } + } + + /** + * Verify that we can connect to the given component with a MediaBrowser, and if so, add that + * component to the list of resumption components + */ + private fun tryUpdateResumptionList(key: String, componentName: ComponentName) { + Log.d(TAG, "Testing if we can connect to $componentName") + mediaBrowser?.disconnect() + mediaBrowser = ResumeMediaBrowser(context, + object : ResumeMediaBrowser.Callback() { + override fun onConnected() { + Log.d(TAG, "yes we can resume with $componentName") + resumeComponentFoundCallback(key, getResumeAction(componentName)) + updateResumptionList(componentName) + mediaBrowser?.disconnect() + mediaBrowser = null + } + + override fun onError() { + Log.e(TAG, "Cannot resume with $componentName") + resumeComponentFoundCallback(key, null) + mediaBrowser?.disconnect() + mediaBrowser = null + } + }, + componentName) + mediaBrowser?.testConnection() + } + + /** + * Add the component to the saved list of media browser services, checking for duplicates and + * removing older components that exceed the maximum limit + * @param componentName + */ + private fun updateResumptionList(componentName: ComponentName) { + // Remove if exists + resumeComponents.remove(componentName) + // Insert at front of queue + resumeComponents.add(componentName) + // Remove old components if over the limit + if (resumeComponents.size > ResumeMediaBrowser.MAX_RESUMPTION_CONTROLS) { + resumeComponents.remove() + } + + // Save changes + val sb = StringBuilder() + resumeComponents.forEach { + sb.append(it.flattenToString()) + sb.append(ResumeMediaBrowser.DELIMITER) + } + val userContext = context.createContextAsUser(context.getUser(), 0) + val prefs = userContext.getSharedPreferences(MEDIA_PREFERENCES, Context.MODE_PRIVATE) + prefs.edit().putString(MEDIA_PREFERENCE_KEY, sb.toString()).apply() + } + + /** + * Get a runnable which will resume media playback + */ + private fun getResumeAction(componentName: ComponentName): Runnable { + return Runnable { + mediaBrowser?.disconnect() + mediaBrowser = ResumeMediaBrowser(context, + object : ResumeMediaBrowser.Callback() { + override fun onConnected() { + if (mediaBrowser?.token == null) { + Log.e(TAG, "Error after connect") + mediaBrowser?.disconnect() + mediaBrowser = null + return + } + Log.d(TAG, "Connected for restart $componentName") + val controller = MediaController(context, mediaBrowser!!.token) + val controls = controller.transportControls + controls.prepare() + controls.play() + } + + override fun onError() { + Log.e(TAG, "Resume failed for $componentName") + mediaBrowser?.disconnect() + mediaBrowser = null + } + }, + componentName) + mediaBrowser?.restart() + } + } +}
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaTimeoutListener.kt b/packages/SystemUI/src/com/android/systemui/media/MediaTimeoutListener.kt index 92a1ab1b1871..3c3f4a977ee7 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaTimeoutListener.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaTimeoutListener.kt @@ -45,7 +45,7 @@ class MediaTimeoutListener @Inject constructor( lateinit var timeoutCallback: (String, Boolean) -> Unit - override fun onMediaDataLoaded(key: String, data: MediaData) { + override fun onMediaDataLoaded(key: String, oldKey: String?, data: MediaData) { if (mediaListeners.containsKey(key)) { return } @@ -67,27 +67,35 @@ class MediaTimeoutListener @Inject constructor( var timedOut = false - private val mediaController = mediaControllerFactory.create(data.token) + // Resume controls may have null token + private val mediaController = if (data.token != null) { + mediaControllerFactory.create(data.token) + } else { + null + } private var cancellation: Runnable? = null init { - mediaController.registerCallback(this) + mediaController?.registerCallback(this) } fun destroy() { - mediaController.unregisterCallback(this) + mediaController?.unregisterCallback(this) } override fun onPlaybackStateChanged(state: PlaybackState?) { if (DEBUG) { Log.v(TAG, "onPlaybackStateChanged: $state") } - expireMediaTimeout(key, "playback state ativity - $state, $key") if (state == null || !isPlayingState(state.state)) { if (DEBUG) { Log.v(TAG, "schedule timeout for $key") } + if (cancellation != null) { + if (DEBUG) Log.d(TAG, "cancellation already exists, continuing.") + return + } expireMediaTimeout(key, "PLAYBACK STATE CHANGED - $state") cancellation = mainExecutor.executeDelayed({ cancellation = null @@ -98,6 +106,7 @@ class MediaTimeoutListener @Inject constructor( timeoutCallback(key, timedOut) }, PAUSED_MEDIA_TIMEOUT) } else { + expireMediaTimeout(key, "playback started - $state, $key") timedOut = false timeoutCallback(key, timedOut) } diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaViewManager.kt b/packages/SystemUI/src/com/android/systemui/media/MediaViewManager.kt index 8ab30c75c7eb..9b9a6b4b13ab 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaViewManager.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaViewManager.kt @@ -11,16 +11,12 @@ import android.widget.HorizontalScrollView import android.widget.LinearLayout import androidx.core.view.GestureDetectorCompat import com.android.systemui.R -import com.android.systemui.dagger.qualifiers.Background -import com.android.systemui.dagger.qualifiers.Main -import com.android.systemui.plugins.ActivityStarter import com.android.systemui.qs.PageIndicator import com.android.systemui.statusbar.notification.VisualStabilityManager import com.android.systemui.util.animation.UniqueObjectHostView import com.android.systemui.util.animation.requiresRemeasuring -import com.android.systemui.util.concurrency.DelayableExecutor -import java.util.concurrent.Executor import javax.inject.Inject +import javax.inject.Provider import javax.inject.Singleton private const val FLING_SLOP = 1000000 @@ -32,10 +28,8 @@ private const val FLING_SLOP = 1000000 @Singleton class MediaViewManager @Inject constructor( private val context: Context, - @Main private val foregroundExecutor: Executor, - @Background private val backgroundExecutor: DelayableExecutor, + private val mediaControlPanelFactory: Provider<MediaControlPanel>, private val visualStabilityManager: VisualStabilityManager, - private val activityStarter: ActivityStarter, private val mediaHostStatesManager: MediaHostStatesManager, mediaManager: MediaDataCombineLatest ) { @@ -147,8 +141,8 @@ class MediaViewManager @Inject constructor( visualStabilityManager.addReorderingAllowedCallback(visualStabilityCallback, true /* persistent */) mediaManager.addListener(object : MediaDataManager.Listener { - override fun onMediaDataLoaded(key: String, data: MediaData) { - updateView(key, data) + override fun onMediaDataLoaded(key: String, oldKey: String?, data: MediaData) { + updateView(key, oldKey, data) updatePlayerVisibilities() mediaCarousel.requiresRemeasuring = true } @@ -259,11 +253,16 @@ class MediaViewManager @Inject constructor( } } - private fun updateView(key: String, data: MediaData) { + private fun updateView(key: String, oldKey: String?, data: MediaData) { + // If the key was changed, update entry + val oldData = mediaPlayers[oldKey] + if (oldData != null) { + val oldData = mediaPlayers.remove(oldKey) + mediaPlayers.put(key, oldData!!) + } var existingPlayer = mediaPlayers[key] if (existingPlayer == null) { - existingPlayer = MediaControlPanel(context, foregroundExecutor, backgroundExecutor, - activityStarter, mediaHostStatesManager) + existingPlayer = mediaControlPanelFactory.get() existingPlayer.attach(PlayerViewHolder.create(LayoutInflater.from(context), mediaContent)) mediaPlayers[key] = existingPlayer @@ -286,7 +285,7 @@ class MediaViewManager @Inject constructor( needsReordering = true } } - existingPlayer.bind(data) + existingPlayer?.bind(data) updateMediaPaddings() updatePageIndicator() } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSMediaBrowser.java b/packages/SystemUI/src/com/android/systemui/media/ResumeMediaBrowser.java index a5b73dcbd289..1e9a30364607 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSMediaBrowser.java +++ b/packages/SystemUI/src/com/android/systemui/media/ResumeMediaBrowser.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.systemui.qs; +package com.android.systemui.media; import android.app.PendingIntent; import android.content.ComponentName; @@ -27,14 +27,17 @@ import android.media.session.MediaController; import android.media.session.MediaSession; import android.os.Bundle; import android.service.media.MediaBrowserService; +import android.text.TextUtils; import android.util.Log; +import com.android.systemui.util.Utils; + import java.util.List; /** - * Media browser for managing resumption in QS media controls + * Media browser for managing resumption in media controls */ -public class QSMediaBrowser { +public class ResumeMediaBrowser { /** Maximum number of controls to show on boot */ public static final int MAX_RESUMPTION_CONTROLS = 5; @@ -42,7 +45,8 @@ public class QSMediaBrowser { /** Delimiter for saved component names */ public static final String DELIMITER = ":"; - private static final String TAG = "QSMediaBrowser"; + private static final String TAG = "ResumeMediaBrowser"; + private boolean mIsEnabled = false; private final Context mContext; private final Callback mCallback; private MediaBrowser mMediaBrowser; @@ -54,21 +58,25 @@ public class QSMediaBrowser { * @param callback used to report media items found * @param componentName Component name of the MediaBrowserService this browser will connect to */ - public QSMediaBrowser(Context context, Callback callback, ComponentName componentName) { + public ResumeMediaBrowser(Context context, Callback callback, ComponentName componentName) { + mIsEnabled = Utils.useMediaResumption(context); mContext = context; mCallback = callback; mComponentName = componentName; } /** - * Connects to the MediaBrowserService and looks for valid media. If a media item is returned - * by the service, QSMediaBrowser.Callback#addTrack will be called with its MediaDescription. - * QSMediaBrowser.Callback#onConnected and QSMediaBrowser.Callback#onError will also be called - * when the initial connection is successful, or an error occurs. Note that it is possible for - * the service to connect but for no playable tracks to be found later. - * QSMediaBrowser#disconnect will be called automatically with this function. + * Connects to the MediaBrowserService and looks for valid media. If a media item is returned, + * ResumeMediaBrowser.Callback#addTrack will be called with the MediaDescription. + * ResumeMediaBrowser.Callback#onConnected and ResumeMediaBrowser.Callback#onError will also be + * called when the initial connection is successful, or an error occurs. + * Note that it is possible for the service to connect but for no playable tracks to be found. + * ResumeMediaBrowser#disconnect will be called automatically with this function. */ public void findRecentMedia() { + if (!mIsEnabled) { + return; + } Log.d(TAG, "Connecting to " + mComponentName); disconnect(); Bundle rootHints = new Bundle(); @@ -86,7 +94,7 @@ public class QSMediaBrowser { public void onChildrenLoaded(String parentId, List<MediaBrowser.MediaItem> children) { if (children.size() == 0) { - Log.e(TAG, "No children found for " + mComponentName); + Log.d(TAG, "No children found for " + mComponentName); return; } // We ask apps to return a playable item as the first child when sending @@ -94,23 +102,24 @@ public class QSMediaBrowser { MediaBrowser.MediaItem child = children.get(0); MediaDescription desc = child.getDescription(); if (child.isPlayable()) { - mCallback.addTrack(desc, mMediaBrowser.getServiceComponent(), QSMediaBrowser.this); + mCallback.addTrack(desc, mMediaBrowser.getServiceComponent(), + ResumeMediaBrowser.this); } else { - Log.e(TAG, "Child found but not playable for " + mComponentName); + Log.d(TAG, "Child found but not playable for " + mComponentName); } disconnect(); } @Override public void onError(String parentId) { - Log.e(TAG, "Subscribe error for " + mComponentName + ": " + parentId); + Log.d(TAG, "Subscribe error for " + mComponentName + ": " + parentId); mCallback.onError(); disconnect(); } @Override public void onError(String parentId, Bundle options) { - Log.e(TAG, "Subscribe error for " + mComponentName + ": " + parentId + Log.d(TAG, "Subscribe error for " + mComponentName + ": " + parentId + ", options: " + options); mCallback.onError(); disconnect(); @@ -149,7 +158,7 @@ public class QSMediaBrowser { */ @Override public void onConnectionFailed() { - Log.e(TAG, "Connection failed for " + mComponentName); + Log.d(TAG, "Connection failed for " + mComponentName); mCallback.onError(); disconnect(); } @@ -167,11 +176,15 @@ public class QSMediaBrowser { } /** - * Connects to the MediaBrowserService and starts playback. QSMediaBrowser.Callback#onError or - * QSMediaBrowser.Callback#onConnected will be called depending on whether it was successful. - * QSMediaBrowser#disconnect should be called after this to ensure the connection is closed. + * Connects to the MediaBrowserService and starts playback. + * ResumeMediaBrowser.Callback#onError or ResumeMediaBrowser.Callback#onConnected will be called + * depending on whether it was successful. + * ResumeMediaBrowser#disconnect should be called after this to ensure the connection is closed. */ public void restart() { + if (!mIsEnabled) { + return; + } disconnect(); Bundle rootHints = new Bundle(); rootHints.putBoolean(MediaBrowserService.BrowserRoot.EXTRA_RECENT, true); @@ -224,18 +237,21 @@ public class QSMediaBrowser { /** * Used to test if SystemUI is allowed to connect to the given component as a MediaBrowser. - * QSMediaBrowser.Callback#onError or QSMediaBrowser.Callback#onConnected will be called + * ResumeMediaBrowser.Callback#onError or ResumeMediaBrowser.Callback#onConnected will be called * depending on whether it was successful. - * QSMediaBrowser#disconnect should be called after this to ensure the connection is closed. + * ResumeMediaBrowser#disconnect should be called after this to ensure the connection is closed. */ public void testConnection() { + if (!mIsEnabled) { + return; + } disconnect(); final MediaBrowser.ConnectionCallback connectionCallback = new MediaBrowser.ConnectionCallback() { @Override public void onConnected() { Log.d(TAG, "connected"); - if (mMediaBrowser.getRoot() == null) { + if (TextUtils.isEmpty(mMediaBrowser.getRoot())) { mCallback.onError(); } else { mCallback.onConnected(); @@ -264,7 +280,7 @@ public class QSMediaBrowser { } /** - * Interface to handle results from QSMediaBrowser + * Interface to handle results from ResumeMediaBrowser */ public static class Callback { /** @@ -286,7 +302,7 @@ public class QSMediaBrowser { * @param browser reference to the browser */ public void addTrack(MediaDescription track, ComponentName component, - QSMediaBrowser browser) { + ResumeMediaBrowser browser) { } } } diff --git a/packages/SystemUI/src/com/android/systemui/media/SeekBarViewModel.kt b/packages/SystemUI/src/com/android/systemui/media/SeekBarViewModel.kt index 06821cd615a5..efc476d0c86f 100644 --- a/packages/SystemUI/src/com/android/systemui/media/SeekBarViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/media/SeekBarViewModel.kt @@ -27,8 +27,10 @@ import androidx.annotation.AnyThread import androidx.annotation.WorkerThread import androidx.lifecycle.MutableLiveData import androidx.lifecycle.LiveData - -import com.android.systemui.util.concurrency.DelayableExecutor +import com.android.systemui.dagger.qualifiers.Background +import com.android.systemui.util.concurrency.RepeatableExecutor +import java.util.concurrent.Executor +import javax.inject.Inject private const val POSITION_UPDATE_INTERVAL_MILLIS = 100L @@ -65,7 +67,7 @@ private fun PlaybackState.computePosition(duration: Long): Long { } /** ViewModel for seek bar in QS media player. */ -class SeekBarViewModel(val bgExecutor: DelayableExecutor) { +class SeekBarViewModel @Inject constructor(@Background private val bgExecutor: RepeatableExecutor) { private var _data = Progress(false, false, null, null) set(value) { @@ -89,17 +91,25 @@ class SeekBarViewModel(val bgExecutor: DelayableExecutor) { private var callback = object : MediaController.Callback() { override fun onPlaybackStateChanged(state: PlaybackState) { playbackState = state - if (shouldPollPlaybackPosition()) { - checkPlaybackPosition() + if (PlaybackState.STATE_NONE.equals(playbackState)) { + clearController() + } else { + checkIfPollingNeeded() } } + + override fun onSessionDestroyed() { + clearController() + } } + private var cancel: Runnable? = null /** Listening state (QS open or closed) is used to control polling of progress. */ var listening = true - set(value) { - if (value) { - checkPlaybackPosition() + set(value) = bgExecutor.execute { + if (field != value) { + field = value + checkIfPollingNeeded() } } @@ -131,9 +141,7 @@ class SeekBarViewModel(val bgExecutor: DelayableExecutor) { playbackState?.getState() == PlaybackState.STATE_NONE || (duration != null && duration <= 0)) false else true _data = Progress(enabled, seekAvailable, position, duration) - if (shouldPollPlaybackPosition()) { - checkPlaybackPosition() - } + checkIfPollingNeeded() } /** @@ -145,6 +153,8 @@ class SeekBarViewModel(val bgExecutor: DelayableExecutor) { fun clearController() = bgExecutor.execute { controller = null playbackState = null + cancel?.run() + cancel = null _data = _data.copy(enabled = false) } @@ -152,26 +162,34 @@ class SeekBarViewModel(val bgExecutor: DelayableExecutor) { * Call to clean up any resources. */ @AnyThread - fun onDestroy() { + fun onDestroy() = bgExecutor.execute { controller = null playbackState = null + cancel?.run() + cancel = null } - @AnyThread - private fun checkPlaybackPosition(): Runnable = bgExecutor.executeDelayed({ + @WorkerThread + private fun checkPlaybackPosition() { val duration = _data.duration ?: -1 val currentPosition = playbackState?.computePosition(duration.toLong())?.toInt() if (currentPosition != null && _data.elapsedTime != currentPosition) { _data = _data.copy(elapsedTime = currentPosition) } - if (shouldPollPlaybackPosition()) { - checkPlaybackPosition() - } - }, POSITION_UPDATE_INTERVAL_MILLIS) + } @WorkerThread - private fun shouldPollPlaybackPosition(): Boolean { - return listening && playbackState?.isInMotion() ?: false + private fun checkIfPollingNeeded() { + val needed = listening && playbackState?.isInMotion() ?: false + if (needed) { + if (cancel == null) { + cancel = bgExecutor.executeRepeatedly(this::checkPlaybackPosition, 0L, + POSITION_UPDATE_INTERVAL_MILLIS) + } + } else { + cancel?.run() + cancel = null + } } /** Gets a listener to attach to the seek bar to handle seeking. */ @@ -188,7 +206,7 @@ class SeekBarViewModel(val bgExecutor: DelayableExecutor) { private class SeekBarChangeListener( val viewModel: SeekBarViewModel, - val bgExecutor: DelayableExecutor + val bgExecutor: Executor ) : SeekBar.OnSeekBarChangeListener { override fun onProgressChanged(bar: SeekBar, progress: Int, fromUser: Boolean) { if (fromUser) { diff --git a/packages/SystemUI/src/com/android/systemui/pip/PipAnimationController.java b/packages/SystemUI/src/com/android/systemui/pip/PipAnimationController.java index 7f7e1085d497..03b1ddca4648 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/PipAnimationController.java +++ b/packages/SystemUI/src/com/android/systemui/pip/PipAnimationController.java @@ -17,6 +17,7 @@ package com.android.systemui.pip; import android.animation.Animator; +import android.animation.RectEvaluator; import android.animation.ValueAnimator; import android.annotation.IntDef; import android.content.Context; @@ -26,6 +27,7 @@ import android.view.animation.AnimationUtils; import android.view.animation.Interpolator; import com.android.internal.annotations.VisibleForTesting; +import com.android.systemui.Interpolators; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -74,15 +76,12 @@ public class PipAnimationController { || direction == TRANSITION_DIRECTION_TO_SPLIT_SCREEN; } - private final Interpolator mFastOutSlowInInterpolator; private final PipSurfaceTransactionHelper mSurfaceTransactionHelper; private PipTransitionAnimator mCurrentAnimator; @Inject PipAnimationController(Context context, PipSurfaceTransactionHelper helper) { - mFastOutSlowInInterpolator = AnimationUtils.loadInterpolator(context, - com.android.internal.R.interpolator.fast_out_slow_in); mSurfaceTransactionHelper = helper; } @@ -104,10 +103,11 @@ public class PipAnimationController { } @SuppressWarnings("unchecked") - PipTransitionAnimator getAnimator(SurfaceControl leash, Rect startBounds, Rect endBounds) { + PipTransitionAnimator getAnimator(SurfaceControl leash, Rect startBounds, Rect endBounds, + Rect sourceHintRect) { if (mCurrentAnimator == null) { mCurrentAnimator = setupPipTransitionAnimator( - PipTransitionAnimator.ofBounds(leash, startBounds, endBounds)); + PipTransitionAnimator.ofBounds(leash, startBounds, endBounds, sourceHintRect)); } else if (mCurrentAnimator.getAnimationType() == ANIM_TYPE_ALPHA && mCurrentAnimator.isRunning()) { // If we are still animating the fade into pip, then just move the surface and ensure @@ -122,7 +122,7 @@ public class PipAnimationController { } else { mCurrentAnimator.cancel(); mCurrentAnimator = setupPipTransitionAnimator( - PipTransitionAnimator.ofBounds(leash, startBounds, endBounds)); + PipTransitionAnimator.ofBounds(leash, startBounds, endBounds, sourceHintRect)); } return mCurrentAnimator; } @@ -133,7 +133,7 @@ public class PipAnimationController { private PipTransitionAnimator setupPipTransitionAnimator(PipTransitionAnimator animator) { animator.setSurfaceTransactionHelper(mSurfaceTransactionHelper); - animator.setInterpolator(mFastOutSlowInInterpolator); + animator.setInterpolator(Interpolators.FAST_OUT_SLOW_IN); animator.setFloatValues(FRACTION_START, FRACTION_END); return animator; } @@ -331,6 +331,7 @@ public class PipAnimationController { @Override void onStartTransaction(SurfaceControl leash, SurfaceControl.Transaction tx) { getSurfaceTransactionHelper() + .resetScale(tx, leash, getDestinationBounds()) .crop(tx, leash, getDestinationBounds()) .round(tx, leash, shouldApplyCornerRadius()); tx.show(leash); @@ -346,35 +347,46 @@ public class PipAnimationController { } static PipTransitionAnimator<Rect> ofBounds(SurfaceControl leash, - Rect startValue, Rect endValue) { + Rect startValue, Rect endValue, Rect sourceHintRect) { + // Just for simplicity we'll interpolate between the source rect hint insets and empty + // insets to calculate the window crop + final Rect initialStartValue = new Rect(startValue); + final Rect sourceHintRectInsets = sourceHintRect != null + ? new Rect(sourceHintRect.left - startValue.left, + sourceHintRect.top - startValue.top, + startValue.right - sourceHintRect.right, + startValue.bottom - sourceHintRect.bottom) + : null; + final Rect sourceInsets = new Rect(0, 0, 0, 0); + // construct new Rect instances in case they are recycled return new PipTransitionAnimator<Rect>(leash, ANIM_TYPE_BOUNDS, endValue, new Rect(startValue), new Rect(endValue)) { - private final Rect mTmpRect = new Rect(); - - private int getCastedFractionValue(float start, float end, float fraction) { - return (int) (start * (1 - fraction) + end * fraction + .5f); - } + private final RectEvaluator mRectEvaluator = new RectEvaluator(new Rect()); + private final RectEvaluator mInsetsEvaluator = new RectEvaluator(new Rect()); @Override void applySurfaceControlTransaction(SurfaceControl leash, SurfaceControl.Transaction tx, float fraction) { final Rect start = getStartValue(); final Rect end = getEndValue(); - mTmpRect.set( - getCastedFractionValue(start.left, end.left, fraction), - getCastedFractionValue(start.top, end.top, fraction), - getCastedFractionValue(start.right, end.right, fraction), - getCastedFractionValue(start.bottom, end.bottom, fraction)); - setCurrentValue(mTmpRect); + Rect bounds = mRectEvaluator.evaluate(fraction, start, end); + setCurrentValue(bounds); if (inScaleTransition()) { if (isOutPipDirection(getTransitionDirection())) { - getSurfaceTransactionHelper().scale(tx, leash, end, mTmpRect); + getSurfaceTransactionHelper().scale(tx, leash, end, bounds); } else { - getSurfaceTransactionHelper().scale(tx, leash, start, mTmpRect); + getSurfaceTransactionHelper().scale(tx, leash, start, bounds); } } else { - getSurfaceTransactionHelper().crop(tx, leash, mTmpRect); + if (sourceHintRectInsets != null) { + Rect insets = mInsetsEvaluator.evaluate(fraction, sourceInsets, + sourceHintRectInsets); + getSurfaceTransactionHelper().scaleAndCrop(tx, leash, initialStartValue, + bounds, insets); + } else { + getSurfaceTransactionHelper().scale(tx, leash, start, bounds); + } } tx.apply(); } @@ -390,11 +402,11 @@ public class PipAnimationController { @Override void onEndTransaction(SurfaceControl leash, SurfaceControl.Transaction tx) { - if (!inScaleTransition()) return; // NOTE: intentionally does not apply the transaction here. // this end transaction should get executed synchronously with the final // WindowContainerTransaction in task organizer - getSurfaceTransactionHelper().resetScale(tx, leash, getDestinationBounds()) + getSurfaceTransactionHelper() + .resetScale(tx, leash, getDestinationBounds()) .crop(tx, leash, getDestinationBounds()); } diff --git a/packages/SystemUI/src/com/android/systemui/pip/PipBoundsHandler.java b/packages/SystemUI/src/com/android/systemui/pip/PipBoundsHandler.java index 0d3a16ec1028..26576940740f 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/PipBoundsHandler.java +++ b/packages/SystemUI/src/com/android/systemui/pip/PipBoundsHandler.java @@ -296,6 +296,14 @@ public class PipBoundsHandler { */ public boolean onDisplayRotationChanged(Rect outBounds, Rect oldBounds, Rect outInsetBounds, int displayId, int fromRotation, int toRotation, WindowContainerTransaction t) { + // Calculate the snap fraction of the current stack along the old movement bounds + final Rect postChangeStackBounds = new Rect(oldBounds); + final float snapFraction = getSnapFraction(postChangeStackBounds); + + // Update the display layout, note that we have to do this on every rotation even if we + // aren't in PIP since we need to update the display layout to get the right resources + mDisplayLayout.rotateTo(mContext.getResources(), toRotation); + // Bail early if the event is not sent to current {@link #mDisplayInfo} if ((displayId != mDisplayInfo.displayId) || (fromRotation == toRotation)) { return false; @@ -312,13 +320,6 @@ public class PipBoundsHandler { return false; } - // Calculate the snap fraction of the current stack along the old movement bounds - final Rect postChangeStackBounds = new Rect(oldBounds); - final float snapFraction = getSnapFraction(postChangeStackBounds); - - // Update the display layout - mDisplayLayout.rotateTo(mContext.getResources(), toRotation); - // Populate the new {@link #mDisplayInfo}. // The {@link DisplayInfo} queried from DisplayManager would be the one before rotation, // therefore, the width/height may require a swap first. diff --git a/packages/SystemUI/src/com/android/systemui/pip/PipSurfaceTransactionHelper.java b/packages/SystemUI/src/com/android/systemui/pip/PipSurfaceTransactionHelper.java index fc41d2ea8862..65ea887259be 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/PipSurfaceTransactionHelper.java +++ b/packages/SystemUI/src/com/android/systemui/pip/PipSurfaceTransactionHelper.java @@ -44,6 +44,7 @@ public class PipSurfaceTransactionHelper implements ConfigurationController.Conf private final float[] mTmpFloat9 = new float[9]; private final RectF mTmpSourceRectF = new RectF(); private final RectF mTmpDestinationRectF = new RectF(); + private final Rect mTmpDestinationRect = new Rect(); @Inject public PipSurfaceTransactionHelper(Context context, ConfigurationController configController) { @@ -90,7 +91,30 @@ public class PipSurfaceTransactionHelper implements ConfigurationController.Conf mTmpDestinationRectF.set(destinationBounds); mTmpTransform.setRectToRect(mTmpSourceRectF, mTmpDestinationRectF, Matrix.ScaleToFit.FILL); tx.setMatrix(leash, mTmpTransform, mTmpFloat9) - .setPosition(leash, destinationBounds.left, destinationBounds.top); + .setPosition(leash, mTmpDestinationRectF.left, mTmpDestinationRectF.top); + return this; + } + + /** + * Operates the scale (setMatrix) on a given transaction and leash + * @return same {@link PipSurfaceTransactionHelper} instance for method chaining + */ + PipSurfaceTransactionHelper scaleAndCrop(SurfaceControl.Transaction tx, SurfaceControl leash, + Rect sourceBounds, Rect destinationBounds, Rect insets) { + mTmpSourceRectF.set(sourceBounds); + mTmpDestinationRect.set(sourceBounds); + mTmpDestinationRect.inset(insets); + // Scale by the shortest edge and offset such that the top/left of the scaled inset source + // rect aligns with the top/left of the destination bounds + final float scale = sourceBounds.width() <= sourceBounds.height() + ? (float) destinationBounds.width() / sourceBounds.width() + : (float) destinationBounds.height() / sourceBounds.height(); + final float left = destinationBounds.left - insets.left * scale; + final float top = destinationBounds.top - insets.top * scale; + mTmpTransform.setScale(scale, scale); + tx.setMatrix(leash, mTmpTransform, mTmpFloat9) + .setWindowCrop(leash, mTmpDestinationRect) + .setPosition(leash, left, top); return this; } diff --git a/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java b/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java index c6f144aa57a1..42e0c56d6cc8 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java +++ b/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java @@ -143,8 +143,10 @@ public class PipTaskOrganizer extends TaskOrganizer implements case MSG_RESIZE_ANIMATE: { Rect currentBounds = (Rect) args.arg2; Rect toBounds = (Rect) args.arg3; + Rect sourceHintRect = (Rect) args.arg4; int duration = args.argi2; - animateResizePip(currentBounds, toBounds, args.argi1 /* direction */, duration); + animateResizePip(currentBounds, toBounds, sourceHintRect, + args.argi1 /* direction */, duration); if (updateBoundsCallback != null) { updateBoundsCallback.accept(toBounds); } @@ -294,7 +296,8 @@ public class PipTaskOrganizer extends TaskOrganizer implements public void onTransactionReady(int id, SurfaceControl.Transaction t) { t.apply(); scheduleAnimateResizePip(mLastReportedBounds, destinationBounds, - direction, animationDurationMs, null /* updateBoundsCallback */); + null /* sourceHintRect */, direction, animationDurationMs, + null /* updateBoundsCallback */); mInPip = false; } }); @@ -357,7 +360,8 @@ public class PipTaskOrganizer extends TaskOrganizer implements final Rect currentBounds = mTaskInfo.configuration.windowConfiguration.getBounds(); if (mOneShotAnimationType == ANIM_TYPE_BOUNDS) { - scheduleAnimateResizePip(currentBounds, destinationBounds, + final Rect sourceHintRect = getValidSourceHintRect(info, currentBounds); + scheduleAnimateResizePip(currentBounds, destinationBounds, sourceHintRect, TRANSITION_DIRECTION_TO_PIP, mEnterExitAnimationDuration, null /* updateBoundsCallback */); } else if (mOneShotAnimationType == ANIM_TYPE_ALPHA) { @@ -368,6 +372,21 @@ public class PipTaskOrganizer extends TaskOrganizer implements } } + /** + * Returns the source hint rect if it is valid (if provided and is contained by the current + * task bounds). + */ + private Rect getValidSourceHintRect(ActivityManager.RunningTaskInfo info, Rect sourceBounds) { + final Rect sourceHintRect = info.pictureInPictureParams != null + && info.pictureInPictureParams.hasSourceBoundsHint() + ? info.pictureInPictureParams.getSourceRectHint() + : null; + if (sourceHintRect != null && sourceBounds.contains(sourceHintRect)) { + return sourceHintRect; + } + return null; + } + private void enterPipWithAlphaAnimation(Rect destinationBounds, long durationMs) { // If we are fading the PIP in, then we should move the pip to the final location as // soon as possible, but set the alpha immediately since the transaction can take a @@ -552,13 +571,13 @@ public class PipTaskOrganizer extends TaskOrganizer implements Log.d(TAG, "skip scheduleAnimateResizePip, entering pip deferred"); return; } - scheduleAnimateResizePip(mLastReportedBounds, toBounds, + scheduleAnimateResizePip(mLastReportedBounds, toBounds, null /* sourceHintRect */, TRANSITION_DIRECTION_NONE, duration, updateBoundsCallback); } private void scheduleAnimateResizePip(Rect currentBounds, Rect destinationBounds, - @PipAnimationController.TransitionDirection int direction, int durationMs, - Consumer<Rect> updateBoundsCallback) { + Rect sourceHintRect, @PipAnimationController.TransitionDirection int direction, + int durationMs, Consumer<Rect> updateBoundsCallback) { if (!mInPip) { // can be initiated in other component, ignore if we are no longer in PIP return; @@ -568,6 +587,7 @@ public class PipTaskOrganizer extends TaskOrganizer implements args.arg1 = updateBoundsCallback; args.arg2 = currentBounds; args.arg3 = destinationBounds; + args.arg4 = sourceHintRect; args.argi1 = direction; args.argi2 = durationMs; mUpdateHandler.sendMessage(mUpdateHandler.obtainMessage(MSG_RESIZE_ANIMATE, args)); @@ -667,7 +687,8 @@ public class PipTaskOrganizer extends TaskOrganizer implements } final Rect destinationBounds = new Rect(originalBounds); destinationBounds.offset(xOffset, yOffset); - animateResizePip(originalBounds, destinationBounds, TRANSITION_DIRECTION_SAME, durationMs); + animateResizePip(originalBounds, destinationBounds, null /* sourceHintRect */, + TRANSITION_DIRECTION_SAME, durationMs); } private void resizePip(Rect destinationBounds) { @@ -745,7 +766,7 @@ public class PipTaskOrganizer extends TaskOrganizer implements WindowOrganizer.applyTransaction(wct); } - private void animateResizePip(Rect currentBounds, Rect destinationBounds, + private void animateResizePip(Rect currentBounds, Rect destinationBounds, Rect sourceHintRect, @PipAnimationController.TransitionDirection int direction, int durationMs) { if (Looper.myLooper() != mUpdateHandler.getLooper()) { throw new RuntimeException("Callers should call scheduleAnimateResizePip() instead of " @@ -757,7 +778,7 @@ public class PipTaskOrganizer extends TaskOrganizer implements return; } mPipAnimationController - .getAnimator(mLeash, currentBounds, destinationBounds) + .getAnimator(mLeash, currentBounds, destinationBounds, sourceHintRect) .setTransitionDirection(direction) .setPipAnimationCallback(mPipAnimationCallback) .setDuration(durationMs) diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipResizeGestureHandler.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipResizeGestureHandler.java index 4b23e678b15d..bafbd216b1a2 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipResizeGestureHandler.java +++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipResizeGestureHandler.java @@ -292,20 +292,29 @@ public class PipResizeGestureHandler { break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: - mPipTaskOrganizer.scheduleFinishResizePip(mLastResizeBounds, (Rect bounds) -> { - new Handler(Looper.getMainLooper()).post(() -> { - mMotionHelper.synchronizePinnedStackBounds(); - mUpdateMovementBoundsRunnable.run(); - mCtrlType = CTRL_NONE; - mAllowGesture = false; - mThresholdCrossed = false; - }); - }); + if (!mLastResizeBounds.isEmpty()) { + mPipTaskOrganizer.scheduleFinishResizePip(mLastResizeBounds, + (Rect bounds) -> { + new Handler(Looper.getMainLooper()).post(() -> { + mMotionHelper.synchronizePinnedStackBounds(); + mUpdateMovementBoundsRunnable.run(); + resetState(); + }); + }); + } else { + resetState(); + } break; } } } + private void resetState() { + mCtrlType = CTRL_NONE; + mAllowGesture = false; + mThresholdCrossed = false; + } + void updateMaxSize(int maxX, int maxY) { mMaxSize.set(maxX, maxY); } diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java index c274ee96b170..1ddb1f51670b 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java +++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java @@ -161,6 +161,7 @@ public class PipTouchHandler { private float mSavedSnapFraction = -1f; private boolean mSendingHoverAccessibilityEvents; private boolean mMovementWithinDismiss; + private boolean mHideMenuAfterShown = false; private PipAccessibilityInteractionConnection mConnection; // Touch state @@ -605,11 +606,9 @@ public class PipTouchHandler { MotionEvent ev = (MotionEvent) inputEvent; - - if (mPipResizeGestureHandler.isWithinTouchRegion((int) ev.getX(), (int) ev.getY())) { + if (mPipResizeGestureHandler.isWithinTouchRegion((int) ev.getRawX(), (int) ev.getRawY())) { return true; } - if (mMagnetizedPip.maybeConsumeMotionEvent(ev)) { // If the first touch event occurs within the magnetic field, pass the ACTION_DOWN event // to the touch state. Touch state needs a DOWN event in order to later process MOVE @@ -677,6 +676,7 @@ public class PipTouchHandler { break; } case MotionEvent.ACTION_HOVER_EXIT: { + mHideMenuAfterShown = true; // If Touch Exploration is enabled, some a11y services (e.g. Talkback) is probably // on and changing MotionEvents into HoverEvents. // Let's not enable menu show/hide for a11y services. @@ -767,6 +767,9 @@ public class PipTouchHandler { mSavedSnapFraction = mMotionHelper.animateToExpandedState(expandedBounds, mMovementBounds, mExpandedMovementBounds, callback); } + if (mHideMenuAfterShown) { + mMenuController.hideMenu(); + } } else if (menuState == MENU_STATE_NONE && mMenuState == MENU_STATE_FULL) { // Try and restore the PiP to the closest edge, using the saved snap fraction // if possible @@ -804,6 +807,7 @@ public class PipTouchHandler { } } mMenuState = menuState; + mHideMenuAfterShown = false; updateMovementBounds(); // If pip menu has dismissed, we should register the A11y ActionReplacingConnection for pip // as well, or it can't handle a11y focus and pip menu can't perform any action. diff --git a/packages/SystemUI/src/com/android/systemui/power/EnhancedEstimatesImpl.java b/packages/SystemUI/src/com/android/systemui/power/EnhancedEstimatesImpl.java index 78f53501d100..7d54c211242f 100644 --- a/packages/SystemUI/src/com/android/systemui/power/EnhancedEstimatesImpl.java +++ b/packages/SystemUI/src/com/android/systemui/power/EnhancedEstimatesImpl.java @@ -1,6 +1,7 @@ package com.android.systemui.power; import com.android.settingslib.fuelgauge.Estimate; +import com.android.settingslib.fuelgauge.EstimateKt; import javax.inject.Inject; import javax.inject.Singleton; @@ -19,7 +20,10 @@ public class EnhancedEstimatesImpl implements EnhancedEstimates { @Override public Estimate getEstimate() { - return null; + // Returns an unknown estimate. + return new Estimate(EstimateKt.ESTIMATE_MILLIS_UNKNOWN, + false /* isBasedOnUsage */, + EstimateKt.AVERAGE_TIME_TO_DISCHARGE_UNKNOWN); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/power/PowerUI.java b/packages/SystemUI/src/com/android/systemui/power/PowerUI.java index 48750fa5e769..078c540939aa 100644 --- a/packages/SystemUI/src/com/android/systemui/power/PowerUI.java +++ b/packages/SystemUI/src/com/android/systemui/power/PowerUI.java @@ -374,8 +374,10 @@ public class PowerUI extends SystemUI implements CommandQueue.Callbacks { BatteryStateSnapshot lastSnapshot) { // if we are now over 45% battery & 6 hours remaining so we can trigger hybrid // notification again + final long timeRemainingMillis = currentSnapshot.getTimeRemainingMillis(); if (currentSnapshot.getBatteryLevel() >= CHARGE_CYCLE_PERCENT_RESET - && currentSnapshot.getTimeRemainingMillis() > SIX_HOURS_MILLIS) { + && (timeRemainingMillis > SIX_HOURS_MILLIS + || timeRemainingMillis == NO_ESTIMATE_AVAILABLE)) { mLowWarningShownThisChargeCycle = false; mSevereWarningShownThisChargeCycle = false; if (DEBUG) { @@ -390,8 +392,8 @@ public class PowerUI extends SystemUI implements CommandQueue.Callbacks { mWarnings.showLowBatteryWarning(playSound); // mark if we've already shown a warning this cycle. This will prevent the notification // trigger from spamming users by only showing low/critical warnings once per cycle - if (currentSnapshot.getTimeRemainingMillis() - <= currentSnapshot.getSevereThresholdMillis() + if ((timeRemainingMillis != NO_ESTIMATE_AVAILABLE + && timeRemainingMillis <= currentSnapshot.getSevereThresholdMillis()) || currentSnapshot.getBatteryLevel() <= currentSnapshot.getSevereLevelThreshold()) { mSevereWarningShownThisChargeCycle = true; @@ -426,15 +428,18 @@ public class PowerUI extends SystemUI implements CommandQueue.Callbacks { return false; } + final long timeRemainingMillis = snapshot.getTimeRemainingMillis(); // Only show the low warning if enabled once per charge cycle & no battery saver final boolean canShowWarning = snapshot.isLowWarningEnabled() && !mLowWarningShownThisChargeCycle && !snapshot.isPowerSaver() - && (snapshot.getTimeRemainingMillis() < snapshot.getLowThresholdMillis() + && ((timeRemainingMillis != NO_ESTIMATE_AVAILABLE + && timeRemainingMillis < snapshot.getLowThresholdMillis()) || snapshot.getBatteryLevel() <= snapshot.getLowLevelThreshold()); // Only show the severe warning once per charge cycle final boolean canShowSevereWarning = !mSevereWarningShownThisChargeCycle - && (snapshot.getTimeRemainingMillis() < snapshot.getSevereThresholdMillis() + && ((timeRemainingMillis != NO_ESTIMATE_AVAILABLE + && timeRemainingMillis < snapshot.getSevereThresholdMillis()) || snapshot.getBatteryLevel() <= snapshot.getSevereLevelThreshold()); final boolean canShow = canShowWarning || canShowSevereWarning; diff --git a/packages/SystemUI/src/com/android/systemui/qs/PageIndicator.java b/packages/SystemUI/src/com/android/systemui/qs/PageIndicator.java index 0d614497190f..2c76d70fb3cc 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/PageIndicator.java +++ b/packages/SystemUI/src/com/android/systemui/qs/PageIndicator.java @@ -45,9 +45,6 @@ public class PageIndicator extends ViewGroup { } public void setNumPages(int numPages) { - if (numPages == getChildCount()) { - return; - } TypedArray array = getContext().obtainStyledAttributes( new int[]{android.R.attr.colorControlActivated}); int color = array.getColor(0, 0); @@ -55,12 +52,12 @@ public class PageIndicator extends ViewGroup { setNumPages(numPages, color); } - /** Oveload of setNumPages that allows the indicator color to be specified.*/ + /** Overload of setNumPages that allows the indicator color to be specified.*/ public void setNumPages(int numPages, int color) { + setVisibility(numPages > 1 ? View.VISIBLE : View.GONE); if (numPages == getChildCount()) { return; } - setVisibility(numPages > 1 ? View.VISIBLE : View.GONE); if (mAnimating) { Log.w(TAG, "setNumPages during animation"); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java b/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java index 4008918e267c..65d3572d04a3 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java @@ -355,10 +355,23 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, D } public void addTile(ComponentName tile) { + addTile(tile, /* end */ false); + } + + /** + * Adds a custom tile to the set of current tiles. + * @param tile the component name of the {@link android.service.quicksettings.TileService} + * @param end if true, the tile will be added at the end. If false, at the beginning. + */ + public void addTile(ComponentName tile, boolean end) { String spec = CustomTile.toSpec(tile); if (!mTileSpecs.contains(spec)) { List<String> newSpecs = new ArrayList<>(mTileSpecs); - newSpecs.add(0, spec); + if (end) { + newSpecs.add(spec); + } else { + newSpecs.add(0, spec); + } changeTiles(mTileSpecs, newSpecs); } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java index 191d4757258d..94b4cee92965 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java @@ -41,7 +41,6 @@ import com.android.systemui.qs.customize.QSCustomizer; import com.android.systemui.qs.logging.QSLogger; import com.android.systemui.tuner.TunerService; import com.android.systemui.tuner.TunerService.Tunable; -import com.android.systemui.util.Utils; import java.util.ArrayList; import java.util.Collection; @@ -82,8 +81,7 @@ public class QuickQSPanel extends QSPanel { MediaHost mediaHost, UiEventLogger uiEventLogger ) { - super(context, attrs, dumpManager, broadcastDispatcher, qsLogger, mediaHost, - uiEventLogger); + super(context, attrs, dumpManager, broadcastDispatcher, qsLogger, mediaHost, uiEventLogger); if (mFooter != null) { removeView(mFooter.getView()); } diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java b/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java index 3e268f63d65e..2ddd6aaf4c40 100644 --- a/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java +++ b/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java @@ -33,9 +33,7 @@ import android.os.Bundle; import android.os.IBinder; import android.os.RemoteException; import android.provider.Settings; -import android.util.DisplayMetrics; import android.util.Log; -import android.util.Size; import android.widget.Toast; import com.android.systemui.R; @@ -247,7 +245,8 @@ public class RecordingService extends Service implements MediaRecorder.OnInfoLis startForeground(NOTIFICATION_RECORDING_ID, notification); } - private Notification createSaveNotification(Uri uri) { + private Notification createSaveNotification(ScreenMediaRecorder.SavedRecording recording) { + Uri uri = recording.getUri(); Intent viewIntent = new Intent(Intent.ACTION_VIEW) .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_GRANT_READ_URI_PERMISSION) .setDataAndType(uri, "video/mp4"); @@ -290,16 +289,7 @@ public class RecordingService extends Service implements MediaRecorder.OnInfoLis .addExtras(extras); // Add thumbnail if available - Bitmap thumbnailBitmap = null; - try { - ContentResolver resolver = getContentResolver(); - DisplayMetrics metrics = getResources().getDisplayMetrics(); - Size size = new Size(metrics.widthPixels, metrics.heightPixels / 2); - thumbnailBitmap = resolver.loadThumbnail(uri, size, null); - } catch (IOException e) { - Log.e(TAG, "Error creating thumbnail: " + e.getMessage()); - e.printStackTrace(); - } + Bitmap thumbnailBitmap = recording.getThumbnail(); if (thumbnailBitmap != null) { Notification.BigPictureStyle pictureStyle = new Notification.BigPictureStyle() .bigPicture(thumbnailBitmap) diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenMediaRecorder.java b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenMediaRecorder.java index 8551c88d133a..1c7d987afff2 100644 --- a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenMediaRecorder.java +++ b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenMediaRecorder.java @@ -22,13 +22,17 @@ import static com.android.systemui.screenrecord.ScreenRecordingAudioSource.INTER import static com.android.systemui.screenrecord.ScreenRecordingAudioSource.MIC; import static com.android.systemui.screenrecord.ScreenRecordingAudioSource.MIC_AND_INTERNAL; +import android.annotation.Nullable; import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; +import android.graphics.Bitmap; import android.hardware.display.DisplayManager; import android.hardware.display.VirtualDisplay; +import android.media.MediaCodecInfo; import android.media.MediaMuxer; import android.media.MediaRecorder; +import android.media.ThumbnailUtils; import android.media.projection.IMediaProjection; import android.media.projection.IMediaProjectionManager; import android.media.projection.MediaProjection; @@ -40,6 +44,7 @@ import android.os.ServiceManager; import android.provider.MediaStore; import android.util.DisplayMetrics; import android.util.Log; +import android.util.Size; import android.view.Surface; import android.view.WindowManager; @@ -125,6 +130,9 @@ public class ScreenMediaRecorder { int vidBitRate = screenHeight * screenWidth * refereshRate / VIDEO_FRAME_RATE * VIDEO_FRAME_RATE_TO_RESOLUTION_RATIO; mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); + mMediaRecorder.setVideoEncodingProfileLevel( + MediaCodecInfo.CodecProfileLevel.AVCProfileHigh, + MediaCodecInfo.CodecProfileLevel.AVCLevel42); mMediaRecorder.setVideoSize(screenWidth, screenHeight); mMediaRecorder.setVideoFrameRate(refereshRate); mMediaRecorder.setVideoEncodingBitRate(vidBitRate); @@ -206,7 +214,7 @@ public class ScreenMediaRecorder { /** * Store recorded video */ - Uri save() throws IOException { + protected SavedRecording save() throws IOException { String fileName = new SimpleDateFormat("'screen-'yyyyMMdd-HHmmss'.mp4'") .format(new Date()); @@ -244,8 +252,38 @@ public class ScreenMediaRecorder { OutputStream os = resolver.openOutputStream(itemUri, "w"); Files.copy(mTempVideoFile.toPath(), os); os.close(); - mTempVideoFile.delete(); if (mTempAudioFile != null) mTempAudioFile.delete(); - return itemUri; + DisplayMetrics metrics = mContext.getResources().getDisplayMetrics(); + Size size = new Size(metrics.widthPixels, metrics.heightPixels); + SavedRecording recording = new SavedRecording(itemUri, mTempVideoFile, size); + mTempVideoFile.delete(); + return recording; + } + + /** + * Object representing the recording + */ + public class SavedRecording { + + private Uri mUri; + private Bitmap mThumbnailBitmap; + + protected SavedRecording(Uri uri, File file, Size thumbnailSize) { + mUri = uri; + try { + mThumbnailBitmap = ThumbnailUtils.createVideoThumbnail( + file, thumbnailSize, null); + } catch (IOException e) { + Log.e(TAG, "Error creating thumbnail", e); + } + } + + public Uri getUri() { + return mUri; + } + + public @Nullable Bitmap getThumbnail() { + return mThumbnailBitmap; + } } } diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java index 9b1734d40674..a624479fa63c 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java @@ -643,6 +643,18 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset */ private void showUiOnActionsReady(SavedImageData imageData) { logSuccessOnActionsReady(imageData); + + AccessibilityManager accessibilityManager = (AccessibilityManager) + mContext.getSystemService(Context.ACCESSIBILITY_SERVICE); + long timeoutMs = accessibilityManager.getRecommendedTimeoutMillis( + SCREENSHOT_CORNER_DEFAULT_TIMEOUT_MILLIS, + AccessibilityManager.FLAG_CONTENT_CONTROLS); + + mScreenshotHandler.removeMessages(MESSAGE_CORNER_TIMEOUT); + mScreenshotHandler.sendMessageDelayed( + mScreenshotHandler.obtainMessage(MESSAGE_CORNER_TIMEOUT), + timeoutMs); + if (imageData.uri != null) { mScreenshotHandler.post(() -> { if (mScreenshotAnimation != null && mScreenshotAnimation.isRunning()) { @@ -656,17 +668,6 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset } else { createScreenshotActionsShadeAnimation(imageData).start(); } - - AccessibilityManager accessibilityManager = (AccessibilityManager) - mContext.getSystemService(Context.ACCESSIBILITY_SERVICE); - long timeoutMs = accessibilityManager.getRecommendedTimeoutMillis( - SCREENSHOT_CORNER_DEFAULT_TIMEOUT_MILLIS, - AccessibilityManager.FLAG_CONTENT_CONTROLS); - - mScreenshotHandler.removeMessages(MESSAGE_CORNER_TIMEOUT); - mScreenshotHandler.sendMessageDelayed( - mScreenshotHandler.obtainMessage(MESSAGE_CORNER_TIMEOUT), - timeoutMs); }); } } diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java b/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java index a5bab212e6b7..221174f70d66 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java @@ -123,6 +123,7 @@ class SaveImageInBackgroundTask extends AsyncTask<Void, Void, Void> { if (isCancelled()) { return null; } + Thread.currentThread().setPriority(Thread.MAX_PRIORITY); ContentResolver resolver = mContext.getContentResolver(); Bitmap image = mParams.image; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java index 217148df60e2..5628a24f40ef 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java @@ -52,7 +52,6 @@ import com.android.systemui.Interpolators; import com.android.systemui.colorextraction.SysuiColorExtractor; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.media.MediaDataManager; -import com.android.systemui.media.MediaDeviceManager; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.dagger.StatusBarModule; import com.android.systemui.statusbar.notification.NotificationEntryListener; @@ -102,6 +101,12 @@ public class NotificationMediaManager implements Dumpable { PAUSED_MEDIA_STATES.add(PlaybackState.STATE_PAUSED); PAUSED_MEDIA_STATES.add(PlaybackState.STATE_ERROR); } + private static final HashSet<Integer> INACTIVE_MEDIA_STATES = new HashSet<>(); + static { + INACTIVE_MEDIA_STATES.add(PlaybackState.STATE_NONE); + INACTIVE_MEDIA_STATES.add(PlaybackState.STATE_STOPPED); + INACTIVE_MEDIA_STATES.add(PlaybackState.STATE_ERROR); + } private final NotificationEntryManager mEntryManager; private final MediaDataManager mMediaDataManager; @@ -190,8 +195,7 @@ public class NotificationMediaManager implements Dumpable { KeyguardBypassController keyguardBypassController, @Main DelayableExecutor mainExecutor, DeviceConfigProxy deviceConfig, - MediaDataManager mediaDataManager, - MediaDeviceManager mediaDeviceManager) { + MediaDataManager mediaDataManager) { mContext = context; mMediaArtworkProcessor = mediaArtworkProcessor; mKeyguardBypassController = keyguardBypassController; @@ -212,13 +216,11 @@ public class NotificationMediaManager implements Dumpable { @Override public void onPendingEntryAdded(NotificationEntry entry) { mediaDataManager.onNotificationAdded(entry.getKey(), entry.getSbn()); - mediaDeviceManager.onNotificationAdded(entry.getKey(), entry.getSbn()); } @Override public void onPreEntryUpdated(NotificationEntry entry) { mediaDataManager.onNotificationAdded(entry.getKey(), entry.getSbn()); - mediaDeviceManager.onNotificationAdded(entry.getKey(), entry.getSbn()); } @Override @@ -239,7 +241,6 @@ public class NotificationMediaManager implements Dumpable { int reason) { onNotificationRemoved(entry.getKey()); mediaDataManager.onNotificationRemoved(entry.getKey()); - mediaDeviceManager.onNotificationRemoved(entry.getKey()); } }); @@ -252,10 +253,24 @@ public class NotificationMediaManager implements Dumpable { mPropertiesChangedListener); } + /** + * Check if a state should be considered actively playing + * @param state a PlaybackState + * @return true if playing + */ public static boolean isPlayingState(int state) { return !PAUSED_MEDIA_STATES.contains(state); } + /** + * Check if a state should be considered active (playing or paused) + * @param state a PlaybackState + * @return true if active + */ + public static boolean isActiveState(int state) { + return !INACTIVE_MEDIA_STATES.contains(state); + } + public void setUpWithPresenter(NotificationPresenter presenter) { mPresenter = presenter; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java index 3dda15b5ce39..a8c03243c117 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java @@ -42,7 +42,6 @@ import com.android.systemui.statusbar.notification.stack.NotificationListContain import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.NotificationGroupManager; import com.android.systemui.util.Assert; -import com.android.systemui.util.Utils; import java.util.ArrayList; import java.util.HashMap; @@ -150,9 +149,7 @@ public class NotificationViewHierarchyManager implements DynamicPrivacyControlle final int N = activeNotifications.size(); for (int i = 0; i < N; i++) { NotificationEntry ent = activeNotifications.get(i); - boolean hideMedia = Utils.useQsMediaPlayer(mContext); if (ent.isRowDismissed() || ent.isRowRemoved() - || (ent.isMediaNotification() && hideMedia) || mBubbleController.isBubbleNotificationSuppressedFromShade(ent) || mFgsSectionController.hasEntry(ent)) { // we don't want to update removed notifications because they could diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarDependenciesModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarDependenciesModule.java index c988e1251d3f..84c8db3218e7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarDependenciesModule.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarDependenciesModule.java @@ -24,7 +24,6 @@ import com.android.internal.statusbar.IStatusBarService; import com.android.systemui.bubbles.BubbleController; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.media.MediaDataManager; -import com.android.systemui.media.MediaDeviceManager; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.ActionClickLogger; import com.android.systemui.statusbar.CommandQueue; @@ -51,8 +50,6 @@ import com.android.systemui.tracing.ProtoTracer; import com.android.systemui.util.DeviceConfigProxy; import com.android.systemui.util.concurrency.DelayableExecutor; -import java.util.concurrent.Executor; - import javax.inject.Singleton; import dagger.Lazy; @@ -105,8 +102,7 @@ public interface StatusBarDependenciesModule { KeyguardBypassController keyguardBypassController, @Main DelayableExecutor mainExecutor, DeviceConfigProxy deviceConfigProxy, - MediaDataManager mediaDataManager, - MediaDeviceManager mediaDeviceManager) { + MediaDataManager mediaDataManager) { return new NotificationMediaManager( context, statusBarLazy, @@ -116,8 +112,7 @@ public interface StatusBarDependenciesModule { keyguardBypassController, mainExecutor, deviceConfigProxy, - mediaDataManager, - mediaDeviceManager); + mediaDataManager); } /** */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationFilter.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationFilter.java index 3afd6235b287..6335a09cde2b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationFilter.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationFilter.java @@ -16,6 +16,8 @@ package com.android.systemui.statusbar.notification; +import static com.android.systemui.media.MediaDataManagerKt.isMediaNotification; + import android.Manifest; import android.app.AppGlobals; import android.app.Notification; @@ -27,6 +29,7 @@ import android.service.notification.StatusBarNotification; import com.android.internal.annotations.VisibleForTesting; import com.android.systemui.Dependency; import com.android.systemui.ForegroundServiceController; +import com.android.systemui.media.MediaFeatureFlag; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.NotificationLockscreenUserManager; import com.android.systemui.statusbar.notification.collection.NotificationEntry; @@ -46,6 +49,7 @@ public class NotificationFilter { private final NotificationGroupManager mGroupManager = Dependency.get( NotificationGroupManager.class); private final StatusBarStateController mStatusBarStateController; + private final Boolean mIsMediaFlagEnabled; private NotificationEntryManager.KeyguardEnvironment mEnvironment; private ShadeController mShadeController; @@ -53,8 +57,11 @@ public class NotificationFilter { private NotificationLockscreenUserManager mUserManager; @Inject - public NotificationFilter(StatusBarStateController statusBarStateController) { + public NotificationFilter( + StatusBarStateController statusBarStateController, + MediaFeatureFlag mediaFeatureFlag) { mStatusBarStateController = statusBarStateController; + mIsMediaFlagEnabled = mediaFeatureFlag.getEnabled(); } private NotificationEntryManager.KeyguardEnvironment getEnvironment() { @@ -133,6 +140,10 @@ public class NotificationFilter { } } } + + if (mIsMediaFlagEnabled && isMediaNotification(sbn)) { + return true; + } return false; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/MediaCoordinator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/MediaCoordinator.java new file mode 100644 index 000000000000..026a3ffb73cd --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/MediaCoordinator.java @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.notification.collection.coordinator; + +import static com.android.systemui.media.MediaDataManagerKt.isMediaNotification; + +import com.android.systemui.media.MediaFeatureFlag; +import com.android.systemui.statusbar.notification.collection.NotifPipeline; +import com.android.systemui.statusbar.notification.collection.NotificationEntry; +import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifFilter; + +import javax.inject.Inject; + +/** + * Coordinates hiding (filtering) of media notifications. + */ +public class MediaCoordinator implements Coordinator { + private static final String TAG = "MediaCoordinator"; + + private final Boolean mIsMediaFeatureEnabled; + + private final NotifFilter mMediaFilter = new NotifFilter(TAG) { + @Override + public boolean shouldFilterOut(NotificationEntry entry, long now) { + return mIsMediaFeatureEnabled && isMediaNotification(entry.getSbn()); + } + }; + + @Inject + public MediaCoordinator(MediaFeatureFlag featureFlag) { + mIsMediaFeatureEnabled = featureFlag.getEnabled(); + } + + @Override + public void attach(NotifPipeline pipeline) { + pipeline.addFinalizeFilter(mMediaFilter); + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/NotifCoordinators.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/NotifCoordinators.java index 2b279bbd553a..ac4296439507 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/NotifCoordinators.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/NotifCoordinators.java @@ -57,7 +57,8 @@ public class NotifCoordinators implements Dumpable { BubbleCoordinator bubbleCoordinator, HeadsUpCoordinator headsUpCoordinator, ConversationCoordinator conversationCoordinator, - PreparationCoordinator preparationCoordinator) { + PreparationCoordinator preparationCoordinator, + MediaCoordinator mediaCoordinator) { dumpManager.registerDumpable(TAG, this); mCoordinators.add(new HideLocallyDismissedNotifsCoordinator()); mCoordinators.add(hideNotifsForOtherUsersCoordinator); @@ -72,6 +73,7 @@ public class NotifCoordinators implements Dumpable { mCoordinators.add(preparationCoordinator); } // TODO: add new Coordinators here! (b/112656837) + mCoordinators.add(mediaCoordinator); // TODO: add the sections in a particular ORDER (HeadsUp < People < Alerting) for (Coordinator c : mCoordinators) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ChannelEditorDialogController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ChannelEditorDialogController.kt index b163818f68a8..93db9cdf85ef 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ChannelEditorDialogController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ChannelEditorDialogController.kt @@ -341,7 +341,6 @@ class ChannelEditorDialogController @Inject constructor( } private val wmFlags = (WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS - or WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN or WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH or WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED) } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java index 9925909c3e16..b0861bfbd643 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java @@ -557,9 +557,9 @@ public class NotificationContentView extends FrameLayout { private void focusExpandButtonIfNecessary() { if (mFocusOnVisibilityChange) { - NotificationHeaderView header = getVisibleNotificationHeader(); - if (header != null) { - ImageView expandButton = header.getExpandButton(); + NotificationViewWrapper wrapper = getVisibleWrapper(mVisibleType); + if (wrapper != null) { + View expandButton = wrapper.getExpandButton(); if (expandButton != null) { expandButton.requestAccessibilityFocus(); } @@ -1348,7 +1348,9 @@ public class NotificationContentView extends FrameLayout { } ImageView bubbleButton = layout.findViewById(com.android.internal.R.id.bubble_button); View actionContainer = layout.findViewById(com.android.internal.R.id.actions_container); - if (bubbleButton == null || actionContainer == null) { + LinearLayout actionContainerLayout = + layout.findViewById(com.android.internal.R.id.actions_container_layout); + if (bubbleButton == null || actionContainer == null || actionContainerLayout == null) { return; } boolean isPersonWithShortcut = @@ -1374,8 +1376,16 @@ public class NotificationContentView extends FrameLayout { bubbleButton.setOnClickListener(mContainingNotification.getBubbleClickListener()); bubbleButton.setVisibility(VISIBLE); actionContainer.setVisibility(VISIBLE); + + int paddingEnd = getResources().getDimensionPixelSize( + com.android.internal.R.dimen.bubble_visible_padding_end); + actionContainerLayout.setPaddingRelative(0, 0, paddingEnd, 0); } else { bubbleButton.setVisibility(GONE); + + int paddingEnd = getResources().getDimensionPixelSize( + com.android.internal.R.dimen.bubble_gone_padding_end); + actionContainerLayout.setPaddingRelative(0, 0, paddingEnd, 0); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/PriorityOnboardingDialogController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/PriorityOnboardingDialogController.kt index 88c325880241..c88f0bdc2acb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/PriorityOnboardingDialogController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/PriorityOnboardingDialogController.kt @@ -184,7 +184,6 @@ class PriorityOnboardingDialogController @Inject constructor( } private val wmFlags = (WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS - or WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN or WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH or WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED) } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationConversationTemplateViewWrapper.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationConversationTemplateViewWrapper.kt index 15499b87d56d..fe70c818216e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationConversationTemplateViewWrapper.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationConversationTemplateViewWrapper.kt @@ -50,6 +50,7 @@ class NotificationConversationTemplateViewWrapper constructor( private lateinit var conversationBadgeBg: View private lateinit var expandButton: View private lateinit var expandButtonContainer: View + private lateinit var expandButtonInnerContainer: View private lateinit var imageMessageContainer: ViewGroup private lateinit var messagingLinearLayout: MessagingLinearLayout private lateinit var conversationTitleView: View @@ -69,6 +70,8 @@ class NotificationConversationTemplateViewWrapper constructor( expandButton = requireViewById(com.android.internal.R.id.expand_button) expandButtonContainer = requireViewById(com.android.internal.R.id.expand_button_container) + expandButtonInnerContainer = + requireViewById(com.android.internal.R.id.expand_button_inner_container) importanceRing = requireViewById(com.android.internal.R.id.conversation_icon_badge_ring) appName = requireViewById(com.android.internal.R.id.app_name_text) conversationTitleView = requireViewById(com.android.internal.R.id.conversation_text) @@ -134,6 +137,8 @@ class NotificationConversationTemplateViewWrapper constructor( ) } + override fun getExpandButton() = expandButtonInnerContainer + override fun setShelfIconVisible(visible: Boolean) { if (conversationLayout.isImportantConversation) { if (conversationIconView.visibility != GONE) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationHeaderViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationHeaderViewWrapper.java index f8b783113ccb..4c9cb209424a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationHeaderViewWrapper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationHeaderViewWrapper.java @@ -317,6 +317,11 @@ public class NotificationHeaderViewWrapper extends NotificationViewWrapper { } @Override + public View getExpandButton() { + return mExpandButton; + } + + @Override public int getOriginalIconColor() { return mIcon.getOriginalIconColor(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationViewWrapper.java index 02e537d2879f..30080e3d8cc2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationViewWrapper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationViewWrapper.java @@ -240,6 +240,13 @@ public abstract class NotificationViewWrapper implements TransformableView { return null; } + /** + * @return the expand button if it exists + */ + public @Nullable View getExpandButton() { + return null; + } + public int getOriginalIconColor() { return Notification.COLOR_INVALID; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManager.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManager.kt index ba7675f27cf4..0bdac39f35e9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManager.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManager.kt @@ -287,21 +287,17 @@ class NotificationSectionsManager @Inject internal constructor( // Is there a section discontinuity? This usually occurs due to HUNs if (prev?.entry?.bucket?.let { it > child.entry.bucket } == true) { // Remove existing headers, and move the Incoming header if necessary - if (alertingHeaderTarget != -1) { - if (showHeaders && incomingHeaderTarget != -1) { - incomingHeaderTarget = alertingHeaderTarget - } - alertingHeaderTarget = -1 - } - if (peopleHeaderTarget != -1) { - if (showHeaders && incomingHeaderTarget != -1) { - incomingHeaderTarget = peopleHeaderTarget - } - peopleHeaderTarget = -1 - } - if (showHeaders && incomingHeaderTarget == -1) { - incomingHeaderTarget = 0 + incomingHeaderTarget = when { + !showHeaders -> -1 + incomingHeaderTarget != -1 -> incomingHeaderTarget + peopleHeaderTarget != -1 -> peopleHeaderTarget + alertingHeaderTarget != -1 -> alertingHeaderTarget + gentleHeaderTarget != -1 -> gentleHeaderTarget + else -> 0 } + peopleHeaderTarget = -1 + alertingHeaderTarget = -1 + gentleHeaderTarget = -1 // Walk backwards changing all previous notifications to the Incoming // section for (j in i - 1 downTo lastIncomingIndex + 1) { @@ -323,6 +319,9 @@ class NotificationSectionsManager @Inject internal constructor( peopleHeaderTarget = i // Offset the target if there are other headers before this that // will be moved. + if (currentIncomingHeaderIdx != -1 && incomingHeaderTarget == -1) { + peopleHeaderTarget-- + } if (currentPeopleHeaderIdx != -1) { peopleHeaderTarget-- } @@ -340,6 +339,13 @@ class NotificationSectionsManager @Inject internal constructor( alertingHeaderTarget = i // Offset the target if there are other headers before this that // will be moved. + if (currentIncomingHeaderIdx != -1 && incomingHeaderTarget == -1) { + alertingHeaderTarget-- + } + if (currentPeopleHeaderIdx != -1 && peopleHeaderTarget == -1) { + // People header will be removed + alertingHeaderTarget-- + } if (currentAlertingHeaderIdx != -1) { alertingHeaderTarget-- } @@ -354,6 +360,17 @@ class NotificationSectionsManager @Inject internal constructor( gentleHeaderTarget = i // Offset the target if there are other headers before this that // will be moved. + if (currentIncomingHeaderIdx != -1 && incomingHeaderTarget == -1) { + gentleHeaderTarget-- + } + if (currentPeopleHeaderIdx != -1 && peopleHeaderTarget == -1) { + // People header will be removed + gentleHeaderTarget-- + } + if (currentAlertingHeaderIdx != -1 && alertingHeaderTarget == -1) { + // Alerting header will be removed + gentleHeaderTarget-- + } if (currentGentleHeaderIdx != -1) { gentleHeaderTarget-- } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoTileManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoTileManager.java index 79515415f1c3..fc8c8dbba7fd 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoTileManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoTileManager.java @@ -274,7 +274,7 @@ public class AutoTileManager { } if (value != 0) { if (mSpec.startsWith(CustomTile.PREFIX)) { - mHost.addTile(CustomTile.getComponentFromSpec(mSpec)); + mHost.addTile(CustomTile.getComponentFromSpec(mSpec), /* end */ true); } else { mHost.addTile(mSpec); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java index 76c51d61459a..9d3e915cad69 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java @@ -19,6 +19,7 @@ import com.android.internal.util.ContrastColorUtil; import com.android.settingslib.Utils; import com.android.systemui.Interpolators; import com.android.systemui.R; +import com.android.systemui.bubbles.BubbleController; import com.android.systemui.plugins.DarkIconDispatcher; import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver; import com.android.systemui.plugins.statusbar.StatusBarStateController; @@ -55,6 +56,7 @@ public class NotificationIconAreaController implements DarkReceiver, private final NotificationWakeUpCoordinator mWakeUpCoordinator; private final KeyguardBypassController mBypassController; private final DozeParameters mDozeParameters; + private final BubbleController mBubbleController; private int mIconSize; private int mIconHPadding; @@ -101,7 +103,8 @@ public class NotificationIconAreaController implements DarkReceiver, KeyguardBypassController keyguardBypassController, NotificationMediaManager notificationMediaManager, NotificationListener notificationListener, - DozeParameters dozeParameters) { + DozeParameters dozeParameters, + BubbleController bubbleController) { mStatusBar = statusBar; mContrastColorUtil = ContrastColorUtil.getInstance(context); mContext = context; @@ -112,6 +115,7 @@ public class NotificationIconAreaController implements DarkReceiver, mWakeUpCoordinator = wakeUpCoordinator; wakeUpCoordinator.addListener(this); mBypassController = keyguardBypassController; + mBubbleController = bubbleController; notificationListener.addNotificationSettingsListener(mSettingsListener); initializeNotificationAreaViews(context); @@ -291,6 +295,9 @@ public class NotificationIconAreaController implements DarkReceiver, || !entry.isPulseSuppressed())) { return false; } + if (mBubbleController.isBubbleExpanded(entry)) { + return false; + } return true; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index e0e52001e740..1bc42d1a169d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -2253,6 +2253,8 @@ public class StatusBar extends SystemUI implements DemoMode, updateHideIconsForBouncer(false /* animate */); } } + + updateBubblesVisibility(); } @Override @@ -2268,6 +2270,8 @@ public class StatusBar extends SystemUI implements DemoMode, } mLightBarController.onStatusBarAppearanceChanged(appearanceRegions, barModeChanged, mStatusBarMode, navbarColorManagedByIme); + + updateBubblesVisibility(); } @Override @@ -2311,6 +2315,7 @@ public class StatusBar extends SystemUI implements DemoMode, final int barMode = barMode(mTransientShown, mAppearance); if (updateBarMode(barMode)) { mLightBarController.onStatusBarModeChanged(barMode); + updateBubblesVisibility(); } } @@ -2395,6 +2400,14 @@ public class StatusBar extends SystemUI implements DemoMode, mNotificationPanelViewController.setQsScrimEnabled(scrimEnabled); } + /** Temporarily hides Bubbles if the status bar is hidden. */ + private void updateBubblesVisibility() { + mBubbleController.onStatusBarVisibilityChanged( + mStatusBarMode != MODE_LIGHTS_OUT + && mStatusBarMode != MODE_LIGHTS_OUT_TRANSPARENT + && !mStatusBarWindowHidden); + } + void checkBarMode(@TransitionMode int mode, @WindowVisibleState int windowState, BarTransitions transitions) { final boolean anim = !mNoAnimationOnNextBarModeChange && mDeviceInteractive diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java index c2f246f3922f..58f5d2a5b43f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java @@ -52,6 +52,9 @@ import android.widget.ImageView; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.logging.MetricsLogger; +import com.android.internal.logging.UiEvent; +import com.android.internal.logging.UiEventLogger; +import com.android.internal.logging.UiEventLoggerImpl; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.systemui.Dependency; import com.android.systemui.R; @@ -64,6 +67,7 @@ public class KeyButtonView extends ImageView implements ButtonInterface { private static final String TAG = KeyButtonView.class.getSimpleName(); private final boolean mPlaySounds; + private final UiEventLogger mUiEventLogger; private int mContentDescriptionRes; private long mDownTime; private int mCode; @@ -72,7 +76,7 @@ public class KeyButtonView extends ImageView implements ButtonInterface { private boolean mIsVertical; private AudioManager mAudioManager; private boolean mGestureAborted; - private boolean mLongClicked; + @VisibleForTesting boolean mLongClicked; private OnClickListener mOnClickListener; private final KeyButtonRipple mRipple; private final OverviewProxyService mOverviewProxyService; @@ -82,6 +86,40 @@ public class KeyButtonView extends ImageView implements ButtonInterface { private float mDarkIntensity; private boolean mHasOvalBg = false; + @VisibleForTesting + public enum NavBarActionsEvent implements UiEventLogger.UiEventEnum { + + @UiEvent(doc = "The home button was pressed in the navigation bar.") + NAVBAR_HOME_BUTTON_TAP(533), + + @UiEvent(doc = "The back button was pressed in the navigation bar.") + NAVBAR_BACK_BUTTON_TAP(534), + + @UiEvent(doc = "The overview button was pressed in the navigation bar.") + NAVBAR_OVERVIEW_BUTTON_TAP(535), + + @UiEvent(doc = "The home button was long-pressed in the navigation bar.") + NAVBAR_HOME_BUTTON_LONGPRESS(536), + + @UiEvent(doc = "The back button was long-pressed in the navigation bar.") + NAVBAR_BACK_BUTTON_LONGPRESS(537), + + @UiEvent(doc = "The overview button was long-pressed in the navigation bar.") + NAVBAR_OVERVIEW_BUTTON_LONGPRESS(538), + + NONE(0); // an event we should not log + + private final int mId; + + NavBarActionsEvent(int id) { + mId = id; + } + + @Override + public int getId() { + return mId; + } + } private final Runnable mCheckLongPress = new Runnable() { public void run() { if (isPressed()) { @@ -104,12 +142,14 @@ public class KeyButtonView extends ImageView implements ButtonInterface { } public KeyButtonView(Context context, AttributeSet attrs, int defStyle) { - this(context, attrs, defStyle, InputManager.getInstance()); + this(context, attrs, defStyle, InputManager.getInstance(), new UiEventLoggerImpl()); } @VisibleForTesting - public KeyButtonView(Context context, AttributeSet attrs, int defStyle, InputManager manager) { + public KeyButtonView(Context context, AttributeSet attrs, int defStyle, InputManager manager, + UiEventLogger uiEventLogger) { super(context, attrs); + mUiEventLogger = uiEventLogger; TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.KeyButtonView, defStyle, 0); @@ -326,13 +366,48 @@ public class KeyButtonView extends ImageView implements ButtonInterface { sendEvent(action, flags, SystemClock.uptimeMillis()); } + private void logSomePresses(int action, int flags) { + boolean longPressSet = (flags & KeyEvent.FLAG_LONG_PRESS) != 0; + NavBarActionsEvent uiEvent = NavBarActionsEvent.NONE; + if (action == MotionEvent.ACTION_UP && mLongClicked) { + return; // don't log the up after a long press + } + if (action == MotionEvent.ACTION_DOWN && !longPressSet) { + return; // don't log a down unless it is also the long press marker + } + if ((flags & KeyEvent.FLAG_CANCELED) != 0 + || (flags & KeyEvent.FLAG_CANCELED_LONG_PRESS) != 0) { + return; // don't log various cancels + } + switch(mCode) { + case KeyEvent.KEYCODE_BACK: + uiEvent = longPressSet + ? NavBarActionsEvent.NAVBAR_BACK_BUTTON_LONGPRESS + : NavBarActionsEvent.NAVBAR_BACK_BUTTON_TAP; + break; + case KeyEvent.KEYCODE_HOME: + uiEvent = longPressSet + ? NavBarActionsEvent.NAVBAR_HOME_BUTTON_LONGPRESS + : NavBarActionsEvent.NAVBAR_HOME_BUTTON_TAP; + break; + case KeyEvent.KEYCODE_APP_SWITCH: + uiEvent = longPressSet + ? NavBarActionsEvent.NAVBAR_OVERVIEW_BUTTON_LONGPRESS + : NavBarActionsEvent.NAVBAR_OVERVIEW_BUTTON_TAP; + break; + } + if (uiEvent != NavBarActionsEvent.NONE) { + mUiEventLogger.log(uiEvent); + } + } + private void sendEvent(int action, int flags, long when) { mMetricsLogger.write(new LogMaker(MetricsEvent.ACTION_NAV_BUTTON_EVENT) .setType(MetricsEvent.TYPE_ACTION) .setSubtype(mCode) .addTaggedData(MetricsEvent.FIELD_NAV_ACTION, action) .addTaggedData(MetricsEvent.FIELD_FLAGS, flags)); - // TODO(b/122195391): Added logs to make sure sysui is sending back button events + logSomePresses(action, flags); if (mCode == KeyEvent.KEYCODE_BACK && flags != KeyEvent.FLAG_LONG_PRESS) { Log.i(TAG, "Back button event: " + KeyEvent.actionToString(action)); if (action == MotionEvent.ACTION_UP) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java index b4de3cd5d43b..18a7adda3f7d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java @@ -640,8 +640,7 @@ public class MobileSignalController extends SignalController< + " dataState=" + state.getDataRegistrationState()); } mServiceState = state; - // onDisplayInfoChanged is invoked directly after onServiceStateChanged, so not calling - // updateTelephony() to prevent icon flickering in case of overrides. + updateTelephony(); } @Override @@ -651,12 +650,6 @@ public class MobileSignalController extends SignalController< + " type=" + networkType); } mDataState = state; - if (networkType != mTelephonyDisplayInfo.getNetworkType()) { - Log.d(mTag, "onDataConnectionStateChanged:" - + " network type change and reset displayInfo. type=" + networkType); - mTelephonyDisplayInfo = new TelephonyDisplayInfo(networkType, - TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE); - } updateTelephony(); } diff --git a/packages/SystemUI/src/com/android/systemui/util/DismissCircleView.java b/packages/SystemUI/src/com/android/systemui/util/DismissCircleView.java index 6c3538cb6142..a31ea7c3ab17 100644 --- a/packages/SystemUI/src/com/android/systemui/util/DismissCircleView.java +++ b/packages/SystemUI/src/com/android/systemui/util/DismissCircleView.java @@ -40,7 +40,7 @@ public class DismissCircleView extends FrameLayout { setBackground(res.getDrawable(R.drawable.dismiss_circle_background)); - mIconView.setImageDrawable(res.getDrawable(R.drawable.dismiss_target_x)); + mIconView.setImageDrawable(res.getDrawable(R.drawable.ic_close_white)); addView(mIconView); setViewSizes(); diff --git a/packages/SystemUI/src/com/android/systemui/util/Utils.java b/packages/SystemUI/src/com/android/systemui/util/Utils.java index b1792d003290..5c9db54a0f00 100644 --- a/packages/SystemUI/src/com/android/systemui/util/Utils.java +++ b/packages/SystemUI/src/com/android/systemui/util/Utils.java @@ -133,4 +133,13 @@ public class Utils { Settings.Global.SHOW_MEDIA_ON_QUICK_SETTINGS, 1); return flag > 0; } + + /** + * Allow media resumption controls. Requires {@link #useQsMediaPlayer(Context)} to be enabled. + * Off by default, but can be enabled by setting to 1 + */ + public static boolean useMediaResumption(Context context) { + int flag = Settings.System.getInt(context.getContentResolver(), "qs_media_resumption", 0); + return useQsMediaPlayer(context) && flag > 0; + } } diff --git a/packages/SystemUI/src/com/android/systemui/util/animation/PhysicsAnimator.kt b/packages/SystemUI/src/com/android/systemui/util/animation/PhysicsAnimator.kt index 5df5f405b169..318a6d727e5c 100644 --- a/packages/SystemUI/src/com/android/systemui/util/animation/PhysicsAnimator.kt +++ b/packages/SystemUI/src/com/android/systemui/util/animation/PhysicsAnimator.kt @@ -26,6 +26,7 @@ import androidx.dynamicanimation.animation.FloatPropertyCompat import androidx.dynamicanimation.animation.SpringAnimation import androidx.dynamicanimation.animation.SpringForce import com.android.systemui.util.animation.PhysicsAnimator.Companion.getInstance +import java.lang.ref.WeakReference import java.util.WeakHashMap import kotlin.math.abs import kotlin.math.max @@ -87,7 +88,9 @@ private var verboseLogging = false * * @param T The type of the object being animated. */ -class PhysicsAnimator<T> private constructor (val target: T) { +class PhysicsAnimator<T> private constructor (target: T) { + /** Weak reference to the animation target. */ + val weakTarget = WeakReference(target) /** Data class for representing animation frame updates. */ data class AnimationUpdate(val value: Float, val velocity: Float) @@ -307,6 +310,11 @@ class PhysicsAnimator<T> private constructor (val target: T) { springConfig: SpringConfig, flingMustReachMinOrMax: Boolean = false ): PhysicsAnimator<T> { + val target = weakTarget.get() + if (target == null) { + Log.w(TAG, "Trying to animate a GC-ed target.") + return this + } val flingConfigCopy = flingConfig.copy() val springConfigCopy = springConfig.copy() val toAtLeast = if (startVelocity < 0) flingConfig.min else flingConfig.max @@ -454,6 +462,11 @@ class PhysicsAnimator<T> private constructor (val target: T) { "this message in a test, call PhysicsAnimatorTestUtils#prepareForTest in " + "your test setup.") } + val target = weakTarget.get() + if (target == null) { + Log.w(TAG, "Trying to animate a GC-ed object.") + return + } // Functions that will actually start the animations. These are run after we build and add // the InternalListener, since some animations might update/end immediately and we don't @@ -489,7 +502,7 @@ class PhysicsAnimator<T> private constructor (val target: T) { cancel(animatedProperty) // Apply the configuration and start the animation. - getFlingAnimation(animatedProperty) + getFlingAnimation(animatedProperty, target) .also { flingConfig.applyToAnimation(it) } .start() } @@ -502,7 +515,7 @@ class PhysicsAnimator<T> private constructor (val target: T) { // If there is no corresponding fling config, we're only springing. if (flingConfig == null) { // Apply the configuration and start the animation. - val springAnim = getSpringAnimation(animatedProperty) + val springAnim = getSpringAnimation(animatedProperty, target) springConfig.applyToAnimation(springAnim) animationStartActions.add(springAnim::start) } else { @@ -558,7 +571,7 @@ class PhysicsAnimator<T> private constructor (val target: T) { } // Apply the configuration and start the spring animation. - getSpringAnimation(animatedProperty) + getSpringAnimation(animatedProperty, target) .also { springConfig.applyToAnimation(it) } .start() } @@ -570,6 +583,7 @@ class PhysicsAnimator<T> private constructor (val target: T) { // Add an internal listener that will dispatch animation events to the provided listeners. internalListeners.add(InternalListener( + target, getAnimatedProperties(), ArrayList(updateListeners), ArrayList(endListeners), @@ -594,7 +608,10 @@ class PhysicsAnimator<T> private constructor (val target: T) { } /** Retrieves a spring animation for the given property, building one if needed. */ - private fun getSpringAnimation(property: FloatPropertyCompat<in T>): SpringAnimation { + private fun getSpringAnimation( + property: FloatPropertyCompat<in T>, + target: T + ): SpringAnimation { return springAnimations.getOrPut( property, { configureDynamicAnimation(SpringAnimation(target, property), property) @@ -602,7 +619,7 @@ class PhysicsAnimator<T> private constructor (val target: T) { } /** Retrieves a fling animation for the given property, building one if needed. */ - private fun getFlingAnimation(property: FloatPropertyCompat<in T>): FlingAnimation { + private fun getFlingAnimation(property: FloatPropertyCompat<in T>, target: T): FlingAnimation { return flingAnimations.getOrPut( property, { configureDynamicAnimation(FlingAnimation(target, property), property) @@ -638,6 +655,7 @@ class PhysicsAnimator<T> private constructor (val target: T) { * appropriate value for allEnded to [EndListener.onAnimationEnd]. */ internal inner class InternalListener constructor( + private val target: T, private var properties: Set<FloatPropertyCompat<in T>>, private var updateListeners: List<UpdateListener<T>>, private var endListeners: List<EndListener<T>>, @@ -1008,4 +1026,4 @@ class PhysicsAnimator<T> private constructor (val target: T) { } } } -}
\ No newline at end of file +} diff --git a/packages/SystemUI/src/com/android/systemui/util/sensors/ProximitySensor.java b/packages/SystemUI/src/com/android/systemui/util/sensors/ProximitySensor.java index 708b5a7a45f7..6794a2a3f72f 100644 --- a/packages/SystemUI/src/com/android/systemui/util/sensors/ProximitySensor.java +++ b/packages/SystemUI/src/com/android/systemui/util/sensors/ProximitySensor.java @@ -222,7 +222,9 @@ public class ProximitySensor { if (mAlerting.getAndSet(true)) { return; } - mListeners.forEach(proximitySensorListener -> + + List<ProximitySensorListener> listeners = new ArrayList<>(mListeners); + listeners.forEach(proximitySensorListener -> proximitySensorListener.onSensorEvent(mLastEvent)); mAlerting.set(false); } @@ -247,22 +249,15 @@ public class ProximitySensor { private final ProximitySensor mSensor; private final DelayableExecutor mDelayableExecutor; private List<Consumer<Boolean>> mCallbacks = new ArrayList<>(); + private final ProximitySensor.ProximitySensorListener mListener; + private final AtomicBoolean mRegistered = new AtomicBoolean(); @Inject public ProximityCheck(ProximitySensor sensor, DelayableExecutor delayableExecutor) { mSensor = sensor; mSensor.setTag("prox_check"); mDelayableExecutor = delayableExecutor; - mSensor.pause(); - ProximitySensorListener listener = proximityEvent -> { - mCallbacks.forEach( - booleanConsumer -> - booleanConsumer.accept( - proximityEvent == null ? null : proximityEvent.getNear())); - mCallbacks.clear(); - mSensor.pause(); - }; - mSensor.register(listener); + mListener = this::onProximityEvent; } /** Set a descriptive tag for the sensors registration. */ @@ -272,7 +267,7 @@ public class ProximitySensor { @Override public void run() { - mSensor.pause(); + unregister(); mSensor.alertListeners(); } @@ -284,11 +279,26 @@ public class ProximitySensor { callback.accept(null); } mCallbacks.add(callback); - if (!mSensor.isRegistered()) { - mSensor.resume(); + if (!mRegistered.getAndSet(true)) { + mSensor.register(mListener); mDelayableExecutor.executeDelayed(this, timeoutMs); } } + + private void unregister() { + mSensor.unregister(mListener); + mRegistered.set(false); + } + + private void onProximityEvent(ProximityEvent proximityEvent) { + mCallbacks.forEach( + booleanConsumer -> + booleanConsumer.accept( + proximityEvent == null ? null : proximityEvent.getNear())); + mCallbacks.clear(); + unregister(); + mRegistered.set(false); + } } /** Implement to be notified of ProximityEvents. */ diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java index ce032e2ceaec..3455ff47de8d 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java @@ -212,7 +212,6 @@ public class VolumeDialogImpl implements VolumeDialog, mWindow.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR); mWindow.addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE - | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH diff --git a/packages/SystemUI/tests/src/com/android/systemui/bubbles/storage/BubblePersistentRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/bubbles/storage/BubblePersistentRepositoryTest.kt index f46819252fac..1d02b8dba910 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/bubbles/storage/BubblePersistentRepositoryTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/bubbles/storage/BubblePersistentRepositoryTest.kt @@ -20,6 +20,8 @@ import android.testing.AndroidTestingRunner import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import junit.framework.Assert.assertEquals +import junit.framework.Assert.assertNotNull +import junit.framework.Assert.assertTrue import org.junit.Before import org.junit.Test import org.junit.runner.RunWith @@ -29,9 +31,9 @@ import org.junit.runner.RunWith class BubblePersistentRepositoryTest : SysuiTestCase() { private val bubbles = listOf( - BubbleEntity(0, "com.example.messenger", "shortcut-1", "key-1"), - BubbleEntity(10, "com.example.chat", "alice and bob", "key-2"), - BubbleEntity(0, "com.example.messenger", "shortcut-2", "key-3") + BubbleEntity(0, "com.example.messenger", "shortcut-1", "key-1", 120, 0), + BubbleEntity(10, "com.example.chat", "alice and bob", "key-2", 0, 16537428), + BubbleEntity(0, "com.example.messenger", "shortcut-2", "key-3", 120, 0) ) private lateinit var repository: BubblePersistentRepository @@ -42,6 +44,11 @@ class BubblePersistentRepositoryTest : SysuiTestCase() { @Test fun testReadWriteOperation() { + // Verify read before write doesn't cause FileNotFoundException + val actual = repository.readFromDisk() + assertNotNull(actual) + assertTrue(actual.isEmpty()) + repository.persistsToDisk(bubbles) assertEquals(bubbles, repository.readFromDisk()) } diff --git a/packages/SystemUI/tests/src/com/android/systemui/bubbles/storage/BubbleVolatileRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/bubbles/storage/BubbleVolatileRepositoryTest.kt index 2bb6bb8ebe14..f9d611c2bb33 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/bubbles/storage/BubbleVolatileRepositoryTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/bubbles/storage/BubbleVolatileRepositoryTest.kt @@ -37,9 +37,9 @@ class BubbleVolatileRepositoryTest : SysuiTestCase() { private val user0 = UserHandle.of(0) private val user10 = UserHandle.of(10) - private val bubble1 = BubbleEntity(0, PKG_MESSENGER, "shortcut-1", "k1") - private val bubble2 = BubbleEntity(10, PKG_CHAT, "alice and bob", "k2") - private val bubble3 = BubbleEntity(0, PKG_MESSENGER, "shortcut-2", "k3") + private val bubble1 = BubbleEntity(0, PKG_MESSENGER, "shortcut-1", "k1", 120, 0) + private val bubble2 = BubbleEntity(10, PKG_CHAT, "alice and bob", "k2", 0, 16537428) + private val bubble3 = BubbleEntity(0, PKG_MESSENGER, "shortcut-2", "k3", 120, 0) private val bubbles = listOf(bubble1, bubble2, bubble3) diff --git a/packages/SystemUI/tests/src/com/android/systemui/bubbles/storage/BubbleXmlHelperTest.kt b/packages/SystemUI/tests/src/com/android/systemui/bubbles/storage/BubbleXmlHelperTest.kt index 79701ecf70f8..49467874dd8b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/bubbles/storage/BubbleXmlHelperTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/bubbles/storage/BubbleXmlHelperTest.kt @@ -31,17 +31,17 @@ import java.io.ByteArrayOutputStream class BubbleXmlHelperTest : SysuiTestCase() { private val bubbles = listOf( - BubbleEntity(0, "com.example.messenger", "shortcut-1", "k1"), - BubbleEntity(10, "com.example.chat", "alice and bob", "k2"), - BubbleEntity(0, "com.example.messenger", "shortcut-2", "k3") + BubbleEntity(0, "com.example.messenger", "shortcut-1", "k1", 120, 0), + BubbleEntity(10, "com.example.chat", "alice and bob", "k2", 0, 16537428), + BubbleEntity(0, "com.example.messenger", "shortcut-2", "k3", 120, 0) ) @Test fun testWriteXml() { val expectedEntries = """ - <bb uid="0" pkg="com.example.messenger" sid="shortcut-1" key="k1" /> - <bb uid="10" pkg="com.example.chat" sid="alice and bob" key="k2" /> - <bb uid="0" pkg="com.example.messenger" sid="shortcut-2" key="k3" /> + <bb uid="0" pkg="com.example.messenger" sid="shortcut-1" key="k1" h="120" hid="0" /> + <bb uid="10" pkg="com.example.chat" sid="alice and bob" key="k2" h="0" hid="16537428" /> + <bb uid="0" pkg="com.example.messenger" sid="shortcut-2" key="k3" h="120" hid="0" /> """.trimIndent() ByteArrayOutputStream().use { writeXml(it, bubbles) @@ -56,9 +56,9 @@ class BubbleXmlHelperTest : SysuiTestCase() { val src = """ <?xml version='1.0' encoding='utf-8' standalone='yes' ?> <bs> - <bb uid="0" pkg="com.example.messenger" sid="shortcut-1" key="k1" /> - <bb uid="10" pkg="com.example.chat" sid="alice and bob" key="k2" /> - <bb uid="0" pkg="com.example.messenger" sid="shortcut-2" key="k3" /> + <bb uid="0" pkg="com.example.messenger" sid="shortcut-1" key="k1" h="120" hid="0" /> + <bb uid="10" pkg="com.example.chat" sid="alice and bob" key="k2" h="0" hid="16537428" /> + <bb uid="0" pkg="com.example.messenger" sid="shortcut-2" key="k3" h="120" hid="0" /> </bs> """.trimIndent() val actual = readXml(ByteArrayInputStream(src.toByteArray(Charsets.UTF_8))) diff --git a/packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogTest.java b/packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogTest.java index 32546333aac3..329af2b7f62b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogTest.java @@ -19,6 +19,7 @@ package com.android.systemui.globalactions; import static com.google.common.truth.Truth.assertThat; import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; @@ -244,7 +245,7 @@ public class GlobalActionsDialogTest extends SysuiTestCase { } @Test - public void testCreateActionItems_maxThree() { + public void testCreateActionItems_maxThree_noOverflow() { mGlobalActionsDialog = spy(mGlobalActionsDialog); // allow 3 items to be shown doReturn(3).when(mGlobalActionsDialog).getMaxShownPowerItems(); @@ -254,13 +255,129 @@ public class GlobalActionsDialogTest extends SysuiTestCase { GlobalActionsDialog.GLOBAL_ACTION_KEY_EMERGENCY, GlobalActionsDialog.GLOBAL_ACTION_KEY_POWER, GlobalActionsDialog.GLOBAL_ACTION_KEY_RESTART, + }; + doReturn(actions).when(mGlobalActionsDialog).getDefaultActions(); + mGlobalActionsDialog.createActionItems(); + + assertEquals(3, mGlobalActionsDialog.mItems.size()); + assertEquals(0, mGlobalActionsDialog.mOverflowItems.size()); + assertEquals(0, mGlobalActionsDialog.mPowerItems.size()); + } + + @Test + public void testCreateActionItems_maxThree_condensePower() { + mGlobalActionsDialog = spy(mGlobalActionsDialog); + // allow 3 items to be shown + doReturn(3).when(mGlobalActionsDialog).getMaxShownPowerItems(); + // ensure items are not blocked by keyguard or device provisioning + doReturn(true).when(mGlobalActionsDialog).shouldShowAction(any()); + // make sure lockdown action will be shown + doReturn(true).when(mGlobalActionsDialog).shouldDisplayLockdown(any()); + String[] actions = { + GlobalActionsDialog.GLOBAL_ACTION_KEY_EMERGENCY, + GlobalActionsDialog.GLOBAL_ACTION_KEY_POWER, + GlobalActionsDialog.GLOBAL_ACTION_KEY_RESTART, + GlobalActionsDialog.GLOBAL_ACTION_KEY_LOCKDOWN, + }; + doReturn(actions).when(mGlobalActionsDialog).getDefaultActions(); + mGlobalActionsDialog.createActionItems(); + + assertEquals(3, mGlobalActionsDialog.mItems.size()); + assertEquals(0, mGlobalActionsDialog.mOverflowItems.size()); + assertEquals(2, mGlobalActionsDialog.mPowerItems.size()); + + // PowerOptionsAction should appear immediately after the Emergency action + + GlobalActionsDialog.Action firstItem = mGlobalActionsDialog.mItems.get(0); + GlobalActionsDialog.Action secondItem = mGlobalActionsDialog.mItems.get(1); + + assertTrue(firstItem instanceof GlobalActionsDialog.EmergencyAction); + assertTrue(secondItem instanceof GlobalActionsDialog.PowerOptionsAction); + } + + @Test + public void testCreateActionItems_maxThree_condensePower_noEmergency() { + mGlobalActionsDialog = spy(mGlobalActionsDialog); + // allow 3 items to be shown + doReturn(3).when(mGlobalActionsDialog).getMaxShownPowerItems(); + // make sure lockdown action will be shown + doReturn(true).when(mGlobalActionsDialog).shouldDisplayLockdown(any()); + // ensure items are not blocked by keyguard or device provisioning + doReturn(true).when(mGlobalActionsDialog).shouldShowAction(any()); + String[] actions = { + GlobalActionsDialog.GLOBAL_ACTION_KEY_POWER, + GlobalActionsDialog.GLOBAL_ACTION_KEY_RESTART, + GlobalActionsDialog.GLOBAL_ACTION_KEY_SCREENSHOT, + GlobalActionsDialog.GLOBAL_ACTION_KEY_LOCKDOWN, + }; + doReturn(actions).when(mGlobalActionsDialog).getDefaultActions(); + mGlobalActionsDialog.createActionItems(); + + assertEquals(3, mGlobalActionsDialog.mItems.size()); + assertEquals(0, mGlobalActionsDialog.mOverflowItems.size()); + assertEquals(2, mGlobalActionsDialog.mPowerItems.size()); + + // When Emergency isn't used, PowerOptionsAction should be first + + GlobalActionsDialog.Action firstItem = mGlobalActionsDialog.mItems.get(0); + GlobalActionsDialog.Action secondItem = mGlobalActionsDialog.mItems.get(1); + + assertTrue(firstItem instanceof GlobalActionsDialog.PowerOptionsAction); + assertTrue(secondItem instanceof GlobalActionsDialog.ScreenshotAction); + } + + @Test + public void testCreateActionItems_maxFour_condensePower() { + mGlobalActionsDialog = spy(mGlobalActionsDialog); + // allow 3 items to be shown + doReturn(4).when(mGlobalActionsDialog).getMaxShownPowerItems(); + // make sure lockdown action will be shown + doReturn(true).when(mGlobalActionsDialog).shouldDisplayLockdown(any()); + // ensure items are not blocked by keyguard or device provisioning + doReturn(true).when(mGlobalActionsDialog).shouldShowAction(any()); + String[] actions = { + GlobalActionsDialog.GLOBAL_ACTION_KEY_EMERGENCY, + GlobalActionsDialog.GLOBAL_ACTION_KEY_POWER, + GlobalActionsDialog.GLOBAL_ACTION_KEY_RESTART, + GlobalActionsDialog.GLOBAL_ACTION_KEY_LOCKDOWN, + GlobalActionsDialog.GLOBAL_ACTION_KEY_SCREENSHOT + }; + doReturn(actions).when(mGlobalActionsDialog).getDefaultActions(); + mGlobalActionsDialog.createActionItems(); + + assertEquals(4, mGlobalActionsDialog.mItems.size()); + assertEquals(0, mGlobalActionsDialog.mOverflowItems.size()); + assertEquals(2, mGlobalActionsDialog.mPowerItems.size()); + + // with four items, make sure power still shows up immediately after Emergency + GlobalActionsDialog.Action firstItem = mGlobalActionsDialog.mItems.get(0); + GlobalActionsDialog.Action secondItem = mGlobalActionsDialog.mItems.get(1); + + assertTrue(firstItem instanceof GlobalActionsDialog.EmergencyAction); + assertTrue(secondItem instanceof GlobalActionsDialog.PowerOptionsAction); + } + + @Test + public void testCreateActionItems_maxThree_doNotCondensePower() { + mGlobalActionsDialog = spy(mGlobalActionsDialog); + // allow 3 items to be shown + doReturn(3).when(mGlobalActionsDialog).getMaxShownPowerItems(); + // make sure lockdown action will be shown + doReturn(true).when(mGlobalActionsDialog).shouldDisplayLockdown(any()); + // ensure items are not blocked by keyguard or device provisioning + doReturn(true).when(mGlobalActionsDialog).shouldShowAction(any()); + String[] actions = { + GlobalActionsDialog.GLOBAL_ACTION_KEY_EMERGENCY, + GlobalActionsDialog.GLOBAL_ACTION_KEY_POWER, GlobalActionsDialog.GLOBAL_ACTION_KEY_SCREENSHOT, + GlobalActionsDialog.GLOBAL_ACTION_KEY_LOCKDOWN, }; doReturn(actions).when(mGlobalActionsDialog).getDefaultActions(); mGlobalActionsDialog.createActionItems(); assertEquals(3, mGlobalActionsDialog.mItems.size()); assertEquals(1, mGlobalActionsDialog.mOverflowItems.size()); + assertEquals(0, mGlobalActionsDialog.mPowerItems.size()); } @Test @@ -270,11 +387,13 @@ public class GlobalActionsDialogTest extends SysuiTestCase { doReturn(Integer.MAX_VALUE).when(mGlobalActionsDialog).getMaxShownPowerItems(); // ensure items are not blocked by keyguard or device provisioning doReturn(true).when(mGlobalActionsDialog).shouldShowAction(any()); + // make sure lockdown action will be shown + doReturn(true).when(mGlobalActionsDialog).shouldDisplayLockdown(any()); String[] actions = { GlobalActionsDialog.GLOBAL_ACTION_KEY_EMERGENCY, GlobalActionsDialog.GLOBAL_ACTION_KEY_POWER, GlobalActionsDialog.GLOBAL_ACTION_KEY_RESTART, - GlobalActionsDialog.GLOBAL_ACTION_KEY_SCREENSHOT, + GlobalActionsDialog.GLOBAL_ACTION_KEY_LOCKDOWN, }; doReturn(actions).when(mGlobalActionsDialog).getDefaultActions(); mGlobalActionsDialog.createActionItems(); @@ -288,10 +407,12 @@ public class GlobalActionsDialogTest extends SysuiTestCase { mGlobalActionsDialog = spy(mGlobalActionsDialog); // allow only 3 items to be shown doReturn(3).when(mGlobalActionsDialog).getMaxShownPowerItems(); + // make sure lockdown action will NOT be shown + doReturn(false).when(mGlobalActionsDialog).shouldDisplayLockdown(any()); String[] actions = { GlobalActionsDialog.GLOBAL_ACTION_KEY_EMERGENCY, - // screenshot blocked because device not provisioned - GlobalActionsDialog.GLOBAL_ACTION_KEY_SCREENSHOT, + // lockdown action not allowed + GlobalActionsDialog.GLOBAL_ACTION_KEY_LOCKDOWN, GlobalActionsDialog.GLOBAL_ACTION_KEY_POWER, GlobalActionsDialog.GLOBAL_ACTION_KEY_RESTART, }; diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt index 9d2b6f4deb14..737ced63eed0 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt @@ -31,6 +31,7 @@ import android.widget.ImageButton import android.widget.ImageView import android.widget.SeekBar import android.widget.TextView +import androidx.lifecycle.LiveData import androidx.test.filters.SmallTest import com.android.systemui.R import com.android.systemui.SysuiTestCase @@ -41,6 +42,7 @@ import com.android.systemui.util.time.FakeSystemClock import com.google.common.truth.Truth.assertThat import org.junit.After import org.junit.Before +import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith import org.mockito.ArgumentCaptor @@ -48,6 +50,7 @@ import org.mockito.Mock import org.mockito.Mockito.mock import org.mockito.Mockito.verify import org.mockito.Mockito.`when` as whenever +import org.mockito.junit.MockitoJUnit private const val KEY = "TEST_KEY" private const val APP = "APP" @@ -67,13 +70,14 @@ public class MediaControlPanelTest : SysuiTestCase() { private lateinit var player: MediaControlPanel - private lateinit var fgExecutor: FakeExecutor private lateinit var bgExecutor: FakeExecutor @Mock private lateinit var activityStarter: ActivityStarter @Mock private lateinit var holder: PlayerViewHolder @Mock private lateinit var view: TransitionLayout @Mock private lateinit var mediaHostStatesManager: MediaHostStatesManager + @Mock private lateinit var seekBarViewModel: SeekBarViewModel + @Mock private lateinit var seekBarData: LiveData<SeekBarViewModel.Progress> private lateinit var appIcon: ImageView private lateinit var appName: TextView private lateinit var albumView: ImageView @@ -95,20 +99,17 @@ public class MediaControlPanelTest : SysuiTestCase() { private val device = MediaDeviceData(true, null, DEVICE_NAME) private val disabledDevice = MediaDeviceData(false, null, null) + @JvmField @Rule val mockito = MockitoJUnit.rule() + @Before fun setUp() { - fgExecutor = FakeExecutor(FakeSystemClock()) bgExecutor = FakeExecutor(FakeSystemClock()) - activityStarter = mock(ActivityStarter::class.java) - mediaHostStatesManager = mock(MediaHostStatesManager::class.java) - - player = MediaControlPanel(context, fgExecutor, bgExecutor, activityStarter, - mediaHostStatesManager) + player = MediaControlPanel(context, bgExecutor, activityStarter, mediaHostStatesManager, + seekBarViewModel) + whenever(seekBarViewModel.progress).thenReturn(seekBarData) // Mock out a view holder for the player to attach to. - holder = mock(PlayerViewHolder::class.java) - view = mock(TransitionLayout::class.java) whenever(holder.player).thenReturn(view) appIcon = ImageView(context) whenever(holder.appIcon).thenReturn(appIcon) @@ -171,7 +172,7 @@ public class MediaControlPanelTest : SysuiTestCase() { @Test fun bindWhenUnattached() { val state = MediaData(true, BG_COLOR, APP, null, ARTIST, TITLE, null, emptyList(), - emptyList(), PACKAGE, null, null, device) + emptyList(), PACKAGE, null, null, device, null) player.bind(state) assertThat(player.isPlaying()).isFalse() } @@ -180,7 +181,7 @@ public class MediaControlPanelTest : SysuiTestCase() { fun bindText() { player.attach(holder) val state = MediaData(true, BG_COLOR, APP, null, ARTIST, TITLE, null, emptyList(), - emptyList(), PACKAGE, session.getSessionToken(), null, device) + emptyList(), PACKAGE, session.getSessionToken(), null, device, null) player.bind(state) assertThat(appName.getText()).isEqualTo(APP) assertThat(titleText.getText()).isEqualTo(TITLE) @@ -191,7 +192,7 @@ public class MediaControlPanelTest : SysuiTestCase() { fun bindBackgroundColor() { player.attach(holder) val state = MediaData(true, BG_COLOR, APP, null, ARTIST, TITLE, null, emptyList(), - emptyList(), PACKAGE, session.getSessionToken(), null, device) + emptyList(), PACKAGE, session.getSessionToken(), null, device, null) player.bind(state) val list = ArgumentCaptor.forClass(ColorStateList::class.java) verify(view).setBackgroundTintList(list.capture()) @@ -202,7 +203,7 @@ public class MediaControlPanelTest : SysuiTestCase() { fun bindDevice() { player.attach(holder) val state = MediaData(true, BG_COLOR, APP, null, ARTIST, TITLE, null, emptyList(), - emptyList(), PACKAGE, session.getSessionToken(), null, device) + emptyList(), PACKAGE, session.getSessionToken(), null, device, null) player.bind(state) assertThat(seamlessText.getText()).isEqualTo(DEVICE_NAME) assertThat(seamless.isEnabled()).isTrue() @@ -212,7 +213,7 @@ public class MediaControlPanelTest : SysuiTestCase() { fun bindDisabledDevice() { player.attach(holder) val state = MediaData(true, BG_COLOR, APP, null, ARTIST, TITLE, null, emptyList(), - emptyList(), PACKAGE, session.getSessionToken(), null, disabledDevice) + emptyList(), PACKAGE, session.getSessionToken(), null, disabledDevice, null) player.bind(state) assertThat(seamless.isEnabled()).isFalse() assertThat(seamlessText.getText()).isEqualTo(context.getResources().getString( @@ -223,7 +224,7 @@ public class MediaControlPanelTest : SysuiTestCase() { fun bindNullDevice() { player.attach(holder) val state = MediaData(true, BG_COLOR, APP, null, ARTIST, TITLE, null, emptyList(), - emptyList(), PACKAGE, session.getSessionToken(), null, null) + emptyList(), PACKAGE, session.getSessionToken(), null, null, null) player.bind(state) assertThat(seamless.isEnabled()).isTrue() assertThat(seamlessText.getText()).isEqualTo(context.getResources().getString( diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataCombineLatestTest.java b/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataCombineLatestTest.java index 48e3b0a9d993..bed5c9eb6df5 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataCombineLatestTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataCombineLatestTest.java @@ -79,16 +79,16 @@ public class MediaDataCombineLatestTest extends SysuiTestCase { mManager.addListener(mListener); mMediaData = new MediaData(true, BG_COLOR, APP, null, ARTIST, TITLE, null, - new ArrayList<>(), new ArrayList<>(), PACKAGE, null, null, null, KEY); + new ArrayList<>(), new ArrayList<>(), PACKAGE, null, null, null, null, KEY, false); mDeviceData = new MediaDeviceData(true, null, DEVICE_NAME); } @Test public void eventNotEmittedWithoutDevice() { // WHEN data source emits an event without device data - mDataListener.onMediaDataLoaded(KEY, mMediaData); + mDataListener.onMediaDataLoaded(KEY, null, mMediaData); // THEN an event isn't emitted - verify(mListener, never()).onMediaDataLoaded(eq(KEY), any()); + verify(mListener, never()).onMediaDataLoaded(eq(KEY), any(), any()); } @Test @@ -96,7 +96,7 @@ public class MediaDataCombineLatestTest extends SysuiTestCase { // WHEN device source emits an event without media data mDeviceListener.onMediaDeviceChanged(KEY, mDeviceData); // THEN an event isn't emitted - verify(mListener, never()).onMediaDataLoaded(eq(KEY), any()); + verify(mListener, never()).onMediaDataLoaded(eq(KEY), any(), any()); } @Test @@ -104,22 +104,22 @@ public class MediaDataCombineLatestTest extends SysuiTestCase { // GIVEN that a device event has already been received mDeviceListener.onMediaDeviceChanged(KEY, mDeviceData); // WHEN media event is received - mDataListener.onMediaDataLoaded(KEY, mMediaData); + mDataListener.onMediaDataLoaded(KEY, null, mMediaData); // THEN the listener receives a combined event ArgumentCaptor<MediaData> captor = ArgumentCaptor.forClass(MediaData.class); - verify(mListener).onMediaDataLoaded(eq(KEY), captor.capture()); + verify(mListener).onMediaDataLoaded(eq(KEY), any(), captor.capture()); assertThat(captor.getValue().getDevice()).isNotNull(); } @Test public void emitEventAfterMediaFirst() { // GIVEN that media event has already been received - mDataListener.onMediaDataLoaded(KEY, mMediaData); + mDataListener.onMediaDataLoaded(KEY, null, mMediaData); // WHEN device event is received mDeviceListener.onMediaDeviceChanged(KEY, mDeviceData); // THEN the listener receives a combined event ArgumentCaptor<MediaData> captor = ArgumentCaptor.forClass(MediaData.class); - verify(mListener).onMediaDataLoaded(eq(KEY), captor.capture()); + verify(mListener).onMediaDataLoaded(eq(KEY), any(), captor.capture()); assertThat(captor.getValue().getDevice()).isNotNull(); } @@ -133,7 +133,7 @@ public class MediaDataCombineLatestTest extends SysuiTestCase { @Test public void mediaDataRemovedAfterMediaEvent() { - mDataListener.onMediaDataLoaded(KEY, mMediaData); + mDataListener.onMediaDataLoaded(KEY, null, mMediaData); mDataListener.onMediaDataRemoved(KEY); verify(mListener).onMediaDataRemoved(eq(KEY)); } @@ -145,6 +145,18 @@ public class MediaDataCombineLatestTest extends SysuiTestCase { verify(mListener).onMediaDataRemoved(eq(KEY)); } + @Test + public void mediaDataKeyUpdated() { + // GIVEN that device and media events have already been received + mDataListener.onMediaDataLoaded(KEY, null, mMediaData); + mDeviceListener.onMediaDeviceChanged(KEY, mDeviceData); + // WHEN the key is changed + mDataListener.onMediaDataLoaded("NEW_KEY", KEY, mMediaData); + // THEN the listener gets a load event with the correct keys + ArgumentCaptor<MediaData> captor = ArgumentCaptor.forClass(MediaData.class); + verify(mListener).onMediaDataLoaded(eq("NEW_KEY"), any(), captor.capture()); + } + private MediaDataManager.Listener captureDataListener() { ArgumentCaptor<MediaDataManager.Listener> captor = ArgumentCaptor.forClass( MediaDataManager.Listener.class); diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaDeviceManagerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaDeviceManagerTest.kt index c0aef8adc4af..3a3140f2ff53 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaDeviceManagerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaDeviceManagerTest.kt @@ -23,8 +23,6 @@ import android.media.MediaRouter2Manager import android.media.RoutingSessionInfo import android.media.session.MediaSession import android.media.session.PlaybackState -import android.os.Process -import android.service.notification.StatusBarNotification import android.testing.AndroidTestingRunner import android.testing.TestableLooper import androidx.test.filters.SmallTest @@ -67,6 +65,7 @@ private fun <T> eq(value: T): T = Mockito.eq(value) ?: value public class MediaDeviceManagerTest : SysuiTestCase() { private lateinit var manager: MediaDeviceManager + @Mock private lateinit var mediaDataManager: MediaDataManager @Mock private lateinit var lmmFactory: LocalMediaManagerFactory @Mock private lateinit var lmm: LocalMediaManager @Mock private lateinit var mr2: MediaRouter2Manager @@ -80,13 +79,14 @@ public class MediaDeviceManagerTest : SysuiTestCase() { private lateinit var metadataBuilder: MediaMetadata.Builder private lateinit var playbackBuilder: PlaybackState.Builder private lateinit var notifBuilder: Notification.Builder - private lateinit var sbn: StatusBarNotification + private lateinit var mediaData: MediaData @JvmField @Rule val mockito = MockitoJUnit.rule() @Before fun setUp() { fakeExecutor = FakeExecutor(FakeSystemClock()) - manager = MediaDeviceManager(context, lmmFactory, mr2, featureFlag, fakeExecutor) + manager = MediaDeviceManager(context, lmmFactory, mr2, featureFlag, fakeExecutor, + mediaDataManager) manager.addListener(listener) // Configure mocks. @@ -117,8 +117,8 @@ public class MediaDeviceManagerTest : SysuiTestCase() { setSmallIcon(android.R.drawable.ic_media_pause) setStyle(Notification.MediaStyle().setMediaSession(session.getSessionToken())) } - sbn = StatusBarNotification(PACKAGE, PACKAGE, 0, "TAG", Process.myUid(), 0, 0, - notifBuilder.build(), Process.myUserHandle(), 0) + mediaData = MediaData(true, 0, PACKAGE, null, null, SESSION_TITLE, null, + emptyList(), emptyList(), PACKAGE, session.sessionToken, null, null, null) } @After @@ -128,33 +128,33 @@ public class MediaDeviceManagerTest : SysuiTestCase() { @Test fun removeUnknown() { - manager.onNotificationRemoved("unknown") + manager.onMediaDataRemoved("unknown") } @Test fun addNotification() { - manager.onNotificationAdded(KEY, sbn) + manager.onMediaDataLoaded(KEY, null, mediaData) verify(lmmFactory).create(PACKAGE) } @Test fun featureDisabled() { whenever(featureFlag.enabled).thenReturn(false) - manager.onNotificationAdded(KEY, sbn) + manager.onMediaDataLoaded(KEY, null, mediaData) verify(lmmFactory, never()).create(PACKAGE) } @Test fun addAndRemoveNotification() { - manager.onNotificationAdded(KEY, sbn) - manager.onNotificationRemoved(KEY) + manager.onMediaDataLoaded(KEY, null, mediaData) + manager.onMediaDataRemoved(KEY) verify(lmm).unregisterCallback(any()) } @Test fun deviceEventOnAddNotification() { // WHEN a notification is added - manager.onNotificationAdded(KEY, sbn) + manager.onMediaDataLoaded(KEY, null, mediaData) val deviceCallback = captureCallback() // THEN the update is dispatched to the listener val data = captureDeviceData(KEY) @@ -165,7 +165,7 @@ public class MediaDeviceManagerTest : SysuiTestCase() { @Test fun deviceListUpdate() { - manager.onNotificationAdded(KEY, sbn) + manager.onMediaDataLoaded(KEY, null, mediaData) val deviceCallback = captureCallback() // WHEN the device list changes deviceCallback.onDeviceListUpdate(mutableListOf(device)) @@ -179,7 +179,7 @@ public class MediaDeviceManagerTest : SysuiTestCase() { @Test fun selectedDeviceStateChanged() { - manager.onNotificationAdded(KEY, sbn) + manager.onMediaDataLoaded(KEY, null, mediaData) val deviceCallback = captureCallback() // WHEN the selected device changes state deviceCallback.onSelectedDeviceStateChanged(device, 1) @@ -193,9 +193,9 @@ public class MediaDeviceManagerTest : SysuiTestCase() { @Test fun listenerReceivesKeyRemoved() { - manager.onNotificationAdded(KEY, sbn) + manager.onMediaDataLoaded(KEY, null, mediaData) // WHEN the notification is removed - manager.onNotificationRemoved(KEY) + manager.onMediaDataRemoved(KEY) // THEN the listener receives key removed event verify(listener).onKeyRemoved(eq(KEY)) } @@ -205,7 +205,7 @@ public class MediaDeviceManagerTest : SysuiTestCase() { // GIVEN that MR2Manager returns null for routing session whenever(mr2.getRoutingSessionForMediaController(any())).thenReturn(null) // WHEN a notification is added - manager.onNotificationAdded(KEY, sbn) + manager.onMediaDataLoaded(KEY, null, mediaData) // THEN the device is disabled val data = captureDeviceData(KEY) assertThat(data.enabled).isFalse() @@ -216,7 +216,7 @@ public class MediaDeviceManagerTest : SysuiTestCase() { @Test fun deviceDisabledWhenMR2ReturnsNullRouteInfoOnDeviceChanged() { // GIVEN a notif is added - manager.onNotificationAdded(KEY, sbn) + manager.onMediaDataLoaded(KEY, null, mediaData) reset(listener) // AND MR2Manager returns null for routing session whenever(mr2.getRoutingSessionForMediaController(any())).thenReturn(null) @@ -234,7 +234,7 @@ public class MediaDeviceManagerTest : SysuiTestCase() { @Test fun deviceDisabledWhenMR2ReturnsNullRouteInfoOnDeviceListUpdate() { // GIVEN a notif is added - manager.onNotificationAdded(KEY, sbn) + manager.onMediaDataLoaded(KEY, null, mediaData) reset(listener) // GIVEN that MR2Manager returns null for routing session whenever(mr2.getRoutingSessionForMediaController(any())).thenReturn(null) diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaTimeoutListenerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaTimeoutListenerTest.kt index c21343cb5423..7d44327b0d38 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaTimeoutListenerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaTimeoutListenerTest.kt @@ -16,7 +16,9 @@ package com.android.systemui.media +import android.media.MediaMetadata import android.media.session.MediaController +import android.media.session.MediaSession import android.media.session.PlaybackState import android.testing.AndroidTestingRunner import androidx.test.filters.SmallTest @@ -41,6 +43,10 @@ import org.mockito.Mockito.verify import org.mockito.junit.MockitoJUnit private const val KEY = "KEY" +private const val PACKAGE = "PKG" +private const val SESSION_KEY = "SESSION_KEY" +private const val SESSION_ARTIST = "SESSION_ARTIST" +private const val SESSION_TITLE = "SESSION_TITLE" private fun <T> eq(value: T): T = Mockito.eq(value) ?: value private fun <T> anyObject(): T { @@ -54,12 +60,15 @@ class MediaTimeoutListenerTest : SysuiTestCase() { @Mock private lateinit var mediaControllerFactory: MediaControllerFactory @Mock private lateinit var mediaController: MediaController @Mock private lateinit var executor: DelayableExecutor - @Mock private lateinit var mediaData: MediaData @Mock private lateinit var timeoutCallback: (String, Boolean) -> Unit @Mock private lateinit var cancellationRunnable: Runnable @Captor private lateinit var timeoutCaptor: ArgumentCaptor<Runnable> @Captor private lateinit var mediaCallbackCaptor: ArgumentCaptor<MediaController.Callback> @JvmField @Rule val mockito = MockitoJUnit.rule() + private lateinit var metadataBuilder: MediaMetadata.Builder + private lateinit var playbackBuilder: PlaybackState.Builder + private lateinit var session: MediaSession + private lateinit var mediaData: MediaData private lateinit var mediaTimeoutListener: MediaTimeoutListener @Before @@ -68,22 +77,39 @@ class MediaTimeoutListenerTest : SysuiTestCase() { `when`(executor.executeDelayed(any(), anyLong())).thenReturn(cancellationRunnable) mediaTimeoutListener = MediaTimeoutListener(mediaControllerFactory, executor) mediaTimeoutListener.timeoutCallback = timeoutCallback + + // Create a media session and notification for testing. + metadataBuilder = MediaMetadata.Builder().apply { + putString(MediaMetadata.METADATA_KEY_ARTIST, SESSION_ARTIST) + putString(MediaMetadata.METADATA_KEY_TITLE, SESSION_TITLE) + } + playbackBuilder = PlaybackState.Builder().apply { + setState(PlaybackState.STATE_PAUSED, 6000L, 1f) + setActions(PlaybackState.ACTION_PLAY) + } + session = MediaSession(context, SESSION_KEY).apply { + setMetadata(metadataBuilder.build()) + setPlaybackState(playbackBuilder.build()) + } + session.setActive(true) + mediaData = MediaData(true, 0, PACKAGE, null, null, SESSION_TITLE, null, + emptyList(), emptyList(), PACKAGE, session.sessionToken, null, null, null) } @Test fun testOnMediaDataLoaded_registersPlaybackListener() { - mediaTimeoutListener.onMediaDataLoaded(KEY, mediaData) + mediaTimeoutListener.onMediaDataLoaded(KEY, null, mediaData) verify(mediaController).registerCallback(capture(mediaCallbackCaptor)) // Ignores is same key clearInvocations(mediaController) - mediaTimeoutListener.onMediaDataLoaded(KEY, mediaData) + mediaTimeoutListener.onMediaDataLoaded(KEY, KEY, mediaData) verify(mediaController, never()).registerCallback(anyObject()) } @Test fun testOnMediaDataRemoved_unregistersPlaybackListener() { - mediaTimeoutListener.onMediaDataLoaded(KEY, mediaData) + mediaTimeoutListener.onMediaDataLoaded(KEY, null, mediaData) mediaTimeoutListener.onMediaDataRemoved(KEY) verify(mediaController).unregisterCallback(anyObject()) @@ -105,7 +131,7 @@ class MediaTimeoutListenerTest : SysuiTestCase() { @Test fun testOnPlaybackStateChanged_cancelsTimeout_whenResumed() { - // Assuming we're have a pending timeout + // Assuming we have a pending timeout testOnPlaybackStateChanged_schedulesTimeout_whenPaused() mediaCallbackCaptor.value.onPlaybackStateChanged(PlaybackState.Builder() @@ -114,6 +140,17 @@ class MediaTimeoutListenerTest : SysuiTestCase() { } @Test + fun testOnPlaybackStateChanged_reusesTimeout_whenNotPlaying() { + // Assuming we have a pending timeout + testOnPlaybackStateChanged_schedulesTimeout_whenPaused() + + clearInvocations(cancellationRunnable) + mediaCallbackCaptor.value.onPlaybackStateChanged(PlaybackState.Builder() + .setState(PlaybackState.STATE_STOPPED, 0L, 0f).build()) + verify(cancellationRunnable, never()).run() + } + + @Test fun testTimeoutCallback_invokedIfTimeout() { // Assuming we're have a pending timeout testOnPlaybackStateChanged_schedulesTimeout_whenPaused() @@ -124,7 +161,7 @@ class MediaTimeoutListenerTest : SysuiTestCase() { @Test fun testIsTimedOut() { - mediaTimeoutListener.onMediaDataLoaded(KEY, mediaData) + mediaTimeoutListener.onMediaDataLoaded(KEY, null, mediaData) assertThat(mediaTimeoutListener.isTimedOut(KEY)).isFalse() } }
\ No newline at end of file diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/SeekBarViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/SeekBarViewModelTest.kt index 19e15b3c4307..24e9bd837d5d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/SeekBarViewModelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/SeekBarViewModelTest.kt @@ -29,6 +29,7 @@ import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.util.concurrency.FakeExecutor +import com.android.systemui.util.concurrency.FakeRepeatableExecutor import com.android.systemui.util.time.FakeSystemClock import com.google.common.truth.Truth.assertThat @@ -71,7 +72,7 @@ public class SeekBarViewModelTest : SysuiTestCase() { @Before fun setUp() { fakeExecutor = FakeExecutor(FakeSystemClock()) - viewModel = SeekBarViewModel(fakeExecutor) + viewModel = SeekBarViewModel(FakeRepeatableExecutor(fakeExecutor)) mockController = mock(MediaController::class.java) whenever(mockController.sessionToken).thenReturn(token1) mockTransport = mock(MediaController.TransportControls::class.java) diff --git a/packages/SystemUI/tests/src/com/android/systemui/pip/PipAnimationControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/pip/PipAnimationControllerTest.java index b7a2633d0d36..536cae4380c4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/pip/PipAnimationControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/pip/PipAnimationControllerTest.java @@ -82,7 +82,7 @@ public class PipAnimationControllerTest extends SysuiTestCase { @Test public void getAnimator_withBounds_returnBoundsAnimator() { final PipAnimationController.PipTransitionAnimator animator = mPipAnimationController - .getAnimator(mLeash, new Rect(), new Rect()); + .getAnimator(mLeash, new Rect(), new Rect(), null); assertEquals("Expect ANIM_TYPE_BOUNDS animation", animator.getAnimationType(), PipAnimationController.ANIM_TYPE_BOUNDS); @@ -94,12 +94,12 @@ public class PipAnimationControllerTest extends SysuiTestCase { final Rect endValue1 = new Rect(100, 100, 200, 200); final Rect endValue2 = new Rect(200, 200, 300, 300); final PipAnimationController.PipTransitionAnimator oldAnimator = mPipAnimationController - .getAnimator(mLeash, startValue, endValue1); + .getAnimator(mLeash, startValue, endValue1, null); oldAnimator.setSurfaceControlTransactionFactory(DummySurfaceControlTx::new); oldAnimator.start(); final PipAnimationController.PipTransitionAnimator newAnimator = mPipAnimationController - .getAnimator(mLeash, startValue, endValue2); + .getAnimator(mLeash, startValue, endValue2, null); assertEquals("getAnimator with same type returns same animator", oldAnimator, newAnimator); @@ -129,7 +129,7 @@ public class PipAnimationControllerTest extends SysuiTestCase { final Rect endValue1 = new Rect(100, 100, 200, 200); final Rect endValue2 = new Rect(200, 200, 300, 300); final PipAnimationController.PipTransitionAnimator animator = mPipAnimationController - .getAnimator(mLeash, startValue, endValue1); + .getAnimator(mLeash, startValue, endValue1, null); animator.updateEndValue(endValue2); @@ -141,7 +141,7 @@ public class PipAnimationControllerTest extends SysuiTestCase { final Rect startValue = new Rect(0, 0, 100, 100); final Rect endValue = new Rect(100, 100, 200, 200); final PipAnimationController.PipTransitionAnimator animator = mPipAnimationController - .getAnimator(mLeash, startValue, endValue); + .getAnimator(mLeash, startValue, endValue, null); animator.setSurfaceControlTransactionFactory(DummySurfaceControlTx::new); animator.setPipAnimationCallback(mPipAnimationCallback); diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java index 11477395a781..5d4ef550b36c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java @@ -219,13 +219,43 @@ public class QSTileHostTest extends SysuiTestCase { public void testNoRepeatedSpecs_customTile() { mQSTileHost.onTuningChanged(QSTileHost.TILES_SETTING, CUSTOM_TILE_SPEC); - mQSTileHost.addTile(CUSTOM_TILE); + mQSTileHost.addTile(CUSTOM_TILE, /* end */ false); assertEquals(1, mQSTileHost.mTileSpecs.size()); assertEquals(CUSTOM_TILE_SPEC, mQSTileHost.mTileSpecs.get(0)); } @Test + public void testAddedAtBeginningOnDefault_customTile() { + mQSTileHost.onTuningChanged(QSTileHost.TILES_SETTING, "spec1"); // seed + + mQSTileHost.addTile(CUSTOM_TILE); + + assertEquals(2, mQSTileHost.mTileSpecs.size()); + assertEquals(CUSTOM_TILE_SPEC, mQSTileHost.mTileSpecs.get(0)); + } + + @Test + public void testAddedAtBeginning_customTile() { + mQSTileHost.onTuningChanged(QSTileHost.TILES_SETTING, "spec1"); // seed + + mQSTileHost.addTile(CUSTOM_TILE, /* end */ false); + + assertEquals(2, mQSTileHost.mTileSpecs.size()); + assertEquals(CUSTOM_TILE_SPEC, mQSTileHost.mTileSpecs.get(0)); + } + + @Test + public void testAddedAtEnd_customTile() { + mQSTileHost.onTuningChanged(QSTileHost.TILES_SETTING, "spec1"); // seed + + mQSTileHost.addTile(CUSTOM_TILE, /* end */ true); + + assertEquals(2, mQSTileHost.mTileSpecs.size()); + assertEquals(CUSTOM_TILE_SPEC, mQSTileHost.mTileSpecs.get(1)); + } + + @Test public void testLoadTileSpec_repeated() { List<String> specs = QSTileHost.loadTileSpecs(mContext, "spec1,spec1,spec2"); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationFilterTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationFilterTest.java index 595ba89ca3b6..5a81d36ea744 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationFilterTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationFilterTest.java @@ -27,8 +27,10 @@ import static org.mockito.Mockito.when; import android.Manifest; import android.app.Notification; +import android.app.Notification.MediaStyle; import android.content.pm.IPackageManager; import android.content.pm.PackageManager; +import android.media.session.MediaSession; import android.os.Bundle; import android.service.notification.StatusBarNotification; import android.testing.AndroidTestingRunner; @@ -40,6 +42,7 @@ import androidx.test.filters.SmallTest; import com.android.systemui.ForegroundServiceController; import com.android.systemui.SysuiTestCase; +import com.android.systemui.media.MediaFeatureFlag; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.NotificationLockscreenUserManager; import com.android.systemui.statusbar.notification.NotificationEntryManager.KeyguardEnvironment; @@ -51,6 +54,7 @@ import com.android.systemui.statusbar.notification.row.NotificationTestHelper; import com.android.systemui.statusbar.phone.NotificationGroupManager; import com.android.systemui.statusbar.phone.ShadeController; +import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -73,10 +77,16 @@ public class NotificationFilterTest extends SysuiTestCase { ForegroundServiceController mFsc; @Mock KeyguardEnvironment mEnvironment; + @Mock + MediaFeatureFlag mMediaFeatureFlag; + @Mock + StatusBarStateController mStatusBarStateController; private final IPackageManager mMockPackageManager = mock(IPackageManager.class); private NotificationFilter mNotificationFilter; private ExpandableNotificationRow mRow; + private NotificationEntry mMediaEntry; + private MediaSession mMediaSession; @Before public void setUp() throws Exception { @@ -84,6 +94,12 @@ public class NotificationFilterTest extends SysuiTestCase { MockitoAnnotations.initMocks(this); when(mMockStatusBarNotification.getUid()).thenReturn(UID_NORMAL); + mMediaSession = new MediaSession(mContext, "TEST_MEDIA_SESSION"); + NotificationEntryBuilder builder = new NotificationEntryBuilder(); + builder.modifyNotification(mContext).setStyle( + new MediaStyle().setMediaSession(mMediaSession.getSessionToken())); + mMediaEntry = builder.build(); + when(mMockPackageManager.checkUidPermission( eq(Manifest.permission.NOTIFICATION_DURING_SETUP), eq(UID_NORMAL))) @@ -107,7 +123,12 @@ public class NotificationFilterTest extends SysuiTestCase { mDependency, TestableLooper.get(this)); mRow = testHelper.createRow(); - mNotificationFilter = new NotificationFilter(mock(StatusBarStateController.class)); + mNotificationFilter = new NotificationFilter(mStatusBarStateController, mMediaFeatureFlag); + } + + @After + public void tearDown() { + mMediaSession.release(); } @Test @@ -218,6 +239,56 @@ public class NotificationFilterTest extends SysuiTestCase { assertFalse(mNotificationFilter.shouldFilterOut(entry)); } + @Test + public void shouldFilterOtherNotificationWhenDisabled() { + // GIVEN that the media feature is disabled + when(mMediaFeatureFlag.getEnabled()).thenReturn(false); + NotificationFilter filter = new NotificationFilter(mStatusBarStateController, + mMediaFeatureFlag); + // WHEN the media filter is asked about an entry + NotificationEntry otherEntry = new NotificationEntryBuilder().build(); + final boolean shouldFilter = filter.shouldFilterOut(otherEntry); + // THEN it shouldn't be filtered + assertFalse(shouldFilter); + } + + @Test + public void shouldFilterOtherNotificationWhenEnabled() { + // GIVEN that the media feature is enabled + when(mMediaFeatureFlag.getEnabled()).thenReturn(true); + NotificationFilter filter = new NotificationFilter(mStatusBarStateController, + mMediaFeatureFlag); + // WHEN the media filter is asked about an entry + NotificationEntry otherEntry = new NotificationEntryBuilder().build(); + final boolean shouldFilter = filter.shouldFilterOut(otherEntry); + // THEN it shouldn't be filtered + assertFalse(shouldFilter); + } + + @Test + public void shouldFilterMediaNotificationWhenDisabled() { + // GIVEN that the media feature is disabled + when(mMediaFeatureFlag.getEnabled()).thenReturn(false); + NotificationFilter filter = new NotificationFilter(mStatusBarStateController, + mMediaFeatureFlag); + // WHEN the media filter is asked about a media entry + final boolean shouldFilter = filter.shouldFilterOut(mMediaEntry); + // THEN it shouldn't be filtered + assertFalse(shouldFilter); + } + + @Test + public void shouldFilterMediaNotificationWhenEnabled() { + // GIVEN that the media feature is enabled + when(mMediaFeatureFlag.getEnabled()).thenReturn(true); + NotificationFilter filter = new NotificationFilter(mStatusBarStateController, + mMediaFeatureFlag); + // WHEN the media filter is asked about a media entry + final boolean shouldFilter = filter.shouldFilterOut(mMediaEntry); + // THEN it should be filtered + assertTrue(shouldFilter); + } + private void initStatusBarNotification(boolean allowDuringSetup) { Bundle bundle = new Bundle(); bundle.putBoolean(Notification.EXTRA_ALLOW_DURING_SETUP, allowDuringSetup); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/MediaCoordinatorTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/MediaCoordinatorTest.java new file mode 100644 index 000000000000..c5dc2b4d4f03 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/MediaCoordinatorTest.java @@ -0,0 +1,126 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.notification.collection.coordinator; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.app.Notification.MediaStyle; +import android.media.session.MediaSession; +import android.testing.AndroidTestingRunner; + +import androidx.test.filters.SmallTest; + +import com.android.systemui.SysuiTestCase; +import com.android.systemui.media.MediaFeatureFlag; +import com.android.systemui.statusbar.notification.collection.NotifPipeline; +import com.android.systemui.statusbar.notification.collection.NotificationEntry; +import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder; +import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifFilter; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +@SmallTest +@RunWith(AndroidTestingRunner.class) +public final class MediaCoordinatorTest extends SysuiTestCase { + + private MediaSession mMediaSession; + private NotificationEntry mOtherEntry; + private NotificationEntry mMediaEntry; + + @Mock private NotifPipeline mNotifPipeline; + @Mock private MediaFeatureFlag mMediaFeatureFlag; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + mOtherEntry = new NotificationEntryBuilder().build(); + mMediaSession = new MediaSession(mContext, "TEST_MEDIA_SESSION"); + NotificationEntryBuilder builder = new NotificationEntryBuilder(); + builder.modifyNotification(mContext).setStyle( + new MediaStyle().setMediaSession(mMediaSession.getSessionToken())); + mMediaEntry = builder.build(); + } + + @After + public void tearDown() { + mMediaSession.release(); + } + + @Test + public void shouldFilterOtherNotificationWhenDisabled() { + // GIVEN that the media feature is disabled + when(mMediaFeatureFlag.getEnabled()).thenReturn(false); + MediaCoordinator coordinator = new MediaCoordinator(mMediaFeatureFlag); + // WHEN the media filter is asked about an entry + NotifFilter filter = captureFilter(coordinator); + final boolean shouldFilter = filter.shouldFilterOut(mOtherEntry, 0); + // THEN it shouldn't be filtered + assertThat(shouldFilter).isFalse(); + } + + @Test + public void shouldFilterOtherNotificationWhenEnabled() { + // GIVEN that the media feature is enabled + when(mMediaFeatureFlag.getEnabled()).thenReturn(true); + MediaCoordinator coordinator = new MediaCoordinator(mMediaFeatureFlag); + // WHEN the media filter is asked about an entry + NotifFilter filter = captureFilter(coordinator); + final boolean shouldFilter = filter.shouldFilterOut(mOtherEntry, 0); + // THEN it shouldn't be filtered + assertThat(shouldFilter).isFalse(); + } + + @Test + public void shouldFilterMediaNotificationWhenDisabled() { + // GIVEN that the media feature is disabled + when(mMediaFeatureFlag.getEnabled()).thenReturn(false); + MediaCoordinator coordinator = new MediaCoordinator(mMediaFeatureFlag); + // WHEN the media filter is asked about a media entry + NotifFilter filter = captureFilter(coordinator); + final boolean shouldFilter = filter.shouldFilterOut(mMediaEntry, 0); + // THEN it shouldn't be filtered + assertThat(shouldFilter).isFalse(); + } + + @Test + public void shouldFilterMediaNotificationWhenEnabled() { + // GIVEN that the media feature is enabled + when(mMediaFeatureFlag.getEnabled()).thenReturn(true); + MediaCoordinator coordinator = new MediaCoordinator(mMediaFeatureFlag); + // WHEN the media filter is asked about a media entry + NotifFilter filter = captureFilter(coordinator); + final boolean shouldFilter = filter.shouldFilterOut(mMediaEntry, 0); + // THEN it should be filtered + assertThat(shouldFilter).isTrue(); + } + + private NotifFilter captureFilter(MediaCoordinator coordinator) { + ArgumentCaptor<NotifFilter> filterCaptor = ArgumentCaptor.forClass(NotifFilter.class); + coordinator.attach(mNotifPipeline); + verify(mNotifPipeline).addFinalizeFilter(filterCaptor.capture()); + return filterCaptor.getValue(); + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.java index b018b59e4389..ed4f8b330e23 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.java @@ -16,7 +16,6 @@ package com.android.systemui.statusbar.notification.row; -import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyFloat; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; @@ -30,11 +29,13 @@ import android.app.AppOpsManager; import android.util.ArraySet; import android.view.NotificationHeaderView; import android.view.View; +import android.view.ViewPropertyAnimator; import androidx.test.annotation.UiThreadTest; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; +import com.android.internal.widget.NotificationExpandButton; import com.android.systemui.SysuiTestCase; import org.junit.Before; @@ -98,4 +99,42 @@ public class NotificationContentViewTest extends SysuiTestCase { verify(mockExpanded, times(1)).setVisibility(View.VISIBLE); verify(mockHeadsUp, times(1)).setVisibility(View.VISIBLE); } + + @Test + @UiThreadTest + public void testExpandButtonFocusIsCalled() { + View mockContractedEB = mock(NotificationExpandButton.class); + View mockContracted = mock(NotificationHeaderView.class); + when(mockContracted.animate()).thenReturn(mock(ViewPropertyAnimator.class)); + when(mockContracted.findViewById(com.android.internal.R.id.expand_button)).thenReturn( + mockContractedEB); + + View mockExpandedEB = mock(NotificationExpandButton.class); + View mockExpanded = mock(NotificationHeaderView.class); + when(mockExpanded.animate()).thenReturn(mock(ViewPropertyAnimator.class)); + when(mockExpanded.findViewById(com.android.internal.R.id.expand_button)).thenReturn( + mockExpandedEB); + + View mockHeadsUpEB = mock(NotificationExpandButton.class); + View mockHeadsUp = mock(NotificationHeaderView.class); + when(mockHeadsUp.animate()).thenReturn(mock(ViewPropertyAnimator.class)); + when(mockHeadsUp.findViewById(com.android.internal.R.id.expand_button)).thenReturn( + mockHeadsUpEB); + + // Set up all 3 child forms + mView.setContractedChild(mockContracted); + mView.setExpandedChild(mockExpanded); + mView.setHeadsUpChild(mockHeadsUp); + + // This is required to call requestAccessibilityFocus() + mView.setFocusOnVisibilityChange(); + + // The following will initialize the view and switch from not visible to expanded. + // (heads-up is actually an alternate form of contracted, hence this enters expanded state) + mView.setHeadsUp(true); + + verify(mockContractedEB, times(0)).requestAccessibilityFocus(); + verify(mockExpandedEB, times(1)).requestAccessibilityFocus(); + verify(mockHeadsUpEB, times(0)).requestAccessibilityFocus(); + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManagerTest.java index 3dc941a0bd20..c55391a387d8 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManagerTest.java @@ -403,11 +403,11 @@ public class NotificationSectionsManagerTest extends SysuiTestCase { enablePeopleFiltering(); setupMockStack( - PERSON.headsUp(), - INCOMING_HEADER, - ALERTING.headsUp(), - PEOPLE_HEADER, - PERSON + PERSON.headsUp(), // personHeaderTarget = 0 + INCOMING_HEADER, // currentIncomingHeaderIdx = 1 + ALERTING.headsUp(), // alertingHeaderTarget = 1 + PEOPLE_HEADER, // currentPeopleHeaderIdx = 3 + PERSON // ); mSectionsManager.updateSectionBoundaries(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoTileManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoTileManagerTest.java index 1a6921a1d136..05cdd802167a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoTileManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoTileManagerTest.java @@ -172,11 +172,12 @@ public class AutoTileManagerTest extends SysuiTestCase { } @Test - public void testSettingTileAddedComponent_onChanged() { + public void testSettingTileAddedComponentAtEnd_onChanged() { changeValue(TEST_SETTING_COMPONENT, 1); waitForIdleSync(); verify(mAutoAddTracker).setTileAdded(TEST_CUSTOM_SPEC); - verify(mQsTileHost).addTile(ComponentName.unflattenFromString(TEST_COMPONENT)); + verify(mQsTileHost).addTile(ComponentName.unflattenFromString(TEST_COMPONENT) + , /* end */ true); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationIconAreaControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationIconAreaControllerTest.java index 177e845bfead..d1a439f99702 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationIconAreaControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationIconAreaControllerTest.java @@ -28,6 +28,7 @@ import android.testing.TestableLooper; import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; +import com.android.systemui.bubbles.BubbleController; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.NotificationListener; import com.android.systemui.statusbar.NotificationMediaManager; @@ -63,6 +64,8 @@ public class NotificationIconAreaControllerTest extends SysuiTestCase { @Mock NotificationShadeWindowView mNotificationShadeWindowView; private NotificationIconAreaController mController; + @Mock + private BubbleController mBubbleController; @Before public void setup() { @@ -74,7 +77,7 @@ public class NotificationIconAreaControllerTest extends SysuiTestCase { mController = new NotificationIconAreaController(mContext, mStatusBar, mStatusBarStateController, mWakeUpCoordinator, mKeyguardBypassController, - mNotificationMediaManager, mListener, mDozeParameters); + mNotificationMediaManager, mListener, mDozeParameters, mBubbleController); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/KeyButtonViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/KeyButtonViewTest.java index 943674a7bf64..5e9d592ab773 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/KeyButtonViewTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/KeyButtonViewTest.java @@ -14,21 +14,33 @@ package com.android.systemui.statusbar.policy; -import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.ACTION_NAV_BUTTON_EVENT; -import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_FLAGS; -import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_NAV_ACTION; +import static android.view.KeyEvent.ACTION_DOWN; +import static android.view.KeyEvent.ACTION_UP; +import static android.view.KeyEvent.FLAG_CANCELED; +import static android.view.KeyEvent.FLAG_LONG_PRESS; +import static android.view.KeyEvent.KEYCODE_0; +import static android.view.KeyEvent.KEYCODE_APP_SWITCH; +import static android.view.KeyEvent.KEYCODE_BACK; +import static android.view.KeyEvent.KEYCODE_HOME; + +import static com.android.systemui.statusbar.policy.KeyButtonView.NavBarActionsEvent.NAVBAR_BACK_BUTTON_LONGPRESS; +import static com.android.systemui.statusbar.policy.KeyButtonView.NavBarActionsEvent.NAVBAR_BACK_BUTTON_TAP; +import static com.android.systemui.statusbar.policy.KeyButtonView.NavBarActionsEvent.NAVBAR_HOME_BUTTON_LONGPRESS; +import static com.android.systemui.statusbar.policy.KeyButtonView.NavBarActionsEvent.NAVBAR_HOME_BUTTON_TAP; +import static com.android.systemui.statusbar.policy.KeyButtonView.NavBarActionsEvent.NAVBAR_OVERVIEW_BUTTON_LONGPRESS; +import static com.android.systemui.statusbar.policy.KeyButtonView.NavBarActionsEvent.NAVBAR_OVERVIEW_BUTTON_TAP; import static junit.framework.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.hardware.input.InputManager; -import android.metrics.LogMaker; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.testing.TestableLooper.RunWithLooper; @@ -37,7 +49,7 @@ import android.view.KeyEvent; import androidx.test.filters.SmallTest; import com.android.internal.logging.MetricsLogger; -import com.android.internal.logging.nano.MetricsProto.MetricsEvent; +import com.android.internal.logging.UiEventLogger; import com.android.systemui.SysuiTestCase; import com.android.systemui.bubbles.BubbleController; import com.android.systemui.recents.OverviewProxyService; @@ -46,12 +58,9 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; -import org.mockito.ArgumentMatcher; import org.mockito.Captor; import org.mockito.MockitoAnnotations; -import java.util.Objects; - @RunWith(AndroidTestingRunner.class) @RunWithLooper @SmallTest @@ -60,6 +69,7 @@ public class KeyButtonViewTest extends SysuiTestCase { private KeyButtonView mKeyButtonView; private MetricsLogger mMetricsLogger; private BubbleController mBubbleController; + private UiEventLogger mUiEventLogger; private InputManager mInputManager = mock(InputManager.class); @Captor private ArgumentCaptor<KeyEvent> mInputEventCaptor; @@ -70,45 +80,74 @@ public class KeyButtonViewTest extends SysuiTestCase { mMetricsLogger = mDependency.injectMockDependency(MetricsLogger.class); mBubbleController = mDependency.injectMockDependency(BubbleController.class); mDependency.injectMockDependency(OverviewProxyService.class); + mUiEventLogger = mDependency.injectMockDependency(UiEventLogger.class); + TestableLooper.get(this).runWithLooper(() -> { - mKeyButtonView = new KeyButtonView(mContext, null, 0, mInputManager); + mKeyButtonView = new KeyButtonView(mContext, null, 0, mInputManager, mUiEventLogger); }); } @Test - public void testMetrics() { - int action = 42; - int flags = 0x141; - int code = KeyEvent.KEYCODE_ENTER; - mKeyButtonView.setCode(code); - mKeyButtonView.sendEvent(action, flags); + public void testLogBackPress() { + checkmetrics(KEYCODE_BACK, ACTION_UP, 0, NAVBAR_BACK_BUTTON_TAP); + } + + @Test + public void testLogOverviewPress() { + checkmetrics(KEYCODE_APP_SWITCH, ACTION_UP, 0, NAVBAR_OVERVIEW_BUTTON_TAP); + } + + @Test + public void testLogHomePress() { + checkmetrics(KEYCODE_HOME, ACTION_UP, 0, NAVBAR_HOME_BUTTON_TAP); + } + + @Test + public void testLogBackLongPressLog() { + checkmetrics(KEYCODE_BACK, ACTION_DOWN, FLAG_LONG_PRESS, NAVBAR_BACK_BUTTON_LONGPRESS); + } + + @Test + public void testLogOverviewLongPress() { + checkmetrics(KEYCODE_APP_SWITCH, ACTION_DOWN, FLAG_LONG_PRESS, + NAVBAR_OVERVIEW_BUTTON_LONGPRESS); + } - verify(mMetricsLogger).write(argThat(new ArgumentMatcher<LogMaker>() { - public String mReason; - - @Override - public boolean matches(LogMaker argument) { - return checkField("category", argument.getCategory(), ACTION_NAV_BUTTON_EVENT) - && checkField("type", argument.getType(), MetricsEvent.TYPE_ACTION) - && checkField("subtype", argument.getSubtype(), code) - && checkField("FIELD_FLAGS", argument.getTaggedData(FIELD_FLAGS), flags) - && checkField("FIELD_NAV_ACTION", argument.getTaggedData(FIELD_NAV_ACTION), - action); - } - - private boolean checkField(String field, Object val, Object val2) { - if (!Objects.equals(val, val2)) { - mReason = "Expected " + field + " " + val2 + " but was " + val; - return false; - } - return true; - } - - @Override - public String toString() { - return mReason; - } - })); + @Test + public void testLogHomeLongPress() { + checkmetrics(KEYCODE_HOME, ACTION_DOWN, FLAG_LONG_PRESS, NAVBAR_HOME_BUTTON_LONGPRESS); + } + + @Test + public void testNoLogKeyDown() { + checkmetrics(KEYCODE_BACK, ACTION_DOWN, 0, null); + } + + @Test + public void testNoLogTapAfterLong() { + mKeyButtonView.mLongClicked = true; + checkmetrics(KEYCODE_BACK, ACTION_UP, 0, null); + } + + @Test + public void testNoLogCanceled() { + checkmetrics(KEYCODE_HOME, ACTION_UP, FLAG_CANCELED, null); + } + + @Test + public void testNoLogArbitraryKeys() { + checkmetrics(KEYCODE_0, ACTION_UP, 0, null); + } + + private void checkmetrics(int code, int action, int flag, + KeyButtonView.NavBarActionsEvent expected) { + mKeyButtonView.setCode(code); + mKeyButtonView.sendEvent(action, flag); + if (expected == null) { + verify(mUiEventLogger, never()).log(any(KeyButtonView.NavBarActionsEvent.class)); + } else { + verify(mUiEventLogger, times(1)).log(expected); + } } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/animation/PhysicsAnimatorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/util/animation/PhysicsAnimatorTest.kt index eb435f9314e7..661fad2d6d5c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/util/animation/PhysicsAnimatorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/util/animation/PhysicsAnimatorTest.kt @@ -21,6 +21,7 @@ import org.junit.Assert import org.junit.Assert.assertEquals import org.junit.Assert.assertFalse import org.junit.Assert.assertNotEquals +import org.junit.Assert.assertNotNull import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Ignore @@ -590,8 +591,10 @@ class PhysicsAnimatorTest : SysuiTestCase() { updatesForProperty.remove(update) } + val target = animator.weakTarget.get() + assertNotNull(target) // Mark this invocation verified. - verify(mockUpdateListener).onAnimationUpdateForProperty(animator.target, updateMap) + verify(mockUpdateListener).onAnimationUpdateForProperty(target!!, updateMap) } verifyNoMoreInteractions(mockUpdateListener) @@ -604,4 +607,4 @@ class PhysicsAnimatorTest : SysuiTestCase() { clearAnimationUpdateFrames(animator) } -}
\ No newline at end of file +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/concurrency/FakeRepeatableExecutor.java b/packages/SystemUI/tests/src/com/android/systemui/util/concurrency/FakeRepeatableExecutor.java new file mode 100644 index 000000000000..477f615faf2b --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/util/concurrency/FakeRepeatableExecutor.java @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.util.concurrency; + +/** + * A fake to use in tests. + */ +public class FakeRepeatableExecutor extends RepeatableExecutorImpl { + + /** + * Initializes a fake RepeatableExecutor from a fake executor. + * + * Use the fake executor to actually process tasks. + * + * @param executor fake executor. + */ + public FakeRepeatableExecutor(FakeExecutor executor) { + super(executor); + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/sensors/ProximityCheckTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/sensors/ProximityCheckTest.java index 7221095a1eaf..dae6b284ff15 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/util/sensors/ProximityCheckTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/util/sensors/ProximityCheckTest.java @@ -81,6 +81,32 @@ public class ProximityCheckTest extends SysuiTestCase { assertFalse(mFakeProximitySensor.isRegistered()); } + @Test + public void testProxDoesntCancelOthers() { + assertFalse(mFakeProximitySensor.isRegistered()); + // We don't need our "other" listener to do anything. Just ensure our sensor is registered. + ProximitySensor.ProximitySensorListener emptyListener = event -> { }; + mFakeProximitySensor.register(emptyListener); + assertTrue(mFakeProximitySensor.isRegistered()); + + // Now run a basic check. This is just like testCheck() + mProximityCheck.check(100, mTestableCallback); + + assertNull(mTestableCallback.mLastResult); + + mFakeProximitySensor.setLastEvent(new ProximitySensor.ProximityEvent(true, 0)); + mFakeProximitySensor.alertListeners(); + + assertTrue(mTestableCallback.mLastResult); + + // We should still be registered, since we have another listener. + assertTrue(mFakeProximitySensor.isRegistered()); + + mFakeProximitySensor.unregister(emptyListener); + assertFalse(mFakeProximitySensor.isRegistered()); + + } + private static class TestableCallback implements Consumer<Boolean> { Boolean mLastResult; @Override diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityWindowManager.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityWindowManager.java index 468e93a8f683..d15c60b9501d 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityWindowManager.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityWindowManager.java @@ -725,7 +725,8 @@ public class AccessibilityWindowManager { case WindowManager.LayoutParams.TYPE_SYSTEM_ERROR: case WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY: case WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY: - case WindowManager.LayoutParams.TYPE_SCREENSHOT: { + case WindowManager.LayoutParams.TYPE_SCREENSHOT: + case WindowManager.LayoutParams.TYPE_TRUSTED_APPLICATION_OVERLAY: { return AccessibilityWindowInfo.TYPE_SYSTEM; } diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java index 42e859f9d713..089861bee479 100644 --- a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java +++ b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java @@ -192,7 +192,7 @@ public final class AutofillManagerService public AutofillManagerService(Context context) { super(context, new SecureSettingsServiceNameResolver(context, Settings.Secure.AUTOFILL_SERVICE), - UserManager.DISALLOW_AUTOFILL); + UserManager.DISALLOW_AUTOFILL, PACKAGE_UPDATE_POLICY_REFRESH_EAGER); mUi = new AutoFillUI(ActivityThread.currentActivityThread().getSystemUiContext()); mAm = LocalServices.getService(ActivityManagerInternal.class); diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java index b5aec8e401eb..8eb401a7ee55 100644 --- a/services/core/java/com/android/server/StorageManagerService.java +++ b/services/core/java/com/android/server/StorageManagerService.java @@ -4657,9 +4657,8 @@ class StorageManagerService extends IStorageManager.Stub private void killAppForOpChange(int code, int uid, String packageName) { final IActivityManager am = ActivityManager.getService(); try { - am.killApplication(packageName, - UserHandle.getAppId(uid), - UserHandle.USER_ALL, AppOpsManager.opToName(code) + " changed."); + am.killUid(UserHandle.getAppId(uid), UserHandle.USER_ALL, + AppOpsManager.opToName(code) + " changed."); } catch (RemoteException e) { } } @@ -4681,7 +4680,12 @@ class StorageManagerService extends IStorageManager.Stub // results in a bad UX, especially since the gid only gives access // to unreliable volumes, USB OTGs that are rarely mounted. The app // will get the external_storage gid on next organic restart. - killAppForOpChange(code, uid, packageName); + if (packageName != null) { + killAppForOpChange(code, uid, packageName); + } else { + // TODO(b/158283222) this can happen, figure out if we need + // to kill in this case as well. + } } return; case OP_LEGACY_STORAGE: diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java index 9f2a77c05d2b..2e628642dac5 100644 --- a/services/core/java/com/android/server/am/ProcessList.java +++ b/services/core/java/com/android/server/am/ProcessList.java @@ -2214,11 +2214,11 @@ public final class ProcessList { app.setHasForegroundActivities(true); } - final Map<String, Pair<String, Long>> pkgDataInfoMap; - final Map<String, Pair<String, Long>> whitelistedAppDataInfoMap; + Map<String, Pair<String, Long>> pkgDataInfoMap; + Map<String, Pair<String, Long>> whitelistedAppDataInfoMap; boolean bindMountAppStorageDirs = false; boolean bindMountAppsData = mAppDataIsolationEnabled - && UserHandle.isApp(app.uid) + && (UserHandle.isApp(app.uid) || UserHandle.isIsolated(app.uid)) && mPlatformCompat.isChangeEnabled(APP_DATA_DIRECTORY_ISOLATION, app.info); // Get all packages belongs to the same shared uid. sharedPackages is empty array @@ -2266,6 +2266,13 @@ public final class ProcessList { } } + // If it's an isolated process, it should not even mount its own app data directories, + // since it has no access to them anyway. + if (app.isolated) { + pkgDataInfoMap = null; + whitelistedAppDataInfoMap = null; + } + final Process.ProcessStartResult startResult; if (hostingRecord.usesWebviewZygote()) { startResult = startWebView(entryPoint, @@ -2276,13 +2283,14 @@ public final class ProcessList { } else if (hostingRecord.usesAppZygote()) { final AppZygote appZygote = createAppZygoteForProcessIfNeeded(app); + // We can't isolate app data and storage data as parent zygote already did that. startResult = appZygote.getProcess().start(entryPoint, app.processName, uid, uid, gids, runtimeFlags, mountExternal, app.info.targetSdkVersion, seInfo, requiredAbi, instructionSet, app.info.dataDir, null, app.info.packageName, /*zygotePolicyFlags=*/ ZYGOTE_POLICY_FLAG_EMPTY, isTopApp, app.mDisabledCompatChanges, pkgDataInfoMap, whitelistedAppDataInfoMap, - bindMountAppsData, bindMountAppStorageDirs, + false, false, new String[]{PROC_START_SEQ_IDENT + app.startSeq}); } else { startResult = Process.start(entryPoint, diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java index a33ad7dc0ea1..9f2714673cd6 100644 --- a/services/core/java/com/android/server/appop/AppOpsService.java +++ b/services/core/java/com/android/server/appop/AppOpsService.java @@ -16,6 +16,11 @@ package com.android.server.appop; +import static android.app.ActivityManager.DEBUG_PROCESS_CAPABILITY_FOREGROUND_CAMERA; +import static android.app.ActivityManager.DEBUG_PROCESS_CAPABILITY_FOREGROUND_CAMERA_Q; +import static android.app.ActivityManager.DEBUG_PROCESS_CAPABILITY_FOREGROUND_LOCATION; +import static android.app.ActivityManager.DEBUG_PROCESS_CAPABILITY_FOREGROUND_MICROPHONE; +import static android.app.ActivityManager.DEBUG_PROCESS_CAPABILITY_FOREGROUND_MICROPHONE_Q; import static android.app.ActivityManager.PROCESS_CAPABILITY_FOREGROUND_CAMERA; import static android.app.ActivityManager.PROCESS_CAPABILITY_FOREGROUND_LOCATION; import static android.app.ActivityManager.PROCESS_CAPABILITY_FOREGROUND_MICROPHONE; @@ -66,11 +71,6 @@ import static android.content.Intent.EXTRA_REPLACING; import static android.content.pm.PermissionInfo.PROTECTION_DANGEROUS; import static android.content.pm.PermissionInfo.PROTECTION_FLAG_APPOP; -import static android.app.ActivityManager.DEBUG_PROCESS_CAPABILITY_FOREGROUND_CAMERA; -import static android.app.ActivityManager.DEBUG_PROCESS_CAPABILITY_FOREGROUND_CAMERA_Q; -import static android.app.ActivityManager.DEBUG_PROCESS_CAPABILITY_FOREGROUND_LOCATION; -import static android.app.ActivityManager.DEBUG_PROCESS_CAPABILITY_FOREGROUND_MICROPHONE; -import static android.app.ActivityManager.DEBUG_PROCESS_CAPABILITY_FOREGROUND_MICROPHONE_Q; import static com.android.server.appop.AppOpsService.ModeCallback.ALL_OPS; import static java.lang.Long.max; @@ -249,7 +249,7 @@ public class AppOpsService extends IAppOpsService.Stub { OP_CAMERA, }; - private static final int MAX_UNFORWARED_OPS = 10; + private static final int MAX_UNFORWARDED_OPS = 10; private static final int MAX_UNUSED_POOLED_OBJECTS = 3; private static final int RARELY_USED_PACKAGES_INITIALIZATION_DELAY_MILLIS = 300000; @@ -322,7 +322,7 @@ public class AppOpsService extends IAppOpsService.Stub { @VisibleForTesting final SparseArray<UidState> mUidStates = new SparseArray<>(); - final HistoricalRegistry mHistoricalRegistry = new HistoricalRegistry(this); + volatile @NonNull HistoricalRegistry mHistoricalRegistry = new HistoricalRegistry(this); long mLastRealtime; @@ -1776,8 +1776,7 @@ public class AppOpsService extends IAppOpsService.Stub { mHandler.postDelayed(new Runnable() { @Override public void run() { - List<String> packageNames = getPackageNamesForSampling(); - resamplePackageAndAppOpLocked(packageNames); + List<String> packageNames = getPackageListAndResample(); initializeRarelyUsedPackagesList(new ArraySet<>(packageNames)); } }, RARELY_USED_PACKAGES_INITIALIZATION_DELAY_MILLIS); @@ -1978,6 +1977,8 @@ public class AppOpsService extends IAppOpsService.Stub { if (AppOpsManager.NOTE_OP_COLLECTION_ENABLED && mWriteNoteOpsScheduled) { writeNoteOps(); } + + mHistoricalRegistry.shutdown(); } private ArrayList<AppOpsManager.OpEntry> collectOps(Ops pkgOps, int[] ops) { @@ -3372,7 +3373,7 @@ public class AppOpsService extends IAppOpsService.Stub { } unforwardedOps.add(asyncNotedOp); - if (unforwardedOps.size() > MAX_UNFORWARED_OPS) { + if (unforwardedOps.size() > MAX_UNFORWARDED_OPS) { unforwardedOps.remove(0); } } @@ -5881,6 +5882,25 @@ public class AppOpsService extends IAppOpsService.Stub { mHistoricalRegistry.clearHistory(); } + @Override + public void rebootHistory(long offlineDurationMillis) { + mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_APPOPS, + "rebootHistory"); + + Preconditions.checkArgument(offlineDurationMillis >= 0); + + // Must not hold the appops lock + mHistoricalRegistry.shutdown(); + + if (offlineDurationMillis > 0) { + SystemClock.sleep(offlineDurationMillis); + } + + mHistoricalRegistry = new HistoricalRegistry(mHistoricalRegistry); + mHistoricalRegistry.systemReady(mContext.getContentResolver()); + mHistoricalRegistry.persistPendingHistory(); + } + /** * Report runtime access to AppOp together with message (including stack trace) * @@ -5967,11 +5987,13 @@ public class AppOpsService extends IAppOpsService.Stub { mContext.enforcePermission(android.Manifest.permission.GET_APP_OPS_STATS, Binder.getCallingPid(), Binder.getCallingUid(), null); RuntimeAppOpAccessMessage result; - List<String> packageNames = getPackageNamesForSampling(); synchronized (this) { result = mCollectedRuntimePermissionMessage; - resamplePackageAndAppOpLocked(packageNames); + mCollectedRuntimePermissionMessage = null; } + mHandler.sendMessage(PooledLambda.obtainMessage( + AppOpsService::getPackageListAndResample, + this)); return result; } @@ -5995,6 +6017,15 @@ public class AppOpsService extends IAppOpsService.Stub { } } + /** Obtains package list and resamples package and appop to watch. */ + private List<String> getPackageListAndResample() { + List<String> packageNames = getPackageNamesForSampling(); + synchronized (this) { + resamplePackageAndAppOpLocked(packageNames); + } + return packageNames; + } + /** Resamples package and appop to watch from the list provided. */ private void resamplePackageAndAppOpLocked(@NonNull List<String> packageNames) { if (!packageNames.isEmpty()) { @@ -6010,7 +6041,6 @@ public class AppOpsService extends IAppOpsService.Stub { mSampledAppOpCode = ThreadLocalRandom.current().nextInt(_NUM_OP); mAcceptableLeftDistance = _NUM_OP; mSampledPackage = packageName; - mCollectedRuntimePermissionMessage = null; } /** diff --git a/services/core/java/com/android/server/appop/HistoricalRegistry.java b/services/core/java/com/android/server/appop/HistoricalRegistry.java index ed4506902f0a..3d22a156b91c 100644 --- a/services/core/java/com/android/server/appop/HistoricalRegistry.java +++ b/services/core/java/com/android/server/appop/HistoricalRegistry.java @@ -199,6 +199,13 @@ final class HistoricalRegistry { mInMemoryLock = lock; } + HistoricalRegistry(@NonNull HistoricalRegistry other) { + this(other.mInMemoryLock); + mMode = other.mMode; + mBaseSnapshotInterval = other.mBaseSnapshotInterval; + mIntervalCompressionMultiplier = other.mIntervalCompressionMultiplier; + } + void systemReady(@NonNull ContentResolver resolver) { final Uri uri = Settings.Global.getUriFor(Settings.Global.APPOP_HISTORY_PARAMETERS); resolver.registerContentObserver(uri, false, new ContentObserver( @@ -223,9 +230,16 @@ final class HistoricalRegistry { // When starting always adjust history to now. final long lastPersistTimeMills = mPersistence.getLastPersistTimeMillisDLocked(); + if (lastPersistTimeMills > 0) { - mPendingHistoryOffsetMillis = - System.currentTimeMillis() - lastPersistTimeMills; + mPendingHistoryOffsetMillis = System.currentTimeMillis() + - lastPersistTimeMills; + + if (DEBUG) { + Slog.i(LOG_TAG, "Time since last write: " + + TimeUtils.formatDuration(mPendingHistoryOffsetMillis) + + " by which to push history on next write"); + } } } } @@ -597,6 +611,9 @@ final class HistoricalRegistry { return; } clearHistoryOnDiskDLocked(); + mNextPersistDueTimeMillis = 0; + mPendingHistoryOffsetMillis = 0; + mCurrentHistoricalOps = null; } } } @@ -650,7 +667,15 @@ final class HistoricalRegistry { return mCurrentHistoricalOps; } - private void persistPendingHistory() { + void shutdown() { + synchronized (mInMemoryLock) { + if (mMode != AppOpsManager.HISTORICAL_MODE_DISABLED) { + persistPendingHistory(); + } + } + } + + void persistPendingHistory() { final List<HistoricalOps> pendingWrites; synchronized (mOnDiskLock) { synchronized (mInMemoryLock) { @@ -844,13 +869,7 @@ final class HistoricalRegistry { if (shortestFile == null) { return 0; } - final String shortestNameNoExtension = shortestFile.getName() - .replace(HISTORY_FILE_SUFFIX, ""); - try { - return Long.parseLong(shortestNameNoExtension); - } catch (NumberFormatException e) { - return 0; - } + return shortestFile.lastModified(); } sHistoricalAppOpsDir.finishRead(); } catch (Throwable e) { diff --git a/services/core/java/com/android/server/hdmi/Constants.java b/services/core/java/com/android/server/hdmi/Constants.java index ac3a65310d31..13b6c7c3ea46 100644 --- a/services/core/java/com/android/server/hdmi/Constants.java +++ b/services/core/java/com/android/server/hdmi/Constants.java @@ -483,6 +483,39 @@ final class Constants { static final String PROPERTY_STRIP_AUDIO_TV_NO_SYSTEM_AUDIO = "persist.sys.hdmi.property_strip_audio_tv_no_system_audio"; + /** + * Determines playback device action upon receiving routing control messages. + * <ul> + * <li><b>none</b> No action taken. + * <li><b>wake_up_only</b> PowerManager.wakeUp() is called. + * <li><b>wake_up_and_send_active_source</b> Same as above and + * additionally <Active Source> is sent. + * </ul> + */ + static final String PLAYBACK_DEVICE_ACTION_ON_ROUTING_CONTROL = + "ro.hdmi.cec.source.playback_device_action_on_routing_control"; + + static final String PLAYBACK_DEVICE_ACTION_ON_ROUTING_CONTROL_NONE = "none"; + static final String PLAYBACK_DEVICE_ACTION_ON_ROUTING_CONTROL_WAKE_UP_ONLY = "wake_up_only"; + static final String PLAYBACK_DEVICE_ACTION_ON_ROUTING_CONTROL_WAKE_UP_AND_SEND_ACTIVE_SOURCE = + "wake_up_and_send_active_source"; + + /** + * Property to decide the device behaviour when <Active Source> is lost. + * + * <p>This property applies to playback devices. + * <p>Possible values are: + * <ul> + * <li><b>none</b> No power state change (default). + * <li><b>standby_now</b> PowerManager.goToSleep() is called. + * </ul> + */ + static final String POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST = + "ro.hdmi.cec.source.power_state_change_on_active_source_lost"; + + static final String POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_NONE = "none"; + static final String POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW = "standby_now"; + static final int RECORDING_TYPE_DIGITAL_RF = 1; static final int RECORDING_TYPE_ANALOGUE_RF = 2; static final int RECORDING_TYPE_EXTERNAL_PHYSICAL_ADDRESS = 3; diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java index d6993b2b38e9..ef2781082a24 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java @@ -63,6 +63,14 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource { // TODO(amyjojo): adding system constants for input ports to TIF mapping. private int mLocalActivePath = 0; + // Determines what action should be taken upon receiving Routing Control messages. + @VisibleForTesting + protected String mPlaybackDeviceActionOnRoutingControl; + + // Behaviour of the device when <Active Source> is lost in favor of another device. + @VisibleForTesting + protected String mPowerStateChangeOnActiveSourceLost; + HdmiCecLocalDevicePlayback(HdmiControlService service) { super(service, HdmiDeviceInfo.DEVICE_PLAYBACK); @@ -71,6 +79,14 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource { // The option is false by default. Update settings db as well to have the right // initial setting on UI. mService.writeBooleanSetting(Global.HDMI_CONTROL_AUTO_DEVICE_OFF_ENABLED, mAutoTvOff); + + mPlaybackDeviceActionOnRoutingControl = SystemProperties.get( + Constants.PLAYBACK_DEVICE_ACTION_ON_ROUTING_CONTROL, + Constants.PLAYBACK_DEVICE_ACTION_ON_ROUTING_CONTROL_NONE); + + mPowerStateChangeOnActiveSourceLost = SystemProperties.get( + Constants.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST, + Constants.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_NONE); } @Override @@ -232,6 +248,28 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource { return !getWakeLock().isHeld(); } + @Override + @ServiceThreadOnly + protected boolean handleActiveSource(HdmiCecMessage message) { + super.handleActiveSource(message); + if (mIsActiveSource) { + return true; + } + switch (mPowerStateChangeOnActiveSourceLost) { + case Constants.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW: + mService.standby(); + return true; + case Constants.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_NONE: + return true; + default: + Slog.w(TAG, "Invalid property '" + + Constants.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST + + "' value: " + + mPowerStateChangeOnActiveSourceLost); + return true; + } + } + @ServiceThreadOnly protected boolean handleUserControlPressed(HdmiCecMessage message) { assertRunOnServiceThread(); @@ -323,6 +361,47 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource { } @Override + @ServiceThreadOnly + protected boolean handleRoutingChange(HdmiCecMessage message) { + assertRunOnServiceThread(); + int physicalAddress = HdmiUtils.twoBytesToInt(message.getParams(), 2); + handleRoutingChangeAndInformation(physicalAddress, message); + return true; + } + + @Override + @ServiceThreadOnly + protected boolean handleRoutingInformation(HdmiCecMessage message) { + assertRunOnServiceThread(); + int physicalAddress = HdmiUtils.twoBytesToInt(message.getParams()); + handleRoutingChangeAndInformation(physicalAddress, message); + return true; + } + + @Override + protected void handleRoutingChangeAndInformation(int physicalAddress, HdmiCecMessage message) { + if (physicalAddress != mService.getPhysicalAddress()) { + return; // Do nothing. + } + switch (mPlaybackDeviceActionOnRoutingControl) { + case Constants.PLAYBACK_DEVICE_ACTION_ON_ROUTING_CONTROL_WAKE_UP_AND_SEND_ACTIVE_SOURCE: + setAndBroadcastActiveSource(message, physicalAddress); + break; + case Constants.PLAYBACK_DEVICE_ACTION_ON_ROUTING_CONTROL_WAKE_UP_ONLY: + mService.wakeUp(); + break; + case Constants.PLAYBACK_DEVICE_ACTION_ON_ROUTING_CONTROL_NONE: + break; + default: + Slog.w(TAG, "Invalid property '" + + Constants.PLAYBACK_DEVICE_ACTION_ON_ROUTING_CONTROL + + "' value: " + + mPlaybackDeviceActionOnRoutingControl); + break; + } + } + + @Override protected int findKeyReceiverAddress() { return Constants.ADDR_TV; } diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java index df6b40dbbcb8..470a25bbae6c 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java @@ -199,7 +199,8 @@ abstract class HdmiCecLocalDeviceSource extends HdmiCecLocalDevice { // do nothing } - // Source device with Switch functionality should implement this method. + // Only source devices that react to routing control messages should implement + // this method (e.g. a TV with built in switch). // TODO(): decide which type will handle the routing when multi device type is supported protected void handleRoutingChangeAndInformation(int physicalAddress, HdmiCecMessage message) { // do nothing diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java index 9de95abafdda..b9669c74a6df 100644 --- a/services/core/java/com/android/server/hdmi/HdmiControlService.java +++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java @@ -40,6 +40,7 @@ import android.hardware.hdmi.HdmiControlManager; import android.hardware.hdmi.HdmiDeviceInfo; import android.hardware.hdmi.HdmiHotplugEvent; import android.hardware.hdmi.HdmiPortInfo; +import android.hardware.hdmi.IHdmiCecVolumeControlFeatureListener; import android.hardware.hdmi.IHdmiControlCallback; import android.hardware.hdmi.IHdmiControlService; import android.hardware.hdmi.IHdmiControlStatusChangeListener; @@ -63,6 +64,7 @@ import android.os.HandlerThread; import android.os.IBinder; import android.os.Looper; import android.os.PowerManager; +import android.os.RemoteCallbackList; import android.os.RemoteException; import android.os.SystemClock; import android.os.SystemProperties; @@ -268,6 +270,11 @@ public class HdmiControlService extends SystemService { private final ArrayList<HdmiControlStatusChangeListenerRecord> mHdmiControlStatusChangeListenerRecords = new ArrayList<>(); + // List of records for HDMI control volume control status change listener for death monitoring. + @GuardedBy("mLock") + private final RemoteCallbackList<IHdmiCecVolumeControlFeatureListener> + mHdmiCecVolumeControlFeatureListenerRecords = new RemoteCallbackList<>(); + // List of records for hotplug event listener to handle the the caller killed in action. @GuardedBy("mLock") private final ArrayList<HotplugEventListenerRecord> mHotplugEventListenerRecords = @@ -1814,6 +1821,21 @@ public class HdmiControlService extends SystemService { } @Override + public void addHdmiCecVolumeControlFeatureListener( + final IHdmiCecVolumeControlFeatureListener listener) { + enforceAccessPermission(); + HdmiControlService.this.addHdmiCecVolumeControlFeatureListener(listener); + } + + @Override + public void removeHdmiCecVolumeControlFeatureListener( + final IHdmiCecVolumeControlFeatureListener listener) { + enforceAccessPermission(); + HdmiControlService.this.removeHdmiControlVolumeControlStatusChangeListener(listener); + } + + + @Override public void addHotplugEventListener(final IHdmiHotplugEventListener listener) { enforceAccessPermission(); HdmiControlService.this.addHotplugEventListener(listener); @@ -2409,6 +2431,33 @@ public class HdmiControlService extends SystemService { } } + @VisibleForTesting + void addHdmiCecVolumeControlFeatureListener( + final IHdmiCecVolumeControlFeatureListener listener) { + mHdmiCecVolumeControlFeatureListenerRecords.register(listener); + + runOnServiceThread(new Runnable() { + @Override + public void run() { + // Return the current status of mHdmiCecVolumeControlEnabled; + synchronized (mLock) { + try { + listener.onHdmiCecVolumeControlFeature(mHdmiCecVolumeControlEnabled); + } catch (RemoteException e) { + Slog.e(TAG, "Failed to report HdmiControlVolumeControlStatusChange: " + + mHdmiCecVolumeControlEnabled, e); + } + } + } + }); + } + + @VisibleForTesting + void removeHdmiControlVolumeControlStatusChangeListener( + final IHdmiCecVolumeControlFeatureListener listener) { + mHdmiCecVolumeControlFeatureListenerRecords.unregister(listener); + } + private void addHotplugEventListener(final IHdmiHotplugEventListener listener) { final HotplugEventListenerRecord record = new HotplugEventListenerRecord(listener); try { @@ -2682,6 +2731,19 @@ public class HdmiControlService extends SystemService { } } + private void announceHdmiCecVolumeControlFeatureChange(boolean isEnabled) { + assertRunOnServiceThread(); + mHdmiCecVolumeControlFeatureListenerRecords.broadcast(listener -> { + try { + listener.onHdmiCecVolumeControlFeature(isEnabled); + } catch (RemoteException e) { + Slog.e(TAG, + "Failed to report HdmiControlVolumeControlStatusChange: " + + isEnabled); + } + }); + } + public HdmiCecLocalDeviceTv tv() { return (HdmiCecLocalDeviceTv) mCecController.getLocalDevice(HdmiDeviceInfo.DEVICE_TV); } @@ -3026,6 +3088,7 @@ public class HdmiControlService extends SystemService { isHdmiCecVolumeControlEnabled); } } + announceHdmiCecVolumeControlFeatureChange(isHdmiCecVolumeControlEnabled); } boolean isHdmiCecVolumeControlEnabled() { diff --git a/services/core/java/com/android/server/hdmi/SystemAudioStatusAction.java b/services/core/java/com/android/server/hdmi/SystemAudioStatusAction.java index 13f0f4ae4a92..5d913d12b79f 100644 --- a/services/core/java/com/android/server/hdmi/SystemAudioStatusAction.java +++ b/services/core/java/com/android/server/hdmi/SystemAudioStatusAction.java @@ -64,12 +64,6 @@ final class SystemAudioStatusAction extends HdmiCecFeatureAction { } private void handleSendGiveAudioStatusFailure() { - // Inform to all application that the audio status (volume, mute) of - // the audio amplifier is unknown. - tv().setAudioStatus(false, Constants.UNKNOWN_VOLUME); - - sendUserControlPressedAndReleased(mAvrAddress, - HdmiCecKeycode.getMuteKey(!tv().isSystemAudioActivated())); // Still return SUCCESS to callback. finishWithCallback(HdmiControlManager.RESULT_SUCCESS); diff --git a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java index 75a89a213052..0e997155e7af 100644 --- a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java +++ b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java @@ -584,7 +584,7 @@ class MediaRouter2ServiceImpl { mAllRouterRecords.put(binder, routerRecord); userRecord.mHandler.sendMessage( - obtainMessage(UserHandler::notifyRoutesToRouter, + obtainMessage(UserHandler::notifyRouterRegistered, userRecord.mHandler, routerRecord)); } @@ -1769,8 +1769,8 @@ class MediaRouter2ServiceImpl { } } - private void notifyRoutesToRouter(@NonNull RouterRecord routerRecord) { - List<MediaRoute2Info> routes = new ArrayList<>(); + private void notifyRouterRegistered(@NonNull RouterRecord routerRecord) { + List<MediaRoute2Info> currentRoutes = new ArrayList<>(); MediaRoute2ProviderInfo systemProviderInfo = null; for (MediaRoute2ProviderInfo providerInfo : mLastProviderInfos) { @@ -1780,27 +1780,32 @@ class MediaRouter2ServiceImpl { systemProviderInfo = providerInfo; continue; } - routes.addAll(providerInfo.getRoutes()); + currentRoutes.addAll(providerInfo.getRoutes()); } + RoutingSessionInfo currentSystemSessionInfo; if (routerRecord.mHasModifyAudioRoutingPermission) { if (systemProviderInfo != null) { - routes.addAll(systemProviderInfo.getRoutes()); + currentRoutes.addAll(systemProviderInfo.getRoutes()); } else { // This shouldn't happen. Slog.w(TAG, "notifyRoutesToRouter: System route provider not found."); } + currentSystemSessionInfo = mSystemProvider.getSessionInfos().get(0); } else { - routes.add(mSystemProvider.getDefaultRoute()); + currentRoutes.add(mSystemProvider.getDefaultRoute()); + currentSystemSessionInfo = mSystemProvider.getDefaultSessionInfo(); } - if (routes.size() == 0) { + if (currentRoutes.size() == 0) { return; } + try { - routerRecord.mRouter.notifyRoutesAdded(routes); + routerRecord.mRouter.notifyRouterRegistered( + currentRoutes, currentSystemSessionInfo); } catch (RemoteException ex) { - Slog.w(TAG, "Failed to notify all routes. Router probably died.", ex); + Slog.w(TAG, "Failed to notify router registered. Router probably died.", ex); } } diff --git a/services/core/java/com/android/server/notification/BadgeExtractor.java b/services/core/java/com/android/server/notification/BadgeExtractor.java index af8baa50d501..d323d8095525 100644 --- a/services/core/java/com/android/server/notification/BadgeExtractor.java +++ b/services/core/java/com/android/server/notification/BadgeExtractor.java @@ -19,6 +19,7 @@ import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_BADGE; import android.content.Context; import android.util.Slog; +import android.app.Notification; /** * Determines whether a badge should be shown for this notification @@ -61,6 +62,10 @@ public class BadgeExtractor implements NotificationSignalExtractor { record.setShowBadge(false); } + Notification.BubbleMetadata metadata = record.getNotification().getBubbleMetadata(); + if (metadata != null && metadata.isNotificationSuppressed()) { + record.setShowBadge(false); + } return null; } diff --git a/services/core/java/com/android/server/om/IdmapManager.java b/services/core/java/com/android/server/om/IdmapManager.java index 59735ebb24d2..d6b1b27360ca 100644 --- a/services/core/java/com/android/server/om/IdmapManager.java +++ b/services/core/java/com/android/server/om/IdmapManager.java @@ -65,7 +65,7 @@ final class IdmapManager { * modified. */ boolean createIdmap(@NonNull final PackageInfo targetPackage, - @NonNull final PackageInfo overlayPackage, int additionalPolicies, int userId) { + @NonNull final PackageInfo overlayPackage, int userId) { if (DEBUG) { Slog.d(TAG, "create idmap for " + targetPackage.packageName + " and " + overlayPackage.packageName); @@ -73,14 +73,13 @@ final class IdmapManager { final String targetPath = targetPackage.applicationInfo.getBaseCodePath(); final String overlayPath = overlayPackage.applicationInfo.getBaseCodePath(); try { + int policies = calculateFulfilledPolicies(targetPackage, overlayPackage, userId); boolean enforce = enforceOverlayable(overlayPackage); - int policies = calculateFulfilledPolicies(targetPackage, overlayPackage, userId) - | additionalPolicies; if (mIdmapDaemon.verifyIdmap(targetPath, overlayPath, policies, enforce, userId)) { return false; } - return mIdmapDaemon.createIdmap(targetPath, overlayPath, policies, enforce, userId) - != null; + return mIdmapDaemon.createIdmap(targetPath, overlayPath, policies, + enforce, userId) != null; } catch (Exception e) { Slog.w(TAG, "failed to generate idmap for " + targetPath + " and " + overlayPath + ": " + e.getMessage()); diff --git a/services/core/java/com/android/server/om/OverlayManagerService.java b/services/core/java/com/android/server/om/OverlayManagerService.java index 3c5e47625fa2..396815399874 100644 --- a/services/core/java/com/android/server/om/OverlayManagerService.java +++ b/services/core/java/com/android/server/om/OverlayManagerService.java @@ -45,7 +45,6 @@ import android.content.pm.PackageInfo; import android.content.pm.PackageManagerInternal; import android.content.pm.UserInfo; import android.content.res.ApkAssets; -import android.content.res.Resources; import android.net.Uri; import android.os.Binder; import android.os.Environment; @@ -63,7 +62,6 @@ import android.util.AtomicFile; import android.util.Slog; import android.util.SparseArray; -import com.android.internal.R; import com.android.internal.content.om.OverlayConfig; import com.android.server.FgThread; import com.android.server.IoThread; @@ -252,8 +250,7 @@ public final class OverlayManagerService extends SystemService { mSettings = new OverlayManagerSettings(); mImpl = new OverlayManagerServiceImpl(mPackageManager, im, mSettings, OverlayConfig.getSystemInstance(), getDefaultOverlayPackages(), - new OverlayChangeListener(), getOverlayableConfigurator(), - getOverlayableConfiguratorTargets()); + new OverlayChangeListener()); mActorEnforcer = new OverlayActorEnforcer(mPackageManager); final IntentFilter packageFilter = new IntentFilter(); @@ -336,28 +333,6 @@ public final class OverlayManagerService extends SystemService { return defaultPackages.toArray(new String[defaultPackages.size()]); } - - /** - * Retrieves the package name that is recognized as an actor for the packages specified by - * {@link #getOverlayableConfiguratorTargets()}. - */ - @Nullable - private String getOverlayableConfigurator() { - return TextUtils.nullIfEmpty(Resources.getSystem() - .getString(R.string.config_overlayableConfigurator)); - } - - /** - * Retrieves the target packages that recognize the {@link #getOverlayableConfigurator} as an - * actor for itself. Overlays targeting one of the specified targets that are signed with the - * same signature as the overlayable configurator will be granted the "actor" policy. - */ - @Nullable - private String[] getOverlayableConfiguratorTargets() { - return Resources.getSystem().getStringArray( - R.array.config_overlayableConfiguratorTargets); - } - private final class PackageReceiver extends BroadcastReceiver { @Override public void onReceive(@NonNull final Context context, @NonNull final Intent intent) { diff --git a/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java b/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java index 879ad4fdf011..05a4a38feef1 100644 --- a/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java +++ b/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java @@ -31,7 +31,6 @@ import android.annotation.Nullable; import android.content.om.OverlayInfo; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; -import android.os.OverlayablePolicy; import android.text.TextUtils; import android.util.ArrayMap; import android.util.ArraySet; @@ -74,9 +73,6 @@ final class OverlayManagerServiceImpl { private final String[] mDefaultOverlays; private final OverlayChangeListener mListener; - private final String mOverlayableConfigurator; - private final String[] mOverlayableConfiguratorTargets; - /** * Helper method to merge the overlay manager's (as read from overlays.xml) * and package manager's (as parsed from AndroidManifest.xml files) views @@ -119,17 +115,13 @@ final class OverlayManagerServiceImpl { @NonNull final OverlayManagerSettings settings, @NonNull final OverlayConfig overlayConfig, @NonNull final String[] defaultOverlays, - @NonNull final OverlayChangeListener listener, - @Nullable final String overlayableConfigurator, - @Nullable final String[] overlayableConfiguratorTargets) { + @NonNull final OverlayChangeListener listener) { mPackageManager = packageManager; mIdmapManager = idmapManager; mSettings = settings; mOverlayConfig = overlayConfig; mDefaultOverlays = defaultOverlays; mListener = listener; - mOverlayableConfigurator = overlayableConfigurator; - mOverlayableConfiguratorTargets = overlayableConfiguratorTargets; } /** @@ -714,25 +706,7 @@ final class OverlayManagerServiceImpl { if (targetPackage != null && overlayPackage != null && !("android".equals(targetPackageName) && !isPackageConfiguredMutable(overlayPackageName))) { - - int additionalPolicies = 0; - if (TextUtils.nullIfEmpty(mOverlayableConfigurator) != null - && ArrayUtils.contains(mOverlayableConfiguratorTargets, targetPackageName) - && isPackageConfiguredMutable(overlayPackageName) - && mPackageManager.signaturesMatching(mOverlayableConfigurator, - overlayPackageName, userId)) { - // The overlay targets a package that has the overlayable configurator configured as - // its actor. The overlay and this actor are signed with the same signature, so - // the overlay fulfills the actor policy. - modified |= mSettings.setHasConfiguratorActorPolicy(overlayPackageName, userId, - true); - additionalPolicies |= OverlayablePolicy.ACTOR_SIGNATURE; - } else if (mSettings.hasConfiguratorActorPolicy(overlayPackageName, userId)) { - additionalPolicies |= OverlayablePolicy.ACTOR_SIGNATURE; - } - - modified |= mIdmapManager.createIdmap(targetPackage, overlayPackage, additionalPolicies, - userId); + modified |= mIdmapManager.createIdmap(targetPackage, overlayPackage, userId); } if (overlayPackage != null) { diff --git a/services/core/java/com/android/server/om/OverlayManagerSettings.java b/services/core/java/com/android/server/om/OverlayManagerSettings.java index f8226faf1336..3d520bf59068 100644 --- a/services/core/java/com/android/server/om/OverlayManagerSettings.java +++ b/services/core/java/com/android/server/om/OverlayManagerSettings.java @@ -73,7 +73,7 @@ final class OverlayManagerSettings { remove(packageName, userId); insert(new SettingsItem(packageName, userId, targetPackageName, targetOverlayableName, baseCodePath, OverlayInfo.STATE_UNKNOWN, isEnabled, isMutable, priority, - overlayCategory, false /* hasConfiguratorActorPolicy */)); + overlayCategory)); } /** @@ -160,26 +160,6 @@ final class OverlayManagerSettings { return mItems.get(idx).setState(state); } - boolean hasConfiguratorActorPolicy(@NonNull final String packageName, final int userId) { - final int idx = select(packageName, userId); - if (idx < 0) { - throw new BadKeyException(packageName, userId); - } - return mItems.get(idx).hasConfiguratorActorPolicy(); - } - - /** - * Returns true if the settings were modified, false if they remain the same. - */ - boolean setHasConfiguratorActorPolicy(@NonNull final String packageName, final int userId, - boolean hasPolicy) { - final int idx = select(packageName, userId); - if (idx < 0) { - throw new BadKeyException(packageName, userId); - } - return mItems.get(idx).setHasConfiguratorActorPolicy(hasPolicy); - } - List<OverlayInfo> getOverlaysForTarget(@NonNull final String targetPackageName, final int userId) { // Immutable RROs targeting "android" are loaded from AssetManager, and so they should be @@ -343,17 +323,16 @@ final class OverlayManagerSettings { pw.println(item.mPackageName + ":" + item.getUserId() + " {"); pw.increaseIndent(); - pw.println("mPackageName................: " + item.mPackageName); - pw.println("mUserId.....................: " + item.getUserId()); - pw.println("mTargetPackageName..........: " + item.getTargetPackageName()); - pw.println("mTargetOverlayableName......: " + item.getTargetOverlayableName()); - pw.println("mBaseCodePath...............: " + item.getBaseCodePath()); - pw.println("mState......................: " + OverlayInfo.stateToString(item.getState())); - pw.println("mIsEnabled..................: " + item.isEnabled()); - pw.println("mIsMutable..................: " + item.isMutable()); - pw.println("mPriority...................: " + item.mPriority); - pw.println("mCategory...................: " + item.mCategory); - pw.println("mHasConfiguratorActorPolicy.: " + item.hasConfiguratorActorPolicy()); + pw.println("mPackageName...........: " + item.mPackageName); + pw.println("mUserId................: " + item.getUserId()); + pw.println("mTargetPackageName.....: " + item.getTargetPackageName()); + pw.println("mTargetOverlayableName.: " + item.getTargetOverlayableName()); + pw.println("mBaseCodePath..........: " + item.getBaseCodePath()); + pw.println("mState.................: " + OverlayInfo.stateToString(item.getState())); + pw.println("mIsEnabled.............: " + item.isEnabled()); + pw.println("mIsMutable.............: " + item.isMutable()); + pw.println("mPriority..............: " + item.mPriority); + pw.println("mCategory..............: " + item.mCategory); pw.decreaseIndent(); pw.println("}"); @@ -392,9 +371,6 @@ final class OverlayManagerSettings { case "category": pw.println(item.mCategory); break; - case "hasconfiguratoractorpolicy": - pw.println(item.mHasConfiguratorActorPolicy); - break; } } @@ -422,8 +398,6 @@ final class OverlayManagerSettings { private static final String ATTR_CATEGORY = "category"; private static final String ATTR_USER_ID = "userId"; private static final String ATTR_VERSION = "version"; - private static final String ATTR_HAS_CONFIGURATOR_ACTOR_POLICY = - "hasConfiguratorActorPolicy"; @VisibleForTesting static final int CURRENT_VERSION = 4; @@ -461,6 +435,10 @@ final class OverlayManagerSettings { // Throw an exception which will cause the overlay file to be ignored // and overwritten. throw new XmlPullParserException("old version " + oldVersion + "; ignoring"); + case 3: + // Upgrading from version 3 to 4 is not a breaking change so do not ignore the + // overlay file. + return; default: throw new XmlPullParserException("unrecognized version " + oldVersion); } @@ -480,12 +458,9 @@ final class OverlayManagerSettings { final boolean isStatic = XmlUtils.readBooleanAttribute(parser, ATTR_IS_STATIC); final int priority = XmlUtils.readIntAttribute(parser, ATTR_PRIORITY); final String category = XmlUtils.readStringAttribute(parser, ATTR_CATEGORY); - final boolean hasConfiguratorActorPolicy = XmlUtils.readBooleanAttribute(parser, - ATTR_HAS_CONFIGURATOR_ACTOR_POLICY); return new SettingsItem(packageName, userId, targetPackageName, targetOverlayableName, - baseCodePath, state, isEnabled, !isStatic, priority, category, - hasConfiguratorActorPolicy); + baseCodePath, state, isEnabled, !isStatic, priority, category); } public static void persist(@NonNull final ArrayList<SettingsItem> table, @@ -520,8 +495,6 @@ final class OverlayManagerSettings { XmlUtils.writeBooleanAttribute(xml, ATTR_IS_STATIC, !item.mIsMutable); XmlUtils.writeIntAttribute(xml, ATTR_PRIORITY, item.mPriority); XmlUtils.writeStringAttribute(xml, ATTR_CATEGORY, item.mCategory); - XmlUtils.writeBooleanAttribute(xml, ATTR_HAS_CONFIGURATOR_ACTOR_POLICY, - item.mHasConfiguratorActorPolicy); xml.endTag(null, TAG_ITEM); } } @@ -538,14 +511,12 @@ final class OverlayManagerSettings { private boolean mIsMutable; private int mPriority; private String mCategory; - private boolean mHasConfiguratorActorPolicy; SettingsItem(@NonNull final String packageName, final int userId, @NonNull final String targetPackageName, @Nullable final String targetOverlayableName, @NonNull final String baseCodePath, final @OverlayInfo.State int state, final boolean isEnabled, - final boolean isMutable, final int priority, @Nullable String category, - final boolean hasConfiguratorActorPolicy) { + final boolean isMutable, final int priority, @Nullable String category) { mPackageName = packageName; mUserId = userId; mTargetPackageName = targetPackageName; @@ -557,7 +528,6 @@ final class OverlayManagerSettings { mCache = null; mIsMutable = isMutable; mPriority = priority; - mHasConfiguratorActorPolicy = hasConfiguratorActorPolicy; } private String getTargetPackageName() { @@ -648,18 +618,6 @@ final class OverlayManagerSettings { private int getPriority() { return mPriority; } - - private boolean hasConfiguratorActorPolicy() { - return mHasConfiguratorActorPolicy; - } - - private boolean setHasConfiguratorActorPolicy(boolean hasPolicy) { - if (mHasConfiguratorActorPolicy != hasPolicy) { - mHasConfiguratorActorPolicy = hasPolicy; - return true; - } - return false; - } } private int select(@NonNull final String packageName, final int userId) { diff --git a/services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerModule.java b/services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerModule.java index 49c781905898..2f963b7e6b35 100644 --- a/services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerModule.java +++ b/services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerModule.java @@ -20,11 +20,16 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.hardware.soundtrigger.V2_1.ISoundTriggerHwCallback; import android.hardware.soundtrigger.V2_2.ISoundTriggerHw; +import android.media.audio.common.AudioConfig; +import android.media.audio.common.AudioOffloadInfo; import android.media.soundtrigger_middleware.ISoundTriggerCallback; import android.media.soundtrigger_middleware.ISoundTriggerModule; import android.media.soundtrigger_middleware.ModelParameterRange; +import android.media.soundtrigger_middleware.PhraseRecognitionEvent; +import android.media.soundtrigger_middleware.PhraseRecognitionExtra; import android.media.soundtrigger_middleware.PhraseSoundModel; import android.media.soundtrigger_middleware.RecognitionConfig; +import android.media.soundtrigger_middleware.RecognitionEvent; import android.media.soundtrigger_middleware.SoundModel; import android.media.soundtrigger_middleware.SoundModelType; import android.media.soundtrigger_middleware.SoundTriggerModuleProperties; @@ -540,20 +545,20 @@ class SoundTriggerModule implements IHwBinder.DeathRecipient { switch (mModelType) { case SoundModelType.GENERIC: { android.media.soundtrigger_middleware.RecognitionEvent event = - new android.media.soundtrigger_middleware.RecognitionEvent(); + newEmptyRecognitionEvent(); event.status = android.media.soundtrigger_middleware.RecognitionStatus.ABORTED; + event.type = SoundModelType.GENERIC; mCallback.onRecognition(mHandle, event); } break; case SoundModelType.KEYPHRASE: { android.media.soundtrigger_middleware.PhraseRecognitionEvent event = - new android.media.soundtrigger_middleware.PhraseRecognitionEvent(); - event.common = - new android.media.soundtrigger_middleware.RecognitionEvent(); + newEmptyPhraseRecognitionEvent(); event.common.status = android.media.soundtrigger_middleware.RecognitionStatus.ABORTED; + event.common.type = SoundModelType.KEYPHRASE; mCallback.onPhraseRecognition(mHandle, event); } break; @@ -614,4 +619,35 @@ class SoundTriggerModule implements IHwBinder.DeathRecipient { } } } + + /** + * Creates a default-initialized recognition event. + * + * Object fields are default constructed. + * Array fields are initialized to 0 length. + * + * @return The event. + */ + private static RecognitionEvent newEmptyRecognitionEvent() { + RecognitionEvent result = new RecognitionEvent(); + result.audioConfig = new AudioConfig(); + result.audioConfig.offloadInfo = new AudioOffloadInfo(); + result.data = new byte[0]; + return result; + } + + /** + * Creates a default-initialized phrase recognition event. + * + * Object fields are default constructed. + * Array fields are initialized to 0 length. + * + * @return The event. + */ + private static PhraseRecognitionEvent newEmptyPhraseRecognitionEvent() { + PhraseRecognitionEvent result = new PhraseRecognitionEvent(); + result.common = newEmptyRecognitionEvent(); + result.phraseExtras = new PhraseRecognitionExtra[0]; + return result; + } } diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java index ab459fdadd21..c0c9b3220ae0 100644 --- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java +++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java @@ -2187,7 +2187,7 @@ public class StatsPullAtomService extends SystemService { pulledData.add(e); } } catch (IOException | JSONException e) { - Slog.e(TAG, "exception reading diskstats cache file", e); + Slog.w(TAG, "Unable to read diskstats cache file within pullAppSize"); return StatsManager.PULL_SKIP; } return StatsManager.PULL_SUCCESS; @@ -2291,7 +2291,7 @@ public class StatsPullAtomService extends SystemService { .build(); pulledData.add(e); } catch (IOException | JSONException e) { - Slog.e(TAG, "exception reading diskstats cache file", e); + Slog.w(TAG, "Unable to read diskstats cache file within pullCategorySize"); return StatsManager.PULL_SKIP; } return StatsManager.PULL_SUCCESS; diff --git a/services/core/java/com/android/server/textclassifier/TEST_MAPPING b/services/core/java/com/android/server/textclassifier/TEST_MAPPING new file mode 100644 index 000000000000..ccf26315852d --- /dev/null +++ b/services/core/java/com/android/server/textclassifier/TEST_MAPPING @@ -0,0 +1,7 @@ +{ + "imports": [ + { + "path": "frameworks/base/core/java/android/view/textclassifier" + } + ] +} diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 31897057e076..48609e17ba40 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -3164,6 +3164,11 @@ class Task extends WindowContainer<WindowContainer> { } @Override + public SurfaceControl.Builder makeAnimationLeash() { + return super.makeAnimationLeash().setMetadata(METADATA_TASK_ID, mTaskId); + } + + @Override public SurfaceControl getAnimationLeashParent() { if (WindowManagerService.sHierarchicalAnimations) { return super.getAnimationLeashParent(); diff --git a/services/core/java/com/android/server/wm/TaskChangeNotificationController.java b/services/core/java/com/android/server/wm/TaskChangeNotificationController.java index 6e9428ee6976..2a241183ff1f 100644 --- a/services/core/java/com/android/server/wm/TaskChangeNotificationController.java +++ b/services/core/java/com/android/server/wm/TaskChangeNotificationController.java @@ -185,7 +185,7 @@ class TaskChangeNotificationController { }; private final TaskStackConsumer mNotifyOnActivityRotation = (l, m) -> { - l.onActivityRotation(); + l.onActivityRotation(m.arg1); }; @FunctionalInterface @@ -583,9 +583,10 @@ class TaskChangeNotificationController { msg.sendToTarget(); } - /** @see android.app.ITaskStackListener#onActivityRotation() */ - void notifyOnActivityRotation() { - final Message msg = mHandler.obtainMessage(NOTIFY_ACTIVITY_ROTATED_MSG); + /** @see android.app.ITaskStackListener#onActivityRotation(int) */ + void notifyOnActivityRotation(int displayId) { + final Message msg = mHandler.obtainMessage(NOTIFY_ACTIVITY_ROTATED_MSG, + displayId, 0 /* unused */); forAllLocalListeners(mNotifyOnActivityRotation, msg); msg.sendToTarget(); } diff --git a/services/core/java/com/android/server/wm/TaskSnapshotSurface.java b/services/core/java/com/android/server/wm/TaskSnapshotSurface.java index 392557045b4a..e26f1e1fe06f 100644 --- a/services/core/java/com/android/server/wm/TaskSnapshotSurface.java +++ b/services/core/java/com/android/server/wm/TaskSnapshotSurface.java @@ -391,6 +391,7 @@ class TaskSnapshotSurface implements StartingSurface { frame = null; mTmpSnapshotSize.set(0, 0, buffer.getWidth(), buffer.getHeight()); mTmpDstFrame.set(mFrame); + mTmpDstFrame.offsetTo(0, 0); } // Scale the mismatch dimensions to fill the task bounds diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 8934e8f5c2e0..d1366bd2976e 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -3850,7 +3850,7 @@ public class WindowManagerService extends IWindowManager.Stub if (rotationChanged) { mAtmService.getTaskChangeNotificationController() - .notifyOnActivityRotation(); + .notifyOnActivityRotation(displayContent.mDisplayId); } if (!rotationChanged || forceRelayout) { diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java index 42c21930bdf7..c0252363a159 100644 --- a/services/core/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java @@ -418,25 +418,25 @@ class WindowStateAnimator { if (!mDestroyPreservedSurfaceUponRedraw) { return; } - if (mSurfaceController != null) { - if (mPendingDestroySurface != null) { - // If we are preserving a surface but we aren't relaunching that means - // we are just doing an in-place switch. In that case any SurfaceFlinger side - // child layers need to be reparented to the new surface to make this - // transparent to the app. - if (mWin.mActivityRecord == null || mWin.mActivityRecord.isRelaunching() == false) { - mPostDrawTransaction.reparentChildren( - mPendingDestroySurface.getClientViewRootSurface(), - mSurfaceController.mSurfaceControl).apply(); - } - } + + // If we are preserving a surface but we aren't relaunching that means + // we are just doing an in-place switch. In that case any SurfaceFlinger side + // child layers need to be reparented to the new surface to make this + // transparent to the app. + // If the children are detached, we don't want to reparent them to the new surface. + // Instead let the children get removed when the old surface is deleted. + if (mSurfaceController != null && mPendingDestroySurface != null && !mChildrenDetached + && (mWin.mActivityRecord == null || !mWin.mActivityRecord.isRelaunching())) { + mPostDrawTransaction.reparentChildren( + mPendingDestroySurface.getClientViewRootSurface(), + mSurfaceController.mSurfaceControl).apply(); } destroyDeferredSurfaceLocked(); mDestroyPreservedSurfaceUponRedraw = false; } - void markPreservedSurfaceForDestroy() { + private void markPreservedSurfaceForDestroy() { if (mDestroyPreservedSurfaceUponRedraw && !mService.mDestroyPreservedSurface.contains(mWin)) { mService.mDestroyPreservedSurface.add(mWin); @@ -1363,9 +1363,13 @@ class WindowStateAnimator { if (mPendingDestroySurface != null && mDestroyPreservedSurfaceUponRedraw) { final SurfaceControl pendingSurfaceControl = mPendingDestroySurface.mSurfaceControl; mPostDrawTransaction.reparent(pendingSurfaceControl, null); - mPostDrawTransaction.reparentChildren( - mPendingDestroySurface.getClientViewRootSurface(), - mSurfaceController.mSurfaceControl); + // If the children are detached, we don't want to reparent them to the new surface. + // Instead let the children get removed when the old surface is deleted. + if (!mChildrenDetached) { + mPostDrawTransaction.reparentChildren( + mPendingDestroySurface.getClientViewRootSurface(), + mSurfaceController.mSurfaceControl); + } } SurfaceControl.mergeToGlobalTransaction(mPostDrawTransaction); @@ -1593,6 +1597,12 @@ class WindowStateAnimator { mSurfaceController.detachChildren(); } mChildrenDetached = true; + // If the children are detached, it means the app is exiting. We don't want to tear the + // content down too early, otherwise we could end up with a flicker. By preserving the + // current surface, we ensure the content remains on screen until the window is completely + // removed. It also ensures that the old surface is cleaned up when started again since it + // forces mSurfaceController to be set to null. + preserveSurfaceLocked(); } void setOffsetPositionForStackResize(boolean offsetPositionForStackResize) { diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java index 145e1ec56e4a..c44f12735fb5 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java @@ -15,6 +15,7 @@ */ package com.android.server.hdmi; +import static com.android.server.hdmi.Constants.ADDR_PLAYBACK_1; import static com.android.server.hdmi.Constants.ADDR_TV; import static com.android.server.hdmi.HdmiControlService.INITIATED_BY_ENABLE_CEC; @@ -56,6 +57,7 @@ public class HdmiCecLocalDevicePlaybackTest { private ArrayList<HdmiCecLocalDevice> mLocalDevices = new ArrayList<>(); private int mPlaybackPhysicalAddress; private boolean mWokenUp; + private boolean mStandby; @Mock private IPowerManager mIPowerManagerMock; @Mock private IThermalService mIThermalServiceMock; @@ -76,6 +78,11 @@ public class HdmiCecLocalDevicePlaybackTest { } @Override + void standby() { + mStandby = true; + } + + @Override boolean isControlEnabled() { return true; } @@ -119,6 +126,132 @@ public class HdmiCecLocalDevicePlaybackTest { mNativeWrapper.clearResultMessages(); } + @Test + public void handleRoutingChange_None() { + mHdmiCecLocalDevicePlayback.mPlaybackDeviceActionOnRoutingControl = + Constants.PLAYBACK_DEVICE_ACTION_ON_ROUTING_CONTROL_NONE; + + mWokenUp = false; + + HdmiCecMessage message = + HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000, + mPlaybackPhysicalAddress); + + HdmiCecMessage expectedMessage = + HdmiCecMessageBuilder.buildActiveSource(ADDR_PLAYBACK_1, + mPlaybackPhysicalAddress); + + assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message)).isTrue(); + mTestLooper.dispatchAll(); + assertThat(mWokenUp).isFalse(); + assertThat(mNativeWrapper.getResultMessages().contains(expectedMessage)).isFalse(); + } + + @Test + public void handleRoutingInformation_None() { + mHdmiCecLocalDevicePlayback.mPlaybackDeviceActionOnRoutingControl = + Constants.PLAYBACK_DEVICE_ACTION_ON_ROUTING_CONTROL_NONE; + + mWokenUp = false; + + HdmiCecMessage message = + HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV, + mPlaybackPhysicalAddress); + + HdmiCecMessage expectedMessage = + HdmiCecMessageBuilder.buildActiveSource(ADDR_PLAYBACK_1, + mPlaybackPhysicalAddress); + + assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message)).isTrue(); + mTestLooper.dispatchAll(); + assertThat(mWokenUp).isFalse(); + assertThat(mNativeWrapper.getResultMessages().contains(expectedMessage)).isFalse(); + } + + @Test + public void handleRoutingChange_WakeUpOnly() { + mHdmiCecLocalDevicePlayback.mPlaybackDeviceActionOnRoutingControl = + Constants.PLAYBACK_DEVICE_ACTION_ON_ROUTING_CONTROL_WAKE_UP_ONLY; + + mWokenUp = false; + + HdmiCecMessage message = + HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000, + mPlaybackPhysicalAddress); + + HdmiCecMessage expectedMessage = + HdmiCecMessageBuilder.buildActiveSource(ADDR_PLAYBACK_1, + mPlaybackPhysicalAddress); + + assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message)).isTrue(); + mTestLooper.dispatchAll(); + assertThat(mWokenUp).isTrue(); + assertThat(mNativeWrapper.getResultMessages().contains(expectedMessage)).isFalse(); + } + + @Test + public void handleRoutingInformation_WakeUpOnly() { + mHdmiCecLocalDevicePlayback.mPlaybackDeviceActionOnRoutingControl = + Constants.PLAYBACK_DEVICE_ACTION_ON_ROUTING_CONTROL_WAKE_UP_ONLY; + + mWokenUp = false; + + HdmiCecMessage message = + HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV, + mPlaybackPhysicalAddress); + + HdmiCecMessage expectedMessage = + HdmiCecMessageBuilder.buildActiveSource(ADDR_PLAYBACK_1, + mPlaybackPhysicalAddress); + + assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message)).isTrue(); + mTestLooper.dispatchAll(); + assertThat(mWokenUp).isTrue(); + assertThat(mNativeWrapper.getResultMessages().contains(expectedMessage)).isFalse(); + } + + @Test + public void handleRoutingChange_WakeUpAndSendActiveSource() { + mHdmiCecLocalDevicePlayback.mPlaybackDeviceActionOnRoutingControl = + Constants.PLAYBACK_DEVICE_ACTION_ON_ROUTING_CONTROL_WAKE_UP_AND_SEND_ACTIVE_SOURCE; + + mWokenUp = false; + + HdmiCecMessage message = + HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000, + mPlaybackPhysicalAddress); + + HdmiCecMessage expectedMessage = + HdmiCecMessageBuilder.buildActiveSource(ADDR_PLAYBACK_1, + mPlaybackPhysicalAddress); + + assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message)).isTrue(); + mTestLooper.dispatchAll(); + assertThat(mWokenUp).isTrue(); + assertThat(mNativeWrapper.getResultMessages()).contains(expectedMessage); + } + + @Test + public void handleRoutingInformation_WakeUpAndSendActiveSource() { + mHdmiCecLocalDevicePlayback.mPlaybackDeviceActionOnRoutingControl = + Constants.PLAYBACK_DEVICE_ACTION_ON_ROUTING_CONTROL_WAKE_UP_AND_SEND_ACTIVE_SOURCE; + + mWokenUp = false; + + HdmiCecMessage message = + HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV, + mPlaybackPhysicalAddress); + + HdmiCecMessage expectedMessage = + HdmiCecMessageBuilder.buildActiveSource(ADDR_PLAYBACK_1, + mPlaybackPhysicalAddress); + + assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message)).isTrue(); + mTestLooper.dispatchAll(); + assertThat(mWokenUp).isTrue(); + assertThat(mNativeWrapper.getResultMessages()).contains(expectedMessage); + } + // Playback device does not handle routing control related feature right now @Ignore("b/120845532") @Test @@ -184,6 +317,78 @@ public class HdmiCecLocalDevicePlaybackTest { } @Test + public void handleOnStandby_ScreenOff_NotActiveSource() { + mHdmiCecLocalDevicePlayback.setIsActiveSource(false); + mHdmiCecLocalDevicePlayback.setAutoDeviceOff(true); + mHdmiCecLocalDevicePlayback.onStandby(false, HdmiControlService.STANDBY_SCREEN_OFF); + mTestLooper.dispatchAll(); + + HdmiCecMessage standbyMessage = HdmiCecMessageBuilder.buildStandby( + mHdmiCecLocalDevicePlayback.mAddress, ADDR_TV); + + assertThat(mNativeWrapper.getResultMessages()).doesNotContain(standbyMessage); + } + + @Test + public void handleOnStandby_ScreenOff_ActiveSource() { + mHdmiCecLocalDevicePlayback.setIsActiveSource(true); + mHdmiCecLocalDevicePlayback.setAutoDeviceOff(true); + mHdmiCecLocalDevicePlayback.onStandby(false, HdmiControlService.STANDBY_SCREEN_OFF); + mTestLooper.dispatchAll(); + + HdmiCecMessage standbyMessage = HdmiCecMessageBuilder.buildStandby( + mHdmiCecLocalDevicePlayback.mAddress, ADDR_TV); + + assertThat(mNativeWrapper.getResultMessages()).contains(standbyMessage); + } + + @Test + public void handleActiveSource_ActiveSource_None() { + mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost = + Constants.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_NONE; + mStandby = false; + HdmiCecMessage message = HdmiCecMessageBuilder.buildActiveSource(ADDR_PLAYBACK_1, + mPlaybackPhysicalAddress); + assertThat(mHdmiCecLocalDevicePlayback.handleActiveSource(message)).isTrue(); + mTestLooper.dispatchAll(); + assertThat(mStandby).isFalse(); + } + + @Test + public void handleActiveSource_notActiveSource_None() { + mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost = + Constants.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_NONE; + mStandby = false; + HdmiCecMessage message = HdmiCecMessageBuilder.buildActiveSource(ADDR_TV, 0x0000); + assertThat(mHdmiCecLocalDevicePlayback.handleActiveSource(message)).isTrue(); + mTestLooper.dispatchAll(); + assertThat(mStandby).isFalse(); + } + + @Test + public void handleActiveSource_ActiveSource_StandbyNow() { + mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost = + Constants.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW; + mStandby = false; + HdmiCecMessage message = HdmiCecMessageBuilder.buildActiveSource(ADDR_PLAYBACK_1, + mPlaybackPhysicalAddress); + assertThat(mHdmiCecLocalDevicePlayback.handleActiveSource(message)).isTrue(); + mTestLooper.dispatchAll(); + assertThat(mStandby).isFalse(); + } + + @Test + public void handleActiveSource_notActiveSource_StandbyNow() { + mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost = + Constants.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW; + mStandby = false; + HdmiCecMessage message = HdmiCecMessageBuilder.buildActiveSource(ADDR_TV, 0x0000); + assertThat(mHdmiCecLocalDevicePlayback.handleActiveSource(message)).isTrue(); + mTestLooper.dispatchAll(); + assertThat(mStandby).isTrue(); + } + + @Test public void sendVolumeKeyEvent_up_volumeEnabled() { mHdmiControlService.setHdmiCecVolumeControlEnabled(true); mHdmiCecLocalDevicePlayback.sendVolumeKeyEvent(KeyEvent.KEYCODE_VOLUME_UP, true); diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java index 7af7a23b1ef6..c34b8e19a41d 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java @@ -33,6 +33,7 @@ import android.content.Context; import android.content.ContextWrapper; import android.hardware.hdmi.HdmiControlManager; import android.hardware.hdmi.HdmiPortInfo; +import android.hardware.hdmi.IHdmiCecVolumeControlFeatureListener; import android.os.IPowerManager; import android.os.IThermalService; import android.os.Looper; @@ -261,4 +262,89 @@ public class HdmiControlServiceTest { mHdmiControlService.setHdmiCecVolumeControlEnabled(true); assertThat(mHdmiControlService.isHdmiCecVolumeControlEnabled()).isTrue(); } + + @Test + public void addHdmiCecVolumeControlFeatureListener_emitsCurrentState_enabled() { + mHdmiControlService.setHdmiCecVolumeControlEnabled(true); + VolumeControlFeatureCallback callback = new VolumeControlFeatureCallback(); + + mHdmiControlService.addHdmiCecVolumeControlFeatureListener(callback); + mTestLooper.dispatchAll(); + + assertThat(callback.mCallbackReceived).isTrue(); + assertThat(callback.mVolumeControlEnabled).isTrue(); + } + + @Test + public void addHdmiCecVolumeControlFeatureListener_emitsCurrentState_disabled() { + mHdmiControlService.setHdmiCecVolumeControlEnabled(false); + VolumeControlFeatureCallback callback = new VolumeControlFeatureCallback(); + + mHdmiControlService.addHdmiCecVolumeControlFeatureListener(callback); + mTestLooper.dispatchAll(); + + assertThat(callback.mCallbackReceived).isTrue(); + assertThat(callback.mVolumeControlEnabled).isFalse(); + } + + @Test + public void addHdmiCecVolumeControlFeatureListener_notifiesStateUpdate() { + mHdmiControlService.setHdmiCecVolumeControlEnabled(false); + VolumeControlFeatureCallback callback = new VolumeControlFeatureCallback(); + + mHdmiControlService.addHdmiCecVolumeControlFeatureListener(callback); + + mHdmiControlService.setHdmiCecVolumeControlEnabled(true); + mTestLooper.dispatchAll(); + + assertThat(callback.mCallbackReceived).isTrue(); + assertThat(callback.mVolumeControlEnabled).isTrue(); + } + + @Test + public void addHdmiCecVolumeControlFeatureListener_honorsUnregistration() { + mHdmiControlService.setHdmiCecVolumeControlEnabled(false); + VolumeControlFeatureCallback callback = new VolumeControlFeatureCallback(); + + mHdmiControlService.addHdmiCecVolumeControlFeatureListener(callback); + mTestLooper.dispatchAll(); + + mHdmiControlService.removeHdmiControlVolumeControlStatusChangeListener(callback); + mHdmiControlService.setHdmiCecVolumeControlEnabled(true); + mTestLooper.dispatchAll(); + + assertThat(callback.mCallbackReceived).isTrue(); + assertThat(callback.mVolumeControlEnabled).isFalse(); + } + + @Test + public void addHdmiCecVolumeControlFeatureListener_notifiesStateUpdate_multiple() { + mHdmiControlService.setHdmiCecVolumeControlEnabled(false); + VolumeControlFeatureCallback callback1 = new VolumeControlFeatureCallback(); + VolumeControlFeatureCallback callback2 = new VolumeControlFeatureCallback(); + + mHdmiControlService.addHdmiCecVolumeControlFeatureListener(callback1); + mHdmiControlService.addHdmiCecVolumeControlFeatureListener(callback2); + + + mHdmiControlService.setHdmiCecVolumeControlEnabled(true); + mTestLooper.dispatchAll(); + + assertThat(callback1.mCallbackReceived).isTrue(); + assertThat(callback2.mCallbackReceived).isTrue(); + assertThat(callback1.mVolumeControlEnabled).isTrue(); + assertThat(callback2.mVolumeControlEnabled).isTrue(); + } + + private static class VolumeControlFeatureCallback extends + IHdmiCecVolumeControlFeatureListener.Stub { + boolean mCallbackReceived = false; + boolean mVolumeControlEnabled = false; + + @Override + public void onHdmiCecVolumeControlFeature(boolean enabled) throws RemoteException { + this.mCallbackReceived = true; + this.mVolumeControlEnabled = enabled; + } + } } diff --git a/services/tests/servicestests/src/com/android/server/om/OverlayManagerServiceImplTests.java b/services/tests/servicestests/src/com/android/server/om/OverlayManagerServiceImplTests.java index 8774ab020202..f4c5506c7001 100644 --- a/services/tests/servicestests/src/com/android/server/om/OverlayManagerServiceImplTests.java +++ b/services/tests/servicestests/src/com/android/server/om/OverlayManagerServiceImplTests.java @@ -26,7 +26,6 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import android.content.om.OverlayInfo; -import android.os.OverlayablePolicy; import androidx.test.runner.AndroidJUnit4; @@ -205,138 +204,4 @@ public class OverlayManagerServiceImplTests extends OverlayManagerServiceImplTes impl.setEnabled(OVERLAY, true, USER); assertEquals(0, listener.count); } - - @Test - public void testConfigurator() { - mOverlayableConfigurator = "actor"; - mOverlayableConfiguratorTargets = new String[]{TARGET}; - reinitializeImpl(); - - installNewPackage(target("actor").setCertificate("one"), USER); - installNewPackage(target(TARGET).addOverlayable("TestResources").setCertificate("two"), - USER); - - DummyDeviceState.PackageBuilder overlay = overlay(OVERLAY, TARGET, "TestResources") - .setCertificate("one"); - installNewPackage(overlay, USER); - - DummyIdmapDaemon.IdmapHeader idmap = getIdmapDaemon().getIdmap(overlay.build().apkPath); - assertNotNull(idmap); - assertEquals(OverlayablePolicy.ACTOR_SIGNATURE, - idmap.policies & OverlayablePolicy.ACTOR_SIGNATURE); - } - - @Test - public void testConfiguratorWithoutOverlayable() { - mOverlayableConfigurator = "actor"; - mOverlayableConfiguratorTargets = new String[]{TARGET}; - reinitializeImpl(); - - installNewPackage(target("actor").setCertificate("one"), USER); - installNewPackage(target(TARGET).setCertificate("two"), USER); - - DummyDeviceState.PackageBuilder overlay = overlay(OVERLAY, TARGET).setCertificate("one"); - installNewPackage(overlay, USER); - - DummyIdmapDaemon.IdmapHeader idmap = getIdmapDaemon().getIdmap(overlay.build().apkPath); - assertNotNull(idmap); - assertEquals(OverlayablePolicy.ACTOR_SIGNATURE, - idmap.policies & OverlayablePolicy.ACTOR_SIGNATURE); - } - - @Test - public void testConfiguratorDifferentTargets() { - // The target package is not listed in the configurator target list, so the actor policy - // should not be granted. - mOverlayableConfigurator = "actor"; - mOverlayableConfiguratorTargets = new String[]{"somethingElse"}; - reinitializeImpl(); - - installNewPackage(target("actor").setCertificate("one"), USER); - installNewPackage(target(TARGET).setCertificate("two"), USER); - - DummyDeviceState.PackageBuilder overlay = overlay(OVERLAY, TARGET).setCertificate("one"); - installNewPackage(overlay, USER); - - DummyIdmapDaemon.IdmapHeader idmap = getIdmapDaemon().getIdmap(overlay.build().apkPath); - assertNotNull(idmap); - assertEquals(0, idmap.policies & OverlayablePolicy.ACTOR_SIGNATURE); - } - - @Test - public void testConfiguratorDifferentSignatures() { - mOverlayableConfigurator = "actor"; - mOverlayableConfiguratorTargets = new String[]{TARGET}; - reinitializeImpl(); - - installNewPackage(target("actor").setCertificate("one"), USER); - installNewPackage(target(TARGET).addOverlayable("TestResources").setCertificate("two"), - USER); - - DummyDeviceState.PackageBuilder overlay = overlay(OVERLAY, TARGET, "TestResources") - .setCertificate("two"); - installNewPackage(overlay, USER); - - DummyIdmapDaemon.IdmapHeader idmap = getIdmapDaemon().getIdmap(overlay.build().apkPath); - assertNotNull(idmap); - assertEquals(0, idmap.policies & OverlayablePolicy.ACTOR_SIGNATURE); - } - - @Test - public void testConfiguratorWithoutOverlayableDifferentSignatures() { - mOverlayableConfigurator = "actor"; - mOverlayableConfiguratorTargets = new String[]{TARGET}; - reinitializeImpl(); - - installNewPackage(target("actor").setCertificate("one"), USER); - installNewPackage(target(TARGET).setCertificate("two"), USER); - - DummyDeviceState.PackageBuilder overlay = overlay(OVERLAY, TARGET).setCertificate("two"); - installNewPackage(overlay, USER); - - DummyIdmapDaemon.IdmapHeader idmap = getIdmapDaemon().getIdmap(overlay.build().apkPath); - assertNotNull(idmap); - assertEquals(0, idmap.policies & OverlayablePolicy.ACTOR_SIGNATURE); - } - - @Test - public void testConfiguratorChanges() { - mOverlayableConfigurator = "actor"; - mOverlayableConfiguratorTargets = new String[]{TARGET}; - reinitializeImpl(); - - installNewPackage(target("actor").setCertificate("one"), USER); - installNewPackage(target(TARGET).addOverlayable("TestResources").setCertificate("two"), - USER); - - DummyDeviceState.PackageBuilder overlay = overlay(OVERLAY, TARGET, "TestResources") - .setCertificate("one"); - installNewPackage(overlay, USER); - - DummyIdmapDaemon.IdmapHeader idmap = getIdmapDaemon().getIdmap(overlay.build().apkPath); - assertNotNull(idmap); - assertEquals(OverlayablePolicy.ACTOR_SIGNATURE, - idmap.policies & OverlayablePolicy.ACTOR_SIGNATURE); - - // Change the configurator to a different package. The overlay should still be granted the - // actor policy. - mOverlayableConfigurator = "differentActor"; - OverlayManagerServiceImpl impl = reinitializeImpl(); - impl.updateOverlaysForUser(USER); - - idmap = getIdmapDaemon().getIdmap(overlay.build().apkPath); - assertNotNull(idmap); - assertEquals(OverlayablePolicy.ACTOR_SIGNATURE, - idmap.policies & OverlayablePolicy.ACTOR_SIGNATURE); - - // Reset the setting persisting that the overlay once fulfilled the actor policy implicitly - // through the configurator. The overlay should lose the actor policy. - impl = reinitializeImpl(); - getSettings().setHasConfiguratorActorPolicy(OVERLAY, USER, false); - impl.updateOverlaysForUser(USER); - - idmap = getIdmapDaemon().getIdmap(overlay.build().apkPath); - assertNotNull(idmap); - assertEquals(0, idmap.policies & OverlayablePolicy.ACTOR_SIGNATURE); - } } diff --git a/services/tests/servicestests/src/com/android/server/om/OverlayManagerServiceImplTestsBase.java b/services/tests/servicestests/src/com/android/server/om/OverlayManagerServiceImplTestsBase.java index 52a58907ea5a..733310b2508a 100644 --- a/services/tests/servicestests/src/com/android/server/om/OverlayManagerServiceImplTestsBase.java +++ b/services/tests/servicestests/src/com/android/server/om/OverlayManagerServiceImplTestsBase.java @@ -52,9 +52,6 @@ class OverlayManagerServiceImplTestsBase { private DummyPackageManagerHelper mPackageManager; private DummyIdmapDaemon mIdmapDaemon; private OverlayConfig mOverlayConfig; - private OverlayManagerSettings mSettings; - String mOverlayableConfigurator; - String[] mOverlayableConfiguratorTargets; @Before public void setUp() { @@ -62,26 +59,20 @@ class OverlayManagerServiceImplTestsBase { mListener = new DummyListener(); mPackageManager = new DummyPackageManagerHelper(mState); mIdmapDaemon = new DummyIdmapDaemon(mState); - mSettings = new OverlayManagerSettings(); mOverlayConfig = mock(OverlayConfig.class); when(mOverlayConfig.getPriority(any())).thenReturn(OverlayConfig.DEFAULT_PRIORITY); when(mOverlayConfig.isEnabled(any())).thenReturn(false); when(mOverlayConfig.isMutable(any())).thenReturn(true); - mOverlayableConfigurator = null; - mOverlayableConfiguratorTargets = null; reinitializeImpl(); } - OverlayManagerServiceImpl reinitializeImpl() { + void reinitializeImpl() { mImpl = new OverlayManagerServiceImpl(mPackageManager, new IdmapManager(mIdmapDaemon, mPackageManager), - mSettings, + new OverlayManagerSettings(), mOverlayConfig, new String[0], - mListener, - mOverlayableConfigurator, - mOverlayableConfiguratorTargets); - return mImpl; + mListener); } OverlayManagerServiceImpl getImpl() { @@ -92,14 +83,6 @@ class OverlayManagerServiceImplTestsBase { return mListener; } - DummyIdmapDaemon getIdmapDaemon() { - return mIdmapDaemon; - } - - OverlayManagerSettings getSettings() { - return mSettings; - } - void assertState(@State int expected, final String overlayPackageName, int userId) { final OverlayInfo info = mImpl.getOverlayInfo(overlayPackageName, userId); if (info == null) { diff --git a/services/tests/servicestests/src/com/android/server/om/OverlayManagerSettingsTests.java b/services/tests/servicestests/src/com/android/server/om/OverlayManagerSettingsTests.java index e2cedb5e1a62..146f60aff724 100644 --- a/services/tests/servicestests/src/com/android/server/om/OverlayManagerSettingsTests.java +++ b/services/tests/servicestests/src/com/android/server/om/OverlayManagerSettingsTests.java @@ -367,8 +367,7 @@ public class OverlayManagerSettingsTests { + " isEnabled='false'\n" + " category='dummy-category'\n" + " isStatic='false'\n" - + " priority='0'" - + " hasConfiguratorActorPolicy='true' />\n" + + " priority='0' />\n" + "</overlays>\n"; ByteArrayInputStream is = new ByteArrayInputStream(xml.getBytes("utf-8")); @@ -381,7 +380,6 @@ public class OverlayManagerSettingsTests { assertEquals(1234, oi.userId); assertEquals(STATE_DISABLED, oi.state); assertFalse(mSettings.getEnabled("com.dummy.overlay", 1234)); - assertTrue(mSettings.hasConfiguratorActorPolicy("com.dummy.overlay", 1234)); } @Test diff --git a/services/tests/servicestests/src/com/android/server/pm/parsing/AndroidPackageParsingEquivalenceTest.kt b/services/tests/servicestests/src/com/android/server/pm/parsing/AndroidPackageParsingEquivalenceTest.kt index 5412bb5106ff..74b4d122cbc0 100644 --- a/services/tests/servicestests/src/com/android/server/pm/parsing/AndroidPackageParsingEquivalenceTest.kt +++ b/services/tests/servicestests/src/com/android/server/pm/parsing/AndroidPackageParsingEquivalenceTest.kt @@ -18,8 +18,8 @@ package com.android.server.pm.parsing import android.content.pm.PackageManager import android.platform.test.annotations.Presubmit +import androidx.test.filters.LargeTest import com.google.common.truth.Expect -import com.google.common.truth.Truth.assertWithMessage import org.junit.Rule import org.junit.Test @@ -52,6 +52,7 @@ class AndroidPackageParsingEquivalenceTest : AndroidPackageParsingTestBase() { } } + @LargeTest @Test fun packageInfoEquality() { val flags = PackageManager.GET_ACTIVITIES or @@ -65,7 +66,9 @@ class AndroidPackageParsingEquivalenceTest : AndroidPackageParsingTestBase() { PackageManager.GET_SERVICES or PackageManager.GET_SHARED_LIBRARY_FILES or PackageManager.GET_SIGNATURES or - PackageManager.GET_SIGNING_CERTIFICATES + PackageManager.GET_SIGNING_CERTIFICATES or + PackageManager.MATCH_DIRECT_BOOT_UNAWARE or + PackageManager.MATCH_DIRECT_BOOT_AWARE val oldPackageInfo = oldPackages.asSequence().map { oldPackageInfo(it, flags) } val newPackageInfo = newPackages.asSequence().map { newPackageInfo(it, flags) } @@ -77,11 +80,79 @@ class AndroidPackageParsingEquivalenceTest : AndroidPackageParsingTestBase() { } else { "$firstName | $secondName" } - expect.withMessage("${it.first?.applicationInfo?.sourceDir} $packageName") - .that(it.first?.dumpToString()) - .isEqualTo(it.second?.dumpToString()) + + // Main components are asserted independently to separate the failures. Otherwise the + // comparison would include every component in one massive string. + + val prefix = "${it.first?.applicationInfo?.sourceDir} $packageName" + + expect.withMessage("$prefix PackageInfo") + .that(it.second?.dumpToString()) + .isEqualTo(it.first?.dumpToString()) + + expect.withMessage("$prefix ApplicationInfo") + .that(it.second?.applicationInfo?.dumpToString()) + .isEqualTo(it.first?.applicationInfo?.dumpToString()) + + val firstActivityNames = it.first?.activities?.map { it.name } ?: emptyList() + val secondActivityNames = it.second?.activities?.map { it.name } ?: emptyList() + expect.withMessage("$prefix activities") + .that(secondActivityNames) + .containsExactlyElementsIn(firstActivityNames) + .inOrder() + + if (!it.first?.activities.isNullOrEmpty() && !it.second?.activities.isNullOrEmpty()) { + it.first?.activities?.zip(it.second?.activities!!)?.forEach { + expect.withMessage("$prefix ${it.first.name}") + .that(it.second.dumpToString()) + .isEqualTo(it.first.dumpToString()) + } + } + + val firstReceiverNames = it.first?.receivers?.map { it.name } ?: emptyList() + val secondReceiverNames = it.second?.receivers?.map { it.name } ?: emptyList() + expect.withMessage("$prefix receivers") + .that(secondReceiverNames) + .containsExactlyElementsIn(firstReceiverNames) + .inOrder() + + if (!it.first?.receivers.isNullOrEmpty() && !it.second?.receivers.isNullOrEmpty()) { + it.first?.receivers?.zip(it.second?.receivers!!)?.forEach { + expect.withMessage("$prefix ${it.first.name}") + .that(it.second.dumpToString()) + .isEqualTo(it.first.dumpToString()) + } + } + + val firstProviderNames = it.first?.providers?.map { it.name } ?: emptyList() + val secondProviderNames = it.second?.providers?.map { it.name } ?: emptyList() + expect.withMessage("$prefix providers") + .that(secondProviderNames) + .containsExactlyElementsIn(firstProviderNames) + .inOrder() + + if (!it.first?.providers.isNullOrEmpty() && !it.second?.providers.isNullOrEmpty()) { + it.first?.providers?.zip(it.second?.providers!!)?.forEach { + expect.withMessage("$prefix ${it.first.name}") + .that(it.second.dumpToString()) + .isEqualTo(it.first.dumpToString()) + } + } + + val firstServiceNames = it.first?.services?.map { it.name } ?: emptyList() + val secondServiceNames = it.second?.services?.map { it.name } ?: emptyList() + expect.withMessage("$prefix services") + .that(secondServiceNames) + .containsExactlyElementsIn(firstServiceNames) + .inOrder() + + if (!it.first?.services.isNullOrEmpty() && !it.second?.services.isNullOrEmpty()) { + it.first?.services?.zip(it.second?.services!!)?.forEach { + expect.withMessage("$prefix ${it.first.name}") + .that(it.second.dumpToString()) + .isEqualTo(it.first.dumpToString()) + } + } } } } - - diff --git a/services/tests/servicestests/src/com/android/server/pm/parsing/AndroidPackageParsingTestBase.kt b/services/tests/servicestests/src/com/android/server/pm/parsing/AndroidPackageParsingTestBase.kt index 0f028f05d514..420ff19aab74 100644 --- a/services/tests/servicestests/src/com/android/server/pm/parsing/AndroidPackageParsingTestBase.kt +++ b/services/tests/servicestests/src/com/android/server/pm/parsing/AndroidPackageParsingTestBase.kt @@ -19,6 +19,7 @@ package com.android.server.pm.parsing import android.content.Context import android.content.pm.ActivityInfo import android.content.pm.ApplicationInfo +import android.content.pm.ComponentInfo import android.content.pm.ConfigurationInfo import android.content.pm.FeatureInfo import android.content.pm.InstrumentationInfo @@ -27,6 +28,8 @@ import android.content.pm.PackageParser import android.content.pm.PackageUserState import android.content.pm.PermissionInfo import android.content.pm.ProviderInfo +import android.content.pm.ServiceInfo +import android.os.Bundle import android.os.Debug import android.os.Environment import android.util.SparseArray @@ -38,8 +41,10 @@ import com.android.server.pm.pkg.PackageStateUnserialized import com.android.server.testutils.mockThrowOnUnmocked import com.android.server.testutils.whenever import org.junit.BeforeClass -import org.mockito.Mockito +import org.mockito.Mockito.any +import org.mockito.Mockito.anyBoolean import org.mockito.Mockito.anyInt +import org.mockito.Mockito.anyString import org.mockito.Mockito.mock import java.io.File @@ -47,7 +52,7 @@ open class AndroidPackageParsingTestBase { companion object { - private const val VERIFY_ALL_APKS = false + private const val VERIFY_ALL_APKS = true /** For auditing memory usage differences */ private const val DUMP_HPROF_TO_EXTERNAL = false @@ -81,10 +86,14 @@ open class AndroidPackageParsingTestBase { .filter { file -> file.name.endsWith(".apk") } .toList() } + .distinct() private val dummyUserState = mock(PackageUserState::class.java).apply { installed = true - Mockito.`when`(isAvailable(anyInt())).thenReturn(true) + whenever(isAvailable(anyInt())) { true } + whenever(isMatch(any<ComponentInfo>(), anyInt())) { true } + whenever(isMatch(anyBoolean(), anyBoolean(), anyBoolean(), anyBoolean(), + anyString(), anyInt())) { true } } lateinit var oldPackages: List<PackageParser.Package> @@ -145,6 +154,7 @@ open class AndroidPackageParsingTestBase { private fun mockPkgSetting(aPkg: AndroidPackage) = mockThrowOnUnmocked<PackageSetting> { this.pkg = aPkg whenever(pkgState) { PackageStateUnserialized() } + whenever(readUserState(anyInt())) { dummyUserState } } } @@ -156,19 +166,10 @@ open class AndroidPackageParsingTestBase { // The following methods prepend "this." because @hide APIs can cause an IDE to auto-import // the R.attr constant instead of referencing the field in an attempt to fix the error. - /** - * Known exclusions: - * - [ApplicationInfo.credentialProtectedDataDir] - * - [ApplicationInfo.dataDir] - * - [ApplicationInfo.deviceProtectedDataDir] - * - [ApplicationInfo.processName] - * - [ApplicationInfo.publicSourceDir] - * - [ApplicationInfo.scanPublicSourceDir] - * - [ApplicationInfo.scanSourceDir] - * - [ApplicationInfo.sourceDir] - * These attributes used to be assigned post-package-parsing as part of another component, - * but are now adjusted directly inside [PackageImpl]. - */ + // It's difficult to comment out a line in a triple quoted string, so this is used instead + // to ignore specific fields. A comment is required to explain why a field was ignored. + private fun Any?.ignored(comment: String): String = "IGNORED" + protected fun ApplicationInfo.dumpToString() = """ appComponentFactory=${this.appComponentFactory} backupAgentName=${this.backupAgentName} @@ -179,22 +180,31 @@ open class AndroidPackageParsingTestBase { compatibleWidthLimitDp=${this.compatibleWidthLimitDp} compileSdkVersion=${this.compileSdkVersion} compileSdkVersionCodename=${this.compileSdkVersionCodename} + credentialProtectedDataDir=${this.credentialProtectedDataDir + .ignored("Deferred pre-R, but assigned immediately in R")} + crossProfile=${this.crossProfile.ignored("Added in R")} + dataDir=${this.dataDir.ignored("Deferred pre-R, but assigned immediately in R")} descriptionRes=${this.descriptionRes} + deviceProtectedDataDir=${this.deviceProtectedDataDir + .ignored("Deferred pre-R, but assigned immediately in R")} enabled=${this.enabled} enabledSetting=${this.enabledSetting} flags=${Integer.toBinaryString(this.flags)} fullBackupContent=${this.fullBackupContent} + gwpAsanMode=${this.gwpAsanMode.ignored("Added in R")} hiddenUntilInstalled=${this.hiddenUntilInstalled} icon=${this.icon} iconRes=${this.iconRes} installLocation=${this.installLocation} + labelRes=${this.labelRes} largestWidthLimitDp=${this.largestWidthLimitDp} logo=${this.logo} longVersionCode=${this.longVersionCode} + ${"".ignored("mHiddenApiPolicy is a private field")} manageSpaceActivityName=${this.manageSpaceActivityName} - maxAspectRatio.compareTo(that.maxAspectRatio)=${this.maxAspectRatio} - metaData=${this.metaData} - minAspectRatio.compareTo(that.minAspectRatio)=${this.minAspectRatio} + maxAspectRatio=${this.maxAspectRatio} + metaData=${this.metaData.dumpToString()} + minAspectRatio=${this.minAspectRatio} minSdkVersion=${this.minSdkVersion} name=${this.name} nativeLibraryDir=${this.nativeLibraryDir} @@ -206,18 +216,27 @@ open class AndroidPackageParsingTestBase { permission=${this.permission} primaryCpuAbi=${this.primaryCpuAbi} privateFlags=${Integer.toBinaryString(this.privateFlags)} + processName=${this.processName.ignored("Deferred pre-R, but assigned immediately in R")} + publicSourceDir=${this.publicSourceDir + .ignored("Deferred pre-R, but assigned immediately in R")} requiresSmallestWidthDp=${this.requiresSmallestWidthDp} resourceDirs=${this.resourceDirs?.contentToString()} roundIconRes=${this.roundIconRes} - secondaryCpuAbi=${this.secondaryCpuAbi} - secondaryNativeLibraryDir=${this.secondaryNativeLibraryDir} + scanPublicSourceDir=${this.scanPublicSourceDir + .ignored("Deferred pre-R, but assigned immediately in R")} + scanSourceDir=${this.scanSourceDir + .ignored("Deferred pre-R, but assigned immediately in R")} seInfo=${this.seInfo} seInfoUser=${this.seInfoUser} + secondaryCpuAbi=${this.secondaryCpuAbi} + secondaryNativeLibraryDir=${this.secondaryNativeLibraryDir} sharedLibraryFiles=${this.sharedLibraryFiles?.contentToString()} sharedLibraryInfos=${this.sharedLibraryInfos} showUserIcon=${this.showUserIcon} + sourceDir=${this.sourceDir + .ignored("Deferred pre-R, but assigned immediately in R")} splitClassLoaderNames=${this.splitClassLoaderNames?.contentToString()} - splitDependencies=${this.splitDependencies} + splitDependencies=${this.splitDependencies.dumpToString()} splitNames=${this.splitNames?.contentToString()} splitPublicSourceDirs=${this.splitPublicSourceDirs?.contentToString()} splitSourceDirs=${this.splitSourceDirs?.contentToString()} @@ -226,8 +245,8 @@ open class AndroidPackageParsingTestBase { targetSdkVersion=${this.targetSdkVersion} taskAffinity=${this.taskAffinity} theme=${this.theme} - uid=${this.uid} uiOptions=${this.uiOptions} + uid=${this.uid} versionCode=${this.versionCode} volumeUuid=${this.volumeUuid} zygotePreloadName=${this.zygotePreloadName} @@ -241,19 +260,27 @@ open class AndroidPackageParsingTestBase { """.trimIndent() protected fun InstrumentationInfo.dumpToString() = """ + banner=${this.banner} credentialProtectedDataDir=${this.credentialProtectedDataDir} dataDir=${this.dataDir} deviceProtectedDataDir=${this.deviceProtectedDataDir} functionalTest=${this.functionalTest} handleProfiling=${this.handleProfiling} + icon=${this.icon} + labelRes=${this.labelRes} + logo=${this.logo} + metaData=${this.metaData} + name=${this.name} nativeLibraryDir=${this.nativeLibraryDir} + nonLocalizedLabel=${this.nonLocalizedLabel} + packageName=${this.packageName} primaryCpuAbi=${this.primaryCpuAbi} publicSourceDir=${this.publicSourceDir} secondaryCpuAbi=${this.secondaryCpuAbi} secondaryNativeLibraryDir=${this.secondaryNativeLibraryDir} + showUserIcon=${this.showUserIcon} sourceDir=${this.sourceDir} - splitDependencies=${this.splitDependencies.sequence() - .map { it.first to it.second?.contentToString() }.joinToString()} + splitDependencies=${this.splitDependencies.dumpToString()} splitNames=${this.splitNames?.contentToString()} splitPublicSourceDirs=${this.splitPublicSourceDirs?.contentToString()} splitSourceDirs=${this.splitSourceDirs?.contentToString()} @@ -262,25 +289,40 @@ open class AndroidPackageParsingTestBase { """.trimIndent() protected fun ActivityInfo.dumpToString() = """ + banner=${this.banner} colorMode=${this.colorMode} configChanges=${this.configChanges} + descriptionRes=${this.descriptionRes} + directBootAware=${this.directBootAware} documentLaunchMode=${this.documentLaunchMode} + enabled=${this.enabled} + exported=${this.exported} flags=${Integer.toBinaryString(this.flags)} + icon=${this.icon} + labelRes=${this.labelRes} launchMode=${this.launchMode} launchToken=${this.launchToken} lockTaskLaunchMode=${this.lockTaskLaunchMode} + logo=${this.logo} maxAspectRatio=${this.maxAspectRatio} maxRecents=${this.maxRecents} + metaData=${this.metaData.dumpToString()} minAspectRatio=${this.minAspectRatio} + name=${this.name} + nonLocalizedLabel=${this.nonLocalizedLabel} + packageName=${this.packageName} parentActivityName=${this.parentActivityName} permission=${this.permission} - persistableMode=${this.persistableMode} - privateFlags=${Integer.toBinaryString(this.privateFlags)} + persistableMode=${this.persistableMode.ignored("Could be dropped pre-R, fixed in R")} + privateFlags=${this.privateFlags} + processName=${this.processName.ignored("Deferred pre-R, but assigned immediately in R")} requestedVrComponent=${this.requestedVrComponent} resizeMode=${this.resizeMode} rotationAnimation=${this.rotationAnimation} screenOrientation=${this.screenOrientation} + showUserIcon=${this.showUserIcon} softInputMode=${this.softInputMode} + splitName=${this.splitName} targetActivity=${this.targetActivity} taskAffinity=${this.taskAffinity} theme=${this.theme} @@ -300,30 +342,77 @@ open class AndroidPackageParsingTestBase { protected fun PermissionInfo.dumpToString() = """ backgroundPermission=${this.backgroundPermission} + banner=${this.banner} descriptionRes=${this.descriptionRes} flags=${Integer.toBinaryString(this.flags)} group=${this.group} + icon=${this.icon} + labelRes=${this.labelRes} + logo=${this.logo} + metaData=${this.metaData.dumpToString()} + name=${this.name} nonLocalizedDescription=${this.nonLocalizedDescription} + nonLocalizedLabel=${this.nonLocalizedLabel} + packageName=${this.packageName} protectionLevel=${this.protectionLevel} requestRes=${this.requestRes} + showUserIcon=${this.showUserIcon} """.trimIndent() protected fun ProviderInfo.dumpToString() = """ + applicationInfo=${this.applicationInfo.ignored("Already checked")} authority=${this.authority} + banner=${this.banner} + descriptionRes=${this.descriptionRes} + directBootAware=${this.directBootAware} + enabled=${this.enabled} + exported=${this.exported} flags=${Integer.toBinaryString(this.flags)} forceUriPermissions=${this.forceUriPermissions} grantUriPermissions=${this.grantUriPermissions} + icon=${this.icon} initOrder=${this.initOrder} isSyncable=${this.isSyncable} + labelRes=${this.labelRes} + logo=${this.logo} + metaData=${this.metaData.dumpToString()} multiprocess=${this.multiprocess} + name=${this.name} + nonLocalizedLabel=${this.nonLocalizedLabel} + packageName=${this.packageName} pathPermissions=${this.pathPermissions?.joinToString { "readPermission=${it.readPermission}\nwritePermission=${it.writePermission}" }} + processName=${this.processName.ignored("Deferred pre-R, but assigned immediately in R")} readPermission=${this.readPermission} + showUserIcon=${this.showUserIcon} + splitName=${this.splitName} uriPermissionPatterns=${this.uriPermissionPatterns?.contentToString()} writePermission=${this.writePermission} """.trimIndent() + protected fun ServiceInfo.dumpToString() = """ + applicationInfo=${this.applicationInfo.ignored("Already checked")} + banner=${this.banner} + descriptionRes=${this.descriptionRes} + directBootAware=${this.directBootAware} + enabled=${this.enabled} + exported=${this.exported} + flags=${Integer.toBinaryString(this.flags)} + icon=${this.icon} + labelRes=${this.labelRes} + logo=${this.logo} + mForegroundServiceType"${this.mForegroundServiceType} + metaData=${this.metaData.dumpToString()} + name=${this.name} + nonLocalizedLabel=${this.nonLocalizedLabel} + packageName=${this.packageName} + permission=${this.permission} + processName=${this.processName.ignored("Deferred pre-R, but assigned immediately in R")} + showUserIcon=${this.showUserIcon} + splitName=${this.splitName} + """.trimIndent() + protected fun ConfigurationInfo.dumpToString() = """ reqGlEsVersion=${this.reqGlEsVersion} reqInputFeatures=${this.reqInputFeatures} @@ -333,8 +422,10 @@ open class AndroidPackageParsingTestBase { """.trimIndent() protected fun PackageInfo.dumpToString() = """ - activities=${this.activities?.joinToString { it.dumpToString() }} - applicationInfo=${this.applicationInfo.dumpToString()} + activities=${this.activities?.joinToString { it.dumpToString() } + .ignored("Checked separately in test")} + applicationInfo=${this.applicationInfo.dumpToString() + .ignored("Checked separately in test")} baseRevisionCode=${this.baseRevisionCode} compileSdkVersion=${this.compileSdkVersion} compileSdkVersionCodename=${this.compileSdkVersionCodename} @@ -356,15 +447,18 @@ open class AndroidPackageParsingTestBase { overlayTarget=${this.overlayTarget} packageName=${this.packageName} permissions=${this.permissions?.joinToString { it.dumpToString() }} - providers=${this.providers?.joinToString { it.dumpToString() }} - receivers=${this.receivers?.joinToString { it.dumpToString() }} + providers=${this.providers?.joinToString { it.dumpToString() } + .ignored("Checked separately in test")} + receivers=${this.receivers?.joinToString { it.dumpToString() } + .ignored("Checked separately in test")} reqFeatures=${this.reqFeatures?.joinToString { it.dumpToString() }} requestedPermissions=${this.requestedPermissions?.contentToString()} requestedPermissionsFlags=${this.requestedPermissionsFlags?.contentToString()} requiredAccountType=${this.requiredAccountType} requiredForAllUsers=${this.requiredForAllUsers} restrictedAccountType=${this.restrictedAccountType} - services=${this.services?.contentToString()} + services=${this.services?.joinToString { it.dumpToString() } + .ignored("Checked separately in test")} sharedUserId=${this.sharedUserId} sharedUserLabel=${this.sharedUserLabel} signatures=${this.signatures?.joinToString { it.toCharsString() }} @@ -378,11 +472,17 @@ open class AndroidPackageParsingTestBase { versionName=${this.versionName} """.trimIndent() - @Suppress("unused") - private fun <T> SparseArray<T>.sequence(): Sequence<Pair<Int, T>> { - var index = 0 - return generateSequence { - index++.takeIf { it < size() }?.let { keyAt(it) to valueAt(index) } + private fun Bundle?.dumpToString() = this?.keySet()?.associateWith { get(it) }?.toString() + + private fun <T> SparseArray<T>?.dumpToString(): String { + if (this == null) { + return "EMPTY" + } + + val list = mutableListOf<Pair<Int, T>>() + for (index in (0 until size())) { + list += keyAt(index) to valueAt(index) } + return list.toString() } } diff --git a/services/tests/uiservicestests/src/com/android/server/notification/BadgeExtractorTest.java b/services/tests/uiservicestests/src/com/android/server/notification/BadgeExtractorTest.java index e1f39137e618..c9c31bfcde08 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/BadgeExtractorTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/BadgeExtractorTest.java @@ -29,6 +29,10 @@ import android.app.ActivityManager; import android.app.Notification; import android.app.Notification.Builder; import android.app.NotificationChannel; +import android.app.PendingIntent; +import android.content.Intent; +import android.graphics.drawable.Icon; + import android.os.UserHandle; import android.service.notification.StatusBarNotification; import android.test.suitebuilder.annotation.SmallTest; @@ -79,6 +83,37 @@ public class BadgeExtractorTest extends UiServiceTestCase { return r; } + private NotificationRecord getNotificationRecordWithBubble(boolean suppressNotif) { + NotificationChannel channel = new NotificationChannel("a", "a", IMPORTANCE_UNSPECIFIED); + channel.setShowBadge(/* showBadge */ true); + when(mConfig.getNotificationChannel(mPkg, mUid, "a", false)).thenReturn(channel); + + Notification.BubbleMetadata metadata = new Notification.BubbleMetadata.Builder( + PendingIntent.getActivity(mContext, 0, new Intent(), 0), + Icon.createWithResource("", 0)).build(); + + int flags = metadata.getFlags(); + if (suppressNotif) { + flags |= Notification.BubbleMetadata.FLAG_SUPPRESS_NOTIFICATION; + } else { + flags &= ~Notification.BubbleMetadata.FLAG_SUPPRESS_NOTIFICATION; + } + metadata.setFlags(flags); + + final Builder builder = new Builder(getContext()) + .setContentTitle("foo") + .setSmallIcon(android.R.drawable.sym_def_app_icon) + .setPriority(Notification.PRIORITY_HIGH) + .setDefaults(Notification.DEFAULT_SOUND) + .setBubbleMetadata(metadata); + + Notification n = builder.build(); + StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, mId, mTag, mUid, + mPid, n, mUser, null, System.currentTimeMillis()); + NotificationRecord r = new NotificationRecord(getContext(), sbn, channel); + return r; + } + // // Tests // @@ -154,6 +189,20 @@ public class BadgeExtractorTest extends UiServiceTestCase { } @Test + public void testHideNotifOverridesYes() throws Exception { + BadgeExtractor extractor = new BadgeExtractor(); + extractor.setConfig(mConfig); + + when(mConfig.badgingEnabled(mUser)).thenReturn(true); + when(mConfig.canShowBadge(mPkg, mUid)).thenReturn(true); + NotificationRecord r = getNotificationRecordWithBubble(/* suppressNotif */ true); + + extractor.process(r); + + assertFalse(r.canShowBadge()); + } + + @Test public void testDndOverridesYes() { BadgeExtractor extractor = new BadgeExtractor(); extractor.setConfig(mConfig); diff --git a/services/tests/wmtests/AndroidManifest.xml b/services/tests/wmtests/AndroidManifest.xml index f382fbae9280..30df0d4b4ad9 100644 --- a/services/tests/wmtests/AndroidManifest.xml +++ b/services/tests/wmtests/AndroidManifest.xml @@ -62,6 +62,7 @@ android:resumeWhilePausing="true"/> <activity android:name="com.android.server.wm.ScreenDecorWindowTests$TestActivity" android:showWhenLocked="true" android:allowEmbedded="true"/> + <activity android:name="com.android.server.wm.ActivityLeakTests$DetectLeakActivity" /> </application> <instrumentation diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityLeakTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityLeakTests.java new file mode 100644 index 000000000000..bd6ac58c2445 --- /dev/null +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityLeakTests.java @@ -0,0 +1,184 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.wm; + +import static android.content.Intent.FLAG_ACTIVITY_MULTIPLE_TASK; +import static android.content.Intent.FLAG_ACTIVITY_NEW_DOCUMENT; +import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; + +import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation; + +import static org.junit.Assert.assertFalse; + +import android.app.Activity; +import android.app.Instrumentation; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.os.Debug; +import android.os.StrictMode; +import android.os.strictmode.InstanceCountViolation; +import android.util.Log; + +import org.junit.After; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.List; + +/** + * Tests for Activity leaks. + * + * Build/Install/Run: + * atest WmTests:ActivityLeakTests + */ +public class ActivityLeakTests { + + private final Instrumentation mInstrumentation = getInstrumentation(); + private final Context mContext = mInstrumentation.getTargetContext(); + private final List<Activity> mStartedActivityList = new ArrayList<>(); + + @After + public void tearDown() { + mInstrumentation.runOnMainSync(() -> { + // Reset strict mode. + StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().build()); + }); + for (Activity activity : mStartedActivityList) { + if (!activity.isDestroyed()) { + activity.finish(); + } + } + mStartedActivityList.clear(); + } + + @Test + public void testActivityLeak() { + final Bundle intentExtras = new Bundle(); + intentExtras.putBoolean(DetectLeakActivity.ENABLE_STRICT_MODE, true); + final DetectLeakActivity activity = (DetectLeakActivity) startActivity( + DetectLeakActivity.class, 0 /* flags */, intentExtras); + mStartedActivityList.add(activity); + + activity.finish(); + + assertFalse("Leak found on activity", activity.isLeakedAfterDestroy()); + } + + @Test + public void testActivityLeakForTwoInstances() { + final Bundle intentExtras = new Bundle(); + + // Launch an activity, then enable strict mode + intentExtras.putBoolean(DetectLeakActivity.ENABLE_STRICT_MODE, true); + final DetectLeakActivity activity1 = (DetectLeakActivity) startActivity( + DetectLeakActivity.class, 0 /* flags */, intentExtras); + mStartedActivityList.add(activity1); + + // Launch second activity instance. + intentExtras.putBoolean(DetectLeakActivity.ENABLE_STRICT_MODE, false); + final DetectLeakActivity activity2 = (DetectLeakActivity) startActivity( + DetectLeakActivity.class, + FLAG_ACTIVITY_MULTIPLE_TASK | FLAG_ACTIVITY_NEW_DOCUMENT, intentExtras); + mStartedActivityList.add(activity2); + + // Destroy the activity + activity1.finish(); + assertFalse("Leak found on activity 1", activity1.isLeakedAfterDestroy()); + + activity2.finish(); + assertFalse("Leak found on activity 2", activity2.isLeakedAfterDestroy()); + } + + private Activity startActivity(Class<?> cls, int flags, Bundle extras) { + final Intent intent = new Intent(mContext, cls); + intent.addFlags(flags | FLAG_ACTIVITY_NEW_TASK); + if (extras != null) { + intent.putExtras(extras); + } + return mInstrumentation.startActivitySync(intent); + } + + public static class DetectLeakActivity extends Activity { + + private static final String TAG = "DetectLeakActivity"; + + public static final String ENABLE_STRICT_MODE = "enable_strict_mode"; + + private volatile boolean mWasDestroyed; + private volatile boolean mIsLeaked; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if (getIntent().getBooleanExtra(ENABLE_STRICT_MODE, false)) { + enableStrictMode(); + } + } + + @Override + protected void onDestroy() { + super.onDestroy(); + getWindow().getDecorView().post(() -> { + synchronized (this) { + mWasDestroyed = true; + notifyAll(); + } + }); + } + + public boolean isLeakedAfterDestroy() { + synchronized (this) { + while (!mWasDestroyed && !mIsLeaked) { + try { + wait(5000 /* timeoutMs */); + } catch (InterruptedException ignored) { + } + } + } + return mIsLeaked; + } + + private void enableStrictMode() { + StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() + .detectActivityLeaks() + .penaltyLog() + .penaltyListener(Runnable::run, violation -> { + if (!(violation instanceof InstanceCountViolation)) { + return; + } + synchronized (this) { + mIsLeaked = true; + notifyAll(); + } + Log.w(TAG, violation.toString() + ", " + dumpHprofData()); + }) + .build()); + } + + private String dumpHprofData() { + try { + final String fileName = getDataDir().getPath() + "/ActivityLeakHeapDump.hprof"; + Debug.dumpHprofData(fileName); + return "memory dump filename: " + fileName; + } catch (Throwable e) { + Log.e(TAG, "dumpHprofData failed", e); + return "failed to save memory dump"; + } + } + } +} diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java index cf07221917cc..9621f68f9d6c 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java @@ -73,6 +73,7 @@ import android.util.ArraySet; import android.util.Log; import android.util.Slog; +import com.android.internal.annotations.GuardedBy; import com.android.internal.app.IVoiceActionCheckCallback; import com.android.internal.app.IVoiceInteractionManagerService; import com.android.internal.app.IVoiceInteractionSessionListener; @@ -230,6 +231,10 @@ public class VoiceInteractionManagerService extends SystemService { private int mCurUser; private boolean mCurUserUnlocked; private boolean mCurUserSupported; + + @GuardedBy("this") + private boolean mTemporarilyDisabled; + private final boolean mEnableService; VoiceInteractionManagerServiceStub() { @@ -316,8 +321,12 @@ public class VoiceInteractionManagerService extends SystemService { Settings.Secure.VOICE_INTERACTION_SERVICE, userHandle); ComponentName curRecognizer = getCurRecognizer(userHandle); VoiceInteractionServiceInfo curInteractorInfo = null; - if (DEBUG) Slog.d(TAG, "curInteractorStr=" + curInteractorStr - + " curRecognizer=" + curRecognizer); + if (DEBUG) { + Slog.d(TAG, "curInteractorStr=" + curInteractorStr + + " curRecognizer=" + curRecognizer + + " mEnableService=" + mEnableService + + " mTemporarilyDisabled=" + mTemporarilyDisabled); + } if (curInteractorStr == null && curRecognizer != null && mEnableService) { // If there is no interactor setting, that means we are upgrading // from an older platform version. If the current recognizer is not @@ -472,10 +481,11 @@ public class VoiceInteractionManagerService extends SystemService { } void switchImplementationIfNeededLocked(boolean force) { - if (!mCurUserSupported) { + if (!mCurUserSupported || mTemporarilyDisabled) { if (DEBUG_USER) { - Slog.d(TAG, "switchImplementationIfNeeded(): skipping on unsuported user " - + mCurUser); + Slog.d(TAG, "switchImplementationIfNeeded(): skipping: force= " + force + + "mCurUserSupported=" + mCurUserSupported + + "mTemporarilyDisabled=" + mTemporarilyDisabled); } if (mImpl != null) { mImpl.shutdownLocked(); @@ -928,6 +938,25 @@ public class VoiceInteractionManagerService extends SystemService { } } + @Override + public void setDisabled(boolean disabled) { + enforceCallingPermission(Manifest.permission.ACCESS_VOICE_INTERACTION_SERVICE); + synchronized (this) { + if (mTemporarilyDisabled == disabled) { + if (DEBUG) Slog.d(TAG, "setDisabled(): already " + disabled); + return; + } + Slog.i(TAG, "setDisabled(): changing to " + disabled); + final long caller = Binder.clearCallingIdentity(); + try { + mTemporarilyDisabled = disabled; + switchImplementationIfNeeded(/* force= */ false); + } finally { + Binder.restoreCallingIdentity(caller); + } + } + } + //----------------- Model management APIs --------------------------------// @Override @@ -1378,6 +1407,7 @@ public class VoiceInteractionManagerService extends SystemService { synchronized (this) { pw.println("VOICE INTERACTION MANAGER (dumpsys voiceinteraction)"); pw.println(" mEnableService: " + mEnableService); + pw.println(" mTemporarilyDisabled: " + mTemporarilyDisabled); pw.println(" mCurUser: " + mCurUser); pw.println(" mCurUserUnlocked: " + mCurUserUnlocked); pw.println(" mCurUserSupported: " + mCurUserSupported); diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceShellCommand.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceShellCommand.java index 3f4ddb6846ab..6c355a3b4b30 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceShellCommand.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceShellCommand.java @@ -52,6 +52,8 @@ final class VoiceInteractionManagerServiceShellCommand extends ShellCommand { return requestShow(pw); case "hide": return requestHide(pw); + case "disable": + return requestDisable(pw); default: return handleDefaultCommands(cmd); } @@ -69,6 +71,8 @@ final class VoiceInteractionManagerServiceShellCommand extends ShellCommand { pw.println(""); pw.println(" hide"); pw.println(" Hides the current session"); + pw.println(" disable [true|false]"); + pw.println(" Temporarily disable (when true) service"); pw.println(""); } } @@ -127,6 +131,17 @@ final class VoiceInteractionManagerServiceShellCommand extends ShellCommand { return 0; } + private int requestDisable(PrintWriter pw) { + boolean disabled = Boolean.parseBoolean(getNextArgRequired()); + Slog.i(TAG, "requestDisable(): " + disabled); + try { + mService.setDisabled(disabled); + } catch (Exception e) { + return handleError(pw, "requestDisable()", e); + } + return 0; + } + private static int handleError(PrintWriter pw, String message, Exception e) { Slog.e(TAG, "error calling " + message, e); pw.printf("Error calling %s: %s\n", message, e); diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index 87330d66ab84..a85bd060d65e 100755 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -4241,8 +4241,8 @@ public class CarrierConfigManager { "GPRS:24,24", "EDGE:70,18", "UMTS:115,115", "CDMA-IS95A:14,14", "CDMA-IS95B:14,14", "1xRTT:30,30", "EvDo-rev.0:750,48", "EvDo-rev.A:950,550", "HSDPA:4300,620", "HSUPA:4300,1800", "HSPA:4300,1800", "EvDo-rev.B:1500,550", "eHRPD:750,48", - "HSPAP:13000,3400", "TD-SCDMA:115,115", "LTE:30000,15000", "NR_NSA:47000,15000", - "NR_NSA_MMWAVE:145000,15000", "NR_SA:145000,15000"}); + "HSPAP:13000,3400", "TD-SCDMA:115,115", "LTE:30000,15000", "NR_NSA:47000,18000", + "NR_NSA_MMWAVE:145000,60000", "NR_SA:145000,60000"}); sDefaults.putBoolean(KEY_BANDWIDTH_NR_NSA_USE_LTE_VALUE_FOR_UPSTREAM_BOOL, false); sDefaults.putString(KEY_WCDMA_DEFAULT_SIGNAL_STRENGTH_MEASUREMENT_STRING, "rssi"); sDefaults.putBoolean(KEY_CONFIG_SHOW_ORIG_DIAL_STRING_FOR_CDMA_BOOL, false); diff --git a/tests/RollbackTest/MultiUserRollbackTest.xml b/tests/RollbackTest/MultiUserRollbackTest.xml index ba86c3ff6777..2f62af1856da 100644 --- a/tests/RollbackTest/MultiUserRollbackTest.xml +++ b/tests/RollbackTest/MultiUserRollbackTest.xml @@ -15,6 +15,12 @@ --> <configuration description="Runs rollback tests for multiple users"> <option name="test-suite-tag" value="MultiUserRollbackTest" /> + <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer"> + <option name="run-command" value="pm uninstall com.android.cts.install.lib.testapp.A" /> + <option name="run-command" value="pm uninstall com.android.cts.install.lib.testapp.B" /> + <option name="teardown-command" value="pm uninstall com.android.cts.install.lib.testapp.A" /> + <option name="teardown-command" value="pm uninstall com.android.cts.install.lib.testapp.B" /> + </target_preparer> <test class="com.android.tradefed.testtype.HostTest" > <option name="class" value="com.android.tests.rollback.host.MultiUserRollbackTest" /> </test> diff --git a/tests/RollbackTest/MultiUserRollbackTest/src/com/android/tests/rollback/host/MultiUserRollbackTest.java b/tests/RollbackTest/MultiUserRollbackTest/src/com/android/tests/rollback/host/MultiUserRollbackTest.java index a4c81d577522..42b886f0774f 100644 --- a/tests/RollbackTest/MultiUserRollbackTest/src/com/android/tests/rollback/host/MultiUserRollbackTest.java +++ b/tests/RollbackTest/MultiUserRollbackTest/src/com/android/tests/rollback/host/MultiUserRollbackTest.java @@ -40,23 +40,18 @@ public class MultiUserRollbackTest extends BaseHostJUnit4Test { private static final long SWITCH_USER_COMPLETED_NUMBER_OF_POLLS = 60; private static final long SWITCH_USER_COMPLETED_POLL_INTERVAL_IN_MILLIS = 1000; - private void cleanUp() throws Exception { - getDevice().executeShellCommand("pm rollback-app com.android.cts.install.lib.testapp.A"); - getDevice().executeShellCommand("pm uninstall com.android.cts.install.lib.testapp.A"); - } - @After public void tearDown() throws Exception { - cleanUp(); removeSecondaryUserIfNecessary(); + runPhaseForUsers("cleanUp", mOriginalUserId); } @Before public void setup() throws Exception { - cleanUp(); mOriginalUserId = getDevice().getCurrentUser(); createAndStartSecondaryUser(); installPackage("RollbackTest.apk", "--user all"); + runPhaseForUsers("cleanUp", mOriginalUserId); } @Test diff --git a/tests/RollbackTest/NetworkStagedRollbackTest/src/com/android/tests/rollback/host/NetworkStagedRollbackTest.java b/tests/RollbackTest/NetworkStagedRollbackTest/src/com/android/tests/rollback/host/NetworkStagedRollbackTest.java index 57c52f9c3021..61d7c763e8d7 100644 --- a/tests/RollbackTest/NetworkStagedRollbackTest/src/com/android/tests/rollback/host/NetworkStagedRollbackTest.java +++ b/tests/RollbackTest/NetworkStagedRollbackTest/src/com/android/tests/rollback/host/NetworkStagedRollbackTest.java @@ -59,12 +59,14 @@ public class NetworkStagedRollbackTest extends BaseHostJUnit4Test { @Before public void setUp() throws Exception { + runPhase("cleanUp"); mLogger.start(getDevice()); } @After public void tearDown() throws Exception { mLogger.stop(); + runPhase("cleanUp"); } /** diff --git a/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/MultiUserRollbackTest.java b/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/MultiUserRollbackTest.java index 400bb04f0fab..8641f4d4013a 100644 --- a/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/MultiUserRollbackTest.java +++ b/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/MultiUserRollbackTest.java @@ -22,6 +22,7 @@ import static com.google.common.truth.Truth.assertThat; import android.Manifest; import android.content.rollback.RollbackInfo; +import android.content.rollback.RollbackManager; import com.android.cts.install.lib.Install; import com.android.cts.install.lib.InstallUtils; @@ -54,6 +55,17 @@ public class MultiUserRollbackTest { } @Test + public void cleanUp() { + RollbackManager rm = RollbackUtils.getRollbackManager(); + rm.getAvailableRollbacks().stream().flatMap(info -> info.getPackages().stream()) + .map(info -> info.getPackageName()).forEach(rm::expireRollbackForPackage); + rm.getRecentlyCommittedRollbacks().stream().flatMap(info -> info.getPackages().stream()) + .map(info -> info.getPackageName()).forEach(rm::expireRollbackForPackage); + assertThat(rm.getAvailableRollbacks()).isEmpty(); + assertThat(rm.getRecentlyCommittedRollbacks()).isEmpty(); + } + + @Test public void testBasic() throws Exception { new RollbackTest().testBasic(); } diff --git a/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/NetworkStagedRollbackTest.java b/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/NetworkStagedRollbackTest.java index 8fb59c7c3e2c..42b0c608822e 100644 --- a/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/NetworkStagedRollbackTest.java +++ b/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/NetworkStagedRollbackTest.java @@ -19,6 +19,8 @@ package com.android.tests.rollback; import static com.android.cts.rollback.lib.RollbackInfoSubject.assertThat; import static com.android.cts.rollback.lib.RollbackUtils.getUniqueRollbackInfoForPackage; +import static com.google.common.truth.Truth.assertThat; + import android.Manifest; import android.content.ComponentName; import android.content.Intent; @@ -91,14 +93,23 @@ public class NetworkStagedRollbackTest { } @Test + public void cleanUp() { + RollbackManager rm = RollbackUtils.getRollbackManager(); + rm.getAvailableRollbacks().stream().flatMap(info -> info.getPackages().stream()) + .map(info -> info.getPackageName()).forEach(rm::expireRollbackForPackage); + rm.getRecentlyCommittedRollbacks().stream().flatMap(info -> info.getPackages().stream()) + .map(info -> info.getPackageName()).forEach(rm::expireRollbackForPackage); + assertThat(rm.getAvailableRollbacks()).isEmpty(); + assertThat(rm.getRecentlyCommittedRollbacks()).isEmpty(); + uninstallNetworkStackPackage(); + } + + @Test public void testNetworkFailedRollback_Phase1() throws Exception { // Remove available rollbacks and uninstall NetworkStack on /data/ RollbackManager rm = RollbackUtils.getRollbackManager(); String networkStack = getNetworkStackPackageName(); - rm.expireRollbackForPackage(networkStack); - uninstallNetworkStackPackage(); - assertThat(getUniqueRollbackInfoForPackage(rm.getAvailableRollbacks(), networkStack)).isNull(); @@ -153,9 +164,6 @@ public class NetworkStagedRollbackTest { RollbackManager rm = RollbackUtils.getRollbackManager(); String networkStack = getNetworkStackPackageName(); - rm.expireRollbackForPackage(networkStack); - uninstallNetworkStackPackage(); - assertThat(getUniqueRollbackInfoForPackage(rm.getAvailableRollbacks(), networkStack)).isNull(); diff --git a/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTest.java b/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTest.java index 48b5bed609d1..dd08771b220d 100644 --- a/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTest.java +++ b/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTest.java @@ -48,6 +48,8 @@ import com.android.cts.rollback.lib.Rollback; import com.android.cts.rollback.lib.RollbackBroadcastReceiver; import com.android.cts.rollback.lib.RollbackUtils; +import org.junit.After; +import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; @@ -81,6 +83,21 @@ public class RollbackTest { pri -> packageName.equals(pri.getPackageName()))); } + @Before + @After + public void cleanUp() { + try { + InstallUtils.adoptShellPermissionIdentity(Manifest.permission.TEST_MANAGE_ROLLBACKS); + RollbackManager rm = RollbackUtils.getRollbackManager(); + rm.getAvailableRollbacks().stream().flatMap(info -> info.getPackages().stream()) + .map(info -> info.getPackageName()).forEach(rm::expireRollbackForPackage); + rm.getRecentlyCommittedRollbacks().stream().flatMap(info -> info.getPackages().stream()) + .map(info -> info.getPackageName()).forEach(rm::expireRollbackForPackage); + } finally { + InstallUtils.dropShellPermissionIdentity(); + } + } + /** * Test basic rollbacks. */ diff --git a/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/StagedRollbackTest.java b/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/StagedRollbackTest.java index 6c9ffe2a7fac..00bd4cf388ce 100644 --- a/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/StagedRollbackTest.java +++ b/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/StagedRollbackTest.java @@ -360,7 +360,10 @@ public class StagedRollbackTest { RollbackManager rm = RollbackUtils.getRollbackManager(); rm.getAvailableRollbacks().stream().flatMap(info -> info.getPackages().stream()) .map(info -> info.getPackageName()).forEach(rm::expireRollbackForPackage); - assertThat(RollbackUtils.getRollbackManager().getAvailableRollbacks()).isEmpty(); + rm.getRecentlyCommittedRollbacks().stream().flatMap(info -> info.getPackages().stream()) + .map(info -> info.getPackageName()).forEach(rm::expireRollbackForPackage); + assertThat(rm.getAvailableRollbacks()).isEmpty(); + assertThat(rm.getRecentlyCommittedRollbacks()).isEmpty(); } private static final String APK_IN_APEX_TESTAPEX_NAME = "com.android.apex.apkrollback.test"; diff --git a/tests/RollbackTest/StagedRollbackTest.xml b/tests/RollbackTest/StagedRollbackTest.xml index 2750d3765c20..83fef8e0a04b 100644 --- a/tests/RollbackTest/StagedRollbackTest.xml +++ b/tests/RollbackTest/StagedRollbackTest.xml @@ -19,6 +19,12 @@ <option name="cleanup-apks" value="true" /> <option name="test-file-name" value="RollbackTest.apk" /> </target_preparer> + <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer"> + <option name="run-command" value="pm uninstall com.android.cts.install.lib.testapp.A" /> + <option name="run-command" value="pm uninstall com.android.cts.install.lib.testapp.B" /> + <option name="teardown-command" value="pm uninstall com.android.cts.install.lib.testapp.A" /> + <option name="teardown-command" value="pm uninstall com.android.cts.install.lib.testapp.B" /> + </target_preparer> <test class="com.android.tradefed.testtype.HostTest" > <option name="class" value="com.android.tests.rollback.host.StagedRollbackTest" /> </test> diff --git a/tools/aapt2/Debug.cpp b/tools/aapt2/Debug.cpp index 1eb7d95f381a..439f231193df 100644 --- a/tools/aapt2/Debug.cpp +++ b/tools/aapt2/Debug.cpp @@ -252,29 +252,6 @@ class ValueBodyPrinter : public ConstValueVisitor { Printer* printer_; }; -std::string OverlayablePoliciesToString(PolicyFlags policies) { - std::string str; - - uint32_t remaining = policies; - for (auto const& policy : kPolicyStringToFlag) { - if ((policies & policy.second) != policy.second) { - continue; - } - if (!str.empty()) { - str.append("|"); - } - str.append(policy.first.data()); - remaining &= ~policy.second; - } - if (remaining != 0) { - if (!str.empty()) { - str.append("|"); - } - str.append(StringPrintf("0x%08x", remaining)); - } - return !str.empty() ? str : "none"; -} - } // namespace void Debug::PrintTable(const ResourceTable& table, const DebugPrintTableOptions& options, @@ -575,7 +552,7 @@ void Debug::DumpOverlayable(const ResourceTable& table, text::Printer* printer) overlayable_item.overlayable->name.c_str(), overlayable_item.overlayable->actor.c_str()); const auto policy_subsection = StringPrintf(R"(policies="%s")", - OverlayablePoliciesToString(overlayable_item.policies).c_str()); + android::idmap2::policy::PoliciesToDebugString(overlayable_item.policies).c_str()); const auto value = StringPrintf("%s/%s", to_string(type->type).data(), entry->name.c_str()); items.push_back(DumpOverlayableEntry{overlayable_section, policy_subsection, value}); diff --git a/wifi/java/android/net/wifi/hotspot2/omadm/PpsMoParser.java b/wifi/java/android/net/wifi/hotspot2/omadm/PpsMoParser.java index 68358abe188d..ae60ed47fd6a 100644 --- a/wifi/java/android/net/wifi/hotspot2/omadm/PpsMoParser.java +++ b/wifi/java/android/net/wifi/hotspot2/omadm/PpsMoParser.java @@ -937,7 +937,7 @@ public final class PpsMoParser { */ private static Credential parseCredential(PPSNode node) throws ParsingException { if (node.isLeaf()) { - throw new ParsingException("Leaf node not expected for HomeSP"); + throw new ParsingException("Leaf node not expected for Credential"); } Credential credential = new Credential(); @@ -1009,8 +1009,8 @@ public final class PpsMoParser { parseEAPMethod(child, userCred); break; default: - throw new ParsingException("Unknown node under UsernamPassword: " + - child.getName()); + throw new ParsingException("Unknown node under UsernamePassword: " + + child.getName()); } } return userCred; @@ -1065,7 +1065,7 @@ public final class PpsMoParser { private static Credential.CertificateCredential parseCertificateCredential(PPSNode node) throws ParsingException { if (node.isLeaf()) { - throw new ParsingException("Leaf node not expected for DigitalCertificate"); + throw new ParsingException("Leaf node not expected for CertificateCredential"); } Credential.CertificateCredential certCred = new Credential.CertificateCredential(); @@ -1078,8 +1078,8 @@ public final class PpsMoParser { certCred.setCertSha256Fingerprint(parseHexString(getPpsNodeValue(child))); break; default: - throw new ParsingException("Unknown node under DigitalCertificate: " + - child.getName()); + throw new ParsingException("Unknown node under CertificateCredential: " + + child.getName()); } } return certCred; @@ -1096,7 +1096,7 @@ public final class PpsMoParser { private static Credential.SimCredential parseSimCredential(PPSNode node) throws ParsingException { if (node.isLeaf()) { - throw new ParsingException("Leaf node not expected for SIM"); + throw new ParsingException("Leaf node not expected for SimCredential"); } Credential.SimCredential simCred = new Credential.SimCredential(); @@ -1109,7 +1109,8 @@ public final class PpsMoParser { simCred.setEapType(parseInteger(getPpsNodeValue(child))); break; default: - throw new ParsingException("Unknown node under SIM: " + child.getName()); + throw new ParsingException("Unknown node under SimCredential: " + + child.getName()); } } return simCred; @@ -1657,7 +1658,7 @@ public final class PpsMoParser { private static void parseVendorAndroidExtension(PPSNode node, PasspointConfiguration config) throws ParsingException { if (node.isLeaf()) { - throw new ParsingException("Leaf node not expected for Extension"); + throw new ParsingException("Leaf node not expected for AndroidExtension"); } for (PPSNode child : node.getChildren()) { switch (child.getName()) { @@ -1707,7 +1708,8 @@ public final class PpsMoParser { */ private static byte[] parseHexString(String str) throws ParsingException { if ((str.length() & 1) == 1) { - throw new ParsingException("Odd length hex string: " + str.length()); + throw new ParsingException("Odd length hex string: " + str + ", length: " + + str.length()); } byte[] result = new byte[str.length() / 2]; |