diff options
537 files changed, 7672 insertions, 3037 deletions
diff --git a/ProtoLibraries.bp b/ProtoLibraries.bp index 67acfad3bfdd..c12f5b4395ec 100644 --- a/ProtoLibraries.bp +++ b/ProtoLibraries.bp @@ -35,7 +35,6 @@ gensrcs { "&& $(location soong_zip) -jar -o $(out) -C $(genDir)/$(in) -D $(genDir)/$(in)", srcs: [ - ":framework-connectivity-protos", ":ipconnectivity-proto-src", ":libstats_atom_enum_protos", ":libstats_atom_message_protos", @@ -68,7 +67,6 @@ gensrcs { " $(in)", srcs: [ - ":framework-connectivity-protos", ":ipconnectivity-proto-src", ":libstats_atom_enum_protos", ":libstats_atom_message_protos", @@ -84,7 +82,6 @@ gensrcs { java_library_host { name: "platformprotos", srcs: [ - ":framework-connectivity-protos", ":ipconnectivity-proto-src", ":libstats_atom_enum_protos", ":libstats_atom_message_protos", @@ -124,7 +121,6 @@ java_library { ], sdk_version: "9", srcs: [ - ":framework-connectivity-protos", ":ipconnectivity-proto-src", ":libstats_atom_enum_protos", ":libstats_atom_message_protos", @@ -147,7 +143,6 @@ java_library { }, srcs: [ - ":framework-connectivity-protos", ":ipconnectivity-proto-src", ":libstats_atom_enum_protos", ":libstats_atom_message_protos", @@ -185,7 +180,6 @@ cc_defaults { ], srcs: [ - ":framework-connectivity-protos", ":ipconnectivity-proto-src", ":libstats_atom_enum_protos", ":libstats_atom_message_protos", diff --git a/WEAR_OWNERS b/WEAR_OWNERS new file mode 100644 index 000000000000..4f3bc27c380f --- /dev/null +++ b/WEAR_OWNERS @@ -0,0 +1,6 @@ +yzj@google.com +shreerag@google.com +yeabkal@google.com +adsule@google.com +andriyn@google.com +yfz@google.com diff --git a/apct-tests/perftests/core/src/android/graphics/perftests/PathIteratorPerfTest.java b/apct-tests/perftests/core/src/android/graphics/perftests/PathIteratorPerfTest.java index 6b739bc2f46c..757b74dca93e 100644 --- a/apct-tests/perftests/core/src/android/graphics/perftests/PathIteratorPerfTest.java +++ b/apct-tests/perftests/core/src/android/graphics/perftests/PathIteratorPerfTest.java @@ -58,7 +58,7 @@ public class PathIteratorPerfTest { BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); Path path = constructCircularPath(numSegments); while (state.keepRunning()) { - PathIterator iterator = path.iterator(); + PathIterator iterator = path.getPathIterator(); PathIterator.Segment segment = iterator.next(); while (segment.getVerb() != VERB_DONE) { segment = iterator.next(); @@ -71,7 +71,7 @@ public class PathIteratorPerfTest { float[] points = new float[8]; Path path = constructCircularPath(numSegments); while (state.keepRunning()) { - PathIterator iterator = path.iterator(); + PathIterator iterator = path.getPathIterator(); int verb = iterator.next(points, 0); while (verb != VERB_DONE) { verb = iterator.next(points, 0); diff --git a/apct-tests/perftests/surfaceflinger/AndroidTest.xml b/apct-tests/perftests/surfaceflinger/AndroidTest.xml index 53e5d99409e2..11d110670b7a 100644 --- a/apct-tests/perftests/surfaceflinger/AndroidTest.xml +++ b/apct-tests/perftests/surfaceflinger/AndroidTest.xml @@ -49,16 +49,20 @@ <!-- Guarantee that user defined RunListeners will be running before any of the default listeners defined in this runner. --> <option name="instrumentation-arg" key="newRunListenerMode" value="true" /> + <option name="instrumentation-arg" key="profiling-iterations" value="525" /> <!-- PerfettoListener related arguments --> <option name="instrumentation-arg" key="perfetto_config_text_proto" value="true" /> <option name="instrumentation-arg" key="perfetto_config_file" value="trace_config.textproto" /> <!-- SimpleperfListener related arguments --> <option name="instrumentation-arg" key="report" value="true" /> - <option name="instrumentation-arg" key="arguments" value="""" /> + <option name="instrumentation-arg" key="arguments" value="-g" /> <option name="instrumentation-arg" key="events_to_record" value="instructions,cpu-cycles,raw-l3d-cache-refill,sched:sched_waking" /> <option name="instrumentation-arg" key="processes_to_record" value="surfaceflinger" /> - <option name="instrumentation-arg" key="symbols_to_report" value=""android::SurfaceFlinger::commit(;android::SurfaceFlinger::composite("" /> + <option name="instrumentation-arg" key="symbols_to_report" value=""commit;android::SurfaceFlinger::commit(;composite;android::SurfaceFlinger::composite("" /> + + <!-- should match profiling-iterations --> + <option name="instrumentation-arg" key="test_iterations" value="525" /> <!-- ProcLoadListener related arguments --> <!-- Wait for device last minute threshold to reach 3 with 2 minute timeout before starting the test run --> diff --git a/apct-tests/perftests/surfaceflinger/src/android/surfaceflinger/BufferFlinger.java b/apct-tests/perftests/surfaceflinger/src/android/surfaceflinger/BufferFlinger.java index 52fb8a6023f1..8a447bb801f2 100644 --- a/apct-tests/perftests/surfaceflinger/src/android/surfaceflinger/BufferFlinger.java +++ b/apct-tests/perftests/surfaceflinger/src/android/surfaceflinger/BufferFlinger.java @@ -53,15 +53,17 @@ public class BufferFlinger { } } - public void addBuffer(SurfaceControl.Transaction t, SurfaceControl surfaceControl) - throws InterruptedException { - GraphicBuffer buffer = mBufferQ.take(); - t.setBuffer(surfaceControl, - HardwareBuffer.createFromGraphicBuffer(buffer), - null, - (SyncFence fence) -> { - releaseCallback(fence, buffer); - }); + public void addBuffer(SurfaceControl.Transaction t, SurfaceControl surfaceControl) { + try { + final GraphicBuffer buffer = mBufferQ.take(); + t.setBuffer(surfaceControl, + HardwareBuffer.createFromGraphicBuffer(buffer), + null, + (SyncFence fence) -> { + releaseCallback(fence, buffer); + }); + } catch (InterruptedException ignore) { + } } public void releaseCallback(SyncFence fence, GraphicBuffer buffer) { diff --git a/apct-tests/perftests/surfaceflinger/src/android/surfaceflinger/SurfaceFlingerPerfTest.java b/apct-tests/perftests/surfaceflinger/src/android/surfaceflinger/SurfaceFlingerPerfTest.java index 45d164c96cd8..f92c297936dd 100644 --- a/apct-tests/perftests/surfaceflinger/src/android/surfaceflinger/SurfaceFlingerPerfTest.java +++ b/apct-tests/perftests/surfaceflinger/src/android/surfaceflinger/SurfaceFlingerPerfTest.java @@ -18,8 +18,8 @@ package android.surfaceflinger; import android.graphics.Bitmap; import android.graphics.Color; -import android.perftests.utils.BenchmarkState; -import android.perftests.utils.PerfStatusReporter; +import android.os.Bundle; +import android.util.Log; import android.view.SurfaceControl; import androidx.test.ext.junit.rules.ActivityScenarioRule; @@ -29,6 +29,7 @@ import androidx.test.runner.AndroidJUnit4; import org.junit.After; import org.junit.Before; +import org.junit.BeforeClass; import org.junit.Rule; import org.junit.Test; import org.junit.rules.RuleChain; @@ -40,37 +41,66 @@ import java.util.Random; @LargeTest @RunWith(AndroidJUnit4.class) public class SurfaceFlingerPerfTest { - protected ActivityScenarioRule<SurfaceFlingerTestActivity> mActivityRule = + private static final String TAG = "SurfaceFlingerPerfTest"; + private final ActivityScenarioRule<SurfaceFlingerTestActivity> mActivityRule = new ActivityScenarioRule<>(SurfaceFlingerTestActivity.class); - protected PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter(); private SurfaceFlingerTestActivity mActivity; - static final int BUFFER_COUNT = 2; + private static final int BUFFER_COUNT = 2; + private static final int MAX_BUFFERS = 10; + private static final int MAX_POSITION = 10; + private static final float MAX_SCALE = 2.0f; + + private static final String ARGUMENT_PROFILING_ITERATIONS = "profiling-iterations"; + private static final String DEFAULT_PROFILING_ITERATIONS = "100"; + private static int sProfilingIterations; + private final SurfaceControl.Transaction mTransaction = new SurfaceControl.Transaction(); @Rule public final RuleChain mAllRules = RuleChain - .outerRule(mPerfStatusReporter) - .around(mActivityRule); + .outerRule(mActivityRule); + + @BeforeClass + public static void suiteSetup() { + final Bundle arguments = InstrumentationRegistry.getArguments(); + sProfilingIterations = Integer.parseInt( + arguments.getString(ARGUMENT_PROFILING_ITERATIONS, DEFAULT_PROFILING_ITERATIONS)); + Log.d(TAG, "suiteSetup: mProfilingIterations = " + sProfilingIterations); + } + @Before public void setup() { mActivityRule.getScenario().onActivity(activity -> mActivity = activity); + SurfaceControl.Transaction t = new SurfaceControl.Transaction(); + for (int i = 0; i < MAX_BUFFERS; i++) { + SurfaceControl sc = createSurfaceControl(); + BufferFlinger bufferTracker = createBufferTracker(Color.argb(getRandomColorComponent(), + getRandomColorComponent(), getRandomColorComponent(), + getRandomColorComponent())); + bufferTracker.addBuffer(t, sc); + t.setPosition(sc, i * 10, i * 10); + } + t.apply(true); } @After public void teardown() { mSurfaceControls.forEach(SurfaceControl::release); - mByfferTrackers.forEach(BufferFlinger::freeBuffers); + mBufferTrackers.forEach(BufferFlinger::freeBuffers); } + static int getRandomColorComponent() { + return new Random().nextInt(155) + 100; + } - private ArrayList<BufferFlinger> mByfferTrackers = new ArrayList<>(); + private final ArrayList<BufferFlinger> mBufferTrackers = new ArrayList<>(); private BufferFlinger createBufferTracker(int color) { BufferFlinger bufferTracker = new BufferFlinger(BUFFER_COUNT, color); - mByfferTrackers.add(bufferTracker); + mBufferTrackers.add(bufferTracker); return bufferTracker; } - private ArrayList<SurfaceControl> mSurfaceControls = new ArrayList<>(); - private SurfaceControl createSurfaceControl() throws InterruptedException { + private final ArrayList<SurfaceControl> mSurfaceControls = new ArrayList<>(); + private SurfaceControl createSurfaceControl() { SurfaceControl sc = mActivity.createChildSurfaceControl(); mSurfaceControls.add(sc); return sc; @@ -78,151 +108,90 @@ public class SurfaceFlingerPerfTest { @Test public void singleBuffer() throws Exception { - SurfaceControl sc = createSurfaceControl(); - BufferFlinger bufferTracker = createBufferTracker(Color.GREEN); - SurfaceControl.Transaction t = new SurfaceControl.Transaction(); - bufferTracker.addBuffer(t, sc); - t.show(sc); - - BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); - while (state.keepRunning()) { - bufferTracker.addBuffer(t, sc); - t.apply(); + for (int i = 0; i < sProfilingIterations; i++) { + mBufferTrackers.get(0).addBuffer(mTransaction, mSurfaceControls.get(0)); + mTransaction.show(mSurfaceControls.get(0)).apply(true); } } - static int getRandomColorComponent() { - return new Random().nextInt(155) + 100; - } - @Test public void multipleBuffers() throws Exception { - final int MAX_BUFFERS = 10; - - SurfaceControl.Transaction t = new SurfaceControl.Transaction(); - for (int i = 0; i < MAX_BUFFERS; i++) { - SurfaceControl sc = createSurfaceControl(); - BufferFlinger bufferTracker = createBufferTracker(Color.argb(getRandomColorComponent(), - getRandomColorComponent(), getRandomColorComponent(), - getRandomColorComponent())); - bufferTracker.addBuffer(t, sc); - t.setPosition(sc, i * 10, i * 10); - t.show(sc); - } - t.apply(true); - BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); - while (state.keepRunning()) { + for (int j = 0; j < sProfilingIterations; j++) { for (int i = 0; i < MAX_BUFFERS; i++) { - mByfferTrackers.get(i).addBuffer(t, mSurfaceControls.get(i)); + mBufferTrackers.get(i).addBuffer(mTransaction, mSurfaceControls.get(i)); + mTransaction.show(mSurfaceControls.get(i)); } - t.apply(); + mTransaction.apply(true); } } @Test public void multipleOpaqueBuffers() throws Exception { - final int MAX_BUFFERS = 10; - - SurfaceControl.Transaction t = new SurfaceControl.Transaction(); - for (int i = 0; i < MAX_BUFFERS; i++) { - SurfaceControl sc = createSurfaceControl(); - BufferFlinger bufferTracker = createBufferTracker(Color.rgb(getRandomColorComponent(), - getRandomColorComponent(), getRandomColorComponent())); - bufferTracker.addBuffer(t, sc); - t.setOpaque(sc, true); - t.setPosition(sc, i * 10, i * 10); - t.show(sc); - } - t.apply(true); - BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); - while (state.keepRunning()) { + for (int j = 0; j < sProfilingIterations; j++) { for (int i = 0; i < MAX_BUFFERS; i++) { - mByfferTrackers.get(i).addBuffer(t, mSurfaceControls.get(i)); + mBufferTrackers.get(i).addBuffer(mTransaction, mSurfaceControls.get(i)); + mTransaction.show(mSurfaceControls.get(i)).setOpaque(mSurfaceControls.get(i), true); } - t.apply(); + mTransaction.apply(true); } } @Test public void geometryChanges() throws Exception { - final int MAX_POSITION = 10; - final float MAX_SCALE = 2.0f; - - SurfaceControl sc = createSurfaceControl(); - BufferFlinger bufferTracker = createBufferTracker(Color.GREEN); - SurfaceControl.Transaction t = new SurfaceControl.Transaction(); - bufferTracker.addBuffer(t, sc); - t.show(sc).apply(true); - int step = 0; - BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); - while (state.keepRunning()) { + for (int i = 0; i < sProfilingIterations; i++) { step = ++step % MAX_POSITION; - t.setPosition(sc, step, step); + mTransaction.setPosition(mSurfaceControls.get(0), step, step); float scale = ((step * MAX_SCALE) / MAX_POSITION) + 0.5f; - t.setScale(sc, scale, scale); - t.apply(); + mTransaction.setScale(mSurfaceControls.get(0), scale, scale); + mTransaction.show(mSurfaceControls.get(0)).apply(true); } } @Test public void geometryWithBufferChanges() throws Exception { - final int MAX_POSITION = 10; - - SurfaceControl sc = createSurfaceControl(); - BufferFlinger bufferTracker = createBufferTracker(Color.GREEN); - SurfaceControl.Transaction t = new SurfaceControl.Transaction(); - bufferTracker.addBuffer(t, sc); - t.show(sc).apply(true); - int step = 0; - BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); - while (state.keepRunning()) { + for (int i = 0; i < sProfilingIterations; i++) { step = ++step % MAX_POSITION; - t.setPosition(sc, step, step); - float scale = ((step * 2.0f) / MAX_POSITION) + 0.5f; - t.setScale(sc, scale, scale); - bufferTracker.addBuffer(t, sc); - t.apply(); + mTransaction.setPosition(mSurfaceControls.get(0), step, step); + float scale = ((step * MAX_SCALE) / MAX_POSITION) + 0.5f; + mTransaction.setScale(mSurfaceControls.get(0), scale, scale); + mBufferTrackers.get(0).addBuffer(mTransaction, mSurfaceControls.get(0)); + mTransaction.show(mSurfaceControls.get(0)).apply(true); } } @Test public void addRemoveLayers() throws Exception { - SurfaceControl sc = createSurfaceControl(); - BufferFlinger bufferTracker = createBufferTracker(Color.GREEN); - SurfaceControl.Transaction t = new SurfaceControl.Transaction(); - - BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); - while (state.keepRunning()) { + for (int i = 0; i < sProfilingIterations; i++) { SurfaceControl childSurfaceControl = new SurfaceControl.Builder() .setName("childLayer").setBLASTLayer().build(); - bufferTracker.addBuffer(t, childSurfaceControl); - t.reparent(childSurfaceControl, sc); - t.apply(); - t.remove(childSurfaceControl).apply(); + mBufferTrackers.get(0).addBuffer(mTransaction, childSurfaceControl); + mTransaction.reparent(childSurfaceControl, mSurfaceControls.get(0)); + mTransaction.show(childSurfaceControl).show(mSurfaceControls.get(0)); + mTransaction.apply(true); + mTransaction.remove(childSurfaceControl).apply(true); } } @Test public void displayScreenshot() throws Exception { - BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); - while (state.keepRunning()) { + for (int i = 0; i < sProfilingIterations; i++) { Bitmap screenshot = InstrumentationRegistry.getInstrumentation().getUiAutomation().takeScreenshot(); screenshot.recycle(); + mTransaction.apply(true); } } @Test public void layerScreenshot() throws Exception { - BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); - while (state.keepRunning()) { + for (int i = 0; i < sProfilingIterations; i++) { Bitmap screenshot = InstrumentationRegistry.getInstrumentation().getUiAutomation().takeScreenshot( mActivity.getWindow()); screenshot.recycle(); + mTransaction.apply(true); } } - } diff --git a/apct-tests/perftests/surfaceflinger/src/android/surfaceflinger/SurfaceFlingerTestActivity.java b/apct-tests/perftests/surfaceflinger/src/android/surfaceflinger/SurfaceFlingerTestActivity.java index 832a0cd1e917..bb956596c7eb 100644 --- a/apct-tests/perftests/surfaceflinger/src/android/surfaceflinger/SurfaceFlingerTestActivity.java +++ b/apct-tests/perftests/surfaceflinger/src/android/surfaceflinger/SurfaceFlingerTestActivity.java @@ -22,6 +22,7 @@ import android.os.Bundle; import android.view.SurfaceControl; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.view.Window; import android.view.WindowManager; import java.util.concurrent.CountDownLatch; @@ -38,12 +39,15 @@ public class SurfaceFlingerTestActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + requestWindowFeature(Window.FEATURE_NO_TITLE); + getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, + WindowManager.LayoutParams.FLAG_FULLSCREEN); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); mTestSurfaceView = new TestSurfaceView(this); setContentView(mTestSurfaceView); } - public SurfaceControl createChildSurfaceControl() throws InterruptedException { + public SurfaceControl createChildSurfaceControl() { return mTestSurfaceView.getChildSurfaceControlHelper(); } @@ -65,8 +69,11 @@ public class SurfaceFlingerTestActivity extends Activity { }); } - public SurfaceControl getChildSurfaceControlHelper() throws InterruptedException { - mIsReady.await(); + public SurfaceControl getChildSurfaceControlHelper() { + try { + mIsReady.await(); + } catch (InterruptedException ignore) { + } SurfaceHolder holder = getHolder(); // check to see if surface is valid diff --git a/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java b/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java index c0a9e675dcb2..b6d29aa5641a 100644 --- a/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java +++ b/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java @@ -144,9 +144,9 @@ import com.android.server.JobSchedulerBackgroundThread; import com.android.server.LocalServices; import com.android.server.SystemService; import com.android.server.SystemServiceManager; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.permission.PermissionManagerService; import com.android.server.pm.permission.PermissionManagerServiceInternal; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.tare.AlarmManagerEconomicPolicy; import com.android.server.tare.EconomyManagerInternal; import com.android.server.usage.AppStandbyInternal; diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/FlexibilityController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/FlexibilityController.java index 658b67625f9b..f1e13dfcab5c 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/controllers/FlexibilityController.java +++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/FlexibilityController.java @@ -811,6 +811,12 @@ public final class FlexibilityController extends StateController { @Override @GuardedBy("mLock") + public void dumpConstants(IndentingPrintWriter pw) { + mFcConfig.dump(pw); + } + + @Override + @GuardedBy("mLock") public void dumpControllerStateLocked(IndentingPrintWriter pw, Predicate<JobStatus> predicate) { pw.println("# Constraints Satisfied: " + Integer.bitCount(mSatisfiedFlexibleConstraints)); pw.print("Satisfied Flexible Constraints: "); @@ -821,7 +827,5 @@ public final class FlexibilityController extends StateController { mFlexibilityTracker.dump(pw, predicate); pw.println(); mFlexibilityAlarmQueue.dump(pw); - pw.println(); - mFcConfig.dump(pw); } } diff --git a/apex/jobscheduler/service/java/com/android/server/tare/Agent.java b/apex/jobscheduler/service/java/com/android/server/tare/Agent.java index 4fe021a35f98..12ec9a4624e7 100644 --- a/apex/jobscheduler/service/java/com/android/server/tare/Agent.java +++ b/apex/jobscheduler/service/java/com/android/server/tare/Agent.java @@ -554,6 +554,25 @@ class Agent { } } + @GuardedBy("mLock") + void reclaimAllAssetsLocked(final int userId, @NonNull final String pkgName, int regulationId) { + final Ledger ledger = mScribe.getLedgerLocked(userId, pkgName); + final long curBalance = ledger.getCurrentBalance(); + if (curBalance <= 0) { + return; + } + if (DEBUG) { + Slog.i(TAG, "Reclaiming " + cakeToString(curBalance) + + " from " + appToString(userId, pkgName) + + " because of " + eventToString(regulationId)); + } + + final long now = getCurrentTimeMillis(); + recordTransactionLocked(userId, pkgName, ledger, + new Ledger.Transaction(now, now, regulationId, null, -curBalance, 0), + true); + } + /** * Reclaim a percentage of unused ARCs from every app that hasn't been used recently. The * reclamation will not reduce an app's balance below its minimum balance as dictated by @@ -564,7 +583,7 @@ class Agent { * @param minUnusedTimeMs The minimum amount of time (in milliseconds) that must have * transpired since the last user usage event before we will consider * reclaiming ARCs from the app. - * @param scaleMinBalance Whether or not to used the scaled minimum app balance. If false, + * @param scaleMinBalance Whether or not to use the scaled minimum app balance. If false, * this will use the constant min balance floor given by * {@link EconomicPolicy#getMinSatiatedBalance(int, String)}. If true, * this will use the scaled balance given by @@ -603,7 +622,8 @@ class Agent { } if (toReclaim > 0) { if (DEBUG) { - Slog.i(TAG, "Reclaiming unused wealth! Taking " + toReclaim + Slog.i(TAG, "Reclaiming unused wealth! Taking " + + cakeToString(toReclaim) + " from " + appToString(userId, pkgName)); } @@ -667,21 +687,7 @@ class Agent { */ @GuardedBy("mLock") void onAppRestrictedLocked(final int userId, @NonNull final String pkgName) { - final long curBalance = getBalanceLocked(userId, pkgName); - final long minBalance = mIrs.getMinBalanceLocked(userId, pkgName); - if (curBalance <= minBalance) { - return; - } - if (DEBUG) { - Slog.i(TAG, "App restricted! Taking " + curBalance - + " from " + appToString(userId, pkgName)); - } - - final long now = getCurrentTimeMillis(); - final Ledger ledger = mScribe.getLedgerLocked(userId, pkgName); - recordTransactionLocked(userId, pkgName, ledger, - new Ledger.Transaction(now, now, REGULATION_BG_RESTRICTED, null, -curBalance, 0), - true); + reclaimAllAssetsLocked(userId, pkgName, REGULATION_BG_RESTRICTED); } /** @@ -816,37 +822,18 @@ class Agent { @GuardedBy("mLock") void onPackageRemovedLocked(final int userId, @NonNull final String pkgName) { - reclaimAssetsLocked(userId, pkgName); - mBalanceThresholdAlarmQueue.removeAlarmForKey(new Package(userId, pkgName)); - } - - /** - * Reclaims any ARCs granted to the app, making them available to other apps. Also deletes the - * app's ledger and stops any ongoing event tracking. - */ - @GuardedBy("mLock") - private void reclaimAssetsLocked(final int userId, @NonNull final String pkgName) { - final Ledger ledger = mScribe.getLedgerLocked(userId, pkgName); - if (ledger.getCurrentBalance() != 0) { - mScribe.adjustRemainingConsumableCakesLocked(-ledger.getCurrentBalance()); - } mScribe.discardLedgerLocked(userId, pkgName); mCurrentOngoingEvents.delete(userId, pkgName); + mBalanceThresholdAlarmQueue.removeAlarmForKey(new Package(userId, pkgName)); } @GuardedBy("mLock") - void onUserRemovedLocked(final int userId, @NonNull final List<String> pkgNames) { - reclaimAssetsLocked(userId, pkgNames); + void onUserRemovedLocked(final int userId) { + mScribe.discardLedgersLocked(userId); + mCurrentOngoingEvents.delete(userId); mBalanceThresholdAlarmQueue.removeAlarmsForUserId(userId); } - @GuardedBy("mLock") - private void reclaimAssetsLocked(final int userId, @NonNull final List<String> pkgNames) { - for (int i = 0; i < pkgNames.size(); ++i) { - reclaimAssetsLocked(userId, pkgNames.get(i)); - } - } - @VisibleForTesting static class TrendCalculator implements Consumer<OngoingEvent> { static final long WILL_NOT_CROSS_THRESHOLD = -1; diff --git a/apex/jobscheduler/service/java/com/android/server/tare/EconomicPolicy.java b/apex/jobscheduler/service/java/com/android/server/tare/EconomicPolicy.java index 22a2f5163538..4ba69570f7e0 100644 --- a/apex/jobscheduler/service/java/com/android/server/tare/EconomicPolicy.java +++ b/apex/jobscheduler/service/java/com/android/server/tare/EconomicPolicy.java @@ -70,6 +70,7 @@ public abstract class EconomicPolicy { /** App is fully restricted from running in the background. */ static final int REGULATION_BG_RESTRICTED = TYPE_REGULATION | 5; static final int REGULATION_BG_UNRESTRICTED = TYPE_REGULATION | 6; + static final int REGULATION_FORCE_STOP = TYPE_REGULATION | 8; static final int REWARD_NOTIFICATION_SEEN = TYPE_REWARD | 0; static final int REWARD_NOTIFICATION_INTERACTION = TYPE_REWARD | 1; @@ -409,6 +410,8 @@ public abstract class EconomicPolicy { return "BG_RESTRICTED"; case REGULATION_BG_UNRESTRICTED: return "BG_UNRESTRICTED"; + case REGULATION_FORCE_STOP: + return "FORCE_STOP"; } return "UNKNOWN_REGULATION:" + Integer.toHexString(eventId); } diff --git a/apex/jobscheduler/service/java/com/android/server/tare/InternalResourceService.java b/apex/jobscheduler/service/java/com/android/server/tare/InternalResourceService.java index db91d5c13734..59d4ded8b1d2 100644 --- a/apex/jobscheduler/service/java/com/android/server/tare/InternalResourceService.java +++ b/apex/jobscheduler/service/java/com/android/server/tare/InternalResourceService.java @@ -533,7 +533,9 @@ public class InternalResourceService extends SystemService { void onPackageForceStopped(final int userId, @NonNull final String pkgName) { synchronized (mLock) { - // TODO: reduce ARC count by some amount + // Remove all credits if the user force stops the app. It will slowly regain them + // in response to different events. + mAgent.reclaimAllAssetsLocked(userId, pkgName, EconomicPolicy.REGULATION_FORCE_STOP); } } @@ -576,17 +578,15 @@ public class InternalResourceService extends SystemService { void onUserRemoved(final int userId) { synchronized (mLock) { mVipOverrides.delete(userId); - ArrayList<String> removedPkgs = new ArrayList<>(); final int uIdx = mPkgCache.indexOfKey(userId); if (uIdx >= 0) { for (int p = mPkgCache.numElementsForKeyAt(uIdx) - 1; p >= 0; --p) { final InstalledPackageInfo pkgInfo = mPkgCache.valueAt(uIdx, p); - removedPkgs.add(pkgInfo.packageName); mUidToPackageCache.remove(pkgInfo.uid); } } mPkgCache.delete(userId); - mAgent.onUserRemovedLocked(userId, removedPkgs); + mAgent.onUserRemovedLocked(userId); } } diff --git a/apex/jobscheduler/service/java/com/android/server/tare/Scribe.java b/apex/jobscheduler/service/java/com/android/server/tare/Scribe.java index 29478d05e066..bd4fd72b78ce 100644 --- a/apex/jobscheduler/service/java/com/android/server/tare/Scribe.java +++ b/apex/jobscheduler/service/java/com/android/server/tare/Scribe.java @@ -157,6 +157,12 @@ public class Scribe { } @GuardedBy("mIrs.getLock()") + void discardLedgersLocked(final int userId) { + mLedgers.delete(userId); + postWrite(); + } + + @GuardedBy("mIrs.getLock()") long getSatiatedConsumptionLimitLocked() { return mSatiatedConsumptionLimit; } diff --git a/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java b/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java index f1c4eb45420c..67d711c79b15 100644 --- a/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java +++ b/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java @@ -122,7 +122,7 @@ import com.android.internal.util.ConcurrentUtils; import com.android.server.AlarmManagerInternal; import com.android.server.JobSchedulerBackgroundThread; import com.android.server.LocalServices; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.usage.AppIdleHistory.AppUsageHistory; import libcore.util.EmptyArray; diff --git a/core/api/current.txt b/core/api/current.txt index 1e0a5be82c0f..4d25ad7d8b37 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -15128,7 +15128,7 @@ package android.graphics { field @NonNull public static final android.os.Parcelable.Creator<android.graphics.ParcelableColorSpace> CREATOR; } - public class Path implements java.lang.Iterable<android.graphics.PathIterator.Segment> { + public class Path { ctor public Path(); ctor public Path(@Nullable android.graphics.Path); method public void addArc(@NonNull android.graphics.RectF, float, float); @@ -15155,6 +15155,7 @@ package android.graphics { method public void cubicTo(float, float, float, float, float, float); method @NonNull public android.graphics.Path.FillType getFillType(); method public int getGenerationId(); + method @NonNull public android.graphics.PathIterator getPathIterator(); method public void incReserve(int); method public boolean interpolate(@NonNull android.graphics.Path, float, @NonNull android.graphics.Path); method @Deprecated public boolean isConvex(); @@ -15162,7 +15163,6 @@ package android.graphics { method public boolean isInterpolatable(@NonNull android.graphics.Path); method public boolean isInverseFillType(); method public boolean isRect(@Nullable android.graphics.RectF); - method @NonNull public android.graphics.PathIterator iterator(); method public void lineTo(float, float); method public void moveTo(float, float); method public void offset(float, float, @Nullable android.graphics.Path); @@ -16896,6 +16896,7 @@ package android.hardware { field public static final int DATASPACE_DEPTH = 4096; // 0x1000 field public static final int DATASPACE_DISPLAY_P3 = 143261696; // 0x88a0000 field public static final int DATASPACE_DYNAMIC_DEPTH = 4098; // 0x1002 + field public static final int DATASPACE_HEIF = 4100; // 0x1004 field public static final int DATASPACE_JFIF = 146931712; // 0x8c20000 field public static final int DATASPACE_SCRGB = 411107328; // 0x18810000 field public static final int DATASPACE_SCRGB_LINEAR = 406913024; // 0x18410000 @@ -51848,6 +51849,7 @@ package android.view.accessibility { field public static final int CONTENT_CHANGE_TYPE_DRAG_CANCELLED = 512; // 0x200 field public static final int CONTENT_CHANGE_TYPE_DRAG_DROPPED = 256; // 0x100 field public static final int CONTENT_CHANGE_TYPE_DRAG_STARTED = 128; // 0x80 + field public static final int CONTENT_CHANGE_TYPE_INVALID = 1024; // 0x400 field public static final int CONTENT_CHANGE_TYPE_PANE_APPEARED = 16; // 0x10 field public static final int CONTENT_CHANGE_TYPE_PANE_DISAPPEARED = 32; // 0x20 field public static final int CONTENT_CHANGE_TYPE_PANE_TITLE = 8; // 0x8 @@ -53159,7 +53161,9 @@ package android.view.inputmethod { method @Nullable public String getFallbackText(); field public static final int GESTURE_TYPE_DELETE = 4; // 0x4 field public static final int GESTURE_TYPE_INSERT = 2; // 0x2 + field public static final int GESTURE_TYPE_JOIN_OR_SPLIT = 16; // 0x10 field public static final int GESTURE_TYPE_NONE = 0; // 0x0 + field public static final int GESTURE_TYPE_REMOVE_SPACE = 8; // 0x8 field public static final int GESTURE_TYPE_SELECT = 1; // 0x1 field public static final int GRANULARITY_CHARACTER = 2; // 0x2 field public static final int GRANULARITY_WORD = 1; // 0x1 @@ -53500,6 +53504,35 @@ package android.view.inputmethod { method @NonNull public android.view.inputmethod.InsertGesture.Builder setTextToInsert(@NonNull String); } + public final class JoinOrSplitGesture extends android.view.inputmethod.HandwritingGesture implements android.os.Parcelable { + method public int describeContents(); + method @NonNull public android.graphics.PointF getJoinOrSplitPoint(); + method public void writeToParcel(@NonNull android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.view.inputmethod.JoinOrSplitGesture> CREATOR; + } + + public static final class JoinOrSplitGesture.Builder { + ctor public JoinOrSplitGesture.Builder(); + method @NonNull public android.view.inputmethod.JoinOrSplitGesture build(); + method @NonNull public android.view.inputmethod.JoinOrSplitGesture.Builder setFallbackText(@Nullable String); + method @NonNull public android.view.inputmethod.JoinOrSplitGesture.Builder setJoinOrSplitPoint(@NonNull android.graphics.PointF); + } + + public final class RemoveSpaceGesture extends android.view.inputmethod.HandwritingGesture implements android.os.Parcelable { + method public int describeContents(); + method @NonNull public android.graphics.PointF getEndPoint(); + method @NonNull public android.graphics.PointF getStartPoint(); + method public void writeToParcel(@NonNull android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.view.inputmethod.RemoveSpaceGesture> CREATOR; + } + + public static final class RemoveSpaceGesture.Builder { + ctor public RemoveSpaceGesture.Builder(); + method @NonNull public android.view.inputmethod.RemoveSpaceGesture build(); + method @NonNull public android.view.inputmethod.RemoveSpaceGesture.Builder setFallbackText(@Nullable String); + method @NonNull public android.view.inputmethod.RemoveSpaceGesture.Builder setPoints(@NonNull android.graphics.PointF, @NonNull android.graphics.PointF); + } + public final class SelectGesture extends android.view.inputmethod.HandwritingGesture implements android.os.Parcelable { method public int describeContents(); method public int getGranularity(); diff --git a/core/api/test-current.txt b/core/api/test-current.txt index 8c537336bdde..deb5aca53b78 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -2160,10 +2160,15 @@ package android.provider { field public static final String NAMESPACE_APP_COMPAT_OVERRIDES = "app_compat_overrides"; field public static final String NAMESPACE_CONSTRAIN_DISPLAY_APIS = "constrain_display_apis"; field public static final String NAMESPACE_DEVICE_IDLE = "device_idle"; + field public static final String NAMESPACE_INPUT_METHOD_MANAGER = "input_method_manager"; field public static final String NAMESPACE_JOB_SCHEDULER = "jobscheduler"; field public static final String NAMESPACE_SELECTION_TOOLBAR = "selection_toolbar"; } + public interface InputMethodManagerDeviceConfig { + field public static final String KEY_HIDE_IME_WHEN_NO_EDITOR_FOCUS = "hide_ime_when_no_editor_focus"; + } + public final class Settings { field public static final int RESET_MODE_PACKAGE_DEFAULTS = 1; // 0x1 } diff --git a/core/java/android/accessibilityservice/InputMethod.java b/core/java/android/accessibilityservice/InputMethod.java index 1585f99759cd..93888ef5ba6f 100644 --- a/core/java/android/accessibilityservice/InputMethod.java +++ b/core/java/android/accessibilityservice/InputMethod.java @@ -517,7 +517,8 @@ public class InputMethod { @Override public void invalidateInput(EditorInfo editorInfo, IRemoteAccessibilityInputConnection connection, int sessionId) { - if (!mStartedInputConnection.isSameConnection(connection)) { + if (!mEnabled || mStartedInputConnection == null + || !mStartedInputConnection.isSameConnection(connection)) { // This is not an error, and can be safely ignored. return; } diff --git a/core/java/android/hardware/DataSpace.java b/core/java/android/hardware/DataSpace.java index 01ed1326074a..6c42776cca5e 100644 --- a/core/java/android/hardware/DataSpace.java +++ b/core/java/android/hardware/DataSpace.java @@ -410,6 +410,22 @@ public final class DataSpace { /** @hide */ @Retention(RetentionPolicy.SOURCE) @IntDef(flag = true, value = { + DATASPACE_HEIF, + }) + public @interface DataSpaceFileFormat {}; + + /** + * High Efficiency Image File Format (HEIF). + * + * <p>This value is valid with {@link android.hardware.HardwareBuffer#BLOB HardwareBuffer.BLOB} + * format. The combination is an HEIC image encoded by HEIC or HEVC encoder according to + * ISO/IEC 23008-12.</p> + */ + public static final int DATASPACE_HEIF = 4100; + + /** @hide */ + @Retention(RetentionPolicy.SOURCE) + @IntDef(flag = true, value = { DATASPACE_UNKNOWN, DATASPACE_SCRGB_LINEAR, DATASPACE_SRGB, diff --git a/core/java/android/inputmethodservice/IRemoteInputConnectionInvoker.java b/core/java/android/inputmethodservice/IRemoteInputConnectionInvoker.java index 84c3623c1375..5ce38e9a279a 100644 --- a/core/java/android/inputmethodservice/IRemoteInputConnectionInvoker.java +++ b/core/java/android/inputmethodservice/IRemoteInputConnectionInvoker.java @@ -33,6 +33,8 @@ import android.view.inputmethod.HandwritingGesture; import android.view.inputmethod.InputConnection; import android.view.inputmethod.InputContentInfo; import android.view.inputmethod.InsertGesture; +import android.view.inputmethod.JoinOrSplitGesture; +import android.view.inputmethod.RemoveSpaceGesture; import android.view.inputmethod.SelectGesture; import android.view.inputmethod.SurroundingText; import android.view.inputmethod.TextAttribute; @@ -633,16 +635,11 @@ final class IRemoteInputConnectionInvoker { } /** - * Invokes one of {@link IRemoteInputConnection#performHandwritingSelectGesture( - * InputConnectionCommandHeader, SelectGesture, AndroidFuture)}, - * {@link IRemoteInputConnection#performHandwritingDeleteGesture(InputConnectionCommandHeader, - * DeleteGesture, AndroidFuture)}, - * {@link IRemoteInputConnection#performHandwritingInsertGesture(InputConnectionCommandHeader, - * InsertGesture, AndroidFuture)} - * - * @param {@code gesture} parameter {@link HandwritingGesture}. - * @return {@link AndroidFuture<Integer>} that can be used to retrieve the invocation - * result. {@link RemoteException} will be treated as an error. + * Invokes one of {@link IRemoteInputConnection#performHandwritingSelectGesture}, + * {@link IRemoteInputConnection#performHandwritingDeleteGesture}, + * {@link IRemoteInputConnection#performHandwritingInsertGesture}, + * {@link IRemoteInputConnection#performHandwritingRemoveSpaceGesture}, + * {@link IRemoteInputConnection#performHandwritingJoinOrSplitGesture}. */ @AnyThread public void performHandwritingGesture( @@ -664,6 +661,12 @@ final class IRemoteInputConnectionInvoker { } else if (gesture instanceof DeleteGesture) { mConnection.performHandwritingDeleteGesture( createHeader(), (DeleteGesture) gesture, resultReceiver); + } else if (gesture instanceof RemoveSpaceGesture) { + mConnection.performHandwritingRemoveSpaceGesture( + createHeader(), (RemoveSpaceGesture) gesture, resultReceiver); + } else if (gesture instanceof JoinOrSplitGesture) { + mConnection.performHandwritingJoinOrSplitGesture( + createHeader(), (JoinOrSplitGesture) gesture, resultReceiver); } else if (consumer != null && executor != null) { executor.execute(() -> consumer.accept(InputConnection.HANDWRITING_GESTURE_RESULT_UNSUPPORTED)); diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java index 0ad596b682ce..d71b0235d47d 100644 --- a/core/java/android/os/BatteryStats.java +++ b/core/java/android/os/BatteryStats.java @@ -961,7 +961,7 @@ public abstract class BatteryStats { * also be bumped. */ static final String[] USER_ACTIVITY_TYPES = { - "other", "button", "touch", "accessibility", "attention" + "other", "button", "touch", "accessibility", "attention", "faceDown", "deviceState" }; public static final int NUM_USER_ACTIVITY_TYPES = USER_ACTIVITY_TYPES.length; diff --git a/core/java/android/os/BatteryUsageStats.java b/core/java/android/os/BatteryUsageStats.java index 7105b1ad8b38..0c5f77860750 100644 --- a/core/java/android/os/BatteryUsageStats.java +++ b/core/java/android/os/BatteryUsageStats.java @@ -33,6 +33,7 @@ import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import java.io.Closeable; +import java.io.FileDescriptor; import java.io.IOException; import java.io.PrintWriter; import java.lang.annotation.Retention; @@ -448,6 +449,16 @@ public final class BatteryUsageStats implements Parcelable, Closeable { return proto.getBytes(); } + /** + * Writes contents in a binary protobuffer format, using + * the android.os.BatteryUsageStatsAtomsProto proto. + */ + public void dumpToProto(FileDescriptor fd) { + final ProtoOutputStream proto = new ProtoOutputStream(fd); + writeStatsProto(proto, /* max size */ Integer.MAX_VALUE); + proto.flush(); + } + @NonNull private void writeStatsProto(ProtoOutputStream proto, int maxRawSize) { final AggregateBatteryConsumer deviceBatteryConsumer = getAggregateBatteryConsumer( diff --git a/core/java/android/os/Binder.java b/core/java/android/os/Binder.java index 80cf2f87f1d6..4f26ad2b4f52 100644 --- a/core/java/android/os/Binder.java +++ b/core/java/android/os/Binder.java @@ -1262,8 +1262,15 @@ public class Binder implements IBinder { // Log any exceptions as warnings, don't silently suppress them. // If the call was {@link IBinder#FLAG_ONEWAY} then these exceptions // disappear into the ether. - final boolean tracingEnabled = Trace.isTagEnabled(Trace.TRACE_TAG_AIDL) && - (Binder.isStackTrackingEnabled() || Binder.isTracingEnabled(callingUid)); + final boolean tagEnabled = Trace.isTagEnabled(Trace.TRACE_TAG_AIDL); + final String transactionTraceName; + if (tagEnabled) { + transactionTraceName = getTransactionTraceName(code); + } else { + transactionTraceName = null; + } + + final boolean tracingEnabled = tagEnabled && transactionTraceName != null; try { final BinderCallHeavyHitterWatcher heavyHitterWatcher = sHeavyHitterWatcher; if (heavyHitterWatcher != null) { @@ -1271,7 +1278,7 @@ public class Binder implements IBinder { heavyHitterWatcher.onTransaction(callingUid, getClass(), code); } if (tracingEnabled) { - Trace.traceBegin(Trace.TRACE_TAG_AIDL, getTransactionTraceName(code)); + Trace.traceBegin(Trace.TRACE_TAG_AIDL, transactionTraceName); } if ((flags & FLAG_COLLECT_NOTED_APP_OPS) != 0) { diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java index 01b75d104e5e..c0e2864d1993 100644 --- a/core/java/android/os/PowerManager.java +++ b/core/java/android/os/PowerManager.java @@ -348,6 +348,39 @@ public final class PowerManager { public static final int USER_ACTIVITY_EVENT_DEVICE_STATE = 6; /** + * @hide + */ + @IntDef(prefix = { "USER_ACTIVITY_EVENT_" }, value = { + USER_ACTIVITY_EVENT_OTHER, + USER_ACTIVITY_EVENT_BUTTON, + USER_ACTIVITY_EVENT_TOUCH, + USER_ACTIVITY_EVENT_ACCESSIBILITY, + USER_ACTIVITY_EVENT_ATTENTION, + USER_ACTIVITY_EVENT_FACE_DOWN, + USER_ACTIVITY_EVENT_DEVICE_STATE, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface UserActivityEvent{} + + /** + * + * Convert the user activity event to a string for debugging purposes. + * @hide + */ + public static String userActivityEventToString(@UserActivityEvent int userActivityEvent) { + switch (userActivityEvent) { + case USER_ACTIVITY_EVENT_OTHER: return "other"; + case USER_ACTIVITY_EVENT_BUTTON: return "button"; + case USER_ACTIVITY_EVENT_TOUCH: return "touch"; + case USER_ACTIVITY_EVENT_ACCESSIBILITY: return "accessibility"; + case USER_ACTIVITY_EVENT_ATTENTION: return "attention"; + case USER_ACTIVITY_EVENT_FACE_DOWN: return "faceDown"; + case USER_ACTIVITY_EVENT_DEVICE_STATE: return "deviceState"; + default: return Integer.toString(userActivityEvent); + } + } + + /** * User activity flag: If already dimmed, extend the dim timeout * but do not brighten. This flag is useful for keeping the screen on * a little longer without causing a visible change such as when diff --git a/core/java/android/os/VibrationEffect.java b/core/java/android/os/VibrationEffect.java index 237f6ed819f6..71bc4b36f4e0 100644 --- a/core/java/android/os/VibrationEffect.java +++ b/core/java/android/os/VibrationEffect.java @@ -1077,13 +1077,13 @@ public abstract class VibrationEffect implements Parcelable { } /** - * Compose all of the added primitives together into a single {@link VibrationEffect}. + * Compose all of the added elements together into a single {@link VibrationEffect}. * * <p>The {@link Composition} object is still valid after this call, so you can continue - * adding more primitives to it and generating more {@link VibrationEffect}s by calling this + * adding more elements to it and generating more {@link VibrationEffect}s by calling this * method again. * - * @return The {@link VibrationEffect} resulting from the composition of the primitives. + * @return The {@link VibrationEffect} resulting from the composition of the elements. */ @NonNull public VibrationEffect compose() { diff --git a/core/java/android/provider/DeviceConfig.java b/core/java/android/provider/DeviceConfig.java index b7adcb84102d..d125cbb80a27 100644 --- a/core/java/android/provider/DeviceConfig.java +++ b/core/java/android/provider/DeviceConfig.java @@ -775,6 +775,14 @@ public final class DeviceConfig { */ public static final String NAMESPACE_WEAR = "wear"; + /** + * Namespace for the input method manager platform features. + * + * @hide + */ + @TestApi + public static final String NAMESPACE_INPUT_METHOD_MANAGER = "input_method_manager"; + private static final Object sLock = new Object(); @GuardedBy("sLock") private static ArrayMap<OnPropertiesChangedListener, Pair<String, Executor>> sListeners = diff --git a/core/java/android/provider/InputMethodManagerDeviceConfig.java b/core/java/android/provider/InputMethodManagerDeviceConfig.java new file mode 100644 index 000000000000..906b133d30d1 --- /dev/null +++ b/core/java/android/provider/InputMethodManagerDeviceConfig.java @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2022 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.provider; + +import android.annotation.TestApi; + +/** + * Interface for accessing keys belonging to {@link DeviceConfig#NAMESPACE_INPUT_METHOD_MANAGER}. + * @hide + */ +@TestApi +public interface InputMethodManagerDeviceConfig { + /** + * Whether the IME should be hidden when the window gained focus without an editor focused. + */ + String KEY_HIDE_IME_WHEN_NO_EDITOR_FOCUS = "hide_ime_when_no_editor_focus"; +} diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 14598d558caa..a99d0f0a5656 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -6695,6 +6695,26 @@ public final class Settings { public static final String BLUETOOTH_ADDR_VALID = "bluetooth_addr_valid"; /** + * This is used by LocalBluetoothLeBroadcast to store the broadcast program info. + * @hide + */ + public static final String BLUETOOTH_LE_BROADCAST_PROGRAM_INFO = + "bluetooth_le_broadcast_program_info"; + + /** + * This is used by LocalBluetoothLeBroadcast to store the broadcast code. + * @hide + */ + public static final String BLUETOOTH_LE_BROADCAST_CODE = "bluetooth_le_broadcast_code"; + + /** + * This is used by LocalBluetoothLeBroadcast to store the app source name. + * @hide + */ + public static final String BLUETOOTH_LE_BROADCAST_APP_SOURCE_NAME = + "bluetooth_le_broadcast_app_source_name"; + + /** * Setting to indicate that on device captions are enabled. * * @hide diff --git a/core/java/android/service/wallpaper/WallpaperService.java b/core/java/android/service/wallpaper/WallpaperService.java index bc8822cfb3e9..be8c140e8770 100644 --- a/core/java/android/service/wallpaper/WallpaperService.java +++ b/core/java/android/service/wallpaper/WallpaperService.java @@ -518,7 +518,7 @@ public abstract class WallpaperService extends Service { * {@link #addLocalColorsAreas(List)} * {@link #removeLocalColorsAreas(List)} * When local colors change, call {@link #notifyLocalColorsChanged(List, List)} - * See {@link com.android.systemui.ImageWallpaper} for an example + * See {@link com.android.systemui.wallpapers.ImageWallpaper} for an example * @hide */ public boolean supportsLocalColorExtraction() { diff --git a/core/java/android/view/Choreographer.java b/core/java/android/view/Choreographer.java index cc68ddd9e211..91febcdcb0c4 100644 --- a/core/java/android/view/Choreographer.java +++ b/core/java/android/view/Choreographer.java @@ -765,11 +765,12 @@ public final class Choreographer { startNanos = System.nanoTime(); final long jitterNanos = startNanos - frameTimeNanos; if (jitterNanos >= frameIntervalNanos) { - long lastFrameOffset = 0; + frameTimeNanos = startNanos; if (frameIntervalNanos == 0) { Log.i(TAG, "Vsync data empty due to timeout"); } else { - lastFrameOffset = jitterNanos % frameIntervalNanos; + long lastFrameOffset = jitterNanos % frameIntervalNanos; + frameTimeNanos = frameTimeNanos - lastFrameOffset; final long skippedFrames = jitterNanos / frameIntervalNanos; if (skippedFrames >= SKIPPED_FRAME_WARNING_LIMIT) { Log.i(TAG, "Skipped " + skippedFrames + " frames! " @@ -785,8 +786,7 @@ public final class Choreographer { + " ms in the past."); } } - frameTimeNanos = startNanos - lastFrameOffset; - frameData.updateFrameData(frameTimeNanos); + frameData = getUpdatedFrameData(frameTimeNanos, frameData, jitterNanos); } if (frameTimeNanos < mLastFrameTimeNanos) { @@ -884,7 +884,7 @@ public final class Choreographer { } frameTimeNanos = now - lastFrameOffset; mLastFrameTimeNanos = frameTimeNanos; - frameData.updateFrameData(frameTimeNanos); + frameData = getUpdatedFrameData(frameTimeNanos, frameData, jitterNanos); } } } @@ -998,9 +998,6 @@ public final class Choreographer { /** Holds data that describes one possible VSync frame event to render at. */ public static class FrameTimeline { - static final FrameTimeline INVALID_FRAME_TIMELINE = new FrameTimeline( - FrameInfo.INVALID_VSYNC_ID, Long.MAX_VALUE, Long.MAX_VALUE); - FrameTimeline(long vsyncId, long expectedPresentTimeNanos, long deadlineNanos) { this.mVsyncId = vsyncId; this.mExpectedPresentTimeNanos = expectedPresentTimeNanos; @@ -1019,11 +1016,6 @@ public final class Choreographer { return mVsyncId; } - /** Reset the vsync ID to invalid. */ - void resetVsyncId() { - mVsyncId = FrameInfo.INVALID_VSYNC_ID; - } - /** * The time in {@link System#nanoTime()} timebase which this frame is expected to be * presented. @@ -1046,39 +1038,20 @@ public final class Choreographer { * information including deadline and expected present time. */ public static class FrameData { - static final FrameTimeline[] INVALID_FRAME_TIMELINES = new FrameTimeline[0]; - FrameData() { - this.mFrameTimelines = INVALID_FRAME_TIMELINES; - this.mPreferredFrameTimeline = FrameTimeline.INVALID_FRAME_TIMELINE; - } - FrameData(long frameTimeNanos, DisplayEventReceiver.VsyncEventData vsyncEventData) { - FrameTimeline[] frameTimelines = - new FrameTimeline[vsyncEventData.frameTimelines.length]; - for (int i = 0; i < vsyncEventData.frameTimelines.length; i++) { - DisplayEventReceiver.VsyncEventData.FrameTimeline frameTimeline = - vsyncEventData.frameTimelines[i]; - frameTimelines[i] = new FrameTimeline(frameTimeline.vsyncId, - frameTimeline.expectedPresentTime, frameTimeline.deadline); - } this.mFrameTimeNanos = frameTimeNanos; - this.mFrameTimelines = frameTimelines; - this.mPreferredFrameTimeline = - frameTimelines[vsyncEventData.preferredFrameTimelineIndex]; + this.mFrameTimelines = convertFrameTimelines(vsyncEventData); + this.mPreferredFrameTimelineIndex = + vsyncEventData.preferredFrameTimelineIndex; } private long mFrameTimeNanos; - private FrameTimeline[] mFrameTimelines; - private FrameTimeline mPreferredFrameTimeline; + private final FrameTimeline[] mFrameTimelines; + private int mPreferredFrameTimelineIndex; - void updateFrameData(long frameTimeNanos) { + void updateFrameData(long frameTimeNanos, int newPreferredFrameTimelineIndex) { mFrameTimeNanos = frameTimeNanos; - for (FrameTimeline ft : mFrameTimelines) { - // The ID is no longer valid because the frame time that was registered with the ID - // no longer matches. - // TODO(b/205721584): Ask SF for valid vsync information. - ft.resetVsyncId(); - } + mPreferredFrameTimelineIndex = newPreferredFrameTimelineIndex; } /** The time in nanoseconds when the frame started being rendered. */ @@ -1096,7 +1069,7 @@ public final class Choreographer { /** The platform-preferred frame timeline. */ @NonNull public FrameTimeline getPreferredFrameTimeline() { - return mPreferredFrameTimeline; + return mFrameTimelines[mPreferredFrameTimelineIndex]; } private FrameTimeline[] convertFrameTimelines( @@ -1114,6 +1087,38 @@ public final class Choreographer { } /** + * Update the frame data when the frame is late. + * + * @param jitterNanos currentTime - frameTime + */ + private FrameData getUpdatedFrameData(long frameTimeNanos, FrameData frameData, + long jitterNanos) { + int newPreferredIndex = 0; + FrameTimeline[] frameTimelines = frameData.getFrameTimelines(); + final long minimumDeadline = + frameData.getPreferredFrameTimeline().getDeadlineNanos() + jitterNanos; + // Look for a non-past deadline timestamp in the existing frame data. Otherwise, binder + // query for new frame data. Note that binder is relatively slow, O(ms), so it is + // only called when the existing frame data does not hold a valid frame. + while (newPreferredIndex < frameTimelines.length - 1 + && frameTimelines[newPreferredIndex].getDeadlineNanos() + < minimumDeadline) { + newPreferredIndex++; + } + + long newPreferredDeadline = + frameData.getFrameTimelines()[newPreferredIndex].getDeadlineNanos(); + if (newPreferredDeadline < minimumDeadline) { + DisplayEventReceiver.VsyncEventData latestVsyncEventData = + mDisplayEventReceiver.getLatestVsyncEventData(); + return new FrameData(frameTimeNanos, latestVsyncEventData); + } else { + frameData.updateFrameData(frameTimeNanos, newPreferredIndex); + return frameData; + } + } + + /** * Implement this interface to receive a callback to start the next frame. The callback is * invoked on the {@link Looper} thread to which the {@link Choreographer} is attached. The * callback payload contains information about multiple possible frames, allowing choice of diff --git a/core/java/android/view/InputDevice.java b/core/java/android/view/InputDevice.java index 9306672a4983..38911e07eb64 100644 --- a/core/java/android/view/InputDevice.java +++ b/core/java/android/view/InputDevice.java @@ -460,10 +460,8 @@ public final class InputDevice implements Parcelable { /** * Called by native code - * @hide */ - @VisibleForTesting - public InputDevice(int id, int generation, int controllerNumber, String name, int vendorId, + private InputDevice(int id, int generation, int controllerNumber, String name, int vendorId, int productId, String descriptor, boolean isExternal, int sources, int keyboardType, KeyCharacterMap keyCharacterMap, @InputDeviceCountryCode int countryCode, boolean hasVibrator, boolean hasMicrophone, boolean hasButtonUnderPad, @@ -520,6 +518,142 @@ public final class InputDevice implements Parcelable { } /** + * InputDevice builder used to create an InputDevice for tests in Java. + * @hide + */ + @VisibleForTesting + public static class Builder { + private int mId = 0; + private int mGeneration = 0; + private int mControllerNumber = 0; + private String mName = ""; + private int mVendorId = 0; + private int mProductId = 0; + private String mDescriptor = ""; + private boolean mIsExternal = false; + private int mSources = 0; + private int mKeyboardType = 0; + private KeyCharacterMap mKeyCharacterMap = null; + private boolean mHasVibrator = false; + private boolean mHasMicrophone = false; + private boolean mHasButtonUnderPad = false; + private boolean mHasSensor = false; + private boolean mHasBattery = false; + @InputDeviceCountryCode + private int mCountryCode = InputDeviceCountryCode.INVALID; + + /** @see InputDevice#getId() */ + public Builder setId(int id) { + mId = id; + return this; + } + + /** @see InputDevice#getGeneration() */ + public Builder setGeneration(int generation) { + mGeneration = generation; + return this; + } + + /** @see InputDevice#getControllerNumber() */ + public Builder setControllerNumber(int controllerNumber) { + mControllerNumber = controllerNumber; + return this; + } + + /** @see InputDevice#getName() */ + public Builder setName(String name) { + mName = name; + return this; + } + + /** @see InputDevice#getVendorId() */ + public Builder setVendorId(int vendorId) { + mVendorId = vendorId; + return this; + } + + /** @see InputDevice#getProductId() */ + public Builder setProductId(int productId) { + mProductId = productId; + return this; + } + + /** @see InputDevice#getDescriptor() */ + public Builder setDescriptor(String descriptor) { + mDescriptor = descriptor; + return this; + } + + /** @see InputDevice#isExternal() */ + public Builder setExternal(boolean external) { + mIsExternal = external; + return this; + } + + /** @see InputDevice#getSources() */ + public Builder setSources(int sources) { + mSources = sources; + return this; + } + + /** @see InputDevice#getKeyboardType() */ + public Builder setKeyboardType(int keyboardType) { + mKeyboardType = keyboardType; + return this; + } + + /** @see InputDevice#getKeyCharacterMap() */ + public Builder setKeyCharacterMap(KeyCharacterMap keyCharacterMap) { + mKeyCharacterMap = keyCharacterMap; + return this; + } + + /** @see InputDevice#getVibrator() */ + public Builder setHasVibrator(boolean hasVibrator) { + mHasVibrator = hasVibrator; + return this; + } + + /** @see InputDevice#hasMicrophone() */ + public Builder setHasMicrophone(boolean hasMicrophone) { + mHasMicrophone = hasMicrophone; + return this; + } + + /** @see InputDevice#hasButtonUnderPad() */ + public Builder setHasButtonUnderPad(boolean hasButtonUnderPad) { + mHasButtonUnderPad = hasButtonUnderPad; + return this; + } + + /** @see InputDevice#hasSensor() */ + public Builder setHasSensor(boolean hasSensor) { + mHasSensor = hasSensor; + return this; + } + + /** @see InputDevice#hasBattery() */ + public Builder setHasBattery(boolean hasBattery) { + mHasBattery = hasBattery; + return this; + } + + /** @see InputDevice#getCountryCode() */ + public Builder setCountryCode(@InputDeviceCountryCode int countryCode) { + mCountryCode = countryCode; + return this; + } + + /** Build {@link InputDevice}. */ + public InputDevice build() { + return new InputDevice(mId, mGeneration, mControllerNumber, mName, mVendorId, + mProductId, mDescriptor, mIsExternal, mSources, mKeyboardType, mKeyCharacterMap, + mCountryCode, mHasVibrator, mHasMicrophone, mHasButtonUnderPad, mHasSensor, + mHasBattery); + } + } + + /** * Gets information about the input device with the specified id. * @param id The device id. * @return The input device or null if not found. diff --git a/core/java/android/view/accessibility/AccessibilityEvent.java b/core/java/android/view/accessibility/AccessibilityEvent.java index 7d8f363bf81c..f2c8355adb84 100644 --- a/core/java/android/view/accessibility/AccessibilityEvent.java +++ b/core/java/android/view/accessibility/AccessibilityEvent.java @@ -24,6 +24,7 @@ import android.os.Parcel; import android.os.Parcelable; import android.text.TextUtils; import android.util.Log; +import android.widget.TextView; import com.android.internal.util.BitUtils; @@ -685,6 +686,18 @@ public final class AccessibilityEvent extends AccessibilityRecord implements Par */ public static final int CONTENT_CHANGE_TYPE_DRAG_CANCELLED = 0x0000200; + /** + * Change type for {@link #TYPE_WINDOW_CONTENT_CHANGED} event: + * It means the content is invalid or associated with an error. + * For example, text that sets an error message, such as when input isn't in a valid format, + * should send this event and use {@link AccessibilityNodeInfo#setError} to + * provide more context. + * + * @see AccessibilityNodeInfo#setError + * @see TextView#setError + */ + public static final int CONTENT_CHANGE_TYPE_INVALID = 0x0000400; + /** Change type for {@link #TYPE_SPEECH_STATE_CHANGE} event: another service is speaking. */ public static final int SPEECH_STATE_SPEAKING_START = 0x00000001; @@ -810,6 +823,7 @@ public final class AccessibilityEvent extends AccessibilityRecord implements Par CONTENT_CHANGE_TYPE_DRAG_STARTED, CONTENT_CHANGE_TYPE_DRAG_DROPPED, CONTENT_CHANGE_TYPE_DRAG_CANCELLED, + CONTENT_CHANGE_TYPE_INVALID, }) public @interface ContentChangeTypes {} @@ -1076,6 +1090,7 @@ public final class AccessibilityEvent extends AccessibilityRecord implements Par case CONTENT_CHANGE_TYPE_DRAG_STARTED: return "CONTENT_CHANGE_TYPE_DRAG_STARTED"; case CONTENT_CHANGE_TYPE_DRAG_DROPPED: return "CONTENT_CHANGE_TYPE_DRAG_DROPPED"; case CONTENT_CHANGE_TYPE_DRAG_CANCELLED: return "CONTENT_CHANGE_TYPE_DRAG_CANCELLED"; + case CONTENT_CHANGE_TYPE_INVALID: return "CONTENT_CHANGE_TYPE_INVALID"; default: return Integer.toHexString(type); } } diff --git a/core/java/android/view/inputmethod/DeleteGesture.java b/core/java/android/view/inputmethod/DeleteGesture.java index 1395578ded3c..9fadabfee512 100644 --- a/core/java/android/view/inputmethod/DeleteGesture.java +++ b/core/java/android/view/inputmethod/DeleteGesture.java @@ -64,7 +64,6 @@ public final class DeleteGesture extends HandwritingGesture implements Parcelabl * Returns the deletion area {@link RectF} in screen coordinates. * * Getter for deletion area set with {@link DeleteGesture.Builder#setDeletionArea(RectF)}. - * {@code null} if area was not set. */ @NonNull public RectF getDeletionArea() { @@ -145,7 +144,8 @@ public final class DeleteGesture extends HandwritingGesture implements Parcelabl /** * Used to make this class parcelable. */ - public static final @android.annotation.NonNull Creator<DeleteGesture> CREATOR = + @NonNull + public static final Creator<DeleteGesture> CREATOR = new Creator<DeleteGesture>() { @Override public DeleteGesture createFromParcel(Parcel source) { diff --git a/core/java/android/view/inputmethod/EditorInfo.java b/core/java/android/view/inputmethod/EditorInfo.java index 36b033485575..c3b32c9f1d54 100644 --- a/core/java/android/view/inputmethod/EditorInfo.java +++ b/core/java/android/view/inputmethod/EditorInfo.java @@ -561,6 +561,10 @@ public class EditorInfo implements InputType, Parcelable { supportedTypes |= HandwritingGesture.GESTURE_TYPE_INSERT; } else if (gesture.equals(DeleteGesture.class)) { supportedTypes |= HandwritingGesture.GESTURE_TYPE_DELETE; + } else if (gesture.equals(RemoveSpaceGesture.class)) { + supportedTypes |= HandwritingGesture.GESTURE_TYPE_REMOVE_SPACE; + } else if (gesture.equals(JoinOrSplitGesture.class)) { + supportedTypes |= HandwritingGesture.GESTURE_TYPE_JOIN_OR_SPLIT; } else { throw new IllegalArgumentException("Unknown gesture type: " + gesture); } @@ -595,6 +599,14 @@ public class EditorInfo implements InputType, Parcelable { == HandwritingGesture.GESTURE_TYPE_DELETE) { list.add(DeleteGesture.class); } + if ((mSupportedHandwritingGestureTypes & HandwritingGesture.GESTURE_TYPE_REMOVE_SPACE) + == HandwritingGesture.GESTURE_TYPE_REMOVE_SPACE) { + list.add(RemoveSpaceGesture.class); + } + if ((mSupportedHandwritingGestureTypes & HandwritingGesture.GESTURE_TYPE_JOIN_OR_SPLIT) + == HandwritingGesture.GESTURE_TYPE_JOIN_OR_SPLIT) { + list.add(JoinOrSplitGesture.class); + } return list; } diff --git a/core/java/android/view/inputmethod/HandwritingGesture.java b/core/java/android/view/inputmethod/HandwritingGesture.java index a65933347664..494aaaa32f57 100644 --- a/core/java/android/view/inputmethod/HandwritingGesture.java +++ b/core/java/android/view/inputmethod/HandwritingGesture.java @@ -99,15 +99,23 @@ public abstract class HandwritingGesture { */ public static final int GESTURE_TYPE_DELETE = 1 << 2; + /** Gesture of type {@link RemoveSpaceGesture} to remove whitespace from text. */ + public static final int GESTURE_TYPE_REMOVE_SPACE = 1 << 3; + + /** Gesture of type {@link JoinOrSplitGesture} to join or split text. */ + public static final int GESTURE_TYPE_JOIN_OR_SPLIT = 1 << 4; + /** * Type of gesture like {@link #GESTURE_TYPE_SELECT}, {@link #GESTURE_TYPE_INSERT}, * or {@link #GESTURE_TYPE_DELETE}. */ @IntDef(prefix = {"GESTURE_TYPE_"}, value = { - GESTURE_TYPE_NONE, - GESTURE_TYPE_SELECT, - GESTURE_TYPE_INSERT, - GESTURE_TYPE_DELETE}) + GESTURE_TYPE_NONE, + GESTURE_TYPE_SELECT, + GESTURE_TYPE_INSERT, + GESTURE_TYPE_DELETE, + GESTURE_TYPE_REMOVE_SPACE, + GESTURE_TYPE_JOIN_OR_SPLIT}) @Retention(RetentionPolicy.SOURCE) @interface GestureType{} @@ -121,7 +129,9 @@ public abstract class HandwritingGesture { @IntDef(flag = true, prefix = {"GESTURE_TYPE_"}, value = { GESTURE_TYPE_SELECT, GESTURE_TYPE_INSERT, - GESTURE_TYPE_DELETE}) + GESTURE_TYPE_DELETE, + GESTURE_TYPE_REMOVE_SPACE, + GESTURE_TYPE_JOIN_OR_SPLIT}) @Retention(RetentionPolicy.SOURCE) public @interface GestureTypeFlags{} diff --git a/core/java/android/view/inputmethod/InsertGesture.java b/core/java/android/view/inputmethod/InsertGesture.java index cffdf35b2fb7..8b8359ea5cb2 100644 --- a/core/java/android/view/inputmethod/InsertGesture.java +++ b/core/java/android/view/inputmethod/InsertGesture.java @@ -124,7 +124,8 @@ public final class InsertGesture extends HandwritingGesture implements Parcelabl /** * Used to make this class parcelable. */ - public static final @android.annotation.NonNull Creator<InsertGesture> CREATOR = + @NonNull + public static final Creator<InsertGesture> CREATOR = new Creator<InsertGesture>() { @Override public InsertGesture createFromParcel(Parcel source) { diff --git a/core/java/android/view/inputmethod/JoinOrSplitGesture.aidl b/core/java/android/view/inputmethod/JoinOrSplitGesture.aidl new file mode 100644 index 000000000000..e339b55f4c49 --- /dev/null +++ b/core/java/android/view/inputmethod/JoinOrSplitGesture.aidl @@ -0,0 +1,19 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.view.inputmethod; + +parcelable JoinOrSplitGesture; diff --git a/core/java/android/view/inputmethod/JoinOrSplitGesture.java b/core/java/android/view/inputmethod/JoinOrSplitGesture.java new file mode 100644 index 000000000000..2fa80630731d --- /dev/null +++ b/core/java/android/view/inputmethod/JoinOrSplitGesture.java @@ -0,0 +1,145 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.view.inputmethod; + +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.graphics.PointF; +import android.os.Parcel; +import android.os.Parcelable; + +import java.util.Objects; + +/** + * A subclass of {@link HandwritingGesture} for deleting or inserting whitespace in text. If the + * gesture is drawn over whitespace, then the whitespace will be deleted. Otherwise, a space will be + * inserted. + */ +public final class JoinOrSplitGesture extends HandwritingGesture implements Parcelable { + + private final PointF mPoint; + + private JoinOrSplitGesture(PointF point, String fallbackText) { + mType = GESTURE_TYPE_JOIN_OR_SPLIT; + mPoint = point; + mFallbackText = fallbackText; + } + + private JoinOrSplitGesture(@NonNull Parcel source) { + mType = GESTURE_TYPE_JOIN_OR_SPLIT; + mPoint = source.readTypedObject(PointF.CREATOR); + mFallbackText = source.readString8(); + } + + /** + * Returns the gesture point in screen coordinates set with {@link Builder#setJoinOrSplitPoint}. + */ + @NonNull + public PointF getJoinOrSplitPoint() { + return mPoint; + } + + /** Builder for {@link JoinOrSplitGesture}. This class is not designed to be thread-safe. */ + public static final class Builder { + private PointF mPoint; + private String mFallbackText; + + /** + * Sets the point to apply the join or split operation in screen coordinates. + * + * <p>If the text cursor position closest to the point is inside or on the boundary of + * whitespace, then the whitespace will be deleted, joining the text on either side of the + * whitespace. If there are multiple consecutive whitespace characters, then the entire + * whitespace block will be deleted. + * + * <p>Otherwise, if the text cursor position closest to the point is not touching + * whitespace, then a space will be inserted at that position. + */ + @NonNull + public Builder setJoinOrSplitPoint(@NonNull PointF point) { + mPoint = point; + return this; + } + + /** + * Sets fallback text that will be committed at current cursor position if there is no + * applicable text beneath the gesture point. + */ + @NonNull + public Builder setFallbackText(@Nullable String fallbackText) { + mFallbackText = fallbackText; + return this; + } + + /** + * @return {@link JoinOrSplitGesture} using parameters in this {@link Builder}. + * @throws IllegalArgumentException if one or more positional parameters are not specified. + */ + @NonNull + public JoinOrSplitGesture build() { + if (mPoint == null) { + throw new IllegalArgumentException("Point must be set."); + } + return new JoinOrSplitGesture(mPoint, mFallbackText); + } + } + + /** Used to make this class parcelable. */ + @NonNull + public static final Parcelable.Creator<JoinOrSplitGesture> CREATOR = + new Parcelable.Creator<JoinOrSplitGesture>() { + @Override + public JoinOrSplitGesture createFromParcel(Parcel source) { + return new JoinOrSplitGesture(source); + } + + @Override + public JoinOrSplitGesture[] newArray(int size) { + return new JoinOrSplitGesture[size]; + } + }; + + @Override + public int hashCode() { + return Objects.hash(mPoint, mFallbackText); + } + + @Override + public boolean equals(Object o) { + if (!(o instanceof JoinOrSplitGesture)) return false; + JoinOrSplitGesture that = (JoinOrSplitGesture) o; + return Objects.equals(mPoint, that.mPoint) + && Objects.equals(mFallbackText, that.mFallbackText); + } + + @Override + public int describeContents() { + return 0; + } + + /** + * Used to package this object into a {@link Parcel}. + * + * @param dest {@link Parcel} to be written + * @param flags flags used for parceling + */ + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + dest.writeTypedObject(mPoint, flags); + dest.writeString8(mFallbackText); + } +} diff --git a/core/java/android/view/inputmethod/RemoveSpaceGesture.aidl b/core/java/android/view/inputmethod/RemoveSpaceGesture.aidl new file mode 100644 index 000000000000..7aab528b3e27 --- /dev/null +++ b/core/java/android/view/inputmethod/RemoveSpaceGesture.aidl @@ -0,0 +1,19 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.view.inputmethod; + +parcelable RemoveSpaceGesture; diff --git a/core/java/android/view/inputmethod/RemoveSpaceGesture.java b/core/java/android/view/inputmethod/RemoveSpaceGesture.java new file mode 100644 index 000000000000..936f25907fbb --- /dev/null +++ b/core/java/android/view/inputmethod/RemoveSpaceGesture.java @@ -0,0 +1,152 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.view.inputmethod; + +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.annotation.SuppressLint; +import android.graphics.PointF; +import android.os.Parcel; +import android.os.Parcelable; + +import java.util.Objects; + +/** A subclass of {@link HandwritingGesture} for removing whitespace from text. */ +public final class RemoveSpaceGesture extends HandwritingGesture implements Parcelable { + + private final PointF mStartPoint; + private final PointF mEndPoint; + + private RemoveSpaceGesture(PointF startPoint, PointF endPoint, String fallbackText) { + mType = GESTURE_TYPE_REMOVE_SPACE; + mStartPoint = startPoint; + mEndPoint = endPoint; + mFallbackText = fallbackText; + } + + private RemoveSpaceGesture(@NonNull Parcel source) { + mType = GESTURE_TYPE_REMOVE_SPACE; + mStartPoint = source.readTypedObject(PointF.CREATOR); + mEndPoint = source.readTypedObject(PointF.CREATOR); + mFallbackText = source.readString8(); + } + + /** Returns the start point in screen coordinates set with {@link Builder#setPoints}. */ + @NonNull + public PointF getStartPoint() { + return mStartPoint; + } + + /** Returns the end point in screen coordinates set with {@link Builder#setPoints}. */ + @NonNull + public PointF getEndPoint() { + return mEndPoint; + } + + /** Builder for {@link RemoveSpaceGesture}. This class is not designed to be thread-safe. */ + public static final class Builder { + private PointF mStartPoint; + private PointF mEndPoint; + private String mFallbackText; + + /** + * Sets the start and end points in screen coordinates of the line to apply the remove space + * operation. All whitespace characters touched by the line joining the points will be + * deleted. + * + * <p>The operation will only be performed on a single line of text. If the start and end + * points are on different lines of text, the line will be adjusted to cover only the first + * line of text containing one of the points. + */ + @NonNull + @SuppressLint("MissingGetterMatchingBuilder") + public Builder setPoints(@NonNull PointF startPoint, @NonNull PointF endPoint) { + mStartPoint = startPoint; + mEndPoint = endPoint; + return this; + } + + /** + * Sets fallback text that will be committed at current cursor position if there is no + * whitespace beneath the gesture line. + */ + @NonNull + public Builder setFallbackText(@Nullable String fallbackText) { + mFallbackText = fallbackText; + return this; + } + + /** + * @return {@link RemoveSpaceGesture} using parameters in this {@link Builder}. + * @throws IllegalArgumentException if one or more positional parameters are not specified. + */ + @NonNull + public RemoveSpaceGesture build() { + if (mStartPoint == null || mEndPoint == null) { + throw new IllegalArgumentException("Start and end points must be set."); + } + return new RemoveSpaceGesture(mStartPoint, mEndPoint, mFallbackText); + } + } + + /** Used to make this class parcelable. */ + @NonNull + public static final Parcelable.Creator<RemoveSpaceGesture> CREATOR = + new Parcelable.Creator<RemoveSpaceGesture>() { + @Override + public RemoveSpaceGesture createFromParcel(Parcel source) { + return new RemoveSpaceGesture(source); + } + + @Override + public RemoveSpaceGesture[] newArray(int size) { + return new RemoveSpaceGesture[size]; + } + }; + + @Override + public int hashCode() { + return Objects.hash(mStartPoint, mEndPoint, mFallbackText); + } + + @Override + public boolean equals(Object o) { + if (!(o instanceof RemoveSpaceGesture)) return false; + RemoveSpaceGesture that = (RemoveSpaceGesture) o; + return Objects.equals(mStartPoint, that.mStartPoint) + && Objects.equals(mEndPoint, that.mEndPoint) + && Objects.equals(mFallbackText, that.mFallbackText); + } + + @Override + public int describeContents() { + return 0; + } + + /** + * Used to package this object into a {@link Parcel}. + * + * @param dest {@link Parcel} to be written + * @param flags flags used for parceling + */ + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + dest.writeTypedObject(mStartPoint, flags); + dest.writeTypedObject(mEndPoint, flags); + dest.writeString8(mFallbackText); + } +} diff --git a/core/java/android/view/inputmethod/SelectGesture.java b/core/java/android/view/inputmethod/SelectGesture.java index 5b685176b4a3..2f02e66d4295 100644 --- a/core/java/android/view/inputmethod/SelectGesture.java +++ b/core/java/android/view/inputmethod/SelectGesture.java @@ -63,8 +63,7 @@ public final class SelectGesture extends HandwritingGesture implements Parcelabl /** * Returns the Selection area {@link RectF} in screen coordinates. * - * Getter for selection area set with {@link Builder#setSelectionArea(RectF)}. {@code null} - * if area was not set. + * Getter for selection area set with {@link Builder#setSelectionArea(RectF)}. */ @NonNull public RectF getSelectionArea() { @@ -126,7 +125,7 @@ public final class SelectGesture extends HandwritingGesture implements Parcelabl } /** - * @return {@link SelectGesture} using parameters in this {@link InsertGesture.Builder}. + * @return {@link SelectGesture} using parameters in this {@link Builder}. * @throws IllegalArgumentException if one or more positional parameters are not specified. */ @NonNull @@ -144,7 +143,8 @@ public final class SelectGesture extends HandwritingGesture implements Parcelabl /** * Used to make this class parcelable. */ - public static final @android.annotation.NonNull Parcelable.Creator<SelectGesture> CREATOR = + @NonNull + public static final Parcelable.Creator<SelectGesture> CREATOR = new Parcelable.Creator<SelectGesture>() { @Override public SelectGesture createFromParcel(Parcel source) { diff --git a/core/java/android/widget/SelectionActionModeHelper.java b/core/java/android/widget/SelectionActionModeHelper.java index be6b08fbddae..075aa6c69aed 100644 --- a/core/java/android/widget/SelectionActionModeHelper.java +++ b/core/java/android/widget/SelectionActionModeHelper.java @@ -148,6 +148,9 @@ public final class SelectionActionModeHelper { startSelectionActionMode(null); } else { resetTextClassificationHelper(); + if (mSmartSelectSprite != null && mSmartSelectSprite.isAnimationActive()) { + mSmartSelectSprite.cancelAnimation(); + } mTextClassificationAsyncTask = new TextClassificationAsyncTask( mTextView, mTextClassificationHelper.getTimeoutDuration(), diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 18ebe30a4990..68b902f14079 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -7644,7 +7644,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener createEditorIfNeeded(); mEditor.setError(error, icon); notifyViewAccessibilityStateChangedIfNeeded( - AccessibilityEvent.CONTENT_CHANGE_TYPE_UNDEFINED); + AccessibilityEvent.CONTENT_CHANGE_TYPE_INVALID); } @Override diff --git a/core/java/com/android/internal/app/ChooserActivity.java b/core/java/com/android/internal/app/ChooserActivity.java index 1bc934dfc6a4..5cf7e364bbc1 100644 --- a/core/java/com/android/internal/app/ChooserActivity.java +++ b/core/java/com/android/internal/app/ChooserActivity.java @@ -142,6 +142,7 @@ import java.lang.annotation.RetentionPolicy; import java.net.URISyntaxException; import java.text.Collator; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; @@ -2952,12 +2953,14 @@ public class ChooserActivity extends ResolverActivity implements private void startFinishAnimation() { View rootView = findRootView(); - rootView.startAnimation(new FinishAnimation(this, rootView)); + if (rootView != null) { + rootView.startAnimation(new FinishAnimation(this, rootView)); + } } private boolean maybeCancelFinishAnimation() { View rootView = findRootView(); - Animation animation = rootView.getAnimation(); + Animation animation = rootView == null ? null : rootView.getAnimation(); if (animation instanceof FinishAnimation) { boolean hasEnded = animation.hasEnded(); animation.cancel(); @@ -3721,6 +3724,7 @@ public class ChooserActivity extends ResolverActivity implements this.mRows = rows; this.mCellCountPerRow = cellCountPerRow; this.mCellVisibility = new boolean[rows.size() * cellCountPerRow]; + Arrays.fill(mCellVisibility, true); this.mListAdapterSupplier = listAdapterSupplier; } @@ -4084,11 +4088,13 @@ public class ChooserActivity extends ResolverActivity implements */ private static class FinishAnimation extends AlphaAnimation implements Animation.AnimationListener { + @Nullable private Activity mActivity; + @Nullable private View mRootView; private final float mFromAlpha; - FinishAnimation(Activity activity, View rootView) { + FinishAnimation(@NonNull Activity activity, @NonNull View rootView) { super(rootView.getAlpha(), 0.0f); mActivity = activity; mRootView = rootView; @@ -4112,7 +4118,9 @@ public class ChooserActivity extends ResolverActivity implements @Override public void cancel() { - mRootView.setAlpha(mFromAlpha); + if (mRootView != null) { + mRootView.setAlpha(mFromAlpha); + } cleanup(); super.cancel(); } @@ -4123,9 +4131,10 @@ public class ChooserActivity extends ResolverActivity implements @Override public void onAnimationEnd(Animation animation) { - if (mActivity != null) { - mActivity.finish(); - cleanup(); + Activity activity = mActivity; + cleanup(); + if (activity != null) { + activity.finish(); } } diff --git a/core/java/com/android/internal/inputmethod/IRemoteInputConnection.aidl b/core/java/com/android/internal/inputmethod/IRemoteInputConnection.aidl index 7a219c61bafb..f456e85adff4 100644 --- a/core/java/com/android/internal/inputmethod/IRemoteInputConnection.aidl +++ b/core/java/com/android/internal/inputmethod/IRemoteInputConnection.aidl @@ -25,6 +25,8 @@ import android.view.inputmethod.DeleteGesture; import android.view.inputmethod.ExtractedTextRequest; import android.view.inputmethod.InputContentInfo; import android.view.inputmethod.InsertGesture; +import android.view.inputmethod.JoinOrSplitGesture; +import android.view.inputmethod.RemoveSpaceGesture; import android.view.inputmethod.SelectGesture; import android.view.inputmethod.TextAttribute; @@ -99,6 +101,12 @@ import com.android.internal.inputmethod.InputConnectionCommandHeader; void performHandwritingDeleteGesture(in InputConnectionCommandHeader header, in DeleteGesture gesture, in ResultReceiver resultReceiver); + void performHandwritingRemoveSpaceGesture(in InputConnectionCommandHeader header, + in RemoveSpaceGesture gesture, in ResultReceiver resultReceiver); + + void performHandwritingJoinOrSplitGesture(in InputConnectionCommandHeader header, + in JoinOrSplitGesture gesture, in ResultReceiver resultReceiver); + void setComposingRegion(in InputConnectionCommandHeader header, int start, int end); void setComposingRegionWithTextAttribute(in InputConnectionCommandHeader header, int start, diff --git a/core/java/com/android/internal/inputmethod/InputMethodDebug.java b/core/java/com/android/internal/inputmethod/InputMethodDebug.java index 1852c593535b..bbf0a764d9e4 100644 --- a/core/java/com/android/internal/inputmethod/InputMethodDebug.java +++ b/core/java/com/android/internal/inputmethod/InputMethodDebug.java @@ -20,7 +20,6 @@ import android.annotation.Nullable; import android.view.View; import android.view.WindowManager; import android.view.WindowManager.LayoutParams.SoftInputModeFlags; -import android.view.autofill.AutofillManager; import android.view.inputmethod.HandwritingGesture; import java.util.StringJoiner; @@ -254,6 +253,8 @@ public final class InputMethodDebug { return "HIDE_SOFT_INPUT_EXTRACT_INPUT_CHANGED"; case SoftInputShowHideReason.HIDE_SOFT_INPUT_IMM_DEPRECATION: return "HIDE_SOFT_INPUT_IMM_DEPRECATION"; + case SoftInputShowHideReason.HIDE_WINDOW_GAINED_FOCUS_WITHOUT_EDITOR: + return "HIDE_WINDOW_GAINED_FOCUS_WITHOUT_EDITOR"; default: return "Unknown=" + reason; } @@ -277,6 +278,12 @@ public final class InputMethodDebug { if ((gestureTypeFlags & HandwritingGesture.GESTURE_TYPE_DELETE) != 0) { joiner.add("DELETE"); } + if ((gestureTypeFlags & HandwritingGesture.GESTURE_TYPE_REMOVE_SPACE) != 0) { + joiner.add("REMOVE_SPACE"); + } + if ((gestureTypeFlags & HandwritingGesture.GESTURE_TYPE_JOIN_OR_SPLIT) != 0) { + joiner.add("JOIN_OR_SPLIT"); + } return joiner.setEmptyValue("(none)").toString(); } diff --git a/core/java/com/android/internal/inputmethod/RemoteInputConnectionImpl.java b/core/java/com/android/internal/inputmethod/RemoteInputConnectionImpl.java index dd173a6dfef5..6a7028d31edb 100644 --- a/core/java/com/android/internal/inputmethod/RemoteInputConnectionImpl.java +++ b/core/java/com/android/internal/inputmethod/RemoteInputConnectionImpl.java @@ -48,6 +48,8 @@ import android.view.inputmethod.InputConnection; import android.view.inputmethod.InputContentInfo; import android.view.inputmethod.InputMethodManager; import android.view.inputmethod.InsertGesture; +import android.view.inputmethod.JoinOrSplitGesture; +import android.view.inputmethod.RemoveSpaceGesture; import android.view.inputmethod.SelectGesture; import android.view.inputmethod.TextAttribute; import android.view.inputmethod.TextSnapshot; @@ -997,6 +999,22 @@ public final class RemoteInputConnectionImpl extends IRemoteInputConnection.Stub performHandwritingGestureInternal(header, gesture, resultReceiver); } + @Dispatching(cancellable = true) + @Override + public void performHandwritingRemoveSpaceGesture( + InputConnectionCommandHeader header, RemoveSpaceGesture gesture, + ResultReceiver resultReceiver) { + performHandwritingGestureInternal(header, gesture, resultReceiver); + } + + @Dispatching(cancellable = true) + @Override + public void performHandwritingJoinOrSplitGesture( + InputConnectionCommandHeader header, JoinOrSplitGesture gesture, + ResultReceiver resultReceiver) { + performHandwritingGestureInternal(header, gesture, resultReceiver); + } + private <T extends HandwritingGesture> void performHandwritingGestureInternal( InputConnectionCommandHeader header, T gesture, ResultReceiver resultReceiver) { dispatchWithTracing("performHandwritingGesture", () -> { diff --git a/core/java/com/android/internal/inputmethod/SoftInputShowHideReason.java b/core/java/com/android/internal/inputmethod/SoftInputShowHideReason.java index f5b58c01c293..f1635ebe5fb3 100644 --- a/core/java/com/android/internal/inputmethod/SoftInputShowHideReason.java +++ b/core/java/com/android/internal/inputmethod/SoftInputShowHideReason.java @@ -63,7 +63,8 @@ import java.lang.annotation.Retention; SoftInputShowHideReason.HIDE_SOFT_INPUT_BY_BACK_KEY, SoftInputShowHideReason.HIDE_SOFT_INPUT_IME_TOGGLE_SOFT_INPUT, SoftInputShowHideReason.HIDE_SOFT_INPUT_EXTRACT_INPUT_CHANGED, - SoftInputShowHideReason.HIDE_SOFT_INPUT_IMM_DEPRECATION}) + SoftInputShowHideReason.HIDE_SOFT_INPUT_IMM_DEPRECATION, + SoftInputShowHideReason.HIDE_WINDOW_GAINED_FOCUS_WITHOUT_EDITOR}) public @interface SoftInputShowHideReason { /** Show soft input by {@link android.view.inputmethod.InputMethodManager#showSoftInput}. */ int SHOW_SOFT_INPUT = 0; @@ -247,4 +248,9 @@ public @interface SoftInputShowHideReason { * {@link InputMethodManager#hideSoftInputFromInputMethod(IBinder, int)}. */ int HIDE_SOFT_INPUT_IMM_DEPRECATION = 31; + + /** + * Hide soft input when the window gained focus without an editor from the IME shown window. + */ + int HIDE_WINDOW_GAINED_FOCUS_WITHOUT_EDITOR = 32; } diff --git a/core/java/com/android/internal/jank/DisplayResolutionTracker.java b/core/java/com/android/internal/jank/DisplayResolutionTracker.java new file mode 100644 index 000000000000..fd5846847c95 --- /dev/null +++ b/core/java/com/android/internal/jank/DisplayResolutionTracker.java @@ -0,0 +1,162 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.internal.jank; + +import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__DISPLAY_RESOLUTION__FHD; +import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__DISPLAY_RESOLUTION__HD; +import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__DISPLAY_RESOLUTION__QHD; +import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__DISPLAY_RESOLUTION__SD; +import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__DISPLAY_RESOLUTION__UNKNOWN_RESOLUTION; + +import android.annotation.IntDef; +import android.annotation.Nullable; +import android.hardware.display.DisplayManager; +import android.hardware.display.DisplayManagerGlobal; +import android.os.Handler; +import android.util.SparseArray; +import android.view.DisplayInfo; + +import com.android.internal.annotations.VisibleForTesting; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** +* A class that tracks the display resolutions. +* @hide +*/ +public class DisplayResolutionTracker { + private static final String TAG = DisplayResolutionTracker.class.getSimpleName(); + + public static final int RESOLUTION_UNKNOWN = + UIINTERACTION_FRAME_INFO_REPORTED__DISPLAY_RESOLUTION__UNKNOWN_RESOLUTION; + public static final int RESOLUTION_SD = + UIINTERACTION_FRAME_INFO_REPORTED__DISPLAY_RESOLUTION__SD; + public static final int RESOLUTION_HD = + UIINTERACTION_FRAME_INFO_REPORTED__DISPLAY_RESOLUTION__HD; + public static final int RESOLUTION_FHD = + UIINTERACTION_FRAME_INFO_REPORTED__DISPLAY_RESOLUTION__FHD; + public static final int RESOLUTION_QHD = + UIINTERACTION_FRAME_INFO_REPORTED__DISPLAY_RESOLUTION__QHD; + + /** @hide */ + @IntDef({ + RESOLUTION_UNKNOWN, + RESOLUTION_SD, + RESOLUTION_HD, + RESOLUTION_FHD, + RESOLUTION_QHD, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface Resolution { + } + + private final DisplayInterface mManager; + private final SparseArray<Integer> mResolutions = new SparseArray<>(); + private final Object mLock = new Object(); + + public DisplayResolutionTracker(@Nullable Handler handler) { + this(DisplayInterface.getDefault(handler)); + } + + @VisibleForTesting + public DisplayResolutionTracker(DisplayInterface manager) { + mManager = manager; + mManager.registerDisplayListener(new DisplayManager.DisplayListener() { + @Override + public void onDisplayAdded(int displayId) { + updateDisplay(displayId); + } + + @Override + public void onDisplayChanged(int displayId) { + updateDisplay(displayId); + } + + @Override + public void onDisplayRemoved(int displayId) { + // Not in the event mask below, won't be called. + } + }); + } + + private void updateDisplay(int displayId) { + DisplayInfo info = mManager.getDisplayInfo(displayId); + @Resolution int resolution = getResolution(info); + + synchronized (mLock) { + mResolutions.put(displayId, resolution); + } + } + + /** + * Returns the (cached) resolution of the display with the given ID. + */ + @Resolution + public int getResolution(int displayId) { + return mResolutions.get(displayId, RESOLUTION_UNKNOWN); + } + + /** + * Returns the resolution of the given {@link DisplayInfo}. + */ + @VisibleForTesting + @Resolution + public static int getResolution(DisplayInfo info) { + int smaller = Math.min(info.logicalWidth, info.logicalHeight); + int larger = Math.max(info.logicalWidth, info.logicalHeight); + if (smaller < 720 || larger < 1280) { + return RESOLUTION_SD; + } else if (smaller < 1080 || larger < 1920) { + return RESOLUTION_HD; + } else if (smaller < 1440 || larger < 2560) { + return RESOLUTION_FHD; + } else { + return RESOLUTION_QHD; + } + } + + /** + * Wrapper around the final {@link DisplayManagerGlobal} class. + * @hide + */ + @VisibleForTesting + public interface DisplayInterface { + /** Reurns an implementation wrapping {@link DisplayManagerGlobal}. */ + static DisplayInterface getDefault(@Nullable Handler handler) { + DisplayManagerGlobal manager = DisplayManagerGlobal.getInstance(); + return new DisplayInterface() { + @Override + public void registerDisplayListener(DisplayManager.DisplayListener listener) { + manager.registerDisplayListener(listener, handler, + DisplayManager.EVENT_FLAG_DISPLAY_ADDED + | DisplayManager.EVENT_FLAG_DISPLAY_CHANGED); + } + + @Override + public DisplayInfo getDisplayInfo(int displayId) { + return manager.getDisplayInfo(displayId); + } + }; + } + + /** {@see DisplayManagerGlobal#registerDisplayListener} */ + void registerDisplayListener(DisplayManager.DisplayListener listener); + /** {@see DisplayManagerGlobal#getDisplayInfo} */ + DisplayInfo getDisplayInfo(int displayId); + } +} diff --git a/core/java/com/android/internal/jank/FrameTracker.java b/core/java/com/android/internal/jank/FrameTracker.java index 48343803b10e..e4195d29c1ee 100644 --- a/core/java/com/android/internal/jank/FrameTracker.java +++ b/core/java/com/android/internal/jank/FrameTracker.java @@ -100,6 +100,7 @@ public class FrameTracker extends SurfaceControl.OnJankDataListener private final Session mSession; private final ViewRootWrapper mViewRoot; private final SurfaceControlWrapper mSurfaceControlWrapper; + private final int mDisplayId; private final ViewRootImpl.SurfaceChangedCallback mSurfaceChangedCallback; private final Handler mHandler; private final ChoreographerWrapper mChoreographer; @@ -213,6 +214,7 @@ public class FrameTracker extends SurfaceControl.OnJankDataListener mTraceThresholdMissedFrames = traceThresholdMissedFrames; mTraceThresholdFrameTimeMillis = traceThresholdFrameTimeMillis; mListener = listener; + mDisplayId = config.getDisplayId(); if (mSurfaceOnly) { mSurfaceControl = config.getSurfaceControl(); @@ -625,6 +627,7 @@ public class FrameTracker extends SurfaceControl.OnJankDataListener if (mSession.logToStatsd()) { mStatsLog.write( FrameworkStatsLog.UI_INTERACTION_FRAME_INFO_REPORTED, + mDisplayId, mSession.getStatsdInteractionType(), totalFramesCount, missedFramesCount, @@ -785,9 +788,17 @@ public class FrameTracker extends SurfaceControl.OnJankDataListener } public static class StatsLogWrapper { - public void write(int code, + private final DisplayResolutionTracker mDisplayResolutionTracker; + + public StatsLogWrapper(DisplayResolutionTracker displayResolutionTracker) { + mDisplayResolutionTracker = displayResolutionTracker; + } + + /** {@see FrameworkStatsLog#write) */ + public void write(int code, int displayId, int arg1, long arg2, long arg3, long arg4, long arg5, long arg6, long arg7) { - FrameworkStatsLog.write(code, arg1, arg2, arg3, arg4, arg5, arg6, arg7); + FrameworkStatsLog.write(code, arg1, arg2, arg3, arg4, arg5, arg6, arg7, + mDisplayResolutionTracker.getResolution(displayId)); } } diff --git a/core/java/com/android/internal/jank/InteractionJankMonitor.java b/core/java/com/android/internal/jank/InteractionJankMonitor.java index fc4e041058b1..b5991b3fcbdc 100644 --- a/core/java/com/android/internal/jank/InteractionJankMonitor.java +++ b/core/java/com/android/internal/jank/InteractionJankMonitor.java @@ -306,6 +306,7 @@ public class InteractionJankMonitor { @GuardedBy("mLock") private final SparseArray<Runnable> mTimeoutActions; private final HandlerThread mWorker; + private final DisplayResolutionTracker mDisplayResolutionTracker; private final Object mLock = new Object(); private volatile boolean mEnabled = DEFAULT_ENABLED; @@ -408,6 +409,7 @@ public class InteractionJankMonitor { mWorker = worker; mWorker.start(); mSamplingInterval = DEFAULT_SAMPLING_INTERVAL; + mDisplayResolutionTracker = new DisplayResolutionTracker(worker.getThreadHandler()); // Post initialization to the background in case we're running on the main // thread. @@ -443,7 +445,8 @@ public class InteractionJankMonitor { final FrameMetricsWrapper frameMetrics = new FrameMetricsWrapper(); return new FrameTracker(this, session, config.getHandler(), threadedRenderer, viewRoot, - surfaceControl, choreographer, frameMetrics, new FrameTracker.StatsLogWrapper(), + surfaceControl, choreographer, frameMetrics, + new FrameTracker.StatsLogWrapper(mDisplayResolutionTracker), mTraceThresholdMissedFrames, mTraceThresholdFrameTimeMillis, eventsListener, config); } @@ -1098,6 +1101,14 @@ public class InteractionJankMonitor { public Handler getHandler() { return mHandler; } + + /** + * @return the ID of the display this interaction in on. + */ + @VisibleForTesting + public int getDisplayId() { + return (mSurfaceOnly ? mContext.getDisplay() : mView.getDisplay()).getDisplayId(); + } } /** diff --git a/core/java/com/android/internal/os/PowerProfile.java b/core/java/com/android/internal/os/PowerProfile.java index 54e65e079b83..2bcc645e6a9a 100644 --- a/core/java/com/android/internal/os/PowerProfile.java +++ b/core/java/com/android/internal/os/PowerProfile.java @@ -43,6 +43,7 @@ import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; +import java.util.Locale; /** * Reports power consumption values for various device activities. Reads values from an XML file. @@ -315,6 +316,8 @@ public class PowerProfile { private static final Object sLock = new Object(); + private int mCpuPowerBracketCount; + @VisibleForTesting @UnsupportedAppUsage public PowerProfile(Context context) { @@ -346,7 +349,6 @@ public class PowerProfile { sModemPowerProfile.clear(); initLocked(context, xmlId); } - } @GuardedBy("sLock") @@ -450,6 +452,9 @@ public class PowerProfile { private static final String CPU_CLUSTER_POWER_COUNT = "cpu.cluster_power.cluster"; private static final String CPU_CORE_SPEED_PREFIX = "cpu.core_speeds.cluster"; private static final String CPU_CORE_POWER_PREFIX = "cpu.core_power.cluster"; + private static final String CPU_POWER_BRACKETS_PREFIX = "cpu.power_brackets.cluster"; + + private static final int DEFAULT_CPU_POWER_BRACKET_NUMBER = 3; private void initCpuClusters() { if (sPowerArrayMap.containsKey(CPU_PER_CLUSTER_CORE_COUNT)) { @@ -471,13 +476,104 @@ public class PowerProfile { mCpuClusters[0] = new CpuClusterKey(CPU_CORE_SPEED_PREFIX + 0, CPU_CLUSTER_POWER_COUNT + 0, CPU_CORE_POWER_PREFIX + 0, numCpus); } + + initCpuPowerBrackets(DEFAULT_CPU_POWER_BRACKET_NUMBER); } - public static class CpuClusterKey { - private final String freqKey; - private final String clusterPowerKey; - private final String corePowerKey; - private final int numCpus; + /** + * Parses or computes CPU power brackets: groups of states with similar power requirements. + */ + @VisibleForTesting + public void initCpuPowerBrackets(int defaultCpuPowerBracketNumber) { + boolean anyBracketsSpecified = false; + boolean allBracketsSpecified = true; + for (int cluster = 0; cluster < mCpuClusters.length; cluster++) { + final int steps = getNumSpeedStepsInCpuCluster(cluster); + mCpuClusters[cluster].powerBrackets = new int[steps]; + if (sPowerArrayMap.get(CPU_POWER_BRACKETS_PREFIX + cluster) != null) { + anyBracketsSpecified = true; + } else { + allBracketsSpecified = false; + } + } + + if (anyBracketsSpecified && !allBracketsSpecified) { + throw new RuntimeException( + "Power brackets should be specified for all clusters or no clusters"); + } + + mCpuPowerBracketCount = 0; + if (allBracketsSpecified) { + for (int cluster = 0; cluster < mCpuClusters.length; cluster++) { + final Double[] data = sPowerArrayMap.get(CPU_POWER_BRACKETS_PREFIX + cluster); + if (data.length != mCpuClusters[cluster].powerBrackets.length) { + throw new RuntimeException( + "Wrong number of items in " + CPU_POWER_BRACKETS_PREFIX + cluster); + } + + for (int i = 0; i < data.length; i++) { + final int bracket = (int) Math.round(data[i]); + mCpuClusters[cluster].powerBrackets[i] = bracket; + if (bracket > mCpuPowerBracketCount) { + mCpuPowerBracketCount = bracket; + } + } + } + mCpuPowerBracketCount++; + } else { + double minPower = Double.MAX_VALUE; + double maxPower = Double.MIN_VALUE; + int stateCount = 0; + for (int cluster = 0; cluster < mCpuClusters.length; cluster++) { + final int steps = getNumSpeedStepsInCpuCluster(cluster); + for (int step = 0; step < steps; step++) { + final double power = getAveragePowerForCpuCore(cluster, step); + if (power < minPower) { + minPower = power; + } + if (power > maxPower) { + maxPower = power; + } + } + stateCount += steps; + } + + if (stateCount <= defaultCpuPowerBracketNumber) { + mCpuPowerBracketCount = stateCount; + int bracket = 0; + for (int cluster = 0; cluster < mCpuClusters.length; cluster++) { + final int steps = getNumSpeedStepsInCpuCluster(cluster); + for (int step = 0; step < steps; step++) { + mCpuClusters[cluster].powerBrackets[step] = bracket++; + } + } + } else { + mCpuPowerBracketCount = defaultCpuPowerBracketNumber; + final double minLogPower = Math.log(minPower); + final double logBracket = (Math.log(maxPower) - minLogPower) + / defaultCpuPowerBracketNumber; + + for (int cluster = 0; cluster < mCpuClusters.length; cluster++) { + final int steps = getNumSpeedStepsInCpuCluster(cluster); + for (int step = 0; step < steps; step++) { + final double power = getAveragePowerForCpuCore(cluster, step); + int bracket = (int) ((Math.log(power) - minLogPower) / logBracket); + if (bracket >= defaultCpuPowerBracketNumber) { + bracket = defaultCpuPowerBracketNumber - 1; + } + mCpuClusters[cluster].powerBrackets[step] = bracket; + } + } + } + } + } + + private static class CpuClusterKey { + public final String freqKey; + public final String clusterPowerKey; + public final String corePowerKey; + public final int numCpus; + public int[] powerBrackets; private CpuClusterKey(String freqKey, String clusterPowerKey, String corePowerKey, int numCpus) { @@ -525,6 +621,57 @@ public class PowerProfile { return 0; } + /** + * Returns the number of CPU power brackets: groups of states with similar power requirements. + */ + public int getCpuPowerBracketCount() { + return mCpuPowerBracketCount; + } + + /** + * Description of a CPU power bracket: which cluster/frequency combinations are included. + */ + public String getCpuPowerBracketDescription(int powerBracket) { + StringBuilder sb = new StringBuilder(); + for (int cluster = 0; cluster < mCpuClusters.length; cluster++) { + int[] brackets = mCpuClusters[cluster].powerBrackets; + for (int step = 0; step < brackets.length; step++) { + if (brackets[step] == powerBracket) { + if (sb.length() != 0) { + sb.append(", "); + } + if (mCpuClusters.length > 1) { + sb.append(cluster).append('/'); + } + Double[] freqs = sPowerArrayMap.get(mCpuClusters[cluster].freqKey); + if (freqs != null && step < freqs.length) { + // Frequency in MHz + sb.append(freqs[step].intValue() / 1000); + } + sb.append('('); + sb.append(String.format(Locale.US, "%.1f", + getAveragePowerForCpuCore(cluster, step))); + sb.append(')'); + } + } + } + return sb.toString(); + } + + /** + * Returns the CPU power bracket corresponding to the specified cluster and frequency step + */ + public int getPowerBracketForCpuCore(int cluster, int step) { + if (cluster >= 0 + && cluster < mCpuClusters.length + && step >= 0 + && step < mCpuClusters[cluster].powerBrackets.length) { + return mCpuClusters[cluster].powerBrackets[step]; + } + return 0; + } + + private int mNumDisplays; private void initDisplays() { diff --git a/core/java/com/android/internal/os/Zygote.java b/core/java/com/android/internal/os/Zygote.java index b1e7d15cbf4a..ea5f0b2f2144 100644 --- a/core/java/com/android/internal/os/Zygote.java +++ b/core/java/com/android/internal/os/Zygote.java @@ -1001,16 +1001,24 @@ public final class Zygote { } /** + * This will enable jdwp by default for all apps. It is OK to cache this property + * because we expect to reboot the system whenever this property changes + */ + private static final boolean ENABLE_JDWP = SystemProperties.get( + "persist.debuggable.dalvik.vm.jdwp.enabled").equals("1"); + + /** * Applies debugger system properties to the zygote arguments. * - * If "ro.debuggable" is "1", all apps are debuggable. Otherwise, - * the debugger state is specified via the "--enable-jdwp" flag - * in the spawn request. + * For eng builds all apps are debuggable. On userdebug and user builds + * if persist.debuggable.dalvik.vm.jdwp.enabled is 1 all apps are + * debuggable. Otherwise, the debugger state is specified via the + * "--enable-jdwp" flag in the spawn request. * * @param args non-null; zygote spawner args */ static void applyDebuggerSystemProperty(ZygoteArguments args) { - if (RoSystemProperties.DEBUGGABLE) { + if (Build.IS_ENG || ENABLE_JDWP) { args.mRuntimeFlags |= Zygote.DEBUG_ENABLE_JDWP; } } diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp index cbc34629e8c4..550259fa7083 100644 --- a/core/jni/com_android_internal_os_Zygote.cpp +++ b/core/jni/com_android_internal_os_Zygote.cpp @@ -1277,68 +1277,80 @@ static void isolateAppData(JNIEnv* env, const std::vector<std::string>& merged_d } closedir(dir); - // 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); + // No bind mounting of app data should occur in the case of a sandbox process since SDK sandboxes + // should not be able to read app data. Tmpfs was mounted however since a sandbox should not have + // access to app data. + appid_t appId = multiuser_get_app_id(uid); + bool isSdkSandboxProcess = + (appId >= AID_SDK_SANDBOX_PROCESS_START && appId <= AID_SDK_SANDBOX_PROCESS_END); + if (!isSdkSandboxProcess) { + // 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]; - std::string const & volUuid = merged_data_info_list[i + 1]; - std::string const & inode = merged_data_info_list[i + 2]; - - std::string::size_type sz; - long long ceDataInode = std::stoll(inode, &sz); - - std::string actualCePath, actualDePath; - if (volUuid.compare("null") != 0) { - // Volume that is stored in /mnt/expand - char volPath[PATH_MAX]; - char volCePath[PATH_MAX]; - char volDePath[PATH_MAX]; - char volCeUserPath[PATH_MAX]; - char volDeUserPath[PATH_MAX]; - - snprintf(volPath, PATH_MAX, "/mnt/expand/%s", volUuid.c_str()); - snprintf(volCePath, PATH_MAX, "%s/user", volPath); - snprintf(volDePath, PATH_MAX, "%s/user_de", volPath); - snprintf(volCeUserPath, PATH_MAX, "%s/%d", volCePath, userId); - snprintf(volDeUserPath, PATH_MAX, "%s/%d", volDePath, userId); - - PrepareDirIfNotPresent(volPath, DEFAULT_DATA_DIR_PERMISSION, AID_ROOT, AID_ROOT, fail_fn); - PrepareDirIfNotPresent(volCePath, DEFAULT_DATA_DIR_PERMISSION, AID_ROOT, AID_ROOT, fail_fn); - PrepareDirIfNotPresent(volDePath, DEFAULT_DATA_DIR_PERMISSION, AID_ROOT, AID_ROOT, fail_fn); - PrepareDirIfNotPresent(volCeUserPath, DEFAULT_DATA_DIR_PERMISSION, AID_ROOT, AID_ROOT, - fail_fn); - PrepareDirIfNotPresent(volDeUserPath, DEFAULT_DATA_DIR_PERMISSION, AID_ROOT, AID_ROOT, - fail_fn); - - actualCePath = volCeUserPath; - actualDePath = volDeUserPath; - } else { - // Internal volume that stored in /data - char internalCeUserPath[PATH_MAX]; - char internalDeUserPath[PATH_MAX]; - snprintf(internalCeUserPath, PATH_MAX, "/data/user/%d", userId); - snprintf(internalDeUserPath, PATH_MAX, "/data/user_de/%d", userId); - // If it's not user 0, create /data/user/$USER. - if (userId == 0) { - actualCePath = internalLegacyCePath; - } else { - PrepareDirIfNotPresent(internalCeUserPath, DEFAULT_DATA_DIR_PERMISSION, - AID_ROOT, AID_ROOT, fail_fn); - actualCePath = internalCeUserPath; + for (int i = 0; i < size; i += 3) { + std::string const& packageName = merged_data_info_list[i]; + std::string const& volUuid = merged_data_info_list[i + 1]; + std::string const& inode = merged_data_info_list[i + 2]; + + std::string::size_type sz; + long long ceDataInode = std::stoll(inode, &sz); + + std::string actualCePath, actualDePath; + if (volUuid.compare("null") != 0) { + // Volume that is stored in /mnt/expand + char volPath[PATH_MAX]; + char volCePath[PATH_MAX]; + char volDePath[PATH_MAX]; + char volCeUserPath[PATH_MAX]; + char volDeUserPath[PATH_MAX]; + + snprintf(volPath, PATH_MAX, "/mnt/expand/%s", volUuid.c_str()); + snprintf(volCePath, PATH_MAX, "%s/user", volPath); + snprintf(volDePath, PATH_MAX, "%s/user_de", volPath); + snprintf(volCeUserPath, PATH_MAX, "%s/%d", volCePath, userId); + snprintf(volDeUserPath, PATH_MAX, "%s/%d", volDePath, userId); + + PrepareDirIfNotPresent(volPath, DEFAULT_DATA_DIR_PERMISSION, AID_ROOT, AID_ROOT, + fail_fn); + PrepareDirIfNotPresent(volCePath, DEFAULT_DATA_DIR_PERMISSION, AID_ROOT, AID_ROOT, + fail_fn); + PrepareDirIfNotPresent(volDePath, DEFAULT_DATA_DIR_PERMISSION, AID_ROOT, AID_ROOT, + fail_fn); + PrepareDirIfNotPresent(volCeUserPath, DEFAULT_DATA_DIR_PERMISSION, AID_ROOT, AID_ROOT, + fail_fn); + PrepareDirIfNotPresent(volDeUserPath, DEFAULT_DATA_DIR_PERMISSION, AID_ROOT, AID_ROOT, + fail_fn); + + actualCePath = volCeUserPath; + actualDePath = volDeUserPath; + } else { + // Internal volume that stored in /data + char internalCeUserPath[PATH_MAX]; + char internalDeUserPath[PATH_MAX]; + snprintf(internalCeUserPath, PATH_MAX, "/data/user/%d", userId); + snprintf(internalDeUserPath, PATH_MAX, "/data/user_de/%d", userId); + // If it's not user 0, create /data/user/$USER. + if (userId == 0) { + actualCePath = internalLegacyCePath; + } else { + PrepareDirIfNotPresent(internalCeUserPath, DEFAULT_DATA_DIR_PERMISSION, AID_ROOT, + AID_ROOT, fail_fn); + actualCePath = internalCeUserPath; + } + PrepareDirIfNotPresent(internalDeUserPath, DEFAULT_DATA_DIR_PERMISSION, AID_ROOT, + AID_ROOT, fail_fn); + actualDePath = internalDeUserPath; + } + isolateAppDataPerPackage(userId, packageName, volUuid, ceDataInode, actualCePath, + actualDePath, fail_fn); } - PrepareDirIfNotPresent(internalDeUserPath, DEFAULT_DATA_DIR_PERMISSION, - AID_ROOT, AID_ROOT, fail_fn); - actualDePath = internalDeUserPath; - } - isolateAppDataPerPackage(userId, packageName, volUuid, ceDataInode, - actualCePath, actualDePath, fail_fn); } + // We set the label AFTER everything is done, as we are applying // the file operations on tmpfs. If we set the label when we mount // tmpfs, SELinux will not happy as we are changing system_data_files. @@ -1379,6 +1391,167 @@ static void isolateAppData(JNIEnv* env, const std::vector<std::string>& merged_d freecon(dataFileContext); } +/** + * Without sdk sandbox data isolation, the sandbox could detect if another app is installed on the + * system by "touching" other data directories like /data/misc_ce/0/sdksandbox/com.whatsapp, similar + * to apps without app data isolation (see {@link #isolateAppData()}). + * + * To prevent this, tmpfs is mounted onto misc_ce and misc_de directories on all possible volumes in + * a separate mount namespace. The sandbox directory path is then created containing the name of the + * client app package associated with the sdk sandbox. The contents for this (sdk level storage and + * shared sdk storage) are bind mounted from the sandbox data mirror. + */ +static void isolateSdkSandboxData(JNIEnv* env, jobjectArray pkg_data_info_list, uid_t uid, + const char* process_name, jstring managed_nice_name, + fail_fn_t fail_fn) { + const userid_t userId = multiuser_get_user_id(uid); + + int size = (pkg_data_info_list != nullptr) ? env->GetArrayLength(pkg_data_info_list) : 0; + // The sandbox should only have information of one associated client app (package, uuid, inode) + if (size != 3) { + fail_fn(CREATE_ERROR( + "Unable to isolate sandbox data, incorrect associated app information")); + } + + auto extract_fn = [env, process_name, managed_nice_name, + pkg_data_info_list](int info_list_idx) { + jstring jstr = (jstring)(env->GetObjectArrayElement(pkg_data_info_list, info_list_idx)); + return ExtractJString(env, process_name, managed_nice_name, jstr).value(); + }; + std::string packageName = extract_fn(0); + std::string volUuid = extract_fn(1); + + char internalCePath[PATH_MAX]; + char internalDePath[PATH_MAX]; + char externalPrivateMountPath[PATH_MAX]; + snprintf(internalCePath, PATH_MAX, "/data/misc_ce"); + snprintf(internalDePath, PATH_MAX, "/data/misc_de"); + snprintf(externalPrivateMountPath, PATH_MAX, "/mnt/expand"); + + char ceUserPath[PATH_MAX]; + char deUserPath[PATH_MAX]; + if (volUuid != "null") { + snprintf(ceUserPath, PATH_MAX, "%s/%s/misc_ce/%d", externalPrivateMountPath, + volUuid.c_str(), userId); + snprintf(deUserPath, PATH_MAX, "%s/%s/misc_de/%d", externalPrivateMountPath, + volUuid.c_str(), userId); + } else { + snprintf(ceUserPath, PATH_MAX, "%s/%d", internalCePath, userId); + snprintf(deUserPath, PATH_MAX, "%s/%d", internalDePath, userId); + } + + char ceSandboxPath[PATH_MAX]; + char deSandboxPath[PATH_MAX]; + snprintf(ceSandboxPath, PATH_MAX, "%s/sdksandbox", ceUserPath); + snprintf(deSandboxPath, PATH_MAX, "%s/sdksandbox", deUserPath); + + // If the client app using the sandbox has been installed when the device is locked and the + // sandbox starts up when the device is locked, sandbox storage might not have been created. + // In that case, mount tmpfs for data isolation, but don't bind mount. + bool bindMountCeSandboxDataDirs = true; + bool bindMountDeSandboxDataDirs = true; + if (access(ceSandboxPath, F_OK) != 0) { + bindMountCeSandboxDataDirs = false; + } + if (access(deSandboxPath, F_OK) != 0) { + bindMountDeSandboxDataDirs = false; + } + + char* context = nullptr; + char* userContext = nullptr; + char* sandboxContext = nullptr; + if (getfilecon(internalDePath, &context) < 0) { + fail_fn(CREATE_ERROR("Unable to getfilecon on %s %s", internalDePath, strerror(errno))); + } + if (bindMountDeSandboxDataDirs) { + if (getfilecon(deUserPath, &userContext) < 0) { + fail_fn(CREATE_ERROR("Unable to getfilecon on %s %s", deUserPath, strerror(errno))); + } + if (getfilecon(deSandboxPath, &sandboxContext) < 0) { + fail_fn(CREATE_ERROR("Unable to getfilecon on %s %s", deSandboxPath, strerror(errno))); + } + } + + MountAppDataTmpFs(internalCePath, fail_fn); + MountAppDataTmpFs(internalDePath, fail_fn); + + // Mount tmpfs on all external volumes + DIR* dir = opendir(externalPrivateMountPath); + if (dir == nullptr) { + fail_fn(CREATE_ERROR("Failed to opendir %s", externalPrivateMountPath)); + } + struct dirent* ent; + while ((ent = readdir(dir))) { + if (strcmp(ent->d_name, ".") == 0 || strcmp(ent->d_name, "..") == 0) continue; + if (ent->d_type != DT_DIR) { + fail_fn(CREATE_ERROR("Unexpected type: %d %s", ent->d_type, ent->d_name)); + } + auto volPath = StringPrintf("%s/%s", externalPrivateMountPath, ent->d_name); + auto externalCePath = StringPrintf("%s/misc_ce", volPath.c_str()); + auto externalDePath = StringPrintf("%s/misc_de", volPath.c_str()); + + WaitUntilDirReady(externalCePath.c_str(), fail_fn); + MountAppDataTmpFs(externalCePath.c_str(), fail_fn); + WaitUntilDirReady(externalDePath.c_str(), fail_fn); + MountAppDataTmpFs(externalDePath.c_str(), fail_fn); + } + closedir(dir); + + char mirrorCeSandboxPath[PATH_MAX]; + char mirrorDeSandboxPath[PATH_MAX]; + snprintf(mirrorCeSandboxPath, PATH_MAX, "/data_mirror/misc_ce/%s/%d/sdksandbox", + volUuid.c_str(), userId); + snprintf(mirrorDeSandboxPath, PATH_MAX, "/data_mirror/misc_de/%s/%d/sdksandbox", + volUuid.c_str(), userId); + + if (bindMountCeSandboxDataDirs) { + PrepareDir(ceUserPath, DEFAULT_DATA_DIR_PERMISSION, AID_ROOT, AID_ROOT, fail_fn); + PrepareDir(ceSandboxPath, DEFAULT_DATA_DIR_PERMISSION, AID_ROOT, AID_ROOT, fail_fn); + // TODO(b/231322885): Use inode numbers to find the correct app path when the device locked. + createAndMountAppData(packageName, packageName, mirrorCeSandboxPath, ceSandboxPath, fail_fn, + true /*call_fail_fn*/); + + relabelDir(ceSandboxPath, sandboxContext, fail_fn); + relabelDir(ceUserPath, userContext, fail_fn); + } + if (bindMountDeSandboxDataDirs) { + PrepareDir(deUserPath, DEFAULT_DATA_DIR_PERMISSION, AID_ROOT, AID_ROOT, fail_fn); + PrepareDir(deSandboxPath, DEFAULT_DATA_DIR_PERMISSION, AID_ROOT, AID_ROOT, fail_fn); + createAndMountAppData(packageName, packageName, mirrorDeSandboxPath, deSandboxPath, fail_fn, + true /*call_fail_fn*/); + + relabelDir(deSandboxPath, sandboxContext, fail_fn); + relabelDir(deUserPath, userContext, fail_fn); + } + + // We set the label AFTER everything is done, as we are applying + // the file operations on tmpfs. If we set the label when we mount + // tmpfs, SELinux will not happy as we are changing system_data_files. + relabelDir(internalCePath, context, fail_fn); + relabelDir(internalDePath, context, fail_fn); + + // Relabel CE and DE dirs under /mnt/expand + dir = opendir(externalPrivateMountPath); + if (dir == nullptr) { + fail_fn(CREATE_ERROR("Failed to opendir %s", externalPrivateMountPath)); + } + while ((ent = readdir(dir))) { + if (strcmp(ent->d_name, ".") == 0 || strcmp(ent->d_name, "..") == 0) continue; + auto volPath = StringPrintf("%s/%s", externalPrivateMountPath, ent->d_name); + auto externalCePath = StringPrintf("%s/misc_ce", volPath.c_str()); + auto externalDePath = StringPrintf("%s/misc_de", volPath.c_str()); + relabelDir(externalCePath.c_str(), context, fail_fn); + relabelDir(externalDePath.c_str(), context, fail_fn); + } + closedir(dir); + + if (bindMountDeSandboxDataDirs) { + freecon(sandboxContext); + freecon(userContext); + } + freecon(context); +} + static void insertPackagesToMergedList(JNIEnv* env, std::vector<std::string>& merged_data_info_list, jobjectArray data_info_list, const char* process_name, @@ -1444,6 +1617,13 @@ static void isolateJitProfile(JNIEnv* env, jobjectArray pkg_data_info_list, MountAppDataTmpFs(kCurProfileDirPath, fail_fn); MountAppDataTmpFs(kRefProfileDirPath, fail_fn); + // Sandbox processes do not have JIT profile, so no data needs to be bind mounted. However, it + // should still not have access to JIT profile, so tmpfs is mounted. + appid_t appId = multiuser_get_app_id(uid); + if (appId >= AID_SDK_SANDBOX_PROCESS_START && appId <= AID_SDK_SANDBOX_PROCESS_END) { + return; + } + // Create profile directory for this user. std::string actualCurUserProfile = StringPrintf("%s/%d", kCurProfileDirPath, user_id); PrepareDir(actualCurUserProfile, DEFAULT_DATA_DIR_PERMISSION, AID_ROOT, AID_ROOT, fail_fn); @@ -1596,9 +1776,16 @@ static void SpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArray gids, // Make sure app is running in its own mount namespace before isolating its data directories. ensureInAppMountNamespace(fail_fn); - // Sandbox data and jit profile directories by overlaying a tmpfs on those dirs and bind - // mount all related packages separately. + // Isolate app data, jit profile and sandbox data directories by overlaying a tmpfs on those + // dirs and bind mount all related packages separately. if (mount_data_dirs) { + // Sdk sandbox data isolation does not need to occur for app processes since sepolicy + // prevents access to sandbox data anyway. + appid_t appId = multiuser_get_app_id(uid); + if (appId >= AID_SDK_SANDBOX_PROCESS_START && appId <= AID_SDK_SANDBOX_PROCESS_END) { + isolateSdkSandboxData(env, pkg_data_info_list, uid, process_name, managed_nice_name, + fail_fn); + } isolateAppData(env, pkg_data_info_list, allowlisted_data_info_list, uid, process_name, managed_nice_name, fail_fn); isolateJitProfile(env, pkg_data_info_list, uid, process_name, managed_nice_name, fail_fn); diff --git a/core/proto/android/os/incident.proto b/core/proto/android/os/incident.proto index 57026d95ceb8..4bbfee2f93cd 100644 --- a/core/proto/android/os/incident.proto +++ b/core/proto/android/os/incident.proto @@ -61,7 +61,6 @@ import "frameworks/base/core/proto/android/util/textdump.proto"; import "frameworks/base/core/proto/android/privacy.proto"; import "frameworks/base/core/proto/android/section.proto"; import "frameworks/base/proto/src/ipconnectivity.proto"; -import "packages/modules/Connectivity/framework/proto/netstats.proto"; import "packages/modules/Permission/service/proto/role_service.proto"; package android.os; @@ -247,11 +246,7 @@ message IncidentProto { (section).args = "fingerprint --proto --incident" ]; - optional android.service.NetworkStatsServiceDumpProto netstats = 3001 [ - (section).type = SECTION_DUMPSYS, - (section).args = "netstats --proto", - (section).userdebug_and_eng_only = true - ]; + reserved 3001; optional android.providers.settings.SettingsServiceDumpProto settings = 3002 [ (section).type = SECTION_DUMPSYS, diff --git a/core/res/OWNERS b/core/res/OWNERS index c54638a368a2..d8fc2181cfe8 100644 --- a/core/res/OWNERS +++ b/core/res/OWNERS @@ -37,7 +37,7 @@ per-file res/xml/config_user_types.xml = file:/MULTIUSER_OWNERS per-file res/values/dimens_car.xml = file:/platform/packages/services/Car:/OWNERS # Wear -per-file res/*-watch/* = file:/platform/frameworks/opt/wear:/OWNERS +per-file res/*-watch/* = file:/WEAR_OWNERS # PowerProfile per-file res/xml/power_profile.xml = file:/BATTERY_STATS_OWNERS diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index 99e98f2d7e26..9b997bf4c4fd 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -605,8 +605,7 @@ <string name="fingerprint_error_canceled" msgid="540026881380070750">"Vingerafdrukhandeling is gekanselleer."</string> <string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Vingerafdrukhandeling is deur gebruiker gekanselleer."</string> <string name="fingerprint_error_lockout" msgid="7853461265604738671">"Te veel pogings. Probeer later weer."</string> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Te veel pogings. Gebruik eerder skermslot."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Probeer weer."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Geen vingerafdrukke is geregistreer nie."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Hierdie toetstel het nie \'n vingerafdruksensor nie."</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Besoek \'n verskaffer wat herstelwerk doen."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Kan nie jou gesigmodel skep nie. Probeer weer."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Te helder. Probeer sagter beligting."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Probeer helderder beligting"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Beweeg foon verder weg"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Beweeg foon nader"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Beweeg foon hoër op"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"TV"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Foon"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Dokluidsprekers"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Oorfone"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"Stelsel"</string> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index efb66869ea73..698bce43aad8 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -106,8 +106,8 @@ <string name="roamingText0" msgid="7793257871609854208">"በዝውውር ላይ አመላካች በርቷል"</string> <string name="roamingText1" msgid="5073028598334616445">"በዝውውር ላይ አመልካች ጠፍቷል"</string> <string name="roamingText2" msgid="2834048284153110598">"በዝውውር ላይ አመልካች ብልጭ ብልጭ ይላል"</string> - <string name="roamingText3" msgid="831690234035748988">"ከጎረቤት ውጪ"</string> - <string name="roamingText4" msgid="2171252529065590728">"ከህንፃ ውጪ"</string> + <string name="roamingText3" msgid="831690234035748988">"ከጎረቤት ውጭ"</string> + <string name="roamingText4" msgid="2171252529065590728">"ከህንፃ ውጭ"</string> <string name="roamingText5" msgid="4294671587635796641">"የዝውውር- ተመራጭ ስርዓት"</string> <string name="roamingText6" msgid="5536156746637992029">"ዝውውር- ዝግጁ የሆነ ስርዓት"</string> <string name="roamingText7" msgid="1783303085512907706">" የዝውውር- አጋር ስምምነት"</string> @@ -428,7 +428,7 @@ <string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"ይህ መተግበሪያ ሁሉንም በእርስዎ ጡባዊ ላይ የተከማቹ የቀን መቁጠሪያ ክስተቶችን ማንበብ ወይም የእርስዎን የቀን መቁጠሪያ ውሂብ ማስቀመጥ ይችላል።"</string> <string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"ይህ መተግበሪያ ሁሉንም በእርስዎ Android TV መሣሪያ ላይ የተከማቹ የቀን መቁጠሪያ ክስተቶችን ማንበብ ወይም የእርስዎን የቀን መቁጠሪያ ውሂብ ማስቀመጥ ይችላል።"</string> <string name="permdesc_readCalendar" product="default" msgid="9118823807655829957">"ይህ መተግበሪያ ሁሉንም በእርስዎ ስልክ ላይ የተከማቹ የቀን መቁጠሪያ ክስተቶችን ማንበብ ወይም የእርስዎን የቀን መቁጠሪያ ውሂብ ማስቀመጥ ይችላል።"</string> - <string name="permlab_writeCalendar" msgid="6422137308329578076">"የቀን መቁጠሪያ ክስተቶችን ቀይር ወይም አክል እና ለእንግዶች ከባለቤቱ ዕውቅና ውጪ ላክ።"</string> + <string name="permlab_writeCalendar" msgid="6422137308329578076">"የቀን መቁጠሪያ ክስተቶችን ቀይር ወይም አክል እና ለእንግዶች ከባለቤቱ ዕውቅና ውጭ ላክ።"</string> <string name="permdesc_writeCalendar" product="tablet" msgid="8722230940717092850">"ይህ መተግበሪያ በእርስዎ ጡባዊ ላይ የቀን መቁጠሪያ ክስተቶችን ሊያክል፣ ሊያስወግድ ወይም ሊለውጥ ይችላል። ይህ መተግበሪያ ከቀን መቁጠሪያ የመጡ መስለው የሚታዩ መልእክቶችን ሊልክ ወይም ባለቤቶቹን ሳያሳውቅ ክስተቶችን ሊለውጥ ይችላል።"</string> <string name="permdesc_writeCalendar" product="tv" msgid="951246749004952706">"ይህ መተግበሪያ በእርስዎ Android TV መሣሪያ ላይ የቀን መቁጠሪያ ክስተቶችን ሊያክል፣ ሊያስወግድ ወይም ሊለውጥ ይችላል። ይህ መተግበሪያ ከቀን መቁጠሪያ የመጡ መስለው የሚታዩ መልእክቶችን ሊልክ ወይም ባለቤቶቹን ሳያሳውቅ ክስተቶችን ሊለውጥ ይችላል።"</string> <string name="permdesc_writeCalendar" product="default" msgid="5416380074475634233">"ይህ መተግበሪያ በእርስዎ ስልክ ላይ የቀን መቁጠሪያ ክስተቶችን ሊያክል፣ ሊያስወግድ ወይም ሊለውጥ ይችላል። ይህ መተግበሪያ ከቀን መቁጠሪያ የመጡ መስለው የሚታዩ መልእክቶችን ሊልክ ወይም ባለቤቶቹን ሳያሳውቅ ክስተቶችን ሊለውጥ ይችላል።"</string> @@ -605,8 +605,7 @@ <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> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"በጣም ብዙ ሙከራዎች። በምትኩ የማያ ገጽ መቆለፊያን ይጠቀሙ።"</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"እንደገና ይሞክሩ።"</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"ምንም የጣት አሻራዎች አልተመዘገቡም።"</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"ይህ መሣሪያ የጣት አሻራ ዳሳሽ የለውም።"</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"የጥገና አገልግሎት ሰጪን ይጎብኙ።"</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"የመልክዎን ሞዴል መፍጠር አልተቻለም። እንደገና ይሞክሩ።"</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"ከልክ በላይ ፈካ ያለ። ይበልጥ ረጋ ያለ ብርሃን አጠቃቀምን ይሞክሩ።"</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"ከዚህ ፈካ ያለ ብርሃንን ይሞክሩ"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"ስልኩን ያርቁት"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"ስልኩን ያቅርቡት"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"ስልኩን ከፍ ወዳለ ቦታ ይውሰዱት"</string> @@ -1163,7 +1163,7 @@ <string name="dialog_alert_title" msgid="651856561974090712">"ትኩረት"</string> <string name="loading" msgid="3138021523725055037">"በመጫን ላይ…"</string> <string name="capital_on" msgid="2770685323900821829">"በ"</string> - <string name="capital_off" msgid="7443704171014626777">"ውጪ"</string> + <string name="capital_off" msgid="7443704171014626777">"ውጭ"</string> <string name="checked" msgid="9179896827054513119">"ምልክት ተደርጎበታል"</string> <string name="not_checked" msgid="7972320087569023342">"ምልክት አልተደረገበትም"</string> <string name="selected" msgid="6614607926197755875">"ተመርጧል"</string> @@ -1476,7 +1476,7 @@ <string name="permission_request_notification_title" msgid="1810025922441048273">"ፈቃድ ተጠይቋል"</string> <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">\n" ለ<xliff:g id="ACCOUNT">%s</xliff:g> መለያ ፈቃድ ተጠይቋል"</string> <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"ለመለያ <xliff:g id="ACCOUNT">%2$s</xliff:g>\nበ<xliff:g id="APP">%1$s</xliff:g> የተጠየቀ ፈቃድ።"</string> - <string name="forward_intent_to_owner" msgid="4620359037192871015">"ከስራ መገለጫዎ ውጪ ሆነው መተግበሪያ እየተጠቀሙ ነው"</string> + <string name="forward_intent_to_owner" msgid="4620359037192871015">"ከስራ መገለጫዎ ውጭ ሆነው መተግበሪያ እየተጠቀሙ ነው"</string> <string name="forward_intent_to_work" msgid="3620262405636021151">"ይህን መተግበሪያ በእርስዎ የስራ መገለጫ ላይ እየተጠቀሙበት ነው"</string> <string name="input_method_binding_label" msgid="1166731601721983656">"ግቤት ስልት"</string> <string name="sync_binding_label" msgid="469249309424662147">"አስምር"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"ቴሌቪዥን"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"ስልክ"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"የትከል ድምፅ ማጉያዎች"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"ኤችዲኤምአይ"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"ኤችዲኤምአይ"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"የጆሮ ማዳመጫዎች"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"ዩ ኤስ ቢ"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"ስርዓት"</string> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index 503b6973ce27..82fc943f7784 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -609,8 +609,7 @@ <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> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"تم إجراء عدد كبير جدًا من المحاولات. عليك استخدام قفل الشاشة بدلاً من ذلك."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"أعد المحاولة."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"ليست هناك بصمات إصبع مسجَّلة."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"لا يحتوي هذا الجهاز على مستشعِر بصمات إصبع."</string> @@ -639,7 +638,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"يُرجى التواصل مع مقدِّم خدمات إصلاح."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"يتعذّر إنشاء نموذج الوجه. يُرجى إعادة المحاولة."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"ساطع للغاية. تجربة مستوى سطوع أقلّ."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"جرِّب زيادة الإضاءة."</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"يُرجى إبعاد الهاتف عنك."</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"يُرجى تقريب الهاتف منك."</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"يُرجى رفع الهاتف للأعلى."</string> @@ -1615,7 +1615,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"التلفزيون"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"الهاتف"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"مكبرات صوت للإرساء"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"سماعات رأس"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"النظام"</string> diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml index ce464194d1e6..93957e59f81d 100644 --- a/core/res/res/values-as/strings.xml +++ b/core/res/res/values-as/strings.xml @@ -605,8 +605,7 @@ <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> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"অতি বেছিসংখ্যক প্ৰয়াস। ইয়াৰ সলনি স্ক্ৰীন লক ব্যৱহাৰ কৰক।"</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"আকৌ চেষ্টা কৰক।"</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"কোনো ফিংগাৰপ্ৰিণ্ট যোগ কৰা নহ\'ল।"</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"এই ডিভাইচটোত ফিংগাৰপ্ৰিণ্ট ছেন্সৰ নাই।"</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"মেৰামতি সেৱা প্ৰদানকাৰী কোনো প্ৰতিষ্ঠানলৈ যাওক।"</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"মুখাৱয়বৰ মডেল সৃষ্টি কৰিব নোৱাৰি। পুনৰ চেষ্টা কৰক।"</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"অতি উজ্জ্বল। ইয়াতকৈ কম পোহৰৰ উৎস ব্যৱহাৰ কৰক।"</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"উজ্জ্বল পোহৰ থকা ঠাইলৈ গৈ চাওক"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"ফ’নটো আৰু আঁতৰলৈ নিয়ক"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"ফ’নটো ওচৰলৈ আনক"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"ফ’নটো ওপৰলৈ নিয়ক"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"টিভি"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"ফ\'ন"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"ড\'ক স্পীকাৰসমূহ"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"হেডফ\'নবোৰ"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"ইউএছবি"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"ছিষ্টেম"</string> diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml index 0e2fd3fe77ae..c4f3d75c0e19 100644 --- a/core/res/res/values-az/strings.xml +++ b/core/res/res/values-az/strings.xml @@ -605,8 +605,7 @@ <string name="fingerprint_error_canceled" msgid="540026881380070750">"Barmaq izi əməliyyatı ləğv edildi."</string> <string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Barmaq izi əməliyyatı istifadəçi tərəfindən ləğv edildi."</string> <string name="fingerprint_error_lockout" msgid="7853461265604738671">"Cəhdlər çox oldu. Sonraya saxlayın."</string> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Həddindən çox cəhd edilib. Əvəzində ekran kilidindən istifadə edin."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Yenidən cəhd edin."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Barmaq izi qeydə alınmayıb."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Bu cihazda barmaq izi sensoru yoxdur."</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Təmir provayderini ziyarət edin."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Üz modelinizi yaratmaq olmur. Yenə cəhd edin."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Çox işıqlıdır. Daha az işıqlı şəkli sınayın."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Parlaq işıqdan istifadə edin"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Telefonu uzaq tutun"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Telefonu yaxına tutun"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Telefonu yuxarı tutun"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"TV"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Telefon"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Dok spikerlər"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Qulaqlıq"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"Sistem"</string> diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml index 05d100b38798..bf9c57b5aa40 100644 --- a/core/res/res/values-b+sr+Latn/strings.xml +++ b/core/res/res/values-b+sr+Latn/strings.xml @@ -606,8 +606,7 @@ <string name="fingerprint_error_canceled" msgid="540026881380070750">"Radnja sa otiskom prsta je otkazana."</string> <string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Korisnik je otkazao radnju sa otiskom prsta."</string> <string name="fingerprint_error_lockout" msgid="7853461265604738671">"Previše pokušaja. Probajte ponovo kasnije."</string> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Previše pokušaja. Koristite zaključavanje ekrana umesto toga."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Probajte ponovo."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Nije registrovan nijedan otisak prsta."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Ovaj uređaj nema senzor za otisak prsta."</string> @@ -636,7 +635,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Posetite dobavljača za popravke."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Pravljenje modela lica nije uspelo. Probajte ponovo."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Previše je svetlo. Probajte sa slabijim osvetljenjem."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Probajte sa jačim osvetljenjem"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Udaljite telefon"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Približite telefon"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Pomerite telefon nagore"</string> @@ -1612,7 +1612,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"TV"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Telefon"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Zvučnici bazne stanice"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Slušalice"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"Sistem"</string> diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml index 511dfdcd19fb..1af3c7dd6c85 100644 --- a/core/res/res/values-be/strings.xml +++ b/core/res/res/values-be/strings.xml @@ -607,8 +607,7 @@ <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> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Занадта шмат спроб. Скарыстайце блакіроўку экрана."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Паўтарыце спробу."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Адбіткі пальцаў не зарэгістраваны."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"На гэтай прыладзе няма сканера адбіткаў пальцаў."</string> @@ -637,7 +636,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Звярніцеся ў сэрвісны цэнтр."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Не ўдалося стварыць мадэль твару. Паўтарыце."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Занадта светла. Прыглушыце асвятленне."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Павялічце асвятленне"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Перамясціце тэлефон далей"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Перамясціце тэлефон бліжэй"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Перамясціце тэлефон вышэй"</string> @@ -1613,7 +1613,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"ТБ"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Тэлефон"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Дынамікі станцыi"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Навушнікі"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"Сістэма"</string> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index 8f5aa43c69f9..4ae1f21f8a9c 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -605,8 +605,7 @@ <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> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Твърде много опити. Вместо това използвайте опция за заключване на екрана."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Опитайте отново."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Няма регистрирани отпечатъци."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Това устройство няма сензор за отпечатъци."</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Посетете оторизиран сервиз."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Моделът на лицето ви не бе създаден. Опитайте пак."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Твърде светло е. Опитайте при по-слабо осветление."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Опитайте при по-силно осветление"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Отдалечете телефона"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Доближете телефона"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Преместете телефона по-високо"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"Телевизор"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Телефон"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Докинг станц.: Високогов."</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Слушалки"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"Система"</string> diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml index 7beea9a02dae..2aac0c9a3391 100644 --- a/core/res/res/values-bn/strings.xml +++ b/core/res/res/values-bn/strings.xml @@ -605,8 +605,7 @@ <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> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"অনেকবার চেষ্টা করেছেন। পরিবর্তে স্ক্রিন লক ব্যবহার করুন।"</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"আবার চেষ্টা করুন৷"</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"কোনও আঙ্গুলের ছাপ নথিভুক্ত করা হয়নি।"</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"এই ডিভাইসে আঙ্গুলের ছাপ নেওয়ার সেন্সর নেই।"</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"একজন মেরামতি মিস্ত্রির কাছে যান।"</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"ফেস মডেল তৈরি করা যাচ্ছে না। আবার চেষ্টা করুন।"</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"খুব উজ্জ্বল। আলো কমিয়ে চেষ্টা করে দেখুন।"</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"আরও উজ্জ্বল আলো ব্যবহার করে দেখুন"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"ফোন আরও দূরে নিয়ে যান"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"ফোন আরও কাছে নিয়ে আসুন"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"ফোন আরও উঁচুতে তুলুন"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"টিভি"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"ফোন"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"ডক স্পিকার"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"হেডফোন"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"সিস্টেম"</string> diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml index f182ab4eca14..3c87b0d25e57 100644 --- a/core/res/res/values-bs/strings.xml +++ b/core/res/res/values-bs/strings.xml @@ -606,8 +606,7 @@ <string name="fingerprint_error_canceled" msgid="540026881380070750">"Radnja s otiskom prsta je otkazana."</string> <string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Korisnik je otkazao radnju s otiskom prsta."</string> <string name="fingerprint_error_lockout" msgid="7853461265604738671">"Previše pokušaja. Pokušajte ponovo kasnije."</string> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Previše pokušaja. Umjesto toga koristite zaključavanje ekrana."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Pokušajte ponovo."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Nije prijavljen nijedan otisak prsta."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Ovaj uređaj nema senzor za otisak prsta."</string> @@ -636,7 +635,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Posjetite pružaoca usluga za popravke."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Nije moguće kreirati model lica. Pokušajte ponovo."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Previše svijetlo. Probajte s blažim osvjetljenjem."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Pokušajte s jačim osvjetljenjem"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Odmaknite telefon"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Primaknite telefon"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Pomjerite telefon naviše"</string> @@ -1612,7 +1612,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"TV"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Telefon"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Zvučnici priključne stanice"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Slušalice"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"Sistem"</string> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index e88bb559f7ba..317c00444639 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -605,8 +605,7 @@ <string name="fingerprint_error_canceled" msgid="540026881380070750">"S\'ha cancel·lat l\'operació d\'empremta digital."</string> <string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"L\'usuari ha cancel·lat l\'operació d\'empremta digital."</string> <string name="fingerprint_error_lockout" msgid="7853461265604738671">"S\'han produït massa intents. Torna-ho a provar més tard."</string> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Massa intents. Utilitza el bloqueig de pantalla."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Torna-ho a provar."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"No s\'ha registrat cap empremta digital."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Aquest dispositiu no té sensor d\'empremtes digitals."</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Visita un proveïdor de reparacions."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"No es pot crear el model facial. Torna-ho a provar."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Massa brillant Prova una il·luminació més suau."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Prova amb més il·luminació"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Allunya\'t del telèfon"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Apropa el telèfon"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Mou el telèfon més amunt"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"Televisor"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Telèfon"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Altaveus de la base"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Auriculars"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"Sistema"</string> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index d1c4d76b1b9c..cbd2df6d6e5b 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -607,8 +607,7 @@ <string name="fingerprint_error_canceled" msgid="540026881380070750">"Operace otisku prstu byla zrušena."</string> <string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Uživatel operaci s otiskem prstu zrušil."</string> <string name="fingerprint_error_lockout" msgid="7853461265604738671">"Příliš mnoho pokusů. Zkuste to později."</string> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Příliš mnoho pokusů. Použijte zámek obrazovky."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Zkuste to znovu."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Nejsou zaregistrovány žádné otisky prstů."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Toto zařízení nemá snímač otisků prstů."</string> @@ -637,7 +636,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Navštivte servis"</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Model se nepodařilo vytvořit. Zkuste to znovu."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Je příliš světlo. Zmírněte osvětlení."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Přejděte na světlo"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Umístěte telefon dál"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Umístěte telefon blíž"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Umístěte telefon výš"</string> @@ -1613,7 +1613,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"Televize"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Telefon"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Reproduktory doku"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Sluchátka"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"Systém"</string> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index 5191aead207c..083c42c76733 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -605,8 +605,7 @@ <string name="fingerprint_error_canceled" msgid="540026881380070750">"Fingeraftrykshandlingen blev annulleret."</string> <string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Fingeraftrykshandlingen blev annulleret af brugeren."</string> <string name="fingerprint_error_lockout" msgid="7853461265604738671">"Du har prøvet for mange gange. Prøv igen senere."</string> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Du har brugt for mange forsøg. Brug skærmlåsen i stedet."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Prøv igen."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Der er ikke registreret nogen fingeraftryk."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Denne enhed har ingen fingeraftrykslæser."</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Få den repareret."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Din ansigtsmodel kan ikke oprettes. Prøv igen."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Der er for lyst. Prøv en mere dæmpet belysning."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Prøv med mere belysning"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Flyt telefonen længere væk"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Flyt telefonen tættere på"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Løft telefonen højere op"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"Tv"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Telefon"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Dockstationens højttalere"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Hovedtelefoner"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"System"</string> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index b5af566e9380..fc8eadaf0362 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -605,8 +605,7 @@ <string name="fingerprint_error_canceled" msgid="540026881380070750">"Fingerabdruckvorgang abgebrochen"</string> <string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Vorgang der Fingerabdruckauthentifizierung vom Nutzer abgebrochen."</string> <string name="fingerprint_error_lockout" msgid="7853461265604738671">"Zu viele Versuche, bitte später noch einmal versuchen"</string> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Zu viele Versuche. Verwende stattdessen die Displaysperre."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Bitte versuche es noch einmal."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Keine Fingerabdrücke erfasst."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Dieses Gerät hat keinen Fingerabdrucksensor."</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Suche einen Reparaturdienstleister auf."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Kein Gesichtsmodell möglich. Versuche es erneut."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Zu hell. Schwächere Beleuchtung ausprobieren."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Probiere es mit einer helleren Beleuchtung"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Bewege das Smartphone weiter weg"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Bewege das Smartphone näher heran"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Bewege das Smartphone nach oben"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"TV"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Telefon"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Dock-Lautsprecher"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Kopfhörer"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"System"</string> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 72290963aaa6..c76b2b0352d8 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -605,8 +605,7 @@ <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> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Υπερβολικά πολλές προσπάθειες. Χρησιμοποιήστε εναλλακτικά το κλείδωμα οθόνης."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Δοκιμάστε ξανά."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Δεν έχουν καταχωριστεί δακτυλικά αποτυπώματα."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Αυτή η συσκευή δεν διαθέτει αισθητήρα δακτυλικού αποτυπώματος."</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Επισκεφτείτε έναν πάροχο υπηρεσιών επισκευής."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Αδύν. η δημιουρ. του μοντ. προσώπ. Δοκιμάστε ξανά."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Υπερβολικά έντονος φωτισμός. Δοκιμάστε πιο ήπιο."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Δοκιμάστε με περισσότερο φως"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Απομακρύνετε περισσότερο το τηλέφωνο"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Φέρτε πιο κοντά το τηλέφωνό σας"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Μετακινήστε το τηλέφωνο πιο ψηλά"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"Τηλεόραση"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Τηλέφωνο"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Ηχεία βάσης σύνδεσης"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Ακουστικά"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"Σύστημα"</string> diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml index f0980bd6f0b6..8591467ddf33 100644 --- a/core/res/res/values-en-rAU/strings.xml +++ b/core/res/res/values-en-rAU/strings.xml @@ -634,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Visit a repair provider."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Can’t create your face model. Try again."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Too bright. Try gentler lighting."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Try brighter lighting"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Move phone further away"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Move phone closer"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Move phone higher"</string> @@ -1610,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"TV"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Phone"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Dock speakers"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Headphones"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"System"</string> diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml index 5907d8813cde..08097a540930 100644 --- a/core/res/res/values-en-rCA/strings.xml +++ b/core/res/res/values-en-rCA/strings.xml @@ -634,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Visit a repair provider."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Can’t create your face model. Try again."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Too bright. Try gentler lighting."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Try brighter lighting"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Move phone further away"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Move phone closer"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Move phone higher"</string> @@ -1610,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"TV"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Phone"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Dock speakers"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Headphones"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"System"</string> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index ebe3a4ebbd97..bf82587a5000 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -634,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Visit a repair provider."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Can’t create your face model. Try again."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Too bright. Try gentler lighting."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Try brighter lighting"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Move phone further away"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Move phone closer"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Move phone higher"</string> @@ -1610,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"TV"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Phone"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Dock speakers"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Headphones"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"System"</string> diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml index 5d9c8a2f9d19..110e68f3683e 100644 --- a/core/res/res/values-en-rIN/strings.xml +++ b/core/res/res/values-en-rIN/strings.xml @@ -634,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Visit a repair provider."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Can’t create your face model. Try again."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Too bright. Try gentler lighting."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Try brighter lighting"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Move phone further away"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Move phone closer"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Move phone higher"</string> @@ -1610,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"TV"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Phone"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Dock speakers"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Headphones"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"System"</string> diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml index 3920362b1835..ddb93a81b80d 100644 --- a/core/res/res/values-en-rXC/strings.xml +++ b/core/res/res/values-en-rXC/strings.xml @@ -634,7 +634,7 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Visit a repair provider."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Can’t create your face model. Try again."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Too bright. Try gentler lighting."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Try brighter lighting"</string> + <string name="face_acquired_too_dark" msgid="8539853432479385326">"Not enough light"</string> <string name="face_acquired_too_close" msgid="4453646176196302462">"Move phone farther away"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Move phone closer"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Move phone higher"</string> @@ -1610,7 +1610,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"TV"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Phone"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Dock speakers"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Headphones"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"System"</string> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 575476d44608..933ccfbec174 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -46,6 +46,7 @@ <string name="needPuk2" msgid="7032612093451537186">"Escribir PUK2 para desbloquear la tarjeta SIM."</string> <string name="enablePin" msgid="2543771964137091212">"Error; habilita el bloqueo de SIM/RUIM."</string> <plurals name="pinpuk_attempts" formatted="false" msgid="1619867269012213584"> + <item quantity="many">You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts before SIM is locked.</item> <item quantity="other">Tienes <xliff:g id="NUMBER_1">%d</xliff:g> intentos más antes de que se bloquee la tarjeta SIM.</item> <item quantity="one">Tienes <xliff:g id="NUMBER_0">%d</xliff:g> un intento más antes de que se bloquee la tarjeta SIM.</item> </plurals> @@ -175,7 +176,7 @@ <string name="low_memory" product="watch" msgid="3479447988234030194">"El almacenamiento del reloj está completo. Elimina algunos archivos para liberar espacio."</string> <string name="low_memory" product="tv" msgid="6663680413790323318">"El almacenamiento del dispositivo Android TV está lleno. Borra algunos archivos para liberar espacio."</string> <string name="low_memory" product="default" msgid="2539532364144025569">"Se ha agotado el espacio de almacenamiento del dispositivo. Elimina algunos archivos para liberar espacio."</string> - <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Se instaló la autoridad certificadora}other{Se instalaron las autoridades certificadoras}}"</string> + <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Se instaló la autoridad certificadora}many{Se instalaron las autoridades certificadoras}other{Se instalaron las autoridades certificadoras}}"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Por un tercero desconocido"</string> <string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Por parte de tu administrador del perfil de trabajo"</string> <string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"Por <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string> @@ -249,7 +250,7 @@ <string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Usa esta opción en la mayoría de los casos. Te permite realizar un seguimiento del progreso del informe, ingresar más detalles acerca del problema y tomar capturas de pantalla. Es posible que se omitan secciones menos usadas cuyos informes demoran más en completarse."</string> <string name="bugreport_option_full_title" msgid="7681035745950045690">"Informe completo"</string> <string name="bugreport_option_full_summary" msgid="1975130009258435885">"Usa esta opción para reducir al mínimo la interferencia del sistema cuando tu dispositivo no responde o funciona muy lento, o cuando necesitas todas las secciones del informe. No permite ingresar más detalles ni tomar capturas de pantalla adicionales."</string> - <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Se tomará una captura de pantalla para el informe de errores en # segundo.}other{Se tomará una captura de pantalla para el informe de errores en # segundos.}}"</string> + <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Se tomará una captura de pantalla para el informe de errores en # segundo.}many{Se tomará una captura de pantalla para el informe de errores en # segundos.}other{Se tomará una captura de pantalla para el informe de errores en # segundos.}}"</string> <string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Se tomó la captura de pantalla con el informe de errores"</string> <string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"No se pudo tomar la captura de pantalla con el informe de errores"</string> <string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Modo silencioso"</string> @@ -605,8 +606,7 @@ <string name="fingerprint_error_canceled" msgid="540026881380070750">"Se canceló la operación de huella dactilar."</string> <string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"El usuario canceló la operación de huella dactilar."</string> <string name="fingerprint_error_lockout" msgid="7853461265604738671">"Demasiados intentos. Vuelve a intentarlo más tarde."</string> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Demasiados intentos. Utiliza el bloqueo de pantalla en su lugar."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Vuelve a intentarlo."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"No se registraron huellas digitales."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Este dispositivo no tiene sensor de huellas dactilares."</string> @@ -635,7 +635,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Consulta a un proveedor de reparaciones."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"No se puede crear modelo de rostro. Reinténtalo."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Demasiado brillante. Prueba con menos iluminación."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Prueba con más iluminación"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Aleja el teléfono un poco más"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Acerca el teléfono"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Mueve el teléfono hacia arriba"</string> @@ -1085,7 +1086,7 @@ <string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> desea activar la exploración táctil. Cuando esta función esté activada, podrás escuchar o ver descripciones del contenido seleccionado o usar gestos para interactuar con el dispositivo."</string> <string name="oneMonthDurationPast" msgid="4538030857114635777">"Hace 1 mes."</string> <string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Anterior a 1 mes atrás"</string> - <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Último # día}other{Últimos # días}}"</string> + <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Último # día}many{Últimos # días}other{Últimos # días}}"</string> <string name="last_month" msgid="1528906781083518683">"Último mes"</string> <string name="older" msgid="1645159827884647400">"Antiguos"</string> <string name="preposition_for_date" msgid="2780767868832729599">"activado <xliff:g id="DATE">%s</xliff:g>"</string> @@ -1112,14 +1113,14 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"en <xliff:g id="COUNT">%d</xliff:g> h"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"en <xliff:g id="COUNT">%d</xliff:g> d"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"en <xliff:g id="COUNT">%d</xliff:g> años"</string> - <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Hace # minuto}other{Hace # minutos}}"</string> - <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Hace # hora}other{Hace # horas}}"</string> - <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Hace # día}other{Hace # días}}"</string> - <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{Hace # año}other{Hace # años}}"</string> - <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# minuto}other{# minutos}}"</string> - <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# hora}other{# horas}}"</string> - <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# día}other{# días}}"</string> - <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# año}other{# años}}"</string> + <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Hace # minuto}many{Hace # minutos}other{Hace # minutos}}"</string> + <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Hace # hora}many{Hace # horas}other{Hace # horas}}"</string> + <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Hace # día}many{Hace # días}other{Hace # días}}"</string> + <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{Hace # año}many{Hace # años}other{Hace # años}}"</string> + <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# minuto}many{# minutos}other{# minutos}}"</string> + <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# hora}many{# horas}other{# horas}}"</string> + <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# día}many{# días}other{# días}}"</string> + <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# año}many{# años}other{# años}}"</string> <string name="VideoView_error_title" msgid="5750686717225068016">"Problemas de video"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"No es posible transmitir este video al dispositivo."</string> <string name="VideoView_error_text_unknown" msgid="7658683339707607138">"No se puede reproducir el video."</string> @@ -1168,7 +1169,7 @@ <string name="not_checked" msgid="7972320087569023342">"desactivado"</string> <string name="selected" msgid="6614607926197755875">"seleccionado"</string> <string name="not_selected" msgid="410652016565864475">"no seleccionado"</string> - <string name="rating_label" msgid="1837085249662154601">"{rating,plural, =1{Una estrella de {max}}other{# estrellas de {max}}}"</string> + <string name="rating_label" msgid="1837085249662154601">"{rating,plural, =1{Una estrella de {max}}many{# estrellas de {max}}other{# estrellas de {max}}}"</string> <string name="in_progress" msgid="2149208189184319441">"en curso"</string> <string name="whichApplication" msgid="5432266899591255759">"Completar la acción mediante"</string> <string name="whichApplicationNamed" msgid="6969946041713975681">"Completar acción con %1$s"</string> @@ -1507,7 +1508,7 @@ <string name="skip_button_label" msgid="3566599811326688389">"Omitir"</string> <string name="no_matches" msgid="6472699895759164599">"Sin coincidencias"</string> <string name="find_on_page" msgid="5400537367077438198">"Buscar en la página"</string> - <string name="matches_found" msgid="2296462299979507689">"{count,plural, =1{# coincidencia}other{# de {total}}}"</string> + <string name="matches_found" msgid="2296462299979507689">"{count,plural, =1{# coincidencia}many{# de {total}}other{# de {total}}}"</string> <string name="action_mode_done" msgid="2536182504764803222">"Listo"</string> <string name="progress_erasing" msgid="6891435992721028004">"Borrando almacenamiento compartido…"</string> <string name="share" msgid="4157615043345227321">"Compartir"</string> @@ -1611,7 +1612,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"TV"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Dispositivo"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Altavoces del conector"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Auriculares"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"Sistema"</string> @@ -1860,14 +1861,14 @@ <string name="data_saver_description" msgid="4995164271550590517">"Para reducir el uso de datos, el modo Ahorro de datos evita que algunas apps envíen y reciban datos en segundo plano. La app que estés usando podrá acceder a los datos, pero con menor frecuencia. De esta forma, por ejemplo, las imágenes no se mostrarán hasta que las presiones."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"¿Deseas activar Ahorro de datos?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Activar"</string> - <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Por un minuto (hasta {formattedTime})}other{Por # minutos (hasta {formattedTime})}}"</string> - <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{Durante 1 min (hasta {formattedTime})}other{Durante # min (hasta {formattedTime})}}"</string> - <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{Durante 1 hora (hasta {formattedTime})}other{Durante # horas (hasta {formattedTime})}}"</string> - <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{Durante 1 h (hasta {formattedTime})}other{Durante # h (hasta {formattedTime})}}"</string> - <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Durante un minuto}other{Durante # minutos}}"</string> - <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{Durante 1 min}other{Durante # min}}"</string> - <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{Durante 1 hora}other{Durante # horas}}"</string> - <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{Durante 1 h}other{Durante # h}}"</string> + <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Por un minuto (hasta {formattedTime})}many{Por # minutos (hasta {formattedTime})}other{Por # minutos (hasta {formattedTime})}}"</string> + <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{Durante 1 min (hasta {formattedTime})}many{Durante # min (hasta {formattedTime})}other{Durante # min (hasta {formattedTime})}}"</string> + <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{Durante 1 hora (hasta {formattedTime})}many{Durante # horas (hasta {formattedTime})}other{Durante # horas (hasta {formattedTime})}}"</string> + <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{Durante 1 h (hasta {formattedTime})}many{Durante # h (hasta {formattedTime})}other{Durante # h (hasta {formattedTime})}}"</string> + <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Durante un minuto}many{Durante # minutos}other{Durante # minutos}}"</string> + <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{Durante 1 min}many{Durante # min}other{Durante # min}}"</string> + <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{Durante 1 hora}many{Durante # horas}other{Durante # horas}}"</string> + <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{Durante 1 h}many{Durante # h}other{Durante # h}}"</string> <string name="zen_mode_until_next_day" msgid="1403042784161725038">"Hasta las <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string> <string name="zen_mode_until" msgid="2250286190237669079">"Hasta la(s) <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string> <string name="zen_mode_alarm" msgid="7046911727540499275">"Hasta la hora <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (próxima alarma)"</string> @@ -2000,7 +2001,7 @@ <string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Guardar para Autocompletar"</string> <string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"El contenido no puede autocompletarse"</string> <string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"No hay sugerencias de Autocompletar"</string> - <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Una sugerencia de autocompletar}other{# sugerencias de autocompletar}}"</string> + <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Una sugerencia de autocompletar}many{# sugerencias de autocompletar}other{# sugerencias de autocompletar}}"</string> <string name="autofill_save_title" msgid="7719802414283739775">"¿Quieres guardar en "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string> <string name="autofill_save_title_with_type" msgid="3002460014579799605">"¿Quieres guardar la <xliff:g id="TYPE">%1$s</xliff:g> en "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string> <string name="autofill_save_title_with_2types" msgid="3783270967447869241">"¿Quieres guardar <xliff:g id="TYPE_0">%1$s</xliff:g> y <xliff:g id="TYPE_1">%2$s</xliff:g> en "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string> @@ -2110,7 +2111,7 @@ <string name="mime_type_presentation_ext" msgid="8761049335564371468">"Presentación <xliff:g id="EXTENSION">%1$s</xliff:g>"</string> <string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"La conexión Bluetooth permanecerá activa durante el modo de avión"</string> <string name="car_loading_profile" msgid="8219978381196748070">"Cargando"</string> - <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} y # archivo más}other{{file_name} y # archivos más}}"</string> + <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} y # archivo más}many{{file_name} y # archivos más}other{{file_name} y # archivos más}}"</string> <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"No hay personas recomendadas con quienes compartir"</string> <string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Lista de apps"</string> <string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Aunque no se le otorgó permiso de grabación a esta app, puede capturar audio con este dispositivo USB."</string> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index f1b4bdc9f192..9795e238cf31 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -46,6 +46,7 @@ <string name="needPuk2" msgid="7032612093451537186">"Introduce el código PUK2 para desbloquear la tarjeta SIM."</string> <string name="enablePin" msgid="2543771964137091212">"Error, habilitar bloqueo de SIM/RUIM."</string> <plurals name="pinpuk_attempts" formatted="false" msgid="1619867269012213584"> + <item quantity="many">You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts before SIM is locked.</item> <item quantity="other">Te quedan <xliff:g id="NUMBER_1">%d</xliff:g> intentos para bloquear la tarjeta SIM.</item> <item quantity="one">Te queda <xliff:g id="NUMBER_0">%d</xliff:g> intento para bloquear la tarjeta SIM.</item> </plurals> @@ -175,7 +176,7 @@ <string name="low_memory" product="watch" msgid="3479447988234030194">"El almacenamiento del reloj está lleno. Elimina algunos archivos para liberar espacio."</string> <string name="low_memory" product="tv" msgid="6663680413790323318">"El espacio de almacenamiento de tu dispositivo Android TV está lleno. Elimina algunos archivos para liberar espacio."</string> <string name="low_memory" product="default" msgid="2539532364144025569">"Se ha agotado el espacio de almacenamiento del teléfono. Elimina algunos archivos para liberar espacio."</string> - <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Autoridad de certificación instalada}other{Autoridades de certificación instaladas}}"</string> + <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Autoridad de certificación instalada}many{Autoridades de certificación instaladas}other{Autoridades de certificación instaladas}}"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Por un tercero desconocido"</string> <string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Por el administrador de tu perfil de trabajo"</string> <string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"Por <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string> @@ -249,7 +250,7 @@ <string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Usa esta opción en la mayoría de los casos. Te permite realizar un seguimiento del progreso del informe, introducir más información sobre el problema y hacer capturas de pantalla. Es posible que se omitan algunas secciones menos utilizadas y que requieran más tiempo."</string> <string name="bugreport_option_full_title" msgid="7681035745950045690">"Informe completo"</string> <string name="bugreport_option_full_summary" msgid="1975130009258435885">"Utiliza esta opción para que la interferencia del sistema sea mínima cuando el dispositivo no responda o funcione demasiado lento, o bien cuando necesites todas las secciones del informe. No permite introducir más detalles ni hacer más capturas de pantalla."</string> - <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{La captura de pantalla para el informe de errores se hará en # segundo.}other{La captura de pantalla para el informe de errores se hará en # segundos.}}"</string> + <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{La captura de pantalla para el informe de errores se hará en # segundo.}many{La captura de pantalla para el informe de errores se hará en # segundos.}other{La captura de pantalla para el informe de errores se hará en # segundos.}}"</string> <string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Se ha hecho la captura de pantalla con el informe de errores"</string> <string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"No se ha podido hacer la captura de pantalla con el informe de errores"</string> <string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Modo Silencio"</string> @@ -605,8 +606,7 @@ <string name="fingerprint_error_canceled" msgid="540026881380070750">"Se ha cancelado la operación de huella digital."</string> <string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"El usuario ha cancelado la operación de huella digital."</string> <string name="fingerprint_error_lockout" msgid="7853461265604738671">"Demasiados intentos. Vuelve a intentarlo más tarde."</string> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Demasiados intentos. Usa el bloqueo de pantalla."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Vuelve a intentarlo."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"No se ha registrado ninguna huella digital."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Este dispositivo no tiene sensor de huellas digitales."</string> @@ -635,7 +635,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Visita un proveedor de reparaciones."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"No se puede crear tu modelo. Inténtalo de nuevo."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Hay demasiada luz. Busca un sitio menos iluminado."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Prueba en un lugar con más luz"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Aleja el teléfono"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Acerca el teléfono"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Sube el teléfono"</string> @@ -1085,7 +1086,7 @@ <string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> quiere habilitar la exploración táctil. Cuando esta función esté activada, podrás escuchar o ver descripciones del contenido seleccionado o usar gestos para interactuar con el teléfono."</string> <string name="oneMonthDurationPast" msgid="4538030857114635777">"Hace un mes"</string> <string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Hace más de un mes"</string> - <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Último día (#)}other{Últimos # días}}"</string> + <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Último día (#)}many{Últimos # días}other{Últimos # días}}"</string> <string name="last_month" msgid="1528906781083518683">"El mes pasado"</string> <string name="older" msgid="1645159827884647400">"Anterior"</string> <string name="preposition_for_date" msgid="2780767868832729599">"<xliff:g id="DATE">%s</xliff:g>"</string> @@ -1112,14 +1113,14 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"en <xliff:g id="COUNT">%d</xliff:g>h"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"en <xliff:g id="COUNT">%d</xliff:g> d"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"en <xliff:g id="COUNT">%d</xliff:g>a"</string> - <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Hace # minuto}other{Hace # minutos}}"</string> - <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Hace # hora}other{Hace # horas}}"</string> - <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Hace # día}other{Hace # días}}"</string> - <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{Hace # año}other{Hace # años}}"</string> - <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# minuto}other{# minutos}}"</string> - <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# hora}other{# horas}}"</string> - <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# día}other{# días}}"</string> - <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# año}other{# años}}"</string> + <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Hace # minuto}many{Hace # minutos}other{Hace # minutos}}"</string> + <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Hace # hora}many{Hace # horas}other{Hace # horas}}"</string> + <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Hace # día}many{Hace # días}other{Hace # días}}"</string> + <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{Hace # año}many{Hace # años}other{Hace # años}}"</string> + <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# minuto}many{# minutos}other{# minutos}}"</string> + <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# hora}many{# horas}other{# horas}}"</string> + <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# día}many{# días}other{# días}}"</string> + <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# año}many{# años}other{# años}}"</string> <string name="VideoView_error_title" msgid="5750686717225068016">"Incidencias con el vídeo"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Este vídeo no se puede transmitir al dispositivo."</string> <string name="VideoView_error_text_unknown" msgid="7658683339707607138">"No se puede reproducir el vídeo."</string> @@ -1168,7 +1169,7 @@ <string name="not_checked" msgid="7972320087569023342">"no seleccionado"</string> <string name="selected" msgid="6614607926197755875">"seleccionado"</string> <string name="not_selected" msgid="410652016565864475">"no seleccionado"</string> - <string name="rating_label" msgid="1837085249662154601">"{rating,plural, =1{Una estrella de {max}}other{# estrellas de {max}}}"</string> + <string name="rating_label" msgid="1837085249662154601">"{rating,plural, =1{Una estrella de {max}}many{# estrellas de {max}}other{# estrellas de {max}}}"</string> <string name="in_progress" msgid="2149208189184319441">"en curso"</string> <string name="whichApplication" msgid="5432266899591255759">"Completar acción utilizando"</string> <string name="whichApplicationNamed" msgid="6969946041713975681">"Completar acción con %1$s"</string> @@ -1507,7 +1508,7 @@ <string name="skip_button_label" msgid="3566599811326688389">"Saltar"</string> <string name="no_matches" msgid="6472699895759164599">"No hay coincidencias."</string> <string name="find_on_page" msgid="5400537367077438198">"Buscar en la página"</string> - <string name="matches_found" msgid="2296462299979507689">"{count,plural, =1{# coincidencia}other{# de {total}}}"</string> + <string name="matches_found" msgid="2296462299979507689">"{count,plural, =1{# coincidencia}many{# de {total}}other{# de {total}}}"</string> <string name="action_mode_done" msgid="2536182504764803222">"Hecho"</string> <string name="progress_erasing" msgid="6891435992721028004">"Borrando almacenamiento compartido…"</string> <string name="share" msgid="4157615043345227321">"Compartir"</string> @@ -1611,7 +1612,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"TV"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Teléfono"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Altavoces de la base"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Auriculares"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"Sistema"</string> @@ -1860,14 +1861,14 @@ <string name="data_saver_description" msgid="4995164271550590517">"Para reducir el uso de datos, Ahorro de datos evita que algunas aplicaciones envíen o reciban datos en segundo plano. Si estás usando una aplicación, podrá acceder a datos, pero con menos frecuencia. Esto significa que es posible que, por ejemplo, algunas imágenes no se muestren hasta que las toques."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"¿Activar Ahorro de datos?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Activar"</string> - <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Durante un minuto (hasta las {formattedTime})}other{Durante # minutos (hasta las {formattedTime})}}"</string> - <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{Durante 1 min (hasta las {formattedTime})}other{Durante # min (hasta las {formattedTime})}}"</string> - <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{Durante 1 hora (hasta las {formattedTime})}other{Durante # horas (hasta las {formattedTime})}}"</string> - <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{Durante 1 h (hasta las {formattedTime})}other{Durante # h (hasta las {formattedTime})}}"</string> - <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Durante 1 minuto}other{Durante # minutos}}"</string> - <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{Durante 1 min}other{Durante # min}}"</string> - <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{Durante 1 hora}other{Durante # horas}}"</string> - <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{Durante 1 h}other{Durante # h}}"</string> + <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Durante un minuto (hasta las {formattedTime})}many{Durante # minutos (hasta las {formattedTime})}other{Durante # minutos (hasta las {formattedTime})}}"</string> + <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{Durante 1 min (hasta las {formattedTime})}many{Durante # min (hasta las {formattedTime})}other{Durante # min (hasta las {formattedTime})}}"</string> + <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{Durante 1 hora (hasta las {formattedTime})}many{Durante # horas (hasta las {formattedTime})}other{Durante # horas (hasta las {formattedTime})}}"</string> + <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{Durante 1 h (hasta las {formattedTime})}many{Durante # h (hasta las {formattedTime})}other{Durante # h (hasta las {formattedTime})}}"</string> + <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Durante 1 minuto}many{Durante # minutos}other{Durante # minutos}}"</string> + <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{Durante 1 min}many{Durante # min}other{Durante # min}}"</string> + <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{Durante 1 hora}many{Durante # horas}other{Durante # horas}}"</string> + <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{Durante 1 h}many{Durante # h}other{Durante # h}}"</string> <string name="zen_mode_until_next_day" msgid="1403042784161725038">"Hasta las <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string> <string name="zen_mode_until" msgid="2250286190237669079">"Hasta <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string> <string name="zen_mode_alarm" msgid="7046911727540499275">"Hasta las <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (próxima alarma)"</string> @@ -2000,7 +2001,7 @@ <string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Guardar en la función Autocompletar"</string> <string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"El contenido no se puede autocompletar"</string> <string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"No hay sugerencias de Autocompletar"</string> - <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{1 sugerencia de Autocompletar}other{# sugerencias de Autocompletar}}"</string> + <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{1 sugerencia de Autocompletar}many{# sugerencias de Autocompletar}other{# sugerencias de Autocompletar}}"</string> <string name="autofill_save_title" msgid="7719802414283739775">"¿Guardar en "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string> <string name="autofill_save_title_with_type" msgid="3002460014579799605">"¿Guardar <xliff:g id="TYPE">%1$s</xliff:g> en "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string> <string name="autofill_save_title_with_2types" msgid="3783270967447869241">"¿Guardar <xliff:g id="TYPE_0">%1$s</xliff:g> y <xliff:g id="TYPE_1">%2$s</xliff:g> en "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string> @@ -2110,7 +2111,7 @@ <string name="mime_type_presentation_ext" msgid="8761049335564371468">"Presentación <xliff:g id="EXTENSION">%1$s</xliff:g>"</string> <string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"El Bluetooth seguirá activado en el modo Avión"</string> <string name="car_loading_profile" msgid="8219978381196748070">"Cargando"</string> - <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} y # archivo más}other{{file_name} y # archivos más}}"</string> + <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} y # archivo más}many{{file_name} y # archivos más}other{{file_name} y # archivos más}}"</string> <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"No hay sugerencias de personas con las que compartir"</string> <string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Lista de aplicaciones"</string> <string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Esta aplicación no tiene permiso para grabar, pero podría capturar audio con este dispositivo USB."</string> diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml index 8b8534866b67..fe7549e3434e 100644 --- a/core/res/res/values-et/strings.xml +++ b/core/res/res/values-et/strings.xml @@ -605,8 +605,7 @@ <string name="fingerprint_error_canceled" msgid="540026881380070750">"Sõrmejälje toiming tühistati."</string> <string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Kasutaja tühistas sõrmejälje kasutamise."</string> <string name="fingerprint_error_lockout" msgid="7853461265604738671">"Liiga palju katseid. Proovige hiljem uuesti."</string> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Liiga palju katseid. Kasutage selle asemel ekraanilukku."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Proovige uuesti."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Ühtegi sõrmejälge pole registreeritud."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Selles seadmes pole sõrmejäljeandurit."</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Külastage remonditeenuse pakkujat."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Teie näomudelit ei saa luua. Proovige uuesti."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Liiga ere. Proovige hämaramat valgust."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Proovige parema valgustusega kohas"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Liigutage telefoni kaugemale"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Liigutage telefoni lähemale"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Liigutage telefoni kõrgemale"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"Teler"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Telefon"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Doki kõlarid"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Kõrvaklapid"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"Süsteem"</string> diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index 45cfaf10d697..7f424ebd56eb 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -605,8 +605,7 @@ <string name="fingerprint_error_canceled" msgid="540026881380070750">"Hatz-markaren eragiketa bertan behera utzi da."</string> <string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Erabiltzaileak bertan behera utzi du hatz-marka bidezko eragiketa."</string> <string name="fingerprint_error_lockout" msgid="7853461265604738671">"Saiakera gehiegi egin dituzu. Saiatu berriro geroago."</string> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Saiakera gehiegi egin dira. Erabili pantailaren blokeoa."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Saiatu berriro."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Ez da erregistratu hatz-markarik."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Gailu honek ez du hatz-marken sentsorerik."</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Jarri harremanetan konponketak egiten dituen hornitzaile batekin."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Ezin da sortu aurpegi-eredua. Saiatu berriro."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Argi gehiegi dago. Joan toki ilunago batera."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Erabili argi gehiago"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Urrundu telefonoa"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Hurbildu telefonoa"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Igo telefonoa"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"Telebista"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Telefonoa"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Konektatu bozgorailuak oinarrira"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Entzungailuak"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"Sistema"</string> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index df5bca5b2bb0..83821a3e6ef2 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -605,8 +605,7 @@ <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> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"تلاشهای بیشازحد. حالا از قفل صفحه استفاده کنید."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"دوباره امتحان کنید."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"اثر انگشتی ثبت نشده است."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"این دستگاه حسگر اثر انگشت ندارد."</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"به ارائهدهنده خدمات تعمیر مراجعه کنید."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"مدل چهره ایجاد نشد. دوباره امتحان کنید."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"خیلی روشن است. روشناییاش را ملایمتر کنید."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"نور را بیشتر کنید"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"تلفن را دورتر ببرید"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"تلفن را نزدیکتر بیاورید"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"تلفن را بالاتر ببرید"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"تلویزیون"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"تلفن"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"بلندگوهای جایگاه"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"هدفونها"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"سیستم"</string> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index 375d7afd4421..8798ffcbc76e 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -605,8 +605,7 @@ <string name="fingerprint_error_canceled" msgid="540026881380070750">"Sormenjälkitoiminto peruutettiin."</string> <string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Käyttäjä peruutti sormenjälkitoiminnon."</string> <string name="fingerprint_error_lockout" msgid="7853461265604738671">"Liian monta yritystä. Yritä myöhemmin uudelleen."</string> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Liian monta yritystä. Käytä näytön lukituksen avaustapaa."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Yritä uudelleen."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Sormenjälkiä ei ole otettu käyttöön."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Laitteessa ei ole sormenjälkitunnistinta."</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Ota yhteys korjauspalveluun."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Kasvomallia ei voi luoda. Yritä uudelleen."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Liian kirkasta. Kokeile pehmeämpää valaistusta."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Kokeile kirkkaampaa valaistusta"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Vie puhelin kauemmas"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Tuo puhelin lähemmäs"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Siirrä puhelinta ylemmäs"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"TV"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Puhelin"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Telineen kaiuttimet"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Kuulokkeet"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"Järjestelmä"</string> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index baf6f6959a70..87861aecf423 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -47,6 +47,7 @@ <string name="enablePin" msgid="2543771964137091212">"Opération infructueuse. Activez le verrouillage SIM/RUIM."</string> <plurals name="pinpuk_attempts" formatted="false" msgid="1619867269012213584"> <item quantity="one">Il vous reste <xliff:g id="NUMBER_1">%d</xliff:g> tentative avant que votre carte SIM soit verrouillée.</item> + <item quantity="many">You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts before SIM is locked.</item> <item quantity="other">Il vous reste <xliff:g id="NUMBER_1">%d</xliff:g> tentatives avant que votre carte SIM soit verrouillée.</item> </plurals> <string name="imei" msgid="2157082351232630390">"Code IIEM"</string> @@ -175,7 +176,7 @@ <string name="low_memory" product="watch" msgid="3479447988234030194">"La mémoire de la montre est pleine. Supprimez des fichiers pour libérer de l\'espace."</string> <string name="low_memory" product="tv" msgid="6663680413790323318">"L\'espace de stockage de l\'appareil Android TV est plein. Supprimez des fichiers pour libérer de l\'espace."</string> <string name="low_memory" product="default" msgid="2539532364144025569">"La mémoire du téléphone est pleine. Veuillez supprimer des fichiers pour libérer de l\'espace."</string> - <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Autorité de certification installée}one{Autorité de certification installée}other{Autorités de certification installées}}"</string> + <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Autorité de certification installée}one{Autorité de certification installée}many{Autorités de certification installées}other{Autorités de certification installées}}"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Par un tiers inconnu"</string> <string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Par l\'administrateur de votre profil professionnel"</string> <string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"Par <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string> @@ -249,7 +250,7 @@ <string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Utilisez cette option dans la plupart des circonstances. Elle vous permet de suivre la progression du rapport, d\'entrer plus d\'information sur le problème et d\'effectuer des saisies d\'écran. Certaines sections moins utilisées et dont le remplissage demande beaucoup de temps peuvent être omises."</string> <string name="bugreport_option_full_title" msgid="7681035745950045690">"Rapport complet"</string> <string name="bugreport_option_full_summary" msgid="1975130009258435885">"Utilisez cette option pour qu\'il y ait le moins d\'interférences système possible lorsque votre appareil ne répond pas ou qu\'il est trop lent, ou lorsque vous avez besoin de toutes les sections du rapport de bogue. Aucune capture d\'écran supplémentaire ne peut être capturée, et vous ne pouvez entrer aucune autre information."</string> - <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Saisie d\'une capture d\'écran pour le rapport de bogue dans # seconde.}one{Saisie d\'une capture d\'écran pour le rapport de bogue dans # seconde.}other{Saisie d\'une capture d\'écran pour le rapport de bogue dans # secondes.}}"</string> + <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Saisie d\'une capture d\'écran pour le rapport de bogue dans # seconde.}one{Saisie d\'une capture d\'écran pour le rapport de bogue dans # seconde.}many{Saisie d\'une capture d\'écran pour le rapport de bogue dans # secondes.}other{Saisie d\'une capture d\'écran pour le rapport de bogue dans # secondes.}}"</string> <string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Capture d\'écran prise avec le rapport de bogue"</string> <string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Échec de la prise de capture d\'écran avec le rapport de bogue"</string> <string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Mode silencieux"</string> @@ -605,8 +606,7 @@ <string name="fingerprint_error_canceled" msgid="540026881380070750">"Opération d\'empreinte digitale numérique annulée."</string> <string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"L\'opération d\'empreinte digitale a été annulée par l\'utilisateur."</string> <string name="fingerprint_error_lockout" msgid="7853461265604738671">"Trop de tentatives. Veuillez réessayer plus tard."</string> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Trop de tentatives. Utilisez plutôt le verrouillage de l\'écran."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Réessayer."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Aucune empreinte digitale enregistrée."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Cet appareil ne possède pas de capteur d\'empreintes digitales."</string> @@ -635,7 +635,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Consultez un fournisseur de services de réparation."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Impossible de créer votre modèle facial. Réessayez."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Trop lumineux. Essayez un éclairage plus faible."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Essayez avec un éclairage plus fort"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Éloignez le téléphone"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Rapprochez le téléphone"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Tenez le téléphone plus haut"</string> @@ -1085,7 +1086,7 @@ <string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> souhaite activer la fonctionnalité \"Explorer au toucher\". Lorsque celle-ci est activée, vous pouvez entendre ou voir les descriptions des éléments que vous sélectionnez, ou bien interagir avec le téléphone en effectuant certains gestes."</string> <string name="oneMonthDurationPast" msgid="4538030857114635777">"Il y a 1 mois"</string> <string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Il y a plus d\'un mois"</string> - <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{# dernier jour}one{# dernier jour}other{# derniers jours}}"</string> + <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{# dernier jour}one{# dernier jour}many{# derniers jours}other{# derniers jours}}"</string> <string name="last_month" msgid="1528906781083518683">"Le mois dernier"</string> <string name="older" msgid="1645159827884647400">"Précédent"</string> <string name="preposition_for_date" msgid="2780767868832729599">"le <xliff:g id="DATE">%s</xliff:g>"</string> @@ -1112,14 +1113,14 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"dans <xliff:g id="COUNT">%d</xliff:g> h"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"dans <xliff:g id="COUNT">%d</xliff:g> j"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"dans <xliff:g id="COUNT">%d</xliff:g> a"</string> - <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Il y a # minute}one{Il y a # minute}other{Il y a # minutes}}"</string> - <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Il y a # heure}one{Il y a # heure}other{Il y a # heures}}"</string> - <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Il y a # jour}one{Il y a # jour}other{Il y a # jours}}"</string> - <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{Il y a # an}one{Il y a # an}other{Il y a # ans}}"</string> - <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# minute}one{# minute}other{# minutes}}"</string> - <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# heure}one{# heure}other{# heures}}"</string> - <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# jour}one{# jour}other{# jours}}"</string> - <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# an}one{# an}other{# ans}}"</string> + <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Il y a # minute}one{Il y a # minute}many{Il y a # minutes}other{Il y a # minutes}}"</string> + <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Il y a # heure}one{Il y a # heure}many{Il y a # heures}other{Il y a # heures}}"</string> + <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Il y a # jour}one{Il y a # jour}many{Il y a # jours}other{Il y a # jours}}"</string> + <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{Il y a # an}one{Il y a # an}many{Il y a # ans}other{Il y a # ans}}"</string> + <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# minute}one{# minute}many{# minutes}other{# minutes}}"</string> + <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# heure}one{# heure}many{# heures}other{# heures}}"</string> + <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# jour}one{# jour}many{# jours}other{# jours}}"</string> + <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# an}one{# an}many{# ans}other{# ans}}"</string> <string name="VideoView_error_title" msgid="5750686717225068016">"Problème vidéo"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Impossible de lire cette vidéo en continu sur cet appareil."</string> <string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Impossible de lire la vidéo."</string> @@ -1168,7 +1169,7 @@ <string name="not_checked" msgid="7972320087569023342">"non coché"</string> <string name="selected" msgid="6614607926197755875">"sélectionné"</string> <string name="not_selected" msgid="410652016565864475">"non sélectionné"</string> - <string name="rating_label" msgid="1837085249662154601">"{rating,plural, =1{Une étoile sur {max}}one{# étoile sur {max}}other{# étoiles sur {max}}}"</string> + <string name="rating_label" msgid="1837085249662154601">"{rating,plural, =1{Une étoile sur {max}}one{# étoile sur {max}}many{# d\'étoiles sur {max}}other{# étoiles sur {max}}}"</string> <string name="in_progress" msgid="2149208189184319441">"en cours"</string> <string name="whichApplication" msgid="5432266899591255759">"Continuer avec"</string> <string name="whichApplicationNamed" msgid="6969946041713975681">"Continuer avec %1$s"</string> @@ -1507,7 +1508,7 @@ <string name="skip_button_label" msgid="3566599811326688389">"Ignorer"</string> <string name="no_matches" msgid="6472699895759164599">"Aucune partie"</string> <string name="find_on_page" msgid="5400537367077438198">"Rechercher sur la page"</string> - <string name="matches_found" msgid="2296462299979507689">"{count,plural, =1{# correspondance}one{# sur {total}}other{# sur {total}}}"</string> + <string name="matches_found" msgid="2296462299979507689">"{count,plural, =1{# correspondance}one{# sur {total}}many{# sur {total}}other{# sur {total}}}"</string> <string name="action_mode_done" msgid="2536182504764803222">"Terminé"</string> <string name="progress_erasing" msgid="6891435992721028004">"Effacement du stockage partagé en cours…"</string> <string name="share" msgid="4157615043345227321">"Partager"</string> @@ -1611,7 +1612,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"Télévision"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Téléphone"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Haut-parleurs de la station d\'accueil"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Oreillettes"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"Système"</string> @@ -1860,14 +1861,14 @@ <string name="data_saver_description" msgid="4995164271550590517">"Pour aider à diminuer l\'utilisation des données, la fonctionnalité Économiseur de données empêche certaines applications d\'envoyer ou de recevoir des données en arrière-plan. Une application que vous utilisez actuellement peut accéder à des données, mais peut le faire moins souvent. Cela peut signifier, par exemple, que les images ne s\'affichent pas jusqu\'à ce que vous les touchiez."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Activer l\'économiseur de données?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Activer"</string> - <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Pendant une minute (jusqu\'à {formattedTime})}one{Pendant # minute (jusqu\'à {formattedTime})}other{Pendant # minutes (jusqu\'à {formattedTime})}}"</string> - <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{Pendant 1 m (jusqu\'à {formattedTime})}one{Pendant # m (jusqu\'à {formattedTime})}other{Pendant # m (jusqu\'à {formattedTime})}}"</string> - <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{Pendant 1 heure (jusqu\'à {formattedTime})}one{Pendant # heure (jusqu\'à {formattedTime})}other{Pendant # heures (jusqu\'à {formattedTime})}}"</string> - <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{Pendant 1 h (jusqu\'à {formattedTime})}one{Pendant # h (jusqu\'à {formattedTime})}other{Pendant # h (jusqu\'à {formattedTime})}}"</string> - <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Pendant une minute}one{Pendant # minute}other{Pendant # minutes}}"</string> - <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{Pendant 1 m}one{Pendant # m}other{Pendant # m}}"</string> - <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{Pendant 1 heure}one{Pendant # heure}other{Pendant # heures}}"</string> - <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{Pendant 1 h}one{Pendant # h}other{Pendant # h}}"</string> + <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Pendant une minute (jusqu\'à {formattedTime})}one{Pendant # minute (jusqu\'à {formattedTime})}many{Pendant # minutes (jusqu\'à {formattedTime})}other{Pendant # minutes (jusqu\'à {formattedTime})}}"</string> + <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{Pendant 1 m (jusqu\'à {formattedTime})}one{Pendant # m (jusqu\'à {formattedTime})}many{Pendant # m (jusqu\'à {formattedTime})}other{Pendant # m (jusqu\'à {formattedTime})}}"</string> + <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{Pendant 1 heure (jusqu\'à {formattedTime})}one{Pendant # heure (jusqu\'à {formattedTime})}many{Pendant # heures (jusqu\'à {formattedTime})}other{Pendant # heures (jusqu\'à {formattedTime})}}"</string> + <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{Pendant 1 h (jusqu\'à {formattedTime})}one{Pendant # h (jusqu\'à {formattedTime})}many{Pendant # h (jusqu\'à {formattedTime})}other{Pendant # h (jusqu\'à {formattedTime})}}"</string> + <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Pendant une minute}one{Pendant # minute}many{Pendant # minutes}other{Pendant # minutes}}"</string> + <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{Pendant 1 m}one{Pendant # m}many{Pendant # m}other{Pendant # m}}"</string> + <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{Pendant 1 heure}one{Pendant # heure}many{Pendant # heures}other{Pendant # heures}}"</string> + <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{Pendant 1 h}one{Pendant # h}many{Pendant # h}other{Pendant # h}}"</string> <string name="zen_mode_until_next_day" msgid="1403042784161725038">"Jusqu\'à <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string> <string name="zen_mode_until" msgid="2250286190237669079">"Jusqu\'à <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string> <string name="zen_mode_alarm" msgid="7046911727540499275">"Jusqu\'à <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (alarme suivante)"</string> @@ -2000,7 +2001,7 @@ <string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Enregistrer pour le remplissage automatique"</string> <string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Le contenu ne peut pas être entré automatiquement"</string> <string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Aucune suggestion de remplissage automatique"</string> - <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Une suggestion de remplissage automatique}one{# suggestion de remplissage automatique}other{# suggestions de remplissage automatique}}"</string> + <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Une suggestion de remplissage automatique}one{# suggestion de remplissage automatique}many{# suggestions de remplissage automatique}other{# suggestions de remplissage automatique}}"</string> <string name="autofill_save_title" msgid="7719802414283739775">"Enregistrer sous "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string> <string name="autofill_save_title_with_type" msgid="3002460014579799605">"Enregistrer <xliff:g id="TYPE">%1$s</xliff:g> sous "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string> <string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Enregistrer <xliff:g id="TYPE_0">%1$s</xliff:g> et <xliff:g id="TYPE_1">%2$s</xliff:g> sous "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string> @@ -2110,7 +2111,7 @@ <string name="mime_type_presentation_ext" msgid="8761049335564371468">"Présentation <xliff:g id="EXTENSION">%1$s</xliff:g>"</string> <string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Le Bluetooth restera activé en mode Avion"</string> <string name="car_loading_profile" msgid="8219978381196748070">"Chargement en cours…"</string> - <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # fichier}one{{file_name} + # fichier}other{{file_name} + # fichiers}}"</string> + <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # fichier}one{{file_name} + # fichier}many{{file_name} + # fichiers}other{{file_name} + # fichiers}}"</string> <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Aucune recommandation de personnes avec lesquelles effectuer un partage"</string> <string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Liste des applications"</string> <string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Cette application n\'a pas été autorisée à effectuer des enregistrements, mais elle pourrait capturer du contenu audio par l\'intermédiaire de cet appareil USB."</string> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 95d06f44854f..a9dccbc0c264 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -47,6 +47,7 @@ <string name="enablePin" msgid="2543771964137091212">"Échec de l\'opération. Veuillez activer le verrouillage de la carte SIM/RUIM."</string> <plurals name="pinpuk_attempts" formatted="false" msgid="1619867269012213584"> <item quantity="one">Il vous reste <xliff:g id="NUMBER_1">%d</xliff:g> tentative avant que votre carte SIM ne soit verrouillée.</item> + <item quantity="many">You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts before SIM is locked.</item> <item quantity="other">Il vous reste <xliff:g id="NUMBER_1">%d</xliff:g> tentatives avant que votre carte SIM ne soit verrouillée.</item> </plurals> <string name="imei" msgid="2157082351232630390">"Code IMEI"</string> @@ -175,7 +176,7 @@ <string name="low_memory" product="watch" msgid="3479447988234030194">"La mémoire de la montre est saturée. Veuillez supprimer des fichiers pour libérer de l\'espace."</string> <string name="low_memory" product="tv" msgid="6663680413790323318">"L\'espace de stockage de l\'appareil Android TV est saturé. Supprimez certains fichiers pour libérer de l\'espace."</string> <string name="low_memory" product="default" msgid="2539532364144025569">"La mémoire du téléphone est pleine. Veuillez supprimer des fichiers pour libérer de l\'espace."</string> - <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Autorité de certification installée}one{Autorité de certification installée}other{Autorités de certification installées}}"</string> + <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Autorité de certification installée}one{Autorité de certification installée}many{Autorités de certification installées}other{Autorités de certification installées}}"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Par un tiers inconnu"</string> <string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Par l\'administrateur de votre profil professionnel"</string> <string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"Par <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string> @@ -249,7 +250,7 @@ <string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Utilisez cette option dans la plupart des circonstances. Elle vous permet de suivre la progression du rapport, de saisir plus d\'informations sur le problème et d\'effectuer des captures d\'écran. Certaines sections moins utilisées et dont le remplissage demande beaucoup de temps peuvent être omises."</string> <string name="bugreport_option_full_title" msgid="7681035745950045690">"Rapport complet"</string> <string name="bugreport_option_full_summary" msgid="1975130009258435885">"Utilisez cette option pour qu\'il y ait le moins d\'interférences système possible lorsque votre appareil ne répond pas ou qu\'il est trop lent, ou lorsque vous avez besoin de toutes les sections du rapport de bug. Aucune capture d\'écran supplémentaire ne peut être prise, et vous ne pouvez saisir aucune autre information."</string> - <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Capture d\'écran pour le rapport de bug dans # seconde.}one{Capture d\'écran pour le rapport de bug dans # seconde.}other{Capture d\'écran pour le rapport de bug dans # secondes.}}"</string> + <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Capture d\'écran pour le rapport de bug dans # seconde.}one{Capture d\'écran pour le rapport de bug dans # seconde.}many{Capture d\'écran pour le rapport de bug dans # secondes.}other{Capture d\'écran pour le rapport de bug dans # secondes.}}"</string> <string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Capture d\'écran avec rapport de bug effectuée"</string> <string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Échec de la capture d\'écran avec le rapport de bug"</string> <string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Mode silencieux"</string> @@ -605,8 +606,7 @@ <string name="fingerprint_error_canceled" msgid="540026881380070750">"Opération d\'empreinte digitale annulée."</string> <string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Opération d\'authentification par empreinte digitale annulée par l\'utilisateur."</string> <string name="fingerprint_error_lockout" msgid="7853461265604738671">"Trop de tentatives. Veuillez réessayer plus tard."</string> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Trop de tentatives. Utilisez plutôt le verrouillage de l\'écran."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Veuillez réessayer."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Aucune empreinte digitale enregistrée."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Aucun lecteur d\'empreinte digitale n\'est installé sur cet appareil."</string> @@ -635,7 +635,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Contactez un réparateur."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Impossible de créer l\'empreinte faciale. Réessayez."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Trop lumineux. Essayez de baisser la lumière."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Essayez un éclairage plus lumineux"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Éloignez le téléphone."</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Rapprochez le téléphone"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Déplacez le téléphone vers le haut"</string> @@ -1085,7 +1086,7 @@ <string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> souhaite activer la fonctionnalité \"Explorer au toucher\". Lorsque celle-ci est activée, vous pouvez entendre ou voir les descriptions des éléments que vous sélectionnez, ou bien interagir avec le téléphone en effectuant certains gestes."</string> <string name="oneMonthDurationPast" msgid="4538030857114635777">"Il y a 1 mois"</string> <string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Il y a plus d\'un mois"</string> - <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Dernier jour (#)}one{Dernier jour (#)}other{# derniers jours}}"</string> + <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Dernier jour (#)}one{Dernier jour (#)}many{# derniers jours}other{# derniers jours}}"</string> <string name="last_month" msgid="1528906781083518683">"Le mois dernier"</string> <string name="older" msgid="1645159827884647400">"Préc."</string> <string name="preposition_for_date" msgid="2780767868832729599">"le <xliff:g id="DATE">%s</xliff:g>"</string> @@ -1112,14 +1113,14 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"dans <xliff:g id="COUNT">%d</xliff:g> h"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"dans <xliff:g id="COUNT">%d</xliff:g> j"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"dans <xliff:g id="COUNT">%d</xliff:g> an"</string> - <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Il y a # minute}one{Il y a # minute}other{Il y a # minutes}}"</string> - <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Il y a # heure}one{Il y a # heure}other{Il y a # heures}}"</string> - <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Il y a # jour}one{Il y a # jour}other{Il y a # jours}}"</string> - <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{Il y a # an}one{Il y a # an}other{Il y a # ans}}"</string> - <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# minute}one{# minute}other{# minutes}}"</string> - <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# heure}one{# heure}other{# heures}}"</string> - <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# jour}one{# jour}other{# jours}}"</string> - <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# an}one{# an}other{# ans}}"</string> + <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Il y a # minute}one{Il y a # minute}many{Il y a # minutes}other{Il y a # minutes}}"</string> + <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Il y a # heure}one{Il y a # heure}many{Il y a # heures}other{Il y a # heures}}"</string> + <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Il y a # jour}one{Il y a # jour}many{Il y a # jours}other{Il y a # jours}}"</string> + <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{Il y a # an}one{Il y a # an}many{Il y a # ans}other{Il y a # ans}}"</string> + <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# minute}one{# minute}many{# minutes}other{# minutes}}"</string> + <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# heure}one{# heure}many{# heures}other{# heures}}"</string> + <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# jour}one{# jour}many{# jours}other{# jours}}"</string> + <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# an}one{# an}many{# ans}other{# ans}}"</string> <string name="VideoView_error_title" msgid="5750686717225068016">"Problème vidéo"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Impossible de lire cette vidéo en streaming sur cet appareil."</string> <string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Impossible de lire la vidéo."</string> @@ -1168,7 +1169,7 @@ <string name="not_checked" msgid="7972320087569023342">"désactivé"</string> <string name="selected" msgid="6614607926197755875">"sélectionné"</string> <string name="not_selected" msgid="410652016565864475">"non sélectionné"</string> - <string name="rating_label" msgid="1837085249662154601">"{rating,plural, =1{1 étoile sur {max}}one{# étoile sur {max}}other{# étoiles sur {max}}}"</string> + <string name="rating_label" msgid="1837085249662154601">"{rating,plural, =1{1 étoile sur {max}}one{# étoile sur {max}}many{# étoiles sur {max}}other{# étoiles sur {max}}}"</string> <string name="in_progress" msgid="2149208189184319441">"en cours"</string> <string name="whichApplication" msgid="5432266899591255759">"Continuer avec"</string> <string name="whichApplicationNamed" msgid="6969946041713975681">"Terminer l\'action avec %1$s"</string> @@ -1507,7 +1508,7 @@ <string name="skip_button_label" msgid="3566599811326688389">"Ignorer"</string> <string name="no_matches" msgid="6472699895759164599">"Aucune correspondance"</string> <string name="find_on_page" msgid="5400537367077438198">"Rechercher sur la page"</string> - <string name="matches_found" msgid="2296462299979507689">"{count,plural, =1{# correspondance}one{# sur {total}}other{# sur {total}}}"</string> + <string name="matches_found" msgid="2296462299979507689">"{count,plural, =1{# correspondance}one{# sur {total}}many{# sur {total}}other{# sur {total}}}"</string> <string name="action_mode_done" msgid="2536182504764803222">"OK"</string> <string name="progress_erasing" msgid="6891435992721028004">"Suppression de l\'espace de stockage partagé…"</string> <string name="share" msgid="4157615043345227321">"Partager"</string> @@ -1611,7 +1612,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"Téléviseur"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Téléphone"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Haut-parleurs de la station d\'accueil"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Écouteurs"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"Système"</string> @@ -1860,14 +1861,14 @@ <string name="data_saver_description" msgid="4995164271550590517">"Pour réduire la consommation des données, l\'Économiseur de données empêche certaines applis d\'envoyer ou de recevoir des données en arrière-plan. Les applis que vous utiliserez pourront toujours accéder aux données, mais le feront moins fréquemment. Par exemple, les images pourront ne pas s\'afficher tant que vous n\'aurez pas appuyé dessus."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Activer l\'Économiseur de données ?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Activer"</string> - <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Pendant 1 minute (jusqu\'à {formattedTime})}one{Pendant # minute (jusqu\'à {formattedTime})}other{Pendant # minutes (jusqu\'à {formattedTime})}}"</string> - <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{Pendant 1 min (jusqu\'à {formattedTime})}one{Pendant # min (jusqu\'à {formattedTime})}other{Pendant # min (jusqu\'à {formattedTime})}}"</string> - <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{Pendant 1 heure (jusqu\'à {formattedTime})}one{Pendant # heure (jusqu\'à {formattedTime})}other{Pendant # heures (jusqu\'à {formattedTime})}}"</string> - <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{Pendant 1 h (jusqu\'à {formattedTime})}one{Pendant # h (jusqu\'à {formattedTime})}other{Pendant # h (jusqu\'à {formattedTime})}}"</string> - <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Pendant 1 minute}one{Pendant # minute}other{Pendant # minutes}}"</string> - <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{Pendant 1 min}one{Pendant # min}other{Pendant # min}}"</string> - <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{Pendant 1 heure}one{Pendant # heure}other{Pendant # heures}}"</string> - <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{Pendant 1 h}one{Pendant # h}other{Pendant # h}}"</string> + <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Pendant 1 minute (jusqu\'à {formattedTime})}one{Pendant # minute (jusqu\'à {formattedTime})}many{Pendant # minutes (jusqu\'à {formattedTime})}other{Pendant # minutes (jusqu\'à {formattedTime})}}"</string> + <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{Pendant 1 min (jusqu\'à {formattedTime})}one{Pendant # min (jusqu\'à {formattedTime})}many{Pendant # min (jusqu\'à {formattedTime})}other{Pendant # min (jusqu\'à {formattedTime})}}"</string> + <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{Pendant 1 heure (jusqu\'à {formattedTime})}one{Pendant # heure (jusqu\'à {formattedTime})}many{Pendant # heures (jusqu\'à {formattedTime})}other{Pendant # heures (jusqu\'à {formattedTime})}}"</string> + <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{Pendant 1 h (jusqu\'à {formattedTime})}one{Pendant # h (jusqu\'à {formattedTime})}many{Pendant # h (jusqu\'à {formattedTime})}other{Pendant # h (jusqu\'à {formattedTime})}}"</string> + <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Pendant 1 minute}one{Pendant # minute}many{Pendant # minutes}other{Pendant # minutes}}"</string> + <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{Pendant 1 min}one{Pendant # min}many{Pendant # min}other{Pendant # min}}"</string> + <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{Pendant 1 heure}one{Pendant # heure}many{Pendant # heures}other{Pendant # heures}}"</string> + <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{Pendant 1 h}one{Pendant # h}many{Pendant # h}other{Pendant # h}}"</string> <string name="zen_mode_until_next_day" msgid="1403042784161725038">"Jusqu\'à <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string> <string name="zen_mode_until" msgid="2250286190237669079">"Jusqu\'à <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string> <string name="zen_mode_alarm" msgid="7046911727540499275">"Jusqu\'à <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (alarme suivante)"</string> @@ -2000,7 +2001,7 @@ <string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Enregistrer pour la saisie automatique"</string> <string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Le contenu ne peut pas être saisi automatiquement"</string> <string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Aucune suggestion de saisie automatique"</string> - <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{1 suggestion de saisie automatique}one{# suggestion de saisie automatique}other{# suggestions de saisie automatique}}"</string> + <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{1 suggestion de saisie automatique}one{# suggestion de saisie automatique}many{# suggestions de saisie automatique}other{# suggestions de saisie automatique}}"</string> <string name="autofill_save_title" msgid="7719802414283739775">"Enregistrer dans "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>" ?"</string> <string name="autofill_save_title_with_type" msgid="3002460014579799605">"Enregistrer la <xliff:g id="TYPE">%1$s</xliff:g> dans "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>" ?"</string> <string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Enregistrer <xliff:g id="TYPE_0">%1$s</xliff:g> et <xliff:g id="TYPE_1">%2$s</xliff:g> dans "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>" ?"</string> @@ -2110,7 +2111,7 @@ <string name="mime_type_presentation_ext" msgid="8761049335564371468">"Présentation <xliff:g id="EXTENSION">%1$s</xliff:g>"</string> <string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Le Bluetooth restera activé en mode Avion"</string> <string name="car_loading_profile" msgid="8219978381196748070">"Chargement…"</string> - <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # fichier}one{{file_name} + # fichier}other{{file_name} + # fichiers}}"</string> + <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # fichier}one{{file_name} + # fichier}many{{file_name} + # fichiers}other{{file_name} + # fichiers}}"</string> <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Aucune recommandation de personnes avec lesquelles effectuer un partage"</string> <string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Liste des applications"</string> <string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Cette application n\'a pas reçu l\'autorisation d\'enregistrer des contenus audio, mais peut le faire via ce périphérique USB."</string> diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml index 2dd092d37a6c..ae29e50eb4ad 100644 --- a/core/res/res/values-gl/strings.xml +++ b/core/res/res/values-gl/strings.xml @@ -605,8 +605,7 @@ <string name="fingerprint_error_canceled" msgid="540026881380070750">"Cancelouse a operación da impresión dixital."</string> <string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"O usuario cancelou a operación da impresión dixital."</string> <string name="fingerprint_error_lockout" msgid="7853461265604738671">"Demasiados intentos. Téntao de novo máis tarde."</string> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Demasiados intentos. Mellor usa o bloqueo de pantalla."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Téntao de novo."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Non se rexistraron impresións dixitais."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Este dispositivo non ten sensor de impresión dixital."</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Visita un provedor de reparacións."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Non se puido crear o modelo facial. Téntao de novo."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Hai demasiada iluminación. Proba cunha máis suave."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Proba con máis luz"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Afasta o teléfono"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Achega o teléfono"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Sube o teléfono"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"Televisión"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Teléfono"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Conectar altofalantes á base"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Auriculares"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"Sistema"</string> diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml index d17030282bcb..36812e81bb82 100644 --- a/core/res/res/values-gu/strings.xml +++ b/core/res/res/values-gu/strings.xml @@ -605,8 +605,7 @@ <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> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"ઘણા બધા પ્રયાસો. વિકલ્પ તરીકે સ્ક્રીન લૉકનો ઉપયોગ કરો."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"ફરી પ્રયાસ કરો."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"કોઈ ફિંગરપ્રિન્ટની નોંધણી કરવામાં આવી નથી."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"આ ડિવાઇસમાં કોઈ ફિંગરપ્રિન્ટ સેન્સર નથી."</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"રિપેર કરવાની સેવા આપતા પ્રદાતાની મુલાકાત લો."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"તમારા ચહેરાનું મૉડલ ન બનાવી શકાય. ફરી પ્રયાસ કરો."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"અતિશય પ્રકાશિત. થોડો હળવો પ્રકાશ અજમાવી જુઓ."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"વધુ પ્રકાશિત લાઇટિંગ અજમાવો"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"ફોનને વધુ દૂર લઈ જાઓ"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"ફોનને વધુ નજીક લાવો"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"ફોનને વધુ ઊંચે લઈ જાઓ"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"TV"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"ફોન"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"સ્પીકર્સ ડૉક કરો"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"હેડફોન"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"સિસ્ટમ"</string> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index d97049866d78..2a9a44a1a12a 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -302,7 +302,7 @@ <string name="permgroupdesc_sms" msgid="5726462398070064542">"मैसेज (एसएमएस) भेजें और देखें"</string> <string name="permgrouplab_storage" msgid="17339216290379241">"फ़ाइलें"</string> <string name="permgroupdesc_storage" msgid="5378659041354582769">"अपने डिवाइस में मौजूद फ़ाइलों का ऐक्सेस दें"</string> - <string name="permgrouplab_readMediaAural" msgid="1858331312624942053">"संगीत और ऑडियो के ऐक्सेस"</string> + <string name="permgrouplab_readMediaAural" msgid="1858331312624942053">"संगीत और ऑडियो"</string> <string name="permgroupdesc_readMediaAural" msgid="7565467343667089595">"आपके डिवाइस पर संगीत और ऑडियो को ऐक्सेस करने की अनुमति"</string> <string name="permgrouplab_readMediaVisual" msgid="4724874717811908660">"फ़ोटो और वीडियो के ऐक्सेस"</string> <string name="permgroupdesc_readMediaVisual" msgid="4080463241903508688">"आपके डिवाइस पर फ़ोटो और वीडियो को ऐक्सेस करने की अनुमति"</string> @@ -605,8 +605,7 @@ <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> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"इससे ज़्यादा बार कोशिश नहीं की जा सकती. इसके बजाय, स्क्रीन लॉक का इस्तेमाल करें."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"फिर से कोशिश करें."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"कोई फ़िंगरप्रिंट रजिस्टर नहीं किया गया है."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"इस डिवाइस में फ़िंगरप्रिंट सेंसर नहीं है."</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"फ़िंगरप्रिंट सेंसर को रिपेयर करने की सेवा देने वाली कंपनी से संपर्क करें."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"चेहरे का माॅडल नहीं बन सका. फिर से कोशिश करें."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"बहुत रोशनी है. हल्की रोशनी आज़माएं."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"बेहतर रोशनी में कोशिश करें"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"फ़ोन को दूर ले जाएं"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"फ़ोन को नज़दीक लाएं"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"फ़ोन को थोड़ा और ऊपर ले जाएं"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"टीवी"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"फ़ोन"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"डॉक स्पीकर"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"हेडफ़ोन"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"यूएसबी"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"सिस्टम"</string> @@ -1855,8 +1855,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"आपके व्यवस्थापक ने अपडेट किया है"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"आपके व्यवस्थापक ने हटा दिया है"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"ठीक है"</string> - <string name="battery_saver_description_with_learn_more" msgid="5444908404021316250">"बैटरी सेवर, गहरे रंग वाली थीम को चालू करता है. साथ ही, यह बैकग्राउंड की गतिविधि, कुछ विज़ुअल इफ़ेक्ट, कुछ खास सुविधाओं, और कुछ खास तरह के इंटरनेट कनेक्शन इस्तेमाल करने से डिवाइस को रोकता है या इन्हें बंद कर देता है."</string> - <string name="battery_saver_description" msgid="8518809702138617167">"बैटरी सेवर, गहरे रंग वाली थीम को चालू करता है. साथ ही, यह बैकग्राउंड की गतिविधि, कुछ विज़ुअल इफ़ेक्ट, कुछ खास सुविधाओं, और कुछ खास तरह के इंटरनेट कनेक्शन इस्तेमाल करने से डिवाइस को रोकता है या इन्हें बंद कर देता है."</string> + <string name="battery_saver_description_with_learn_more" msgid="5444908404021316250">"बैटरी सेवर, गहरे रंग वाली थीम को चालू करता है. साथ ही, इस मोड में बैकग्राउंड की गतिविधि, कुछ विज़ुअल इफ़ेक्ट, और कुछ खास सुविधाएं कम या बंद हो जाती हैं. कुछ इंटरनेट कनेक्शन भी पूरी तरह काम नहीं करते."</string> + <string name="battery_saver_description" msgid="8518809702138617167">"बैटरी सेवर, गहरे रंग वाली थीम को चालू करता है. साथ ही, इस मोड में बैकग्राउंड की गतिविधि, कुछ विज़ुअल इफ़ेक्ट, और कुछ सुविधाएं सीमित या बंद हो जाती हैं. कुछ इंटरनेट कनेक्शन भी पूरी तरह काम नहीं करते."</string> <string name="data_saver_description" msgid="4995164271550590517">"डेटा खर्च को कम करने के लिए, डेटा बचाने की सेटिंग कुछ ऐप्लिकेशन को बैकग्राउंड में डेटा भेजने या डेटा पाने से रोकती है. फ़िलहाल, जिस ऐप्लिकेशन का इस्तेमाल किया जा रहा है वह डेटा ऐक्सेस कर सकता है, लेकिन ऐसा कभी-कभी ही हो पाएगा. उदाहरण के लिए, इमेज तब तक दिखाई नहीं देंगी, जब तक उन पर टैप नहीं किया जाएगा."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"डेटा बचाने की सेटिंग चालू करें?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"चालू करें"</string> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index 1a0b1c6f02ff..0a2702a256b9 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -606,8 +606,7 @@ <string name="fingerprint_error_canceled" msgid="540026881380070750">"Radnja otiska prsta otkazana je."</string> <string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Radnju s otiskom prsta otkazao je korisnik."</string> <string name="fingerprint_error_lockout" msgid="7853461265604738671">"Previše pokušaja. Pokušajte ponovo kasnije."</string> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Previše pokušaja. Umjesto toga upotrijebite zaključavanje zaslona."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Pokušajte ponovo."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Nije registriran nijedan otisak prsta."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Ovaj uređaj nema senzor otiska prsta."</string> @@ -636,7 +635,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Posjetite davatelja usluga popravaka."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Izrada modela lica nije uspjela. Pokušajte ponovo."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Presvijetlo je. Pokušajte sa slabijim svjetlom."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Pokušajte s jačim osvjetljenjem"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Udaljite telefon"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Približite telefon"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Pomaknite telefon prema gore"</string> @@ -1612,7 +1612,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"Televizor"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Telefon"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Zvučnici postolja"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Slušalice"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"Sustav"</string> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index 24dc9b6eb35a..01b6f90aa676 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -605,8 +605,7 @@ <string name="fingerprint_error_canceled" msgid="540026881380070750">"Ujjlenyomattal kapcsolatos művelet megszakítva"</string> <string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Az ujjlenyomattal kapcsolatos műveletet a felhasználó megszakította."</string> <string name="fingerprint_error_lockout" msgid="7853461265604738671">"Túl sok próbálkozás. Próbálja újra később."</string> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Túl sok próbálkozás. Használja inkább a képernyőzárat."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Próbálkozzon újra."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Nincsenek regisztrált ujjlenyomatok."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Ez az eszköz nem rendelkezik ujjlenyomat-érzékelővel."</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Keresse fel a szervizt."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Nem lehet létrehozni az arcmodellt. Próbálja újra."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Túl világos. Próbálja kevésbé erős világítással."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Próbálja jobb megvilágítás mellett"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Tartsa távolabb a telefont"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Tartsa közelebb a telefont"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Emelje magasabbra a telefont"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"TV"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Telefon"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Dokkolóegység hangszórója"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Fejhallgató"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"Rendszer"</string> diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml index b9206c3f4947..86560bef7f76 100644 --- a/core/res/res/values-hy/strings.xml +++ b/core/res/res/values-hy/strings.xml @@ -605,8 +605,7 @@ <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> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Չափազանց շատ փորձեր են արվել։ Օգտագործեք էկրանի կողպումը։"</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Փորձեք նորից:"</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Գրանցված մատնահետք չկա:"</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Այս սարքը չունի մատնահետքերի սկաներ։"</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Այցելեք սպասարկման կենտրոն։"</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Չհաջողվեց ստեղծել ձեր դեմքի մոդելը։ Նորից փորձեք։"</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Շատ լուսավոր է։ Փորձեք ավելի թեթև լուսավորություն։"</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Ավելի պայծառ դարձրեք լուսավորությունը"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Փոքր-ինչ հեռու պահեք հեռախոսը"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Մոտեցրեք հեռախոսը"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Բարձրացրեք հեռախոսը"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"Հեռուստացույց"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Հեռախոս"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Դոկ-կայանի բարձրախոսներ"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Ականջակալներ"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"Համակարգ"</string> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index 30f98fd096f9..b145e200c54a 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -605,8 +605,7 @@ <string name="fingerprint_error_canceled" msgid="540026881380070750">"Operasi sidik jari dibatalkan."</string> <string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Operasi sidik jari dibatalkan oleh pengguna."</string> <string name="fingerprint_error_lockout" msgid="7853461265604738671">"Terlalu banyak upaya. Coba lagi nanti."</string> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Terlalu banyak upaya gagal. Gunakan kunci layar."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Coba lagi."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Tidak ada sidik jari yang terdaftar."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Perangkat ini tidak memiliki sensor sidik jari."</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Kunjungi penyedia reparasi."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Tidak dapat membuat model wajah Anda. Coba lagi."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Terlalu terang. Coba cahaya yang lebih lembut."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Coba pencahayaan yang lebih cerah"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Jauhkan ponsel"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Dekatkan ponsel"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Gerakkan ponsel ke atas"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"TV"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Ponsel"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Pengeras suara dok"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Headphone"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"Sistem"</string> diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml index 20bf9bfc319f..6f48de292a26 100644 --- a/core/res/res/values-is/strings.xml +++ b/core/res/res/values-is/strings.xml @@ -605,8 +605,7 @@ <string name="fingerprint_error_canceled" msgid="540026881380070750">"Hætt við fingrafarsaðgerð."</string> <string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Notandi hætti við að nota fingrafar."</string> <string name="fingerprint_error_lockout" msgid="7853461265604738671">"Of margar tilraunir. Reyndu aftur síðar."</string> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Of margar tilraunir. Notaðu skjálás í staðinn."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Reyndu aftur."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Engin fingraför hafa verið skráð."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Þetta tæki er ekki með fingrafaralesara."</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Þú verður að fara á verkstæði."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Ekki tekst að búa til andlitslíkan. Reyndu aftur."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Of bjart. Prófaðu mýkri lýsingu."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Prófaðu sterkari lýsingu"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Færðu símann lengra frá"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Færðu símann nær"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Færðu símann hærra"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"Sjónvarp"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Sími"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Dokkuhátalarar"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Heyrnartól"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"Kerfi"</string> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 330100c53b67..fb7763a12994 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -46,6 +46,7 @@ <string name="needPuk2" msgid="7032612093451537186">"Digita il PUK2 per sbloccare la SIM."</string> <string name="enablePin" msgid="2543771964137091212">"Operazione non riuscita; attiva blocco SIM/RUIM."</string> <plurals name="pinpuk_attempts" formatted="false" msgid="1619867269012213584"> + <item quantity="many">You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts before SIM is locked.</item> <item quantity="other">Hai ancora <xliff:g id="NUMBER_1">%d</xliff:g> tentativi a disposizione prima che la SIM venga bloccata.</item> <item quantity="one">Hai ancora <xliff:g id="NUMBER_0">%d</xliff:g> tentativo a disposizione prima che la SIM venga bloccata.</item> </plurals> @@ -175,7 +176,7 @@ <string name="low_memory" product="watch" msgid="3479447988234030194">"La memoria dell\'orologio è piena. Elimina alcuni file per liberare spazio."</string> <string name="low_memory" product="tv" msgid="6663680413790323318">"Lo spazio di archiviazione del dispositivo Android TV è pieno. Elimina alcuni file per liberare spazio."</string> <string name="low_memory" product="default" msgid="2539532364144025569">"Spazio di archiviazione del telefono esaurito. Elimina alcuni file per liberare spazio."</string> - <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Autorità di certificazione installata}other{Autorità di certificazione installate}}"</string> + <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Autorità di certificazione installata}many{Autorità di certificazione installate}other{Autorità di certificazione installate}}"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Da una terza parte sconosciuta"</string> <string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Dall\'amministratore del tuo profilo di lavoro"</string> <string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"Da <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string> @@ -249,7 +250,7 @@ <string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Utilizza questa opzione nella maggior parte dei casi. Ti consente di monitorare l\'avanzamento della segnalazione, di inserire maggiori dettagli relativi al problema e di acquisire screenshot. Potrebbero essere omesse alcune sezioni meno utilizzate il cui inserimento nella segnalazione richiede molto tempo."</string> <string name="bugreport_option_full_title" msgid="7681035745950045690">"Report completo"</string> <string name="bugreport_option_full_summary" msgid="1975130009258435885">"Utilizza questa opzione per ridurre al minimo l\'interferenza di sistema quando il dispositivo non risponde, è troppo lento oppure quando ti servono tutte le sezioni della segnalazione. Non puoi inserire altri dettagli o acquisire altri screenshot."</string> - <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Lo screenshot per la segnalazione di bug verrà acquisito tra # secondo.}other{Lo screenshot per la segnalazione di bug verrà acquisito tra # secondi.}}"</string> + <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Lo screenshot per la segnalazione di bug verrà acquisito tra # secondo.}many{Lo screenshot per la segnalazione di bug verrà acquisito tra # secondi.}other{Lo screenshot per la segnalazione di bug verrà acquisito tra # secondi.}}"</string> <string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Screenshot con segnalazione di bug effettuato correttamente"</string> <string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Impossibile acquisire screenshot con segnalazione di bug"</string> <string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Modalità silenziosa"</string> @@ -605,8 +606,7 @@ <string name="fingerprint_error_canceled" msgid="540026881380070750">"Operazione associata all\'impronta annullata."</string> <string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Operazione di autenticazione dell\'impronta annullata dall\'utente."</string> <string name="fingerprint_error_lockout" msgid="7853461265604738671">"Troppi tentativi. Riprova più tardi."</string> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Troppi tentativi. Usa il blocco schermo."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Riprova."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Nessuna impronta digitale registrata."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Questo dispositivo non dispone di sensore di impronte."</string> @@ -635,7 +635,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Contatta un fornitore di servizi di riparazione."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Impossibile creare il modello del volto. Riprova."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Troppa luce. Prova con una luce più soft."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Prova con più luce"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Allontana il telefono"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Avvicina il telefono"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Sposta il telefono più in alto"</string> @@ -1085,7 +1086,7 @@ <string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> vuole attivare la funzione Esplora al tocco. Quando la funzione Esplora al tocco è attiva, puoi ascoltare o visualizzare le descrizioni di ciò che stai toccando oppure interagire con il telefono tramite gesti."</string> <string name="oneMonthDurationPast" msgid="4538030857114635777">"1 mese fa"</string> <string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Oltre 1 mese fa"</string> - <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Ultimo giorno}other{Ultimi # giorni}}"</string> + <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Ultimo giorno}many{Ultimi # giorni}other{Ultimi # giorni}}"</string> <string name="last_month" msgid="1528906781083518683">"Ultimo mese"</string> <string name="older" msgid="1645159827884647400">"Precedente"</string> <string name="preposition_for_date" msgid="2780767868832729599">"<xliff:g id="DATE">%s</xliff:g>"</string> @@ -1112,14 +1113,14 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"tra <xliff:g id="COUNT">%d</xliff:g> h"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"tra <xliff:g id="COUNT">%d</xliff:g> g"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"tra <xliff:g id="COUNT">%d</xliff:g> a"</string> - <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# minuto fa}other{# minuti fa}}"</string> - <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# ora fa}other{# ore fa}}"</string> - <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# giorno fa}other{# giorni fa}}"</string> - <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# anno fa}other{# anni fa}}"</string> - <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# minuto}other{# minuti}}"</string> - <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# ora}other{# ore}}"</string> - <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# giorno}other{# giorni}}"</string> - <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# anno}other{# anni}}"</string> + <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# minuto fa}many{# minuti fa}other{# minuti fa}}"</string> + <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# ora fa}many{# ore fa}other{# ore fa}}"</string> + <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# giorno fa}many{# giorni fa}other{# giorni fa}}"</string> + <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# anno fa}many{# anni fa}other{# anni fa}}"</string> + <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# minuto}many{# minuti}other{# minuti}}"</string> + <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# ora}many{# ore}other{# ore}}"</string> + <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# giorno}many{# giorni}other{# giorni}}"</string> + <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# anno}many{# anni}other{# anni}}"</string> <string name="VideoView_error_title" msgid="5750686717225068016">"Problemi video"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Questo video non è valido per lo streaming su questo dispositivo."</string> <string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Impossibile riprodurre il video."</string> @@ -1168,7 +1169,7 @@ <string name="not_checked" msgid="7972320087569023342">"deselezionato"</string> <string name="selected" msgid="6614607926197755875">"selezionato"</string> <string name="not_selected" msgid="410652016565864475">"non selezionato"</string> - <string name="rating_label" msgid="1837085249662154601">"{rating,plural, =1{Una stella su {max}}other{# stelle su {max}}}"</string> + <string name="rating_label" msgid="1837085249662154601">"{rating,plural, =1{Una stella su {max}}many{# stelle su {max}}other{# stelle su {max}}}"</string> <string name="in_progress" msgid="2149208189184319441">"In corso"</string> <string name="whichApplication" msgid="5432266899591255759">"Completa l\'azione con"</string> <string name="whichApplicationNamed" msgid="6969946041713975681">"Completamento azione con %1$s"</string> @@ -1507,7 +1508,7 @@ <string name="skip_button_label" msgid="3566599811326688389">"Salta"</string> <string name="no_matches" msgid="6472699895759164599">"Nessuna corrispondenza"</string> <string name="find_on_page" msgid="5400537367077438198">"Trova nella pagina"</string> - <string name="matches_found" msgid="2296462299979507689">"{count,plural, =1{# corrispondenza}other{# di {total}}}"</string> + <string name="matches_found" msgid="2296462299979507689">"{count,plural, =1{# corrispondenza}many{# di {total}}other{# di {total}}}"</string> <string name="action_mode_done" msgid="2536182504764803222">"Fine"</string> <string name="progress_erasing" msgid="6891435992721028004">"Cancellazione archivio condiviso…"</string> <string name="share" msgid="4157615043345227321">"Condividi"</string> @@ -1611,7 +1612,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"TV"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Telefono"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Altoparlanti dock"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Cuffie audio"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"Sistema"</string> @@ -1860,14 +1861,14 @@ <string name="data_saver_description" msgid="4995164271550590517">"Per contribuire a ridurre l\'utilizzo dei dati, la funzionalità Risparmio dati impedisce ad alcune app di inviare o ricevere dati in background. Un\'app in uso può accedere ai dati, ma potrebbe farlo con meno frequenza. Per esempio, è possibile che le immagini non vengano visualizzate finché non le tocchi."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Attivare Risparmio dati?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Attiva"</string> - <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Per un minuto (fino alle ore {formattedTime})}other{Per # minuti (fino alle ore {formattedTime})}}"</string> - <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{Per 1 min (fino alle ore {formattedTime})}other{Per # min (fino alle ore {formattedTime})}}"</string> - <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{Per 1 ora (fino alle ore {formattedTime})}other{Per # ore (fino alle ore {formattedTime})}}"</string> - <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{Per 1 h (fino alle ore {formattedTime})}other{Per # h (fino alle ore {formattedTime})}}"</string> - <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Per un minuto}other{Per # minuti}}"</string> - <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{Per 1 min}other{Per # min}}"</string> - <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{Per 1 ora}other{Per # ore}}"</string> - <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{Per 1 h}other{Per # h}}"</string> + <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Per un minuto (fino alle ore {formattedTime})}many{Per # minuti (fino alle ore {formattedTime})}other{Per # minuti (fino alle ore {formattedTime})}}"</string> + <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{Per 1 min (fino alle ore {formattedTime})}many{Per # min (fino alle ore {formattedTime})}other{Per # min (fino alle ore {formattedTime})}}"</string> + <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{Per 1 ora (fino alle ore {formattedTime})}many{Per # ore (fino alle ore {formattedTime})}other{Per # ore (fino alle ore {formattedTime})}}"</string> + <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{Per 1 h (fino alle ore {formattedTime})}many{Per # h (fino alle ore {formattedTime})}other{Per # h (fino alle ore {formattedTime})}}"</string> + <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Per un minuto}many{Per # minuti}other{Per # minuti}}"</string> + <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{Per 1 min}many{Per # min}other{Per # min}}"</string> + <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{Per 1 ora}many{Per # ore}other{Per # ore}}"</string> + <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{Per 1 h}many{Per # h}other{Per # h}}"</string> <string name="zen_mode_until_next_day" msgid="1403042784161725038">"Fino a: <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string> <string name="zen_mode_until" msgid="2250286190237669079">"Fino a <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string> <string name="zen_mode_alarm" msgid="7046911727540499275">"Fino a <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (prossima sveglia)"</string> @@ -2000,7 +2001,7 @@ <string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Salva per Compilazione automatica"</string> <string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Impossibile compilare automaticamente i contenuti"</string> <string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Nessun suggerimento di Compilazione automatica"</string> - <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Un suggerimento di compilazione automatica}other{# suggerimenti di compilazione automatica}}"</string> + <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Un suggerimento di compilazione automatica}many{# suggerimenti di compilazione automatica}other{# suggerimenti di compilazione automatica}}"</string> <string name="autofill_save_title" msgid="7719802414283739775">"Vuoi salvare su "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string> <string name="autofill_save_title_with_type" msgid="3002460014579799605">"Vuoi salvare la <xliff:g id="TYPE">%1$s</xliff:g> su "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string> <string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Vuoi salvare <xliff:g id="TYPE_0">%1$s</xliff:g> e <xliff:g id="TYPE_1">%2$s</xliff:g> su "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string> @@ -2110,7 +2111,7 @@ <string name="mime_type_presentation_ext" msgid="8761049335564371468">"Presentazione <xliff:g id="EXTENSION">%1$s</xliff:g>"</string> <string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Il Bluetooth rimane attivo durante l\'uso della modalità aereo"</string> <string name="car_loading_profile" msgid="8219978381196748070">"Caricamento"</string> - <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # file}other{{file_name} + # file}}"</string> + <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # file}many{{file_name} + # file}other{{file_name} + # file}}"</string> <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Nessuna persona consigliata per la condivisione"</string> <string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Elenco di app"</string> <string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"A questa app non è stata concessa l\'autorizzazione di registrazione, ma l\'app potrebbe acquisire l\'audio tramite questo dispositivo USB."</string> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index 40a3a7dcaf7e..7a460a334b68 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -607,8 +607,7 @@ <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> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"בוצעו יותר מדי ניסיונות. יש להשתמש בנעילת המסך במקום זאת."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"כדאי לנסות שוב."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"לא נסרקו טביעות אצבע."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"במכשיר הזה אין חיישן טביעות אצבע."</string> @@ -637,7 +636,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"צריך ליצור קשר עם ספק תיקונים."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"לא ניתן ליצור את התבנית לזיהוי הפנים. יש לנסות שוב."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"בהירה מדי. צריך תאורה עדינה יותר."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"כדאי לנסות בתאורה חזקה יותר"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"צריך להרחיק את הטלפון"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"צריך לקרב את הטלפון"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"צריך להגביה את הטלפון"</string> @@ -1613,7 +1613,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"טלוויזיה"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"טלפון"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"רמקולים של מעגן"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"אוזניות"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"מערכת"</string> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index b1373c6876da..cf8521f84b7b 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -605,8 +605,7 @@ <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> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"試行回数が上限を超えました。代わりに画面ロックを使用してください。"</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"もう一度お試しください。"</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"指紋が登録されていません。"</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"このデバイスには指紋認証センサーがありません。"</string> @@ -635,7 +634,7 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"修理業者に調整を依頼してください。"</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"顔モデルを作成できません。もう一度お試しください。"</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"明るすぎます。もっと暗い場所でお試しください。"</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"もっと明るい場所でお試しください"</string> + <string name="face_acquired_too_dark" msgid="8539853432479385326">"十分な光がありません"</string> <string name="face_acquired_too_close" msgid="4453646176196302462">"スマートフォンをもっと離してください"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"スマートフォンをもっと近づけてください"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"スマートフォンをもっと上げてください"</string> @@ -1611,7 +1610,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"テレビ"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"モバイル デバイス"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"ホルダーのスピーカー"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"ヘッドホン"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"システム"</string> diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml index 090fc1fb5271..ae14cc9ac6ae 100644 --- a/core/res/res/values-ka/strings.xml +++ b/core/res/res/values-ka/strings.xml @@ -605,8 +605,7 @@ <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> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"მეტისმეტად ბევრი მცდელობა იყო. სანაცვლოდ გამოიყენეთ ეკრანის დაბლოკვა."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"ხელახლა სცადეთ"</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"თითის ანაბეჭდები რეგისტრირებული არ არის."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"ამ მოწყობილობას არ აქვს თითის ანაბეჭდის სენსორი."</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"ეწვიეთ შეკეთების სერვისის პროვაიდერს."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"თქვენი სახის მოდელი ვერ იქმნება. ცადეთ ხელახლა."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"მეტისმეტად ნათელია. ცადეთ უფრო სუსტი განათება."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"ცადეთ უფრო ძლიერი განათება"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"გაწიეთ ტელეფონი უფრო შორს"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"მიიტანეთ ტელეფონი უფრო ახლოს"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"აწიეთ ტელეფონი ზემოთ"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"ტელევიზია"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"ტელეფონი"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"სპიკერების მიმაგრება"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"ყურსასმენები"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"სისტემა"</string> diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml index afd0bf86afd1..54edba31e8da 100644 --- a/core/res/res/values-kk/strings.xml +++ b/core/res/res/values-kk/strings.xml @@ -635,7 +635,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Жөндеу қызметіне барыңыз."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Бет үлгісі жасалмады. Қайталап көріңіз."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Тым ашық. Күңгірттеу жарық керек."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Жарық деңгейін арттырыңыз."</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Телефонды алшақ ұстаңыз."</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Телефонды жақынырақ ұстаңыз."</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Телефонды жоғарырақ ұстаңыз."</string> @@ -1611,7 +1612,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"ТД"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Телефон"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Үндеткіштерді қондыру"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Құлақаспаптар"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"Жүйе"</string> diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml index a878eb308e05..0d3d07dc3bee 100644 --- a/core/res/res/values-km/strings.xml +++ b/core/res/res/values-km/strings.xml @@ -605,8 +605,7 @@ <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> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"ព្យាយាមច្រើនដងពេក។ សូមប្រើការចាក់សោអេក្រង់ជំនួសវិញ។"</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"ព្យាយាមម្ដងទៀត។"</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"មិនមានការចុះឈ្មោះស្នាមម្រាមដៃទេ។"</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"ឧបករណ៍នេះមិនមានឧបករណ៍ចាប់ស្នាមម្រាមដៃទេ។"</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"ទាក់ទងក្រុមហ៊ុនផ្ដល់ការជួសជុល។"</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"មិនអាចបង្កើតគំរូមុខរបស់អ្នកបានទេ។ សូមព្យាយាមម្ដងទៀត។"</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"ភ្លឺពេក។ សូមសាកល្បងប្រើពន្លឺស្រាលជាងនេះ។"</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"សាកល្បងប្រើពន្លឺភ្លឺជាងនេះ"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"ដាក់ទូរសព្ទឱ្យឆ្ងាយជាងមុន"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"ដាក់ទូរសព្ទឱ្យជិតជាងមុន"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"ដាក់ទូរសព្ទឱ្យខ្ពស់ជាងមុន"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"ទូរទស្សន៍"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"ទូរសព្ទ"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"ភ្ជាប់អូប៉ាល័រ"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"កាស"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"ប្រព័ន្ធ"</string> diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml index 1bcc7051e373..9925a261ad8a 100644 --- a/core/res/res/values-kn/strings.xml +++ b/core/res/res/values-kn/strings.xml @@ -605,8 +605,7 @@ <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> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"ಹಲವು ಬಾರಿ ಪ್ರಯತ್ನಿಸಿದ್ದೀರಿ. ಬದಲಾಗಿ ಪರದೆಲಾಕ್ ಬಳಸಿ."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"ಯಾವುದೇ ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಅನ್ನು ನೋಂದಣಿ ಮಾಡಿಲ್ಲ."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"ಈ ಸಾಧನವು ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಸೆನ್ಸರ್ ಅನ್ನು ಹೊಂದಿಲ್ಲ."</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"ರಿಪೇರಿ ಮಾಡುವವರನ್ನು ಸಂಪರ್ಕಿಸಿ."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"ಫೇಸ್ ಮಾಡೆಲ್ ರಚಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಪುನಃ ಪ್ರಯತ್ನಿಸಿ."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"ತುಂಬಾ ಪ್ರಕಾಶಮಾನವಾಗಿದೆ ಮಂದ ಪ್ರಕಾಶಮಾನವಿರುವ ಲೈಟ್ ಬಳಸಿ"</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"ಪ್ರಕಾಶಮಾನವಾದ ಲೈಟಿಂಗ್ ಬಳಸಿ"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"ಫೋನ್ ಅನ್ನು ದೂರಕ್ಕೆ ಸರಿಸಿ"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"ಫೋನ್ ಅನ್ನು ಸಮೀಪಕ್ಕೆ ತನ್ನಿ"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"ಫೋನ್ ಅನ್ನು ಮೇಲಕ್ಕೆ ಎತ್ತಿ ಹಿಡಿಯಿರಿ."</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"ಟಿವಿ"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"ಫೋನ್"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"ಡಾಕ್ ಸ್ಪೀಕರ್ಗಳು"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"ಹೆಡ್ಫೋನ್ಗಳು"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"ಸಿಸ್ಟಂ"</string> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index a08d2aa0c946..40c545fd2ea4 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -605,8 +605,7 @@ <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> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"시도 횟수가 너무 많습니다. 화면 잠금을 대신 사용하세요."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"다시 시도해 보세요."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"등록된 지문이 없습니다."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"기기에 지문 센서가 없습니다."</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"수리업체에 방문하세요."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"얼굴 모델을 만들 수 없습니다. 다시 시도해 주세요."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"너무 밝습니다. 조명 밝기를 조금 낮춰보세요."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"조명을 밝게 해 보세요."</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"휴대전화를 얼굴에서 더 멀리 떨어뜨려 주세요."</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"휴대전화를 얼굴에 더 가까이 가져와 주세요."</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"휴대전화를 위로 이동하세요"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"TV"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"휴대전화"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"도크 스피커"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"헤드폰"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"시스템"</string> diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml index 7572c4b622b3..f27b0d63fecf 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -605,8 +605,7 @@ <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> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Өтө көп жолу аракет кылдыңыз. Экранды кулпулоо функциясын колдонуңуз."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Кайра бир аракеттениңиз."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Бир да манжа изи катталган эмес."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Бул түзмөктө манжа изинин сенсору жок."</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Тейлөө кызматына кайрылыңыз."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Жүзүңүздүн үлгүсү түзүлгөн жок. Кайталаңыз."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Өтө жарык. Жарыктыкты азайтып көрүңүз."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Жарыгыраак жерге туруңуз"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Телефонду алыстатыңыз"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Телефонду жакындатыңыз"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Телефонду жогору жылдырыңыз"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"Сыналгы"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Телефон"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Аудио док бекет"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Кулакчын"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"Тутум"</string> diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml index 8bfe9e2cb098..7c9f8154a42f 100644 --- a/core/res/res/values-lo/strings.xml +++ b/core/res/res/values-lo/strings.xml @@ -605,8 +605,7 @@ <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> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"ພະຍາຍາມຫຼາຍເທື່ອເກີນໄປ. ກະລຸນາໃຊ້ການລອກໜ້າຈໍແທນ."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"ລອງໃໝ່ອີກຄັ້ງ."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"ບໍ່ມີການລົງທະບຽນລາຍນິ້ວມື."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"ອຸປະກອນນີ້ບໍ່ມີເຊັນເຊີລາຍນິ້ວມື."</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"ກະລຸນາໄປຫາຜູ້ໃຫ້ບໍລິການສ້ອມແປງ."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"ບໍ່ສາມາດສ້າງຮູບແບບໃບໜ້າຂອງທ່ານໄດ້. ກະລຸນາລອງໃໝ່."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"ແຈ້ງເກີນໄປ. ລອງຄ່ອຍແສງໄຟລົງ."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"ກະລຸນາລອງໃຊ້ສະພາບແສງທີ່ແຈ້ງຂຶ້ນ"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"ເລື່ອນໂທລະສັບອອກໄປໄກຂຶ້ນ"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"ເລື່ອນໂທລະສັບເຂົ້າໄປໃກ້ຂຶ້ນ"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"ຍົກໂທລະສັບໃຫ້ສູງຂຶ້ນ"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"ໂທລະພາບ"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"ໂທລະສັບ"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"ບ່ອນຕັ້ງລຳໂພງ"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"ຫູຟັງ"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"ລະບົບ"</string> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index afa77e684b9b..2954f9c192c1 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -607,8 +607,7 @@ <string name="fingerprint_error_canceled" msgid="540026881380070750">"Piršto antspaudo operacija atšaukta."</string> <string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Piršto antspaudo operaciją atšaukė naudotojas."</string> <string name="fingerprint_error_lockout" msgid="7853461265604738671">"Per daug bandymų. Vėliau bandykite dar kartą."</string> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Per daug bandymų. Naudokite ekrano užraktą."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Bandykite dar kartą."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Neužregistruota jokių kontrolinių kodų."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Šiame įrenginyje nėra kontrolinio kodo jutiklio."</string> @@ -637,7 +636,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Apsilankykite pas taisymo paslaugos teikėją."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Nepavyko sukurti veido modelio. Band. dar kartą."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Per šviesu. Išbandykite mažesnį apšvietimą."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Išbandykite šviesesnį apšvietimą"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Laikykite telefoną toliau"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Laikykite telefoną arčiau"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Laikykite telefoną aukščiau"</string> @@ -1613,7 +1613,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"TV"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Telefonas"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Doko garsiakalbiai"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Ausinės"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"Sistema"</string> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index d44c435fe370..853a490c9d39 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -606,8 +606,7 @@ <string name="fingerprint_error_canceled" msgid="540026881380070750">"Nospieduma darbība neizdevās."</string> <string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Lietotājs atcēla pirksta nospieduma darbību."</string> <string name="fingerprint_error_lockout" msgid="7853461265604738671">"Pārāk daudz mēģinājumu. Vēlāk mēģiniet vēlreiz."</string> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Pārāk daudz mēģinājumu. Izmantojiet ekrāna bloķēšanu."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Mēģiniet vēlreiz."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Nav reģistrēts neviens pirksta nospiedums."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Šajā ierīcē nav pirksta nospieduma sensora."</string> @@ -636,7 +635,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Sazinieties ar remonta pakalpojumu sniedzēju."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Nevar izveidot sejas modeli. Mēģiniet vēlreiz."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Pārāk spilgts. Izmēģiniet maigāku apgaismojumu."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Izmēģiniet spožāku apgaismojumu"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Pārvietojiet tālruni tālāk."</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Pārvietojiet tālruni tuvāk."</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Paceliet tālruni augstāk."</string> @@ -1612,7 +1612,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"TV"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Tālrunis"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Doka skaļruņi"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Austiņas"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"Sistēma"</string> diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml index e74bc07084cb..9ce43d1e74ad 100644 --- a/core/res/res/values-mk/strings.xml +++ b/core/res/res/values-mk/strings.xml @@ -605,8 +605,7 @@ <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> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Премногу обиди. Користете заклучување екран."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Обидете се повторно."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Не се запишани отпечатоци."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Уредов нема сензор за отпечатоци."</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Однесете го на поправка."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Не може да создаде модел на лик. Обидете се пак."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Премногу светла. Пробајте со послабо осветлување."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Пробајте со посилно осветлување"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Оддалечете го телефонот"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Доближете го телефонот"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Кренете го телефонот погоре"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"Телевизор"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Телефон"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Приклучи звучници"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Слушалки"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"Систем"</string> diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml index 70b706a2ba3b..c71047d421f2 100644 --- a/core/res/res/values-ml/strings.xml +++ b/core/res/res/values-ml/strings.xml @@ -605,8 +605,7 @@ <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> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"നിരവധി ശ്രമങ്ങൾ. പകരം സ്ക്രീൻ ലോക്ക് ഉപയോഗിക്കുക."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"വീണ്ടും ശ്രമിക്കൂ."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"വിരലടയാളങ്ങൾ എൻറോൾ ചെയ്തിട്ടില്ല."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"ഈ ഉപകരണത്തിൽ ഫിംഗർപ്രിന്റ് സെൻസറില്ല."</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"റിപ്പയർ കേന്ദ്രം സന്ദർശിക്കുക."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"മുഖ മോഡൽ സൃഷ്ടിക്കാനാകുന്നില്ല. വീണ്ടും ശ്രമിക്കൂ."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"വളരെയധികം തെളിച്ചം. സൗമ്യതയേറിയ പ്രകാശം ശ്രമിക്കൂ."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"കൂടുതൽ വെളിച്ചമുള്ളയിടത്ത് പരീക്ഷിച്ച് നോക്കൂ"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"ഫോൺ കൂടുതൽ ദൂരേയ്ക്ക് നീക്കുക"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"ഫോൺ അടുത്തേക്ക് നീക്കുക"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"ഫോൺ മുകളിലേക്ക് ഉയർത്തുക"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"ടിവി"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"ഫോണ്"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"ഡോക്ക് സ്പീക്കറുകൾ"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"ഹെഡ്ഫോണുകൾ"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"സിസ്റ്റം"</string> diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml index 4e50f56759c9..417500db62c3 100644 --- a/core/res/res/values-mn/strings.xml +++ b/core/res/res/values-mn/strings.xml @@ -605,8 +605,7 @@ <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> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Хэт олон удаа оролдлоо. Оронд нь дэлгэцийн түгжээ ашиглана уу."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Дахин оролдно уу."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Бүртгүүлсэн хурууны хээ алга."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Энэ төхөөрөмжид хурууны хээ мэдрэгч алга."</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Засварын үйлчилгээ үзүүлэгчид зочилно уу."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Нүүрний загвар үүсгэж чадсангүй. Дахин оролдоно уу."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Хэт цайвар байна. Гэрэл багатай газар оролдоно уу."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Гэрэлтэй орчинд туршина уу"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Утсаа холдуулна уу"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Утсаа ойртуулна уу"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Утсаа дээшлүүлнэ үү"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"Tелевиз"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Утас"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Чанга яригчийг суулгах"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Чихэвч"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"Систем"</string> diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml index 371f7766f782..f91a18f96466 100644 --- a/core/res/res/values-mr/strings.xml +++ b/core/res/res/values-mr/strings.xml @@ -605,8 +605,7 @@ <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> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"खूप जास्त प्रयत्न. त्याऐवजी स्क्रीन लॉक वापरा."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"पुन्हा प्रयत्न करा."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"कोणत्याही फिंगरप्रिंटची नोंद झाली नाही"</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"या डिव्हाइसमध्ये फिंगरप्रिंट सेन्सर नाही."</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"दुरुस्तीच्या सेवा पुरवठादाराला भेट द्या."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"फेस मॉडेल तयार करू शकत नाही. पुन्हा प्रयत्न करा."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"खूप प्रखर. आणखी सौम्य प्रकाश वापरून पहा."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"आणखी प्रखर प्रकाश वापरून पहा"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"फोन आणखी दूर हलवा"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"फोन आणखी जवळ हलवा"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"फोन आणखी वर हलवा"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"टीव्ही"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"फोन"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"स्पीकर डॉक करा"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"हेडफोन"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"सिस्टम"</string> diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml index 2179308d1e22..9b76a16c492c 100644 --- a/core/res/res/values-ms/strings.xml +++ b/core/res/res/values-ms/strings.xml @@ -605,8 +605,7 @@ <string name="fingerprint_error_canceled" msgid="540026881380070750">"Pengendalian cap jari dibatalkan."</string> <string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Pengendalian cap jari dibatalkan oleh pengguna."</string> <string name="fingerprint_error_lockout" msgid="7853461265604738671">"Terlalu banyak percubaan. Cuba sebentar lagi."</string> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Terlalu banyak percubaan. Gunakan kunci skrin."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Cuba lagi."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Tiada cap jari didaftarkan."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Peranti ini tiada penderia cap jari."</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Lawati penyedia pembaikan."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Tidak dapat membuat model wajah anda. Cuba lagi."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Terlalu terang. Cuba pencahayaan yang lebih lembut."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Cuba pencahayaan yang lebih cerah"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Jauhkan telefon"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Dekatkan telefon"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Tinggikan lagi telefon"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"TV"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Telefon"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Pembesar suara dok"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Fon kepala"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"Sistem"</string> diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml index ebaa96751d1a..87916c444458 100644 --- a/core/res/res/values-my/strings.xml +++ b/core/res/res/values-my/strings.xml @@ -605,8 +605,7 @@ <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> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"ကြိုးပမ်းမှုအကြိမ်ရေ များလွန်းသည်။ ဖန်သားပြင်လော့ခ်ချခြင်းကို အစားထိုးသုံးပါ။"</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"ပြန်ကြိုးစားပါ"</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"မည်သည့် လက်ဗွေကိုမျှ ထည့်သွင်းမထားပါ။"</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"ဤစက်တွင် လက်ဗွေအာရုံခံကိရိယာ မရှိပါ။"</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"ပြုပြင်ရေး ဝန်ဆောင်မှုပေးသူထံသို့ သွားပါ။"</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"သင့်မျက်နှာနမူနာ ပြုလုပ်၍မရပါ။ ထပ်စမ်းကြည့်ပါ။"</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"အလွန် လင်းသည်။ အလင်းလျှော့ကြည့်ပါ။"</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"ပိုလင်းအောင် လုပ်ကြည့်ပါ"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"ဖုန်းကို အဝေးသို့ခွာပါ"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"ဖုန်းကို အနားသို့ပိုတိုးပါ"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"ဖုန်းကို ပိုမြှင့်လိုက်ပါ"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"TV"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"ဖုန်း"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"အထိုင်ရှိသော စပီကာများ"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"နားကြပ်"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"စနစ်"</string> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index 120c08ad004d..e1015480d721 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -605,8 +605,7 @@ <string name="fingerprint_error_canceled" msgid="540026881380070750">"Fingeravtrykk-operasjonen ble avbrutt."</string> <string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Fingeravtrykk-operasjonen ble avbrutt av brukeren."</string> <string name="fingerprint_error_lockout" msgid="7853461265604738671">"For mange forsøk. Prøv på nytt senere."</string> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"For mange forsøk. Bruk skjermlås i stedet."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Prøv på nytt."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Ingen fingeravtrykk er registrert."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Denne enheten har ikke fingeravtrykkssensor."</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Gå til en reparasjonsleverandør."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Kan ikke lage ansiktsmodell. Prøv på nytt."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"For lyst. Prøv svakere belysning."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Prøv sterkere belysning"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Flytt telefonen lengre unna"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Flytt telefonen nærmere"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Flytt telefonen høyere"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"Google TV"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Telefon"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Dokkhøyttalere"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Hodetelefoner"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"System"</string> diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml index d8f8077ed430..b2bf381a3753 100644 --- a/core/res/res/values-ne/strings.xml +++ b/core/res/res/values-ne/strings.xml @@ -605,8 +605,7 @@ <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> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"निकै धेरै पटक प्रयास गरिसकिएको छ। बरु स्क्रिन लक प्रयोग गर्नुहोस्।"</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"पुन: प्रयास गर्नुहोला।"</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"कुनै पनि फिंगरप्रिन्ट दर्ता गरिएको छैन।"</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"यो डिभाइसमा कुनै पनि फिंगरप्रिन्ट सेन्सर छैन।"</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"फिंगरप्रिन्ट सेन्सर मर्मत गर्ने सेवा प्रदायक कम्पनीमा सम्पर्क गर्नुहोस्।"</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"तपाईंको फेस मोडेल सिर्जना गर्न सकिएन। फेरि प्रयास गर्नुहोस्।"</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"ज्यादै चम्किलो। अझ मधुरो प्रकाश प्रयोग गरी हेर्नु…"</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"अझ उज्यालो ठाउँमा गएर फोटो खिची हेर्नुहोस्"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"फोन अझै पर सार्नुहोस्"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"फोन अझै नजिक सार्नुहोस्"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"फोन अझ माथि उठाउनुहोस्"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"टिभी"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"फोन"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"डक स्पिकरहरू"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"हेडफोनहरू"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"प्रणाली"</string> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index 3ff13f6964d0..9811e2701b36 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -605,8 +605,7 @@ <string name="fingerprint_error_canceled" msgid="540026881380070750">"Vingerafdrukbewerking geannuleerd."</string> <string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Vingerafdrukverificatie geannuleerd door gebruiker."</string> <string name="fingerprint_error_lockout" msgid="7853461265604738671">"Te veel pogingen. Probeer het later opnieuw."</string> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Te veel pogingen. Gebruik in plaats daarvan de schermvergrendeling."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Probeer het opnieuw."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Geen vingerafdrukken geregistreerd."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Dit apparaat heeft geen vingerafdruksensor."</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Ga naar een reparateur."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Kan gezichtsmodel niet maken. Probeer het opnieuw."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Overbelicht. Probeer een minder felle belichting."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Probeer fellere verlichting"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Houd de telefoon verder weg"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Houd de telefoon dichterbij"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Houd de telefoon hoger"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"Tv"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Telefoon"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Dockluidsprekers"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Hoofdtelefoon"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"Systeem"</string> diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml index 29391d64129c..d3cbaeca1936 100644 --- a/core/res/res/values-or/strings.xml +++ b/core/res/res/values-or/strings.xml @@ -605,8 +605,7 @@ <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> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"ଅନେକଗୁଡ଼ିଏ ପ୍ରଚେଷ୍ଟା। ଏହା ପରିବର୍ତ୍ତେ ସ୍କ୍ରିନ ଲକ ବ୍ୟବହାର କରନ୍ତୁ।"</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।"</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"କୌଣସି ଆଙ୍ଗୁଠି ଚିହ୍ନ ପଞ୍ଜୀକୃତ ହୋଇନାହିଁ।"</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"ଏହି ଡିଭାଇସ୍ରେ ଟିପଚିହ୍ନ ସେନ୍ସର୍ ନାହିଁ।"</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"ଏକ ମରାମତି କେନ୍ଦ୍ରକୁ ଭିଜିଟ୍ କରନ୍ତୁ।"</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"ଫେସର ମଡେଲ ତିଆରି କରାଯାଇପାରିବ ନାହିଁ। ପୁଣି ଚେଷ୍ଟା କର।"</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"ଅତ୍ୟଧିକ ଉଜ୍ଵଳ। କମ୍ ଉଜ୍ବଳକରଣରେ ଚେଷ୍ଟା କରନ୍ତୁ।"</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"ଉଜ୍ଜ୍ୱଳ ଲାଇଟ ବ୍ୟବହାର କରି ଦେଖନ୍ତୁ"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"ଫୋନକୁ ଟିକେ ଦୂରକୁ ନିଅନ୍ତୁ"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"ଫୋନକୁ ପାଖକୁ ଆଣନ୍ତୁ"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"ଫୋନକୁ ଉପରକୁ ମୁଭ କରନ୍ତୁ"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"TV"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"ଫୋନ"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"ଡକ୍ ସ୍ପିକର୍"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"ହେଡଫୋନ୍"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"ସିଷ୍ଟମ"</string> @@ -2044,7 +2044,7 @@ <string name="shortcut_restore_signature_mismatch" msgid="579345304221605479">"ଶର୍ଟକଟ୍ ରିଷ୍ଟୋର୍ କରିହେଲା ନାହିଁ, କାରଣ ଏହି ଆପ୍ର ସ୍ୱାକ୍ଷର ମେଳ ହେଉନାହିଁ"</string> <string name="shortcut_restore_unknown_issue" msgid="2478146134395982154">"ଶର୍ଟକଟ୍ ରିଷ୍ଟୋର୍ କରିହେଲା ନାହିଁ"</string> <string name="shortcut_disabled_reason_unknown" msgid="753074793553599166">"ଶର୍ଟକଟ୍ ଅକ୍ଷମ କରାଯାଇଛି"</string> - <string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"ଅନଇନଷ୍ଟଲ୍ କରନ୍ତୁ"</string> + <string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"ଅନଇନଷ୍ଟଲ କରନ୍ତୁ"</string> <string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"କୌଣସିମତେ ଖୋଲନ୍ତୁ"</string> <string name="harmful_app_warning_title" msgid="8794823880881113856">"ହାନିକାରକ ଆପ୍ ଚିହ୍ନଟ ହୋଇଛି"</string> <string name="log_access_confirmation_title" msgid="2343578467290592708">"ସମସ୍ତ ଡିଭାଇସ ଲଗକୁ ଆକ୍ସେସ କରିବା ପାଇଁ <xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g>କୁ ଅନୁମତି ଦେବେ?"</string> diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml index 0433cf4e7195..2ffeef46abb9 100644 --- a/core/res/res/values-pa/strings.xml +++ b/core/res/res/values-pa/strings.xml @@ -605,8 +605,7 @@ <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> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"ਬਹੁਤ ਸਾਰੀਆਂ ਕੋਸ਼ਿਸ਼ਾਂ। ਇਸਦੀ ਬਜਾਏ ਸਕ੍ਰੀਨ ਲਾਕ ਵਰਤੋ।"</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"ਕੋਈ ਫਿੰਗਰਪ੍ਰਿੰਟ ਦਰਜ ਨਹੀਂ ਕੀਤੇ ਗਏ।"</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"ਇਸ ਡੀਵਾਈਸ ਵਿੱਚ ਫਿੰਗਰਪ੍ਰਿੰਟ ਸੈਂਸਰ ਨਹੀਂ ਹੈ।"</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"ਮੁਰੰਮਤ ਪ੍ਰਦਾਨਕ \'ਤੇ ਜਾਓ।"</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"ਤੁਹਾਡੇ ਚਿਹਰੇ ਦਾ ਮਾਡਲ ਨਹੀਂ ਬਣਿਆ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"ਬਹੁਤ ਜ਼ਿਆਦਾ ਚਮਕ। ਹਲਕੀ ਚਮਕ ਵਰਤ ਕੇ ਦੇਖੋ।"</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"ਤੇਜ਼ ਰੋਸ਼ਨੀ ਕਰ ਕੇ ਦੇਖੋ"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"ਫ਼ੋਨ ਨੂੰ ਦੂਰ ਲਿਜਾਓ"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"ਫ਼ੋਨ ਨੇੜੇ ਲਿਜਾਓ"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"ਫ਼ੋਨ ਨੂੰ ਥੋੜ੍ਹਾ ਉੱਤੇ ਲਿਜਾਓ"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"TV"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"ਫ਼ੋਨ ਕਰੋ"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"ਡੌਕ ਸਪੀਕਰਸ"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"ਹੈੱਡਫ਼ੋਨ"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"ਸਿਸਟਮ"</string> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index ed1e709064af..88b54b0671e9 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -607,8 +607,7 @@ <string name="fingerprint_error_canceled" msgid="540026881380070750">"Odczyt odcisku palca został anulowany."</string> <string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Odczyt odcisku palca został anulowany przez użytkownika."</string> <string name="fingerprint_error_lockout" msgid="7853461265604738671">"Zbyt wiele prób. Spróbuj ponownie później."</string> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Zbyt wiele prób. Użyj blokady ekranu."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Spróbuj ponownie."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Nie zarejestrowano odcisków palców."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"To urządzenie nie jest wyposażone w czytnik linii papilarnych."</string> @@ -637,7 +636,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Odwiedź serwis."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Nie można utworzyć modelu twarzy. Spróbuj ponownie."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Zbyt jasno. Spróbuj przy słabszym świetle."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Spróbuj w jaśniejszym świetle"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Odsuń telefon"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Przybliż telefon"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Przesuń telefon wyżej"</string> @@ -1613,7 +1613,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"Telewizor"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Telefon"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Głośniki stacji dokującej"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Słuchawki"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"System"</string> diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index ce63b94f29e3..7d5721a893e0 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -47,6 +47,7 @@ <string name="enablePin" msgid="2543771964137091212">"Falha. Ative o bloqueio do chip/R-UIM."</string> <plurals name="pinpuk_attempts" formatted="false" msgid="1619867269012213584"> <item quantity="one">Tentativas restantes: <xliff:g id="NUMBER_1">%d</xliff:g>. Caso o código correto não seja digitado, o chip será bloqueado.</item> + <item quantity="many">You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts before SIM is locked.</item> <item quantity="other">Tentativas restantes: <xliff:g id="NUMBER_1">%d</xliff:g>. Caso o código correto não seja digitado, o chip será bloqueado.</item> </plurals> <string name="imei" msgid="2157082351232630390">"IMEI"</string> @@ -175,7 +176,7 @@ <string name="low_memory" product="watch" msgid="3479447988234030194">"Armazenamento do relógio cheio. Exclua alguns arquivos para liberar espaço."</string> <string name="low_memory" product="tv" msgid="6663680413790323318">"O armazenamento do dispositivo Android TV está cheio. Exclua alguns arquivos para liberar espaço."</string> <string name="low_memory" product="default" msgid="2539532364144025569">"O armazenamento do telefone está cheio. Exclua alguns arquivos para liberar espaço."</string> - <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Autoridade certificadora instalada}one{Autoridade certificadora instalada}other{Autoridades certificadoras instaladas}}"</string> + <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Autoridade certificadora instalada}one{Autoridade certificadora instalada}many{Autoridades certificadoras instaladas}other{Autoridades certificadoras instaladas}}"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Por terceiros desconhecidos"</string> <string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Pelo administrador do seu perfil de trabalho"</string> <string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"Por <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string> @@ -249,7 +250,7 @@ <string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Use este recurso na maioria das circunstâncias. Ele permite que você acompanhe o progresso do relatório, informe mais detalhes sobre o problema e faça capturas de tela. É possível que ele omita algumas seções menos utilizadas que levam muito tempo na emissão dos relatórios."</string> <string name="bugreport_option_full_title" msgid="7681035745950045690">"Relatório completo"</string> <string name="bugreport_option_full_summary" msgid="1975130009258435885">"Use esta opção para ter o mínimo de interferência do sistema quando seu dispositivo não estiver respondendo ou estiver muito lento, ou quando você precisar de todas as seções de relatórios. Ela não permite que você informe mais detalhes ou faça capturas de tela adicionais."</string> - <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Capturas de tela para o relatório do bug vão ser feitas em # segundo.}one{Capturas de tela para o relatório do bug vão ser feitas em # segundo.}other{Capturas de tela para o relatório do bug vão ser feitas em # segundos.}}"</string> + <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Capturas de tela para o relatório do bug vão ser feitas em # segundo.}one{Capturas de tela para o relatório do bug vão ser feitas em # segundo.}many{Capturas de tela para o relatório do bug vão ser feitas em # segundos.}other{Capturas de tela para o relatório do bug vão ser feitas em # segundos.}}"</string> <string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Captura de tela com o relatório do bug concluída"</string> <string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Falha ao capturar a tela com o relatório do bug"</string> <string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Modo silencioso"</string> @@ -605,8 +606,7 @@ <string name="fingerprint_error_canceled" msgid="540026881380070750">"Operação de impressão digital cancelada."</string> <string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Operação de impressão digital cancelada pelo usuário."</string> <string name="fingerprint_error_lockout" msgid="7853461265604738671">"Excesso de tentativas. Tente novamente mais tarde."</string> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Excesso de tentativas. Use o bloqueio de tela."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Tente novamente."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Nenhuma impressão digital registrada."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Este dispositivo não tem um sensor de impressão digital."</string> @@ -635,7 +635,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Entre em contato com uma assistência técnica."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Falha ao criar o modelo de rosto. Tente de novo."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Muito iluminado. Diminua a iluminação."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Use uma iluminação mais intensa"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Afaste o smartphone"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Aproxime o smartphone do seu rosto"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Mova o smartphone para cima"</string> @@ -1085,7 +1086,7 @@ <string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> quer ativar o Explorar por toque. Com ele, você pode ouvir ou ver descrições do que está sob seu dedo e interagir com o telefone por gestos."</string> <string name="oneMonthDurationPast" msgid="4538030857114635777">"1 mês atrás"</string> <string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Antes de 1 mês atrás"</string> - <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{No último # dia}one{No último # dia}other{Nos últimos # dias}}"</string> + <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{No último # dia}one{No último # dia}many{Nos últimos # dias}other{Nos últimos # dias}}"</string> <string name="last_month" msgid="1528906781083518683">"Mês passado"</string> <string name="older" msgid="1645159827884647400">"Mais antigos"</string> <string name="preposition_for_date" msgid="2780767868832729599">"em <xliff:g id="DATE">%s</xliff:g>"</string> @@ -1112,14 +1113,14 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"em <xliff:g id="COUNT">%d</xliff:g>h"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"em <xliff:g id="COUNT">%d</xliff:g> dias"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"em <xliff:g id="COUNT">%d</xliff:g>a"</string> - <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# minuto atrás}one{# minuto atrás}other{# minutos atrás}}"</string> - <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# hora atrás}one{# hora atrás}other{# horas atrás}}"</string> - <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# dia atrás}one{# dia atrás}other{# dias atrás}}"</string> - <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# ano atrás}one{# ano atrás}other{# anos atrás}}"</string> - <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# minuto}one{# minuto}other{# minutos}}"</string> - <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# hora}one{# hora}other{# horas}}"</string> - <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# dia}one{# dia}other{# dias}}"</string> - <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# ano}one{# ano}other{# anos}}"</string> + <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# minuto atrás}one{# minuto atrás}many{# minutos atrás}other{# minutos atrás}}"</string> + <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# hora atrás}one{# hora atrás}many{# horas atrás}other{# horas atrás}}"</string> + <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# dia atrás}one{# dia atrás}many{# dias atrás}other{# dias atrás}}"</string> + <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# ano atrás}one{# ano atrás}many{# anos atrás}other{# anos atrás}}"</string> + <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# minuto}one{# minuto}many{# minutos}other{# minutos}}"</string> + <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# hora}one{# hora}many{# horas}other{# horas}}"</string> + <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# dia}one{# dia}many{# dias}other{# dias}}"</string> + <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# ano}one{# ano}many{# anos}other{# anos}}"</string> <string name="VideoView_error_title" msgid="5750686717225068016">"Problema com o vídeo"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Este vídeo não é válido para transmissão neste dispositivo."</string> <string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Não é possível reproduzir este vídeo."</string> @@ -1168,7 +1169,7 @@ <string name="not_checked" msgid="7972320087569023342">"não marcado"</string> <string name="selected" msgid="6614607926197755875">"selecionado"</string> <string name="not_selected" msgid="410652016565864475">"não selecionado"</string> - <string name="rating_label" msgid="1837085249662154601">"{rating,plural, =1{1 de {max} estrelas}one{# de {max} estrelas}other{# de {max} estrelas}}"</string> + <string name="rating_label" msgid="1837085249662154601">"{rating,plural, =1{1 de {max} estrelas}one{# de {max} estrelas}many{# de {max} estrelas}other{# de {max} estrelas}}"</string> <string name="in_progress" msgid="2149208189184319441">"em andamento"</string> <string name="whichApplication" msgid="5432266899591255759">"Complete a ação usando"</string> <string name="whichApplicationNamed" msgid="6969946041713975681">"Concluir a ação usando %1$s"</string> @@ -1507,7 +1508,7 @@ <string name="skip_button_label" msgid="3566599811326688389">"Pular"</string> <string name="no_matches" msgid="6472699895759164599">"Não encontrado"</string> <string name="find_on_page" msgid="5400537367077438198">"Localizar na página"</string> - <string name="matches_found" msgid="2296462299979507689">"{count,plural, =1{# correspondência}one{# de {total}}other{# de {total}}}"</string> + <string name="matches_found" msgid="2296462299979507689">"{count,plural, =1{# correspondência}one{# de {total}}many{# de {total}}other{# de {total}}}"</string> <string name="action_mode_done" msgid="2536182504764803222">"Concluído"</string> <string name="progress_erasing" msgid="6891435992721028004">"Limpando armazenamento compartilhado…"</string> <string name="share" msgid="4157615043345227321">"Compartilhar"</string> @@ -1611,7 +1612,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"TV"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Telefone"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Alto-falantes na base"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Fones de ouvido"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"Sistema"</string> @@ -1860,14 +1861,14 @@ <string name="data_saver_description" msgid="4995164271550590517">"Para ajudar a reduzir o uso de dados, a Economia de dados impede que alguns apps enviem ou recebam dados em segundo plano. Um app que você está usando no momento pode acessar dados, mas com menos frequência. Isso pode fazer com que imagens não apareçam até você tocar nelas."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Ativar a Economia de dados?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Ativar"</string> - <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Por um minuto (até {formattedTime})}one{Por # minuto (até {formattedTime})}other{Por # minutos (até {formattedTime})}}"</string> - <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{Por 1min (até {formattedTime})}one{Por #min (até {formattedTime})}other{Por #min (até {formattedTime})}}"</string> - <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{Por 1 hora (até {formattedTime})}one{Por # hora (até {formattedTime})}other{Por # horas (até {formattedTime})}}"</string> - <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{Por 1h (até {formattedTime})}one{Por #h (até {formattedTime})}other{Por #h (até {formattedTime})}}"</string> - <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Por um minuto}one{Por # minuto}other{Por # minutos}}"</string> - <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{Por 1min}one{Por #min}other{Por #min}}"</string> - <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{Por 1 hora}one{Por # hora}other{Por # horas}}"</string> - <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{Por 1h}one{Por #h}other{Por #h}}"</string> + <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Por um minuto (até {formattedTime})}one{Por # minuto (até {formattedTime})}many{Por # minutos (até {formattedTime})}other{Por # minutos (até {formattedTime})}}"</string> + <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{Por 1min (até {formattedTime})}one{Por #min (até {formattedTime})}many{Por #min (até {formattedTime})}other{Por #min (até {formattedTime})}}"</string> + <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{Por 1 hora (até {formattedTime})}one{Por # hora (até {formattedTime})}many{Por # horas (até {formattedTime})}other{Por # horas (até {formattedTime})}}"</string> + <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{Por 1h (até {formattedTime})}one{Por #h (até {formattedTime})}many{Por #h (até {formattedTime})}other{Por #h (até {formattedTime})}}"</string> + <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Por um minuto}one{Por # minuto}many{Por # minutos}other{Por # minutos}}"</string> + <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{Por 1min}one{Por #min}many{Por #min}other{Por #min}}"</string> + <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{Por 1 hora}one{Por # hora}many{Por # horas}other{Por # horas}}"</string> + <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{Por 1h}one{Por #h}many{Por #h}other{Por #h}}"</string> <string name="zen_mode_until_next_day" msgid="1403042784161725038">"Até <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string> <string name="zen_mode_until" msgid="2250286190237669079">"Até às <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string> <string name="zen_mode_alarm" msgid="7046911727540499275">"Até <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (próximo alarme)"</string> @@ -2000,7 +2001,7 @@ <string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Salvar no Preenchimento automático"</string> <string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Não é possível preencher os conteúdos automaticamente"</string> <string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Sem sugestões de preenchimento automático"</string> - <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Uma sugestão de preenchimento automático}one{# sugestão de preenchimento automático}other{# sugestões de preenchimento automático}}"</string> + <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Uma sugestão de preenchimento automático}one{# sugestão de preenchimento automático}many{# sugestões de preenchimento automático}other{# sugestões de preenchimento automático}}"</string> <string name="autofill_save_title" msgid="7719802414283739775">"Salvar em "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string> <string name="autofill_save_title_with_type" msgid="3002460014579799605">"Salvar <xliff:g id="TYPE">%1$s</xliff:g> em "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string> <string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Salvar <xliff:g id="TYPE_0">%1$s</xliff:g> e <xliff:g id="TYPE_1">%2$s</xliff:g> em "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string> @@ -2110,7 +2111,7 @@ <string name="mime_type_presentation_ext" msgid="8761049335564371468">"Apresentação em <xliff:g id="EXTENSION">%1$s</xliff:g>"</string> <string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"O Bluetooth permanecerá ativado no modo avião"</string> <string name="car_loading_profile" msgid="8219978381196748070">"Carregando"</string> - <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # arquivo}one{{file_name} + # arquivo}other{{file_name} + # arquivos}}"</string> + <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # arquivo}one{{file_name} + # arquivo}many{{file_name} + # arquivos}other{{file_name} + # arquivos}}"</string> <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Não há sugestões de pessoas para compartilhar"</string> <string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Lista de apps"</string> <string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Este app não tem permissão de gravação, mas pode capturar áudio pelo dispositivo USB."</string> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index 55cb68bf1e1f..1fe0db7a55c6 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -46,6 +46,7 @@ <string name="needPuk2" msgid="7032612093451537186">"Introduza o PUK2 para desbloquear o cartão SIM."</string> <string name="enablePin" msgid="2543771964137091212">"Ação sem êxito. Ative o bloqueio do SIM/RUIM."</string> <plurals name="pinpuk_attempts" formatted="false" msgid="1619867269012213584"> + <item quantity="many">You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts before SIM is locked.</item> <item quantity="other">Tem mais <xliff:g id="NUMBER_1">%d</xliff:g> tentativas antes de o cartão SIM ficar bloqueado.</item> <item quantity="one">Tem mais <xliff:g id="NUMBER_0">%d</xliff:g> tentativa antes de o cartão SIM ficar bloqueado.</item> </plurals> @@ -175,7 +176,7 @@ <string name="low_memory" product="watch" msgid="3479447988234030194">"O armazenamento de visualizações está cheio. Elimine alguns ficheiros para libertar espaço."</string> <string name="low_memory" product="tv" msgid="6663680413790323318">"O armazenamento do dispositivo Android TV está cheio. Elimine alguns ficheiros para libertar espaço."</string> <string name="low_memory" product="default" msgid="2539532364144025569">"O armazenamento do telemóvel está cheio. Elimine alguns ficheiros para libertar espaço."</string> - <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Autoridade de certificação instalada}other{Autoridades de certificação instaladas}}"</string> + <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Autoridade de certificação instalada}many{Autoridades de certificação instaladas}other{Autoridades de certificação instaladas}}"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Por um terceiro desconhecido"</string> <string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Pelo gestor do seu perfil de trabalho"</string> <string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"Por <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string> @@ -249,7 +250,7 @@ <string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Utilize esta opção na maioria das circunstâncias. Permite monitorizar o progresso do relatório, introduzir mais detalhes acerca do problema e tirar capturas de ecrã. Pode omitir algumas secções menos utilizadas que demoram muito tempo a comunicar."</string> <string name="bugreport_option_full_title" msgid="7681035745950045690">"Relatório completo"</string> <string name="bugreport_option_full_summary" msgid="1975130009258435885">"Utilize esta opção para uma interferência mínima do sistema quando o dispositivo não responder ou estiver demasiado lento, ou quando precisar de todas as secções de relatório. Não permite introduzir mais detalhes ou tirar capturas de ecrã adicionais."</string> - <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{A fazer uma captura de ecrã do relatório de erro dentro de # segundo.}other{A fazer uma captura de ecrã do relatório de erro dentro de # segundos.}}"</string> + <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{A fazer uma captura de ecrã do relatório de erro dentro de # segundo.}many{A fazer uma captura de ecrã do relatório de erro dentro de # segundos.}other{A fazer uma captura de ecrã do relatório de erro dentro de # segundos.}}"</string> <string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Captura de ecrã tirada com o relatório de erro."</string> <string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Falha ao fazer captura de ecrã com o relatório de erro."</string> <string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Modo silencioso"</string> @@ -605,8 +606,7 @@ <string name="fingerprint_error_canceled" msgid="540026881380070750">"Operação de impressão digital cancelada."</string> <string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Operação de impressão digital cancelada pelo utilizador."</string> <string name="fingerprint_error_lockout" msgid="7853461265604738671">"Demasiadas tentativas. Tente novamente mais tarde."</string> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Demasiadas tentativas. Em alternativa, use o bloqueio de ecrã."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Tente novamente."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Nenhuma impressão digital registada."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Este dispositivo não tem sensor de impressões digitais."</string> @@ -635,7 +635,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Visite um fornecedor de serviços de reparação."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Impossível criar modelo de rosto. Tente novamente."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Demasiado clara. Experimente uma luz mais suave."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Experimente um local com mais luz"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Afaste ainda mais o telemóvel"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Aproxime o telemóvel do rosto"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Mova o telemóvel mais para cima"</string> @@ -1085,7 +1086,7 @@ <string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> pretende ativar a funcionalidade Explorar Através do Toque. Quando a funcionalidade Explorar Através do Toque estiver ativada, pode ouvir ou visualizar descrições sobre o que está por baixo do seu dedo ou executar gestos para interagir com o telemóvel."</string> <string name="oneMonthDurationPast" msgid="4538030857114635777">"Há 1 mês"</string> <string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Há mais de 1 mês"</string> - <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{# dia anterior}other{# dias anteriores}}"</string> + <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{# dia anterior}many{# dias anteriores}other{# dias anteriores}}"</string> <string name="last_month" msgid="1528906781083518683">"Último mês"</string> <string name="older" msgid="1645159827884647400">"Mais antiga"</string> <string name="preposition_for_date" msgid="2780767868832729599">"a <xliff:g id="DATE">%s</xliff:g>"</string> @@ -1112,14 +1113,14 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"em <xliff:g id="COUNT">%d</xliff:g> h"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"em <xliff:g id="COUNT">%d</xliff:g> d"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"em <xliff:g id="COUNT">%d</xliff:g> a"</string> - <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Há # minuto}other{Há # minutos}}"</string> - <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Há # hora}other{Há # horas}}"</string> - <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Há # dia}other{Há # dias}}"</string> - <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{Há # ano}other{Há # anos}}"</string> - <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# minuto}other{# minutos}}"</string> - <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# hora}other{# horas}}"</string> - <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# dia}other{# dias}}"</string> - <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# ano}other{# anos}}"</string> + <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Há # minuto}many{Há # minutos}other{Há # minutos}}"</string> + <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Há # hora}many{Há # horas}other{Há # horas}}"</string> + <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Há # dia}many{Há # dias}other{Há # dias}}"</string> + <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{Há # ano}many{Há # anos}other{Há # anos}}"</string> + <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# minuto}many{# minutos}other{# minutos}}"</string> + <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# hora}many{# horas}other{# horas}}"</string> + <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# dia}many{# dias}other{# dias}}"</string> + <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# ano}many{# anos}other{# anos}}"</string> <string name="VideoView_error_title" msgid="5750686717225068016">"Problema com o vídeo"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Este vídeo não é válido para transmissão neste aparelho."</string> <string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Não é possível reproduzir este vídeo."</string> @@ -1168,7 +1169,7 @@ <string name="not_checked" msgid="7972320087569023342">"não selecionado"</string> <string name="selected" msgid="6614607926197755875">"selecionado"</string> <string name="not_selected" msgid="410652016565864475">"não selecionado"</string> - <string name="rating_label" msgid="1837085249662154601">"{rating,plural, =1{Uma estrela de {max}}other{# estrelas de {max}}}"</string> + <string name="rating_label" msgid="1837085249662154601">"{rating,plural, =1{Uma estrela de {max}}many{# estrelas de {max}}other{# estrelas de {max}}}"</string> <string name="in_progress" msgid="2149208189184319441">"em curso"</string> <string name="whichApplication" msgid="5432266899591255759">"Concluir ação utilizando"</string> <string name="whichApplicationNamed" msgid="6969946041713975681">"Concluir ação utilizando %1$s"</string> @@ -1507,7 +1508,7 @@ <string name="skip_button_label" msgid="3566599811326688389">"Ignorar"</string> <string name="no_matches" msgid="6472699895759164599">"Sem correspondências"</string> <string name="find_on_page" msgid="5400537367077438198">"Localizar na página"</string> - <string name="matches_found" msgid="2296462299979507689">"{count,plural, =1{# correspondência}other{# de {total}}}"</string> + <string name="matches_found" msgid="2296462299979507689">"{count,plural, =1{# correspondência}many{# de {total}}other{# de {total}}}"</string> <string name="action_mode_done" msgid="2536182504764803222">"Concluído"</string> <string name="progress_erasing" msgid="6891435992721028004">"A apagar o armazenamento partilhado…"</string> <string name="share" msgid="4157615043345227321">"Partilhar"</string> @@ -1611,7 +1612,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"TV"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Telemóvel"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Altif. estação ancoragem"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Auscultadores"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"Sistema"</string> @@ -1860,14 +1861,14 @@ <string name="data_saver_description" msgid="4995164271550590517">"Para ajudar a reduzir a utilização de dados, a Poupança de dados impede que algumas apps enviem ou recebam dados em segundo plano. Uma determinada app que esteja a utilizar atualmente pode aceder aos dados, mas é possível que o faça com menos frequência. Isto pode significar, por exemplo, que as imagens não são apresentadas até que toque nas mesmas."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Ativar a Poupança de dados?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Ativar"</string> - <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Durante um minuto (até à[s] {formattedTime})}other{Durante # minutos (até à[s] {formattedTime})}}"</string> - <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{Durante 1 min (até à[s] {formattedTime})}other{Durante # min (até à[s] {formattedTime})}}"</string> - <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{Durante 1 hora (até à[s] {formattedTime})}other{Durante # horas (até à[s] {formattedTime})}}"</string> - <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{Durante 1 h (até à[s] {formattedTime})}other{Durante # h (até à[s] {formattedTime})}}"</string> - <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Durante um minuto}other{Durante # minutos}}"</string> - <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{Durante 1 min}other{Durante # min}}"</string> - <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{Durante 1 hora}other{Durante # horas}}"</string> - <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{Durante 1 h}other{Durante # h}}"</string> + <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Durante um minuto (até à[s] {formattedTime})}many{Durante # minutos (até à[s] {formattedTime})}other{Durante # minutos (até à[s] {formattedTime})}}"</string> + <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{Durante 1 min (até à[s] {formattedTime})}many{Durante # min (até à[s] {formattedTime})}other{Durante # min (até à[s] {formattedTime})}}"</string> + <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{Durante 1 hora (até à[s] {formattedTime})}many{Durante # horas (até à[s] {formattedTime})}other{Durante # horas (até à[s] {formattedTime})}}"</string> + <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{Durante 1 h (até à[s] {formattedTime})}many{Durante # h (até à[s] {formattedTime})}other{Durante # h (até à[s] {formattedTime})}}"</string> + <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Durante um minuto}many{Durante # minutos}other{Durante # minutos}}"</string> + <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{Durante 1 min}many{Durante # min}other{Durante # min}}"</string> + <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{Durante 1 hora}many{Durante # horas}other{Durante # horas}}"</string> + <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{Durante 1 h}many{Durante # h}other{Durante # h}}"</string> <string name="zen_mode_until_next_day" msgid="1403042784161725038">"Até <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string> <string name="zen_mode_until" msgid="2250286190237669079">"Até às <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string> <string name="zen_mode_alarm" msgid="7046911727540499275">"Até <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (próximo alarme)"</string> @@ -2000,7 +2001,7 @@ <string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Guardar para o Preenchimento automático"</string> <string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Não é possível preencher automaticamente o conteúdo"</string> <string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Sem sugestões do preenchimento automático"</string> - <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Uma sugestão do preenchimento automático}other{# sugestões de preenchimento automático}}"</string> + <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Uma sugestão do preenchimento automático}many{# sugestões de preenchimento automático}other{# sugestões de preenchimento automático}}"</string> <string name="autofill_save_title" msgid="7719802414283739775">"Pretende guardar em "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string> <string name="autofill_save_title_with_type" msgid="3002460014579799605">"Pretende guardar <xliff:g id="TYPE">%1$s</xliff:g> em "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string> <string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Pretende guardar <xliff:g id="TYPE_0">%1$s</xliff:g> e <xliff:g id="TYPE_1">%2$s</xliff:g> em "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string> @@ -2110,7 +2111,7 @@ <string name="mime_type_presentation_ext" msgid="8761049335564371468">"Apresentação <xliff:g id="EXTENSION">%1$s</xliff:g>"</string> <string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"O Bluetooth continuará ativado durante o modo de avião."</string> <string name="car_loading_profile" msgid="8219978381196748070">"A carregar…"</string> - <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # ficheiro}other{{file_name} + # ficheiros}}"</string> + <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # ficheiro}many{{file_name} + # ficheiros}other{{file_name} + # ficheiros}}"</string> <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Não existem pessoas recomendadas com quem partilhar"</string> <string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Lista de aplicações"</string> <string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Esta app não recebeu autorização de gravação, mas pode capturar áudio através deste dispositivo USB."</string> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index ce63b94f29e3..7d5721a893e0 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -47,6 +47,7 @@ <string name="enablePin" msgid="2543771964137091212">"Falha. Ative o bloqueio do chip/R-UIM."</string> <plurals name="pinpuk_attempts" formatted="false" msgid="1619867269012213584"> <item quantity="one">Tentativas restantes: <xliff:g id="NUMBER_1">%d</xliff:g>. Caso o código correto não seja digitado, o chip será bloqueado.</item> + <item quantity="many">You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts before SIM is locked.</item> <item quantity="other">Tentativas restantes: <xliff:g id="NUMBER_1">%d</xliff:g>. Caso o código correto não seja digitado, o chip será bloqueado.</item> </plurals> <string name="imei" msgid="2157082351232630390">"IMEI"</string> @@ -175,7 +176,7 @@ <string name="low_memory" product="watch" msgid="3479447988234030194">"Armazenamento do relógio cheio. Exclua alguns arquivos para liberar espaço."</string> <string name="low_memory" product="tv" msgid="6663680413790323318">"O armazenamento do dispositivo Android TV está cheio. Exclua alguns arquivos para liberar espaço."</string> <string name="low_memory" product="default" msgid="2539532364144025569">"O armazenamento do telefone está cheio. Exclua alguns arquivos para liberar espaço."</string> - <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Autoridade certificadora instalada}one{Autoridade certificadora instalada}other{Autoridades certificadoras instaladas}}"</string> + <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Autoridade certificadora instalada}one{Autoridade certificadora instalada}many{Autoridades certificadoras instaladas}other{Autoridades certificadoras instaladas}}"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Por terceiros desconhecidos"</string> <string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Pelo administrador do seu perfil de trabalho"</string> <string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"Por <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string> @@ -249,7 +250,7 @@ <string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Use este recurso na maioria das circunstâncias. Ele permite que você acompanhe o progresso do relatório, informe mais detalhes sobre o problema e faça capturas de tela. É possível que ele omita algumas seções menos utilizadas que levam muito tempo na emissão dos relatórios."</string> <string name="bugreport_option_full_title" msgid="7681035745950045690">"Relatório completo"</string> <string name="bugreport_option_full_summary" msgid="1975130009258435885">"Use esta opção para ter o mínimo de interferência do sistema quando seu dispositivo não estiver respondendo ou estiver muito lento, ou quando você precisar de todas as seções de relatórios. Ela não permite que você informe mais detalhes ou faça capturas de tela adicionais."</string> - <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Capturas de tela para o relatório do bug vão ser feitas em # segundo.}one{Capturas de tela para o relatório do bug vão ser feitas em # segundo.}other{Capturas de tela para o relatório do bug vão ser feitas em # segundos.}}"</string> + <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Capturas de tela para o relatório do bug vão ser feitas em # segundo.}one{Capturas de tela para o relatório do bug vão ser feitas em # segundo.}many{Capturas de tela para o relatório do bug vão ser feitas em # segundos.}other{Capturas de tela para o relatório do bug vão ser feitas em # segundos.}}"</string> <string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Captura de tela com o relatório do bug concluída"</string> <string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Falha ao capturar a tela com o relatório do bug"</string> <string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Modo silencioso"</string> @@ -605,8 +606,7 @@ <string name="fingerprint_error_canceled" msgid="540026881380070750">"Operação de impressão digital cancelada."</string> <string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Operação de impressão digital cancelada pelo usuário."</string> <string name="fingerprint_error_lockout" msgid="7853461265604738671">"Excesso de tentativas. Tente novamente mais tarde."</string> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Excesso de tentativas. Use o bloqueio de tela."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Tente novamente."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Nenhuma impressão digital registrada."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Este dispositivo não tem um sensor de impressão digital."</string> @@ -635,7 +635,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Entre em contato com uma assistência técnica."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Falha ao criar o modelo de rosto. Tente de novo."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Muito iluminado. Diminua a iluminação."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Use uma iluminação mais intensa"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Afaste o smartphone"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Aproxime o smartphone do seu rosto"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Mova o smartphone para cima"</string> @@ -1085,7 +1086,7 @@ <string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> quer ativar o Explorar por toque. Com ele, você pode ouvir ou ver descrições do que está sob seu dedo e interagir com o telefone por gestos."</string> <string name="oneMonthDurationPast" msgid="4538030857114635777">"1 mês atrás"</string> <string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Antes de 1 mês atrás"</string> - <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{No último # dia}one{No último # dia}other{Nos últimos # dias}}"</string> + <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{No último # dia}one{No último # dia}many{Nos últimos # dias}other{Nos últimos # dias}}"</string> <string name="last_month" msgid="1528906781083518683">"Mês passado"</string> <string name="older" msgid="1645159827884647400">"Mais antigos"</string> <string name="preposition_for_date" msgid="2780767868832729599">"em <xliff:g id="DATE">%s</xliff:g>"</string> @@ -1112,14 +1113,14 @@ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"em <xliff:g id="COUNT">%d</xliff:g>h"</string> <string name="duration_days_shortest_future" msgid="3392722163935571543">"em <xliff:g id="COUNT">%d</xliff:g> dias"</string> <string name="duration_years_shortest_future" msgid="5537464088352970388">"em <xliff:g id="COUNT">%d</xliff:g>a"</string> - <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# minuto atrás}one{# minuto atrás}other{# minutos atrás}}"</string> - <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# hora atrás}one{# hora atrás}other{# horas atrás}}"</string> - <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# dia atrás}one{# dia atrás}other{# dias atrás}}"</string> - <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# ano atrás}one{# ano atrás}other{# anos atrás}}"</string> - <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# minuto}one{# minuto}other{# minutos}}"</string> - <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# hora}one{# hora}other{# horas}}"</string> - <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# dia}one{# dia}other{# dias}}"</string> - <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# ano}one{# ano}other{# anos}}"</string> + <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# minuto atrás}one{# minuto atrás}many{# minutos atrás}other{# minutos atrás}}"</string> + <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# hora atrás}one{# hora atrás}many{# horas atrás}other{# horas atrás}}"</string> + <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# dia atrás}one{# dia atrás}many{# dias atrás}other{# dias atrás}}"</string> + <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# ano atrás}one{# ano atrás}many{# anos atrás}other{# anos atrás}}"</string> + <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# minuto}one{# minuto}many{# minutos}other{# minutos}}"</string> + <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# hora}one{# hora}many{# horas}other{# horas}}"</string> + <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# dia}one{# dia}many{# dias}other{# dias}}"</string> + <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# ano}one{# ano}many{# anos}other{# anos}}"</string> <string name="VideoView_error_title" msgid="5750686717225068016">"Problema com o vídeo"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Este vídeo não é válido para transmissão neste dispositivo."</string> <string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Não é possível reproduzir este vídeo."</string> @@ -1168,7 +1169,7 @@ <string name="not_checked" msgid="7972320087569023342">"não marcado"</string> <string name="selected" msgid="6614607926197755875">"selecionado"</string> <string name="not_selected" msgid="410652016565864475">"não selecionado"</string> - <string name="rating_label" msgid="1837085249662154601">"{rating,plural, =1{1 de {max} estrelas}one{# de {max} estrelas}other{# de {max} estrelas}}"</string> + <string name="rating_label" msgid="1837085249662154601">"{rating,plural, =1{1 de {max} estrelas}one{# de {max} estrelas}many{# de {max} estrelas}other{# de {max} estrelas}}"</string> <string name="in_progress" msgid="2149208189184319441">"em andamento"</string> <string name="whichApplication" msgid="5432266899591255759">"Complete a ação usando"</string> <string name="whichApplicationNamed" msgid="6969946041713975681">"Concluir a ação usando %1$s"</string> @@ -1507,7 +1508,7 @@ <string name="skip_button_label" msgid="3566599811326688389">"Pular"</string> <string name="no_matches" msgid="6472699895759164599">"Não encontrado"</string> <string name="find_on_page" msgid="5400537367077438198">"Localizar na página"</string> - <string name="matches_found" msgid="2296462299979507689">"{count,plural, =1{# correspondência}one{# de {total}}other{# de {total}}}"</string> + <string name="matches_found" msgid="2296462299979507689">"{count,plural, =1{# correspondência}one{# de {total}}many{# de {total}}other{# de {total}}}"</string> <string name="action_mode_done" msgid="2536182504764803222">"Concluído"</string> <string name="progress_erasing" msgid="6891435992721028004">"Limpando armazenamento compartilhado…"</string> <string name="share" msgid="4157615043345227321">"Compartilhar"</string> @@ -1611,7 +1612,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"TV"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Telefone"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Alto-falantes na base"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Fones de ouvido"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"Sistema"</string> @@ -1860,14 +1861,14 @@ <string name="data_saver_description" msgid="4995164271550590517">"Para ajudar a reduzir o uso de dados, a Economia de dados impede que alguns apps enviem ou recebam dados em segundo plano. Um app que você está usando no momento pode acessar dados, mas com menos frequência. Isso pode fazer com que imagens não apareçam até você tocar nelas."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Ativar a Economia de dados?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Ativar"</string> - <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Por um minuto (até {formattedTime})}one{Por # minuto (até {formattedTime})}other{Por # minutos (até {formattedTime})}}"</string> - <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{Por 1min (até {formattedTime})}one{Por #min (até {formattedTime})}other{Por #min (até {formattedTime})}}"</string> - <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{Por 1 hora (até {formattedTime})}one{Por # hora (até {formattedTime})}other{Por # horas (até {formattedTime})}}"</string> - <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{Por 1h (até {formattedTime})}one{Por #h (até {formattedTime})}other{Por #h (até {formattedTime})}}"</string> - <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Por um minuto}one{Por # minuto}other{Por # minutos}}"</string> - <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{Por 1min}one{Por #min}other{Por #min}}"</string> - <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{Por 1 hora}one{Por # hora}other{Por # horas}}"</string> - <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{Por 1h}one{Por #h}other{Por #h}}"</string> + <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Por um minuto (até {formattedTime})}one{Por # minuto (até {formattedTime})}many{Por # minutos (até {formattedTime})}other{Por # minutos (até {formattedTime})}}"</string> + <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{Por 1min (até {formattedTime})}one{Por #min (até {formattedTime})}many{Por #min (até {formattedTime})}other{Por #min (até {formattedTime})}}"</string> + <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{Por 1 hora (até {formattedTime})}one{Por # hora (até {formattedTime})}many{Por # horas (até {formattedTime})}other{Por # horas (até {formattedTime})}}"</string> + <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{Por 1h (até {formattedTime})}one{Por #h (até {formattedTime})}many{Por #h (até {formattedTime})}other{Por #h (até {formattedTime})}}"</string> + <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Por um minuto}one{Por # minuto}many{Por # minutos}other{Por # minutos}}"</string> + <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{Por 1min}one{Por #min}many{Por #min}other{Por #min}}"</string> + <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{Por 1 hora}one{Por # hora}many{Por # horas}other{Por # horas}}"</string> + <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{Por 1h}one{Por #h}many{Por #h}other{Por #h}}"</string> <string name="zen_mode_until_next_day" msgid="1403042784161725038">"Até <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string> <string name="zen_mode_until" msgid="2250286190237669079">"Até às <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string> <string name="zen_mode_alarm" msgid="7046911727540499275">"Até <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (próximo alarme)"</string> @@ -2000,7 +2001,7 @@ <string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Salvar no Preenchimento automático"</string> <string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Não é possível preencher os conteúdos automaticamente"</string> <string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Sem sugestões de preenchimento automático"</string> - <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Uma sugestão de preenchimento automático}one{# sugestão de preenchimento automático}other{# sugestões de preenchimento automático}}"</string> + <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Uma sugestão de preenchimento automático}one{# sugestão de preenchimento automático}many{# sugestões de preenchimento automático}other{# sugestões de preenchimento automático}}"</string> <string name="autofill_save_title" msgid="7719802414283739775">"Salvar em "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string> <string name="autofill_save_title_with_type" msgid="3002460014579799605">"Salvar <xliff:g id="TYPE">%1$s</xliff:g> em "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string> <string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Salvar <xliff:g id="TYPE_0">%1$s</xliff:g> e <xliff:g id="TYPE_1">%2$s</xliff:g> em "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string> @@ -2110,7 +2111,7 @@ <string name="mime_type_presentation_ext" msgid="8761049335564371468">"Apresentação em <xliff:g id="EXTENSION">%1$s</xliff:g>"</string> <string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"O Bluetooth permanecerá ativado no modo avião"</string> <string name="car_loading_profile" msgid="8219978381196748070">"Carregando"</string> - <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # arquivo}one{{file_name} + # arquivo}other{{file_name} + # arquivos}}"</string> + <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # arquivo}one{{file_name} + # arquivo}many{{file_name} + # arquivos}other{{file_name} + # arquivos}}"</string> <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Não há sugestões de pessoas para compartilhar"</string> <string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Lista de apps"</string> <string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Este app não tem permissão de gravação, mas pode capturar áudio pelo dispositivo USB."</string> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 1e050e1ce7c5..27b04d6cf662 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -606,8 +606,7 @@ <string name="fingerprint_error_canceled" msgid="540026881380070750">"Operațiunea privind amprenta a fost anulată."</string> <string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Operațiunea privind amprenta a fost anulată de utilizator."</string> <string name="fingerprint_error_lockout" msgid="7853461265604738671">"Prea multe încercări. Încercați din nou mai târziu."</string> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Prea multe încercări. Folosește blocarea ecranului."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Încercați din nou."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Nu au fost înregistrate amprente."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Dispozitivul nu are senzor de amprentă."</string> @@ -636,7 +635,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Vizitați un furnizor de servicii de reparații."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Nu se poate crea modelul facial. Reîncercați."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Prea luminos. Încercați o lumină mai slabă."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Încercați o lumină mai puternică"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Mutați telefonul mai departe"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Mutați telefonul mai aproape"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Mutați telefonul mai sus"</string> @@ -1612,7 +1612,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"TV"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Telefon"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Difuz. dispozit. andocare"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Căști"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"Sistem"</string> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index 0f21c9002da5..2cceafc90b72 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -607,8 +607,7 @@ <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> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Слишком много попыток. Используйте другой способ разблокировки экрана."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Повторите попытку."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Нет отсканированных отпечатков пальцев"</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"На этом устройстве нет сканера отпечатков пальцев."</string> @@ -637,7 +636,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Обратитесь в сервисный центр."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Невозможно создать модель лица. Повторите попытку."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Слишком светло. Сделайте освещение менее ярким."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Сделайте освещение ярче"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Переместите телефон дальше от лица"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Переместите телефон ближе к лицу"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Переместите телефон выше"</string> @@ -1613,7 +1613,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"Телевизор"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Телефон"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Динамики док-станции"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Наушники"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"Система"</string> diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml index e96e0e4ed9c6..06ac0f88ca3c 100644 --- a/core/res/res/values-si/strings.xml +++ b/core/res/res/values-si/strings.xml @@ -605,8 +605,7 @@ <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> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"උත්සාහ ගණන ඉතා වැඩියි. ඒ වෙනුවට තිර අගුල භාවිත කරන්න."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"නැවත උත්සාහ කරන්න."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"ඇඟිලි සලකුණු ඇතුළත් කර නොමැත."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"මෙම උපාංගයේ ඇඟිලි සලකුණු සංවේදකයක් නොමැත."</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"අළුත්වැඩියා සැපයුම්කරුවෙකු බලන්න."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"ඔබගේ මුහුණු ආකෘතිය තැනිය නොහැකිය. නැවත උත්සාහ කරන්න."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"දීප්තිය වැඩියි. තවත් මඳ ආලෝකය උත්සාහ කරන්න."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"තවත් දීප්තිමත් ආලෝකය උත්සාහ කරන්න"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"දුරකථනය තවත් ඈතට ගෙන යන්න"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"දුරකථනය තවත් සමීපයට ගෙන එන්න"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"දුරකථනය තවත් ඉහළට ගෙන යන්න"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"රූපවාහිනී"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"දුරකථනය"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"නාදක ඩොක් කරන්න"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"ඉස් බණු"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"පද්ධතිය"</string> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index 566f448414e8..cdc682982417 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -607,8 +607,7 @@ <string name="fingerprint_error_canceled" msgid="540026881380070750">"Operácia týkajúca sa odtlačku prsta bola zrušená"</string> <string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Overenie odtlačku prsta zrušil používateľ."</string> <string name="fingerprint_error_lockout" msgid="7853461265604738671">"Príliš veľa pokusov. Skúste to neskôr."</string> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Príliš veľa pokusov. Použite radšej zámku obrazovky."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Skúste to znova"</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Neregistrovali ste žiadne odtlačky prstov."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Toto zariadenie nemá senzor odtlačkov prstov."</string> @@ -637,7 +636,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Navštívte poskytovateľa opráv."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Model tváre sa nedá vytvoriť. Skúste to znova."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Príliš veľa svetla. Skúste jemnejšie osvetlenie."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Skúste lepšie osvetlenie"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Oddiaľte telefón"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Priblížte telefón"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Posuňte telefón vyššie"</string> @@ -1613,7 +1613,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"Televízor"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Telefón"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Reproduktory doku"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Slúchadlá"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"Systém"</string> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index af74ebaa7188..6da07f8be2d5 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -607,8 +607,7 @@ <string name="fingerprint_error_canceled" msgid="540026881380070750">"Dejanje s prstnim odtisom je bilo preklicano."</string> <string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Dejanje s prstnim odtisom je preklical uporabnik."</string> <string name="fingerprint_error_lockout" msgid="7853461265604738671">"Preveč poskusov. Poskusite znova pozneje."</string> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Preveč poskusov. Odklenite z zaklepanjem zaslona."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Poskusite znova."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Ni registriranih prstnih odtisov."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Ta naprava nima tipala prstnih odtisov."</string> @@ -637,7 +636,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Obiščite ponudnika popravil."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Modela obraza ni mogoče ustvariti. Poskusite znova."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Presvetlo. Poskusite z blažjo osvetlitvijo."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Poskusite z močnejšo osvetlitvijo."</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Telefon nekoliko odmaknite."</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Bolj približajte telefon."</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Telefon premaknite višje."</string> @@ -1613,7 +1613,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"Televizor"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Telefon"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Zvočniki stojala"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Slušalke"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"Sistem"</string> diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml index c359aad622bd..587215a1a93b 100644 --- a/core/res/res/values-sq/strings.xml +++ b/core/res/res/values-sq/strings.xml @@ -605,8 +605,7 @@ <string name="fingerprint_error_canceled" msgid="540026881380070750">"Operacioni i gjurmës së gishtit u anulua."</string> <string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Veprimi i gjurmës së gishtit u anulua nga përdoruesi."</string> <string name="fingerprint_error_lockout" msgid="7853461265604738671">"Keni bërë shumë tentativa. Provo përsëri më vonë."</string> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Shumë përpjekje. Përdor më mirë kyçjen e ekranit."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Provo përsëri."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Nuk ka asnjë gjurmë gishti të regjistruar."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Kjo pajisje nuk ka sensor të gjurmës së gishtit."</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Vizito një ofrues të shërbimit të riparimit."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Modeli i fytyrës nuk krijohet. Provo sërish."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Me shumë ndriçim. Provo një ndriçim më të butë."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Provo një ndriçim më të fortë"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Lëvize telefonin më larg"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Lëvize telefonin më afër"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Lëvize telefonin më lart"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"Televizori"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Telefon"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Altoparlantët e stacionit"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Kufjet"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"Sistemi"</string> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index 6d29046be1b4..2acaf5ccd2fd 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -606,8 +606,7 @@ <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> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Превише покушаја. Користите закључавање екрана уместо тога."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Пробајте поново."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Није регистрован ниједан отисак прста."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Овај уређај нема сензор за отисак прста."</string> @@ -636,7 +635,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Посетите добављача за поправке."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Прављење модела лица није успело. Пробајте поново."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Превише је светло. Пробајте са слабијим осветљењем."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Пробајте са јачим осветљењем"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Удаљите телефон"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Приближите телефон"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Померите телефон нагоре"</string> @@ -1612,7 +1612,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"ТВ"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Телефон"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Звучници базне станице"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Слушалице"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"Систем"</string> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index 1ee319298249..a6c162aa6b72 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -605,8 +605,7 @@ <string name="fingerprint_error_canceled" msgid="540026881380070750">"Fingeravtrycksåtgärden avbröts."</string> <string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Fingeravtrycksåtgärden avbröts av användaren."</string> <string name="fingerprint_error_lockout" msgid="7853461265604738671">"Du har gjort för många försök. Försök igen senare."</string> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"För många försök. Använd låsskärmen i stället."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Försök igen."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Inga fingeravtryck har registrerats."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Enheten har ingen fingeravtryckssensor."</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Besök ett reparationsställe."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Ansiktsmodellen kunde inte skapas. Försök igen."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Det är för ljust. Testa lägre belysning."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Testa med bättre belysning"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Flytta telefonen längre bort"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"För telefonen närmare"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Höj telefonen"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"TV"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Mobil"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Dockningsstationens högtalare"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Hörlurar"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"System"</string> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index 8659b6a630c5..b17f58e18434 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -605,8 +605,7 @@ <string name="fingerprint_error_canceled" msgid="540026881380070750">"Mchakato wa alama ya kidole umeghairiwa."</string> <string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Mtumiaji ameghairi uthibitishaji wa alama ya kidole."</string> <string name="fingerprint_error_lockout" msgid="7853461265604738671">"Majaribio mengi mno. Jaribu tena baadaye."</string> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Umejaribu mara nyingi mno. Badala yake, tumia mbinu ya kufunga skrini."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Jaribu tena."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Hakuna alama za vidole zilizojumuishwa."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Kifaa hiki hakina kitambua alama ya kidole."</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Tembelea mtoa huduma za urekebishaji."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Imeshindwa kuunda muundo wa uso wako. Jaribu tena."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Inang\'aa mno. Jaribu mwangaza hafifu"</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Jaribu kuongeza mwangaza"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Sogeza simu mbali kiasi"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Sogeza simu karibu"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Sogeza simu juu zaidi"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"Runinga"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Simu"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Vipasa sauti vya kituo"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Vipokeasauti"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"Mfumo"</string> diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml index 611eadf032ab..6a7973e24760 100644 --- a/core/res/res/values-ta/strings.xml +++ b/core/res/res/values-ta/strings.xml @@ -605,8 +605,7 @@ <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> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"பலமுறை முயன்றுவிட்டீர்கள். இதற்குப் பதிலாகத் திரைப்பூட்டைப் பயன்படுத்தவும்."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"மீண்டும் முயற்சிக்கவும்."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"கைரேகைப் பதிவுகள் எதுவும் இல்லை."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"இந்தச் சாதனத்தில் கைரேகை சென்சார் இல்லை."</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"பழுதுபார்ப்புச் சேவை வழங்குநரைத் தொடர்புகொள்ளவும்."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"முகத் தோற்றம் பதிவாகவில்லை. மீண்டும் முயலவும்."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"அதிக ஒளிர்வு. மிதமான ஒளியில் முயலவும்."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"பிரகாசமான ஒளியில் முயலவும்"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"மொபைலை முகத்தில் இருந்து தள்ளிப் பிடிக்கவும்"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"மொபைலை அருகில் நகர்த்தவும்"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"மொபைலை மேலே நகர்த்தவும்"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"டிவி"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"ஃபோன்"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"மொபைல் வைக்கும் கருவியின் ஸ்பீக்கர்கள்"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"ஹெட்ஃபோன்கள்"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"சிஸ்டம்"</string> diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index a56a6287754c..8c53b1333ba9 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -605,8 +605,7 @@ <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> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"చాలా ఎక్కువ సార్లు ప్రయత్నించారు. బదులుగా స్క్రీన్ లాక్ను ఉపయోగించండి."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"మళ్లీ ప్రయత్నించండి."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"వేలిముద్రలు నమోదు చేయబడలేదు."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"ఈ పరికరంలో వేలిముద్ర సెన్సార్ ఎంపిక లేదు."</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"రిపెయిర్ ప్రొవైడర్ను సందర్శించండి."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"మీ ఫేస్మోడల్ క్రియేషన్ కుదరదు. మళ్లీ ట్రై చేయండి."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"వెలుతురు అధికంగా ఉంది. తక్కువ ఉండేలా చూడండి."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"ప్రకాశవంతమైన లైటింగ్లో ట్రై చేయండి"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"ఫోన్ను కాస్త దూరంగా జరపండి"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"ఫోన్ను దగ్గరగా పట్టుకోండి"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"ఫోన్ను పైకి పట్టుకోండి"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"టీవీ"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"ఫోన్"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"డాక్ స్పీకర్లు"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"హెడ్ఫోన్లు"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"సిస్టమ్"</string> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index a51876c3d309..7826774dadd4 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -605,8 +605,7 @@ <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> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"ลองหลายครั้งเกินไป ใช้การล็อกหน้าจอแทน"</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"ลองอีกครั้ง"</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"ไม่มีลายนิ้วมือที่ลงทะเบียน"</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"อุปกรณ์นี้ไม่มีเซ็นเซอร์ลายนิ้วมือ"</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"โปรดติดต่อผู้ให้บริการซ่อม"</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"สร้างรูปแบบใบหน้าไม่ได้ โปรดลองอีกครั้ง"</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"สว่างเกินไป ลองหาตำแหน่งที่แสงน้อยกว่านี้"</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"ลองหาตำแหน่งที่สว่างขึ้น"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"ถือโทรศัพท์ให้ห่างกว่านี้"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"ถือโทรศัพท์ให้ใกล้กว่านี้"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"ยกโทรศัพท์ให้สูงขึ้น"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"ทีวี"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"โทรศัพท์"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"ลำโพงแท่นชาร์จ"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"หูฟัง"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"ระบบ"</string> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index faacade6a268..e9d17a99edf0 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -605,8 +605,7 @@ <string name="fingerprint_error_canceled" msgid="540026881380070750">"Nakansela ang operasyong ginagamitan ng fingerprint."</string> <string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Kinansela ng user ang operasyon sa fingerprint."</string> <string name="fingerprint_error_lockout" msgid="7853461265604738671">"Napakaraming pagtatangka. Subukan ulit sa ibang pagkakataon."</string> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Masyadong maraming pagsubok. Gamitin na lang ang lock ng screen."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Subukang muli."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Walang naka-enroll na fingerprint."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Walang sensor ng fingerprint ang device na ito."</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Bumisita sa provider ng pag-aayos."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Hindi magawa ang iyong face model. Subukan ulit."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Masyadong maliwanag. Subukang bawasan ang liwanag."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Subukan sa mas maliwanag"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Ilayo pa ang telepono"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Ilapit pa ang telepono"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Itaas pa ang telepono"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"TV"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Telepono"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Mga speaker ng dock"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Mga Headphone"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"System"</string> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index af503ca07ced..762b731a8c1d 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -605,8 +605,7 @@ <string name="fingerprint_error_canceled" msgid="540026881380070750">"Parmak izi işlemi iptal edildi."</string> <string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Parmak izi işlemi kullanıcı tarafından iptal edildi."</string> <string name="fingerprint_error_lockout" msgid="7853461265604738671">"Çok fazla deneme yapıldı. Daha sonra tekrar deneyin."</string> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Çok fazla deneme yapıldı. Bunun yerine ekran kilidini kullanın."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Tekrar deneyin."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Parmak izi kaydedilmedi."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Bu cihazda parmak izi sensörü yok."</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Bir onarım hizmeti sağlayıcıyı ziyaret edin."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Yüzünüzün modeli oluşturulamıyor. Tekrar deneyin."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Çok parlak. Parlaklığı daha az bir ışıklandırma deneyin."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Daha parlak ışıkta deneyin"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Telefonu uzaklaştırın"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Telefonu yaklaştırın"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Telefonu daha yukarı kaldırın"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"TV"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Telefon"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Yuva hoparlörleri"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Kulaklıklar"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"Sistem"</string> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index bac234ad72bf..730cfac172b7 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -607,8 +607,7 @@ <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> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Забагато спроб. Використайте натомість розблокування екрана."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Повторіть спробу."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Відбитки пальців не зареєстровано."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"На цьому пристрої немає сканера відбитків пальців."</string> @@ -637,7 +636,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Зверніться до постачальника послуг із ремонту."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Модель обличчя не створено. Повторіть спробу."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Занадто яскраво. Потрібно менше світла."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Потрібно більше світла"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Тримайте телефон далі від обличчя"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Тримайте телефон ближче до обличчя"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Підніміть телефон вище"</string> @@ -1613,7 +1613,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"Телевізор"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Телефон"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Динаміки док-станції"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Навушники"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"Система"</string> diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml index 7db1619f9ab1..6fa00716e8da 100644 --- a/core/res/res/values-ur/strings.xml +++ b/core/res/res/values-ur/strings.xml @@ -605,8 +605,7 @@ <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> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"کافی زیادہ کوششیں۔ اس کے بجائے اسکرین لاک کا استعمال کریں۔"</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"دوبارہ کوشش کریں۔"</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"کوئی فنگر پرنٹ مندرج شدہ نہیں ہے۔"</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"اس آلہ میں فنگر پرنٹ سینسر نہیں ہے۔"</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"ایک مرمت فراہم کنندہ کو ملاحظہ کریں۔"</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"آپکے چہرے کا ماڈل تخلیق نہیں ہو سکا۔ پھر کوشش کریں۔"</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"کافی روشنی ہے۔ ہلکی روشنی میں آزمائیں۔"</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"تیز روشنی میں آزمائیں"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"فون کو تھوڑا دور کریں"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"فون کو تھوڑا قریب کریں"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"فون کو تھوڑا اوپر لے جائیں"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"TV"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"فون"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"ڈاک اسپیکرز"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"ہیڈ فونز"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"سسٹم"</string> diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml index 8f4cceb1c3ee..b9a0ae5440b1 100644 --- a/core/res/res/values-uz/strings.xml +++ b/core/res/res/values-uz/strings.xml @@ -605,8 +605,7 @@ <string name="fingerprint_error_canceled" msgid="540026881380070750">"Barmoq izi tekshiruvi bekor qilindi."</string> <string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Barmoq izi amali foydalanuvchi tomonidan bekor qilindi"</string> <string name="fingerprint_error_lockout" msgid="7853461265604738671">"Urinishlar soni ko‘payib ketdi. Keyinroq qayta urinib ko‘ring."</string> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Juda koʻp urinildi. Ekran qulfi orqali urining."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Qayta urinib ko‘ring."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Hech qanday barmoq izi qayd qilinmagan."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Bu qurilmada barmoq izi skaneri mavjud emas."</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Xizmat koʻrsatish markaziga murojaat qiling."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Yuzingiz modeli yaratilmadi. Qayta urining."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Juda yorqin. Biroz soyaroq joy tanlang."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Atrofingizni yanada yoriting"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Telefonni biroz uzoqroq tuting"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Telefonni yaqinroq tuting"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Telefonni teparoq tuting"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"TV"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Telefon"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Taglik karnaylar"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Quloq karnaychalari"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"Tizim"</string> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index 40eb56d6a914..ad4a3899e3b8 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -605,8 +605,7 @@ <string name="fingerprint_error_canceled" msgid="540026881380070750">"Thao tác dùng dấu vân tay bị hủy."</string> <string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Người dùng đã hủy thao tác dùng dấu vân tay."</string> <string name="fingerprint_error_lockout" msgid="7853461265604738671">"Quá nhiều lần thử. Hãy thử lại sau."</string> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Bạn đã thử quá nhiều lần. Hãy dùng phương thức khoá màn hình."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Thử lại."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Chưa đăng ký vân tay."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Thiết bị này không có cảm biến vân tay."</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Hãy liên hệ với một nhà cung cấp dịch vụ sửa chữa."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Không thể tạo mẫu khuôn mặt của bạn. Hãy thử lại."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Quá sáng. Hãy thử giảm độ sáng."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Hãy thử tăng độ sáng"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Đưa điện thoại ra xa hơn"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Đưa điện thoại lại gần hơn"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Nâng điện thoại lên cao hơn"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"TV"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Điện thoại"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Loa đế"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Tai nghe"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"Hệ thống"</string> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 066600b96d7c..ce5cd53800dd 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -605,8 +605,7 @@ <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> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"尝试次数过多,请通过屏幕锁定功能解锁。"</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"请重试。"</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"未注册任何指纹。"</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"此设备没有指纹传感器。"</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"请联系维修服务提供商。"</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"无法创建您的脸部模型,请重试。"</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"亮度过高,请尝试使用较柔和的亮度。"</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"请尝试调亮光线"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"请将手机拿远一点"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"请将手机拿近一点"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"请将手机举高一点"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"电视"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"手机"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"基座扬声器"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"耳机"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"系统"</string> diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index a1c0921f7ddf..96c7b0be4f81 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -605,8 +605,7 @@ <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> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"嘗試次數過多,請改用螢幕鎖定功能。"</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"再試一次。"</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"未註冊任何指紋"</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"此裝置沒有指紋感應器。"</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"請諮詢維修服務供應商。"</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"無法建立面部模型,請再試一次。"</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"影像太亮。請嘗試在更暗的環境下使用。"</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"請試用更充足的光線"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"請將手機移開一點"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"請將手機移近一點"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"請將手機向上移"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"電視"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"手機"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"插座喇叭"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"耳機"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"系統"</string> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index cb8f7bf18415..46d95c7fbb45 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -605,8 +605,7 @@ <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> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"嘗試次數過多,請改用螢幕鎖定功能。"</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"請再試一次。"</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"未登錄任何指紋。"</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"這個裝置沒有指紋感應器。"</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"請洽詢維修供應商。"</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"無法建立臉部模型,請再試一次。"</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"亮度過高,請嘗試使用較柔和的照明方式。"</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"請採用更明亮的光源"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"請將手機拿遠一點"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"請將手機拿近一點"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"請將手機舉高一點"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"電視"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"手機"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"座架喇叭"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"耳機"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"系統"</string> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index 5ae40dc1babe..6e640c60724c 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -605,8 +605,7 @@ <string name="fingerprint_error_canceled" msgid="540026881380070750">"Ukusebenza kwezigxivizo zeminwe kukhanseliwe."</string> <string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Umsebenzi wezigxivizo zomunwe ukhanselwe umsebenzisi."</string> <string name="fingerprint_error_lockout" msgid="7853461265604738671">"Imizamo eminingi kakhulu. Zama futhi emuva kwesikhathi."</string> - <!-- no translation found for fingerprint_error_lockout_permanent (9060651300306264843) --> - <skip /> + <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Imizamo eminingi kakhulu. Sebenzisa ukukhiya isikrini kunalokho."</string> <string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Zama futhi."</string> <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Azikho izigxivizo zeminwe ezibhalisiwe."</string> <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Le divayisi ayinayo inzwa yezigxivizo zeminwe."</string> @@ -635,7 +634,8 @@ <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Vakashela umhlinzeki wokulungisa."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Ayikwazi ukusungula imodeli yobuso bakho. Zama futhi."</string> <string name="face_acquired_too_bright" msgid="8070756048978079164">"Kukhanya kakhulu. Zama ukukhanya okuthambile."</string> - <string name="face_acquired_too_dark" msgid="7919016380747701228">"Zama ukukhanyisa okukhudlwana"</string> + <!-- no translation found for face_acquired_too_dark (8539853432479385326) --> + <skip /> <string name="face_acquired_too_close" msgid="4453646176196302462">"Yisa ifoni kude"</string> <string name="face_acquired_too_far" msgid="2922278214231064859">"Sondeza ifoni eduze"</string> <string name="face_acquired_too_high" msgid="8278815780046368576">"Yisa ifoni phezulu"</string> @@ -1611,7 +1611,7 @@ <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"I-TV"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Ifoni"</string> <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Izipikha ze-Dock"</string> - <string name="default_audio_route_name_hdmi" msgid="5474470558160717850">"HDMI"</string> + <string name="default_audio_route_name_external_device" msgid="5474470558160717850">"HDMI"</string> <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Ama-headphone"</string> <string name="default_audio_route_name_usb" msgid="895668743163316932">"I-USB"</string> <string name="default_audio_route_category_name" msgid="5241740395748134483">"Isistimu"</string> diff --git a/core/res/res/values/bools.xml b/core/res/res/values/bools.xml index fe296c704095..4b27bf2849fb 100644 --- a/core/res/res/values/bools.xml +++ b/core/res/res/values/bools.xml @@ -18,6 +18,7 @@ <bool name="kg_enable_camera_default_widget">true</bool> <bool name="kg_center_small_widgets_vertically">false</bool> <bool name="kg_top_align_page_shrink_on_bouncer_visible">true</bool> + <bool name="kg_wake_on_acquire_start">false</bool> <bool name="action_bar_embed_tabs">true</bool> <bool name="split_action_bar_is_narrow">true</bool> <bool name="preferences_prefer_dual_pane">false</bool> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index f68541538e90..dfada139b4fe 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -1733,7 +1733,7 @@ <item name="default_lock_wallpaper" type="drawable">@null</item> <!-- Component name of the built in wallpaper used to display bitmap wallpapers. This must not be null. --> - <string name="image_wallpaper_component" translatable="false">com.android.systemui/com.android.systemui.ImageWallpaper</string> + <string name="image_wallpaper_component" translatable="false">com.android.systemui/com.android.systemui.wallpapers.ImageWallpaper</string> <!-- True if WallpaperService is enabled --> <bool name="config_enableWallpaperService">true</bool> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index ef33a22dacc7..63eb83eb8db0 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -1689,7 +1689,7 @@ <!-- Message shown during fingerprint acquisision when the fingerprint cannot be recognized --> <string name="fingerprint_acquired_partial">Press firmly on the sensor</string> <!-- Message shown during fingerprint acquisision when the fingerprint cannot be recognized --> - <string name="fingerprint_acquired_insufficient">Couldn\'t process fingerprint. Please try again.</string> + <string name="fingerprint_acquired_insufficient">Can\u2019t recognize fingerprint. Try again.</string> <!-- Message shown during fingerprint acquisision when the fingerprint sensor needs cleaning --> <string name="fingerprint_acquired_imager_dirty">Clean fingerprint sensor and try again</string> <string name="fingerprint_acquired_imager_dirty_alt">Clean sensor and try again</string> @@ -1725,17 +1725,17 @@ <!-- Error message shown when the fingerprint hardware has run out of room for storing fingerprints --> <string name="fingerprint_error_no_space">Can\u2019t set up fingerprint</string> <!-- Error message shown when the fingerprint hardware timer has expired and the user needs to restart the operation. --> - <string name="fingerprint_error_timeout">Fingerprint time out reached. Try again.</string> + <string name="fingerprint_error_timeout">Fingerprint setup timed out. Try again.</string> <!-- Generic error message shown when the fingerprint operation (e.g. enrollment or authentication) is canceled. Generally not shown to the user--> <string name="fingerprint_error_canceled">Fingerprint operation canceled.</string> <!-- Generic error message shown when the fingerprint authentication operation is canceled due to user input. Generally not shown to the user --> <string name="fingerprint_error_user_canceled">Fingerprint operation canceled by user.</string> <!-- Generic error message shown when the fingerprint operation fails because too many attempts have been made. --> - <string name="fingerprint_error_lockout">Too many attempts. Try again later.</string> + <string name="fingerprint_error_lockout">Too many attempts. Use screen lock instead.</string> <!-- Generic error message shown when the fingerprint operation fails because strong authentication is required --> <string name="fingerprint_error_lockout_permanent">Too many attempts. Use screen lock instead.</string> <!-- Generic error message shown when the fingerprint hardware can't recognize the fingerprint --> - <string name="fingerprint_error_unable_to_process">Try again.</string> + <string name="fingerprint_error_unable_to_process">Can\u2019t process fingerprint. Try again.</string> <!-- Generic error message shown when the user has no enrolled fingerprints --> <string name="fingerprint_error_no_fingerprints">No fingerprints enrolled.</string> <!-- Generic error message shown when the app requests fingerprint authentication on a device without a sensor --> @@ -4525,8 +4525,8 @@ <!-- Name of the default audio route when an audio dock is connected. [CHAR LIMIT=50] --> <string name="default_audio_route_name_dock_speakers">Dock speakers</string> - <!-- Name of the default audio route when HDMI is connected. [CHAR LIMIT=50] --> - <string name="default_audio_route_name_hdmi">HDMI</string> + <!-- Name of the default audio route when an external device is connected. [CHAR LIMIT=50] --> + <string name="default_audio_route_name_external_device">External Device</string> <!-- Name of the default audio route when wired headphones are connected. [CHAR LIMIT=50] --> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 069bfe78fa05..66bfbb61ff15 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -1082,7 +1082,7 @@ <java-symbol type="string" name="default_audio_route_id" /> <java-symbol type="string" name="default_audio_route_name" /> <java-symbol type="string" name="default_audio_route_name_dock_speakers" /> - <java-symbol type="string" name="default_audio_route_name_hdmi" /> + <java-symbol type="string" name="default_audio_route_name_external_device" /> <java-symbol type="string" name="default_audio_route_name_headphones" /> <java-symbol type="string" name="default_audio_route_name_usb" /> <java-symbol type="string" name="default_audio_route_category_name" /> @@ -2830,6 +2830,7 @@ <java-symbol type="dimen" name="fast_scroller_minimum_touch_target" /> <java-symbol type="array" name="config_cdma_international_roaming_indicators" /> <java-symbol type="string" name="kg_text_message_separator" /> + <java-symbol type="bool" name="kg_wake_on_acquire_start" /> <java-symbol type="bool" name="config_use_sim_language_file" /> <java-symbol type="bool" name="config_LTE_eri_for_network_name" /> diff --git a/core/tests/coretests/res/xml/power_profile_test_power_brackets.xml b/core/tests/coretests/res/xml/power_profile_test_power_brackets.xml new file mode 100644 index 000000000000..c1293880de0a --- /dev/null +++ b/core/tests/coretests/res/xml/power_profile_test_power_brackets.xml @@ -0,0 +1,51 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2022 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. + --> + +<device name="Android"> + + <array name="cpu.clusters.cores"> + <value>1</value> + <value>2</value> + </array> + + <array name="cpu.core_speeds.cluster0"> + <value>300000</value> + </array> + + <array name="cpu.core_speeds.cluster1"> + <value>300000</value> + <value>1000000</value> + </array> + + <array name="cpu.core_power.cluster0"> + <value>10</value> + </array> + + <array name="cpu.core_power.cluster1"> + <value>25</value> + <value>35</value> + </array> + + <array name="cpu.power_brackets.cluster0"> + <value>1</value> + </array> + + <array name="cpu.power_brackets.cluster1"> + <value>1</value> + <value>0</value> + </array> +</device> diff --git a/core/tests/coretests/src/android/hardware/input/InputDeviceLightsManagerTest.java b/core/tests/coretests/src/android/hardware/input/InputDeviceLightsManagerTest.java index e13a3323d31a..3ecc7ff17114 100644 --- a/core/tests/coretests/src/android/hardware/input/InputDeviceLightsManagerTest.java +++ b/core/tests/coretests/src/android/hardware/input/InputDeviceLightsManagerTest.java @@ -110,11 +110,10 @@ public class InputDeviceLightsManagerTest { } private InputDevice createInputDevice(int id) { - return new InputDevice(id, 0 /* generation */, 0 /* controllerNumber */, "name", - 0 /* vendorId */, 0 /* productId */, "descriptor", true /* isExternal */, - 0 /* sources */, 0 /* keyboardType */, null /* keyCharacterMap */, - InputDeviceCountryCode.INVALID, false /* hasVibrator */, false /* hasMicrophone */, - false /* hasButtonUnderpad */, false /* hasSensor */, false /* hasBattery */); + return new InputDevice.Builder() + .setId(id) + .setName("Test Device " + id) + .build(); } private void mockLights(Light[] lights) throws Exception { diff --git a/core/tests/coretests/src/android/hardware/input/InputDeviceSensorManagerTest.java b/core/tests/coretests/src/android/hardware/input/InputDeviceSensorManagerTest.java index 54ee4349c3e1..6cf2314fea45 100644 --- a/core/tests/coretests/src/android/hardware/input/InputDeviceSensorManagerTest.java +++ b/core/tests/coretests/src/android/hardware/input/InputDeviceSensorManagerTest.java @@ -35,7 +35,6 @@ import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; -import android.os.test.TestLooper; import android.platform.test.annotations.Presubmit; import android.view.InputDevice; @@ -73,10 +72,7 @@ public class InputDeviceSensorManagerTest { @Rule public final MockitoRule mockito = MockitoJUnit.rule(); - private TestLooper mTestLooper; - private ContextWrapper mContextSpy; private InputManager mInputManager; - private InputDeviceSensorManager mSensorManager; private IInputSensorEventListener mIInputSensorEventListener; private final Object mLock = new Object(); @@ -84,11 +80,10 @@ public class InputDeviceSensorManagerTest { @Before public void setUp() throws Exception { - mTestLooper = new TestLooper(); - mContextSpy = spy(new ContextWrapper(InstrumentationRegistry.getContext())); + final Context context = spy(new ContextWrapper(InstrumentationRegistry.getContext())); InputManager inputManager = InputManager.resetInstance(mIInputManagerMock); - when(mContextSpy.getSystemService(eq(Context.INPUT_SERVICE))).thenReturn(inputManager); + when(context.getSystemService(eq(Context.INPUT_SERVICE))).thenReturn(inputManager); when(mIInputManagerMock.getInputDeviceIds()).thenReturn(new int[]{DEVICE_ID}); @@ -104,7 +99,7 @@ public class InputDeviceSensorManagerTest { when(mIInputManagerMock.registerSensorListener(any())).thenReturn(true); - mInputManager = mContextSpy.getSystemService(InputManager.class); + mInputManager = context.getSystemService(InputManager.class); } @After @@ -145,13 +140,11 @@ public class InputDeviceSensorManagerTest { } private InputDevice createInputDeviceWithSensor(int id) { - InputDevice d = new InputDevice(id, 0 /* generation */, 0 /* controllerNumber */, "name", - 0 /* vendorId */, 0 /* productId */, "descriptor", true /* isExternal */, - 0 /* sources */, 0 /* keyboardType */, null /* keyCharacterMap */, - InputDeviceCountryCode.INVALID, false /* hasVibrator */, false /* hasMicrophone */, - false /* hasButtonUnderpad */, true /* hasSensor */, false /* hasBattery */); - assertTrue(d.hasSensor()); - return d; + return new InputDevice.Builder() + .setId(id) + .setName("Test Device " + id) + .setHasSensor(true) + .build(); } private InputSensorInfo createInputSensorInfo(int id, int type) { @@ -164,8 +157,8 @@ public class InputDeviceSensorManagerTest { } private InputDevice getSensorDevice(int[] deviceIds) { - for (int i = 0; i < deviceIds.length; i++) { - InputDevice device = mInputManager.getInputDevice(deviceIds[i]); + for (int deviceId : deviceIds) { + InputDevice device = mInputManager.getInputDevice(deviceId); if (device.hasSensor()) { return device; } @@ -176,7 +169,7 @@ public class InputDeviceSensorManagerTest { @Test public void getInputDeviceSensors_withExpectedType() throws Exception { InputDevice device = getSensorDevice(mInputManager.getInputDeviceIds()); - assertTrue(device != null); + assertNotNull(device); SensorManager sensorManager = device.getSensorManager(); List<Sensor> accelList = sensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER); @@ -197,7 +190,7 @@ public class InputDeviceSensorManagerTest { public void getInputDeviceSensors_withUnexpectedType() throws Exception { InputDevice device = getSensorDevice(mInputManager.getInputDeviceIds()); - assertTrue(device != null); + assertNotNull(device); SensorManager sensorManager = device.getSensorManager(); List<Sensor> gameRotationList = sensorManager.getSensorList( @@ -213,7 +206,7 @@ public class InputDeviceSensorManagerTest { @Test public void testInputDeviceSensorListener() throws Exception { InputDevice device = getSensorDevice(mInputManager.getInputDeviceIds()); - assertTrue(device != null); + assertNotNull(device); SensorManager sensorManager = device.getSensorManager(); Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); diff --git a/core/tests/coretests/src/com/android/internal/jank/DisplayResolutionTrackerTest.java b/core/tests/coretests/src/com/android/internal/jank/DisplayResolutionTrackerTest.java new file mode 100644 index 000000000000..50210226db6f --- /dev/null +++ b/core/tests/coretests/src/com/android/internal/jank/DisplayResolutionTrackerTest.java @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.internal.jank; + +import static com.android.internal.jank.DisplayResolutionTracker.getResolution; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.hardware.display.DisplayManager; +import android.view.DisplayInfo; + +import androidx.test.filters.SmallTest; + +import org.junit.Before; +import org.junit.Test; +import org.mockito.ArgumentCaptor; + +@SmallTest +public class DisplayResolutionTrackerTest { + private static final DisplayInfo SD = makeDisplayInfo(800, 600); + private static final DisplayInfo HD = makeDisplayInfo(720, 1280); + private static final DisplayInfo FHD = makeDisplayInfo(2340, 1080); + private static final DisplayInfo QHD = makeDisplayInfo(3120, 1440); + + private DisplayResolutionTracker.DisplayInterface mDisplayManager; + private ArgumentCaptor<DisplayManager.DisplayListener> mListenerCaptor; + private DisplayResolutionTracker mTracker; + + @Before + public void setup() throws Exception { + mDisplayManager = mock(DisplayResolutionTracker.DisplayInterface.class); + mListenerCaptor = ArgumentCaptor.forClass(DisplayManager.DisplayListener.class); + + mTracker = new DisplayResolutionTracker(mDisplayManager); + + verify(mDisplayManager).registerDisplayListener(mListenerCaptor.capture()); + } + + @Test + public void testResolutionMapping() { + assertThat(getResolution(SD)).isEqualTo(DisplayResolutionTracker.RESOLUTION_SD); + assertThat(getResolution(HD)).isEqualTo(DisplayResolutionTracker.RESOLUTION_HD); + assertThat(getResolution(FHD)).isEqualTo(DisplayResolutionTracker.RESOLUTION_FHD); + assertThat(getResolution(QHD)).isEqualTo(DisplayResolutionTracker.RESOLUTION_QHD); + } + + @Test + public void testResolutionUpdatesOnDisplayChanges() throws Exception { + assertThat(mTracker.getResolution(42)) + .isEqualTo(DisplayResolutionTracker.RESOLUTION_UNKNOWN); + + when(mDisplayManager.getDisplayInfo(42)).thenReturn(FHD, QHD); + + mListenerCaptor.getValue().onDisplayAdded(42); + assertThat(mTracker.getResolution(42)) + .isEqualTo(DisplayResolutionTracker.RESOLUTION_FHD); + mListenerCaptor.getValue().onDisplayChanged(42); + assertThat(mTracker.getResolution(42)) + .isEqualTo(DisplayResolutionTracker.RESOLUTION_QHD); + } + + private static DisplayInfo makeDisplayInfo(int width, int height) { + DisplayInfo info = new DisplayInfo(); + info.logicalWidth = width; + info.logicalHeight = height; + return info; + } +} diff --git a/core/tests/coretests/src/com/android/internal/jank/FrameTrackerTest.java b/core/tests/coretests/src/com/android/internal/jank/FrameTrackerTest.java index e068730e9bda..dbbd70525d28 100644 --- a/core/tests/coretests/src/com/android/internal/jank/FrameTrackerTest.java +++ b/core/tests/coretests/src/com/android/internal/jank/FrameTrackerTest.java @@ -124,6 +124,7 @@ public class FrameTrackerTest { when(config.isSurfaceOnly()).thenReturn(surfaceOnly); when(config.getSurfaceControl()).thenReturn(mSurfaceControl); when(config.shouldDeferMonitor()).thenReturn(true); + when(config.getDisplayId()).thenReturn(42); View view = mRule.getActivity().getWindow().getDecorView(); Handler spyHandler = spy(new Handler(handler.getLooper())); when(config.getView()).thenReturn(surfaceOnly ? null : view); @@ -168,6 +169,7 @@ public class FrameTrackerTest { verify(tracker).removeObservers(); verify(tracker, never()).triggerPerfetto(); verify(mStatsLog).write(eq(UI_INTERACTION_FRAME_INFO_REPORTED), + eq(42), /* displayId */ eq(CUJ_TO_STATSD_INTERACTION_TYPE[CUJ_NOTIFICATION_SHADE_EXPAND_COLLAPSE]), eq(2L) /* totalFrames */, eq(0L) /* missedFrames */, @@ -204,6 +206,7 @@ public class FrameTrackerTest { verify(tracker).triggerPerfetto(); verify(mStatsLog).write(eq(UI_INTERACTION_FRAME_INFO_REPORTED), + eq(42), /* displayId */ eq(CUJ_TO_STATSD_INTERACTION_TYPE[CUJ_NOTIFICATION_SHADE_EXPAND_COLLAPSE]), eq(2L) /* totalFrames */, eq(1L) /* missedFrames */, @@ -240,6 +243,7 @@ public class FrameTrackerTest { verify(tracker, never()).triggerPerfetto(); verify(mStatsLog).write(eq(UI_INTERACTION_FRAME_INFO_REPORTED), + eq(42), /* displayId */ eq(CUJ_TO_STATSD_INTERACTION_TYPE[CUJ_NOTIFICATION_SHADE_EXPAND_COLLAPSE]), eq(2L) /* totalFrames */, eq(0L) /* missedFrames */, @@ -276,6 +280,7 @@ public class FrameTrackerTest { verify(tracker).triggerPerfetto(); verify(mStatsLog).write(eq(UI_INTERACTION_FRAME_INFO_REPORTED), + eq(42), /* displayId */ eq(CUJ_TO_STATSD_INTERACTION_TYPE[CUJ_NOTIFICATION_SHADE_EXPAND_COLLAPSE]), eq(2L) /* totalFrames */, eq(1L) /* missedFrames */, @@ -315,6 +320,7 @@ public class FrameTrackerTest { verify(tracker).triggerPerfetto(); verify(mStatsLog).write(eq(UI_INTERACTION_FRAME_INFO_REPORTED), + eq(42), /* displayId */ eq(CUJ_TO_STATSD_INTERACTION_TYPE[CUJ_NOTIFICATION_SHADE_EXPAND_COLLAPSE]), eq(2L) /* totalFrames */, eq(1L) /* missedFrames */, @@ -356,6 +362,7 @@ public class FrameTrackerTest { verify(tracker).removeObservers(); verify(tracker, never()).triggerPerfetto(); verify(mStatsLog).write(eq(UI_INTERACTION_FRAME_INFO_REPORTED), + eq(42), /* displayId */ eq(CUJ_TO_STATSD_INTERACTION_TYPE[CUJ_NOTIFICATION_SHADE_EXPAND_COLLAPSE]), eq(2L) /* totalFrames */, eq(0L) /* missedFrames */, @@ -483,6 +490,7 @@ public class FrameTrackerTest { verify(tracker).triggerPerfetto(); verify(mStatsLog).write(eq(UI_INTERACTION_FRAME_INFO_REPORTED), + eq(42), /* displayId */ eq(CUJ_TO_STATSD_INTERACTION_TYPE[CUJ_WALLPAPER_TRANSITION]), eq(2L) /* totalFrames */, eq(1L) /* missedFrames */, @@ -519,6 +527,7 @@ public class FrameTrackerTest { verify(tracker, never()).triggerPerfetto(); verify(mStatsLog).write(eq(UI_INTERACTION_FRAME_INFO_REPORTED), + eq(42), /* displayId */ eq(CUJ_TO_STATSD_INTERACTION_TYPE[CUJ_WALLPAPER_TRANSITION]), eq(2L) /* totalFrames */, eq(0L) /* missedFrames */, @@ -555,6 +564,7 @@ public class FrameTrackerTest { verify(tracker, never()).triggerPerfetto(); verify(mStatsLog).write(eq(UI_INTERACTION_FRAME_INFO_REPORTED), + eq(42), /* displayId */ eq(CUJ_TO_STATSD_INTERACTION_TYPE[CUJ_WALLPAPER_TRANSITION]), eq(2L) /* totalFrames */, eq(0L) /* missedFrames */, @@ -585,6 +595,7 @@ public class FrameTrackerTest { verify(mSurfaceControlWrapper).removeJankStatsListener(any()); verify(tracker).triggerPerfetto(); verify(mStatsLog).write(eq(UI_INTERACTION_FRAME_INFO_REPORTED), + eq(42), /* displayId */ eq(CUJ_TO_STATSD_INTERACTION_TYPE[CUJ_WALLPAPER_TRANSITION]), eq(6L) /* totalFrames */, eq(5L) /* missedFrames */, diff --git a/core/tests/coretests/src/com/android/internal/jank/InteractionJankMonitorTest.java b/core/tests/coretests/src/com/android/internal/jank/InteractionJankMonitorTest.java index 1519e48adbe0..4770fa6315aa 100644 --- a/core/tests/coretests/src/com/android/internal/jank/InteractionJankMonitorTest.java +++ b/core/tests/coretests/src/com/android/internal/jank/InteractionJankMonitorTest.java @@ -354,10 +354,11 @@ public class InteractionJankMonitorTest { when(configuration.isSurfaceOnly()).thenReturn(false); when(configuration.getView()).thenReturn(mView); when(configuration.getHandler()).thenReturn(mView.getHandler()); + when(configuration.getDisplayId()).thenReturn(42); FrameTracker tracker = spy(new FrameTracker(monitor, session, mWorker.getThreadHandler(), threadedRenderer, viewRoot, surfaceControl, choreographer, - new FrameMetricsWrapper(), new StatsLogWrapper(), + new FrameMetricsWrapper(), new StatsLogWrapper(null), /* traceThresholdMissedFrames= */ 1, /* traceThresholdFrameTimeMillis= */ -1, listener, configuration)); diff --git a/core/tests/coretests/src/com/android/internal/os/PowerProfileTest.java b/core/tests/coretests/src/com/android/internal/os/PowerProfileTest.java index bc3b4229f5e5..6a3d379363a8 100644 --- a/core/tests/coretests/src/com/android/internal/os/PowerProfileTest.java +++ b/core/tests/coretests/src/com/android/internal/os/PowerProfileTest.java @@ -21,6 +21,11 @@ import static com.android.internal.os.PowerProfile.POWER_GROUP_DISPLAY_AMBIENT; import static com.android.internal.os.PowerProfile.POWER_GROUP_DISPLAY_SCREEN_FULL; import static com.android.internal.os.PowerProfile.POWER_GROUP_DISPLAY_SCREEN_ON; +import static com.google.common.truth.Truth.assertThat; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; + import android.annotation.XmlRes; import android.content.Context; import android.content.res.Resources; @@ -28,15 +33,16 @@ import android.content.res.XmlResourceParser; import androidx.test.InstrumentationRegistry; import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import com.android.frameworks.coretests.R; import com.android.internal.power.ModemPowerProfile; import com.android.internal.util.XmlUtils; -import junit.framework.TestCase; - +import org.junit.Assert; import org.junit.Before; import org.junit.Test; +import org.junit.runner.RunWith; /* * Keep this file in sync with frameworks/base/core/res/res/xml/power_profile_test.xml and @@ -46,7 +52,8 @@ import org.junit.Test; * atest com.android.internal.os.PowerProfileTest */ @SmallTest -public class PowerProfileTest extends TestCase { +@RunWith(AndroidJUnit4.class) +public class PowerProfileTest { static final String TAG_TEST_MODEM = "test-modem"; static final String ATTR_NAME = "name"; @@ -516,4 +523,66 @@ public class PowerProfileTest extends TestCase { fail("Unanable to find element " + element + " with name " + elementName); return null; } + + private void assertEquals(int expected, int actual) { + Assert.assertEquals(expected, actual); + } + + private void assertEquals(double expected, double actual) { + Assert.assertEquals(expected, actual, 0.1); + } + + + @Test + public void powerBrackets_specifiedInPowerProfile() { + mProfile.forceInitForTesting(mContext, R.xml.power_profile_test_power_brackets); + mProfile.initCpuPowerBrackets(8); + + int cpuPowerBracketCount = mProfile.getCpuPowerBracketCount(); + assertThat(cpuPowerBracketCount).isEqualTo(2); + assertThat(new int[]{ + mProfile.getPowerBracketForCpuCore(0, 0), + mProfile.getPowerBracketForCpuCore(1, 0), + mProfile.getPowerBracketForCpuCore(1, 1), + }).isEqualTo(new int[]{1, 1, 0}); + } + + @Test + public void powerBrackets_automatic() { + mProfile.forceInitForTesting(mContext, R.xml.power_profile_test); + + assertThat(mProfile.getCpuPowerBracketCount()).isEqualTo(3); + assertThat(mProfile.getCpuPowerBracketDescription(0)) + .isEqualTo("0/300(10.0)"); + assertThat(mProfile.getCpuPowerBracketDescription(1)) + .isEqualTo("0/1000(20.0), 0/2000(30.0), 1/300(25.0)"); + assertThat(mProfile.getCpuPowerBracketDescription(2)) + .isEqualTo("1/1000(35.0), 1/2500(50.0), 1/3000(60.0)"); + assertThat(new int[]{ + mProfile.getPowerBracketForCpuCore(0, 0), + mProfile.getPowerBracketForCpuCore(0, 1), + mProfile.getPowerBracketForCpuCore(0, 2), + mProfile.getPowerBracketForCpuCore(1, 0), + mProfile.getPowerBracketForCpuCore(1, 1), + mProfile.getPowerBracketForCpuCore(1, 2), + mProfile.getPowerBracketForCpuCore(1, 3), + }).isEqualTo(new int[]{0, 1, 1, 1, 2, 2, 2}); + } + + @Test + public void powerBrackets_moreBracketsThanStates() { + mProfile.forceInitForTesting(mContext, R.xml.power_profile_test); + mProfile.initCpuPowerBrackets(8); + + assertThat(mProfile.getCpuPowerBracketCount()).isEqualTo(7); + assertThat(new int[]{ + mProfile.getPowerBracketForCpuCore(0, 0), + mProfile.getPowerBracketForCpuCore(0, 1), + mProfile.getPowerBracketForCpuCore(0, 2), + mProfile.getPowerBracketForCpuCore(1, 0), + mProfile.getPowerBracketForCpuCore(1, 1), + mProfile.getPowerBracketForCpuCore(1, 2), + mProfile.getPowerBracketForCpuCore(1, 3), + }).isEqualTo(new int[]{0, 1, 2, 3, 4, 5, 6}); + } } diff --git a/graphics/java/android/graphics/Path.java b/graphics/java/android/graphics/Path.java index 052b9af09bc8..81b8542c20f7 100644 --- a/graphics/java/android/graphics/Path.java +++ b/graphics/java/android/graphics/Path.java @@ -33,7 +33,7 @@ import libcore.util.NativeAllocationRegistry; * (based on the paint's Style), or it can be used for clipping or to draw * text on a path. */ -public class Path implements Iterable<PathIterator.Segment> { +public class Path { private static final NativeAllocationRegistry sRegistry = NativeAllocationRegistry.createMalloced( @@ -97,8 +97,7 @@ public class Path implements Iterable<PathIterator.Segment> { * @return the Iterator object */ @NonNull - @Override - public PathIterator iterator() { + public PathIterator getPathIterator() { return new PathIterator(this); } diff --git a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java index 724a50fbdb04..6af3d2bf4915 100644 --- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java +++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java @@ -901,6 +901,36 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen mPresenter.cleanupContainer(wct, container, false /* shouldFinishDependent */); } + @Nullable + @GuardedBy("mLock") + private TaskFragmentContainer resolveStartActivityIntentFromNonActivityContext( + @NonNull WindowContainerTransaction wct, @NonNull Intent intent) { + final int taskCount = mTaskContainers.size(); + if (taskCount == 0) { + // We don't have other Activity to check split with. + return null; + } + if (taskCount > 1) { + Log.w(TAG, "App is calling startActivity from a non-Activity context when it has" + + " more than one Task. If the new launch Activity is in a different process," + + " and it is expected to be embedded, please start it from an Activity" + + " instead."); + return null; + } + + // Check whether the Intent should be embedded in the known Task. + final TaskContainer taskContainer = mTaskContainers.valueAt(0); + if (taskContainer.isInPictureInPicture() + || taskContainer.getTopNonFinishingActivity() == null) { + // We don't embed activity when it is in PIP, or if we can't find any other owner + // activity in the Task. + return null; + } + + return resolveStartActivityIntent(wct, taskContainer.getTaskId(), intent, + null /* launchingActivity */); + } + /** * When we are trying to handle a new activity Intent, returns the {@link TaskFragmentContainer} * that we should reparent the new activity to if there is any embedding rule matched. @@ -1777,23 +1807,38 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen @Override public Instrumentation.ActivityResult onStartActivity(@NonNull Context who, @NonNull Intent intent, @NonNull Bundle options) { - // TODO(b/190433398): Check if the activity is configured to always be expanded. - - // Check if activity should be put in a split with the activity that launched it. - if (!(who instanceof Activity)) { - return super.onStartActivity(who, intent, options); - } - final Activity launchingActivity = (Activity) who; - if (isInPictureInPicture(launchingActivity)) { - // We don't embed activity when it is in PIP. - return super.onStartActivity(who, intent, options); + // TODO(b/232042367): Consolidate the activity create handling so that we can handle + // cross-process the same as normal. + + final Activity launchingActivity; + if (who instanceof Activity) { + // We will check if the new activity should be split with the activity that launched + // it. + launchingActivity = (Activity) who; + if (isInPictureInPicture(launchingActivity)) { + // We don't embed activity when it is in PIP. + return super.onStartActivity(who, intent, options); + } + } else { + // When the context to start activity is not an Activity context, we will check if + // the new activity should be embedded in the known Task belonging to the organizer + // process. @see #resolveStartActivityIntentFromNonActivityContext + // It is a current security limitation that we can't access the activity info of + // other process even if it is in the same Task. + launchingActivity = null; } synchronized (mLock) { - final int taskId = getTaskId(launchingActivity); final WindowContainerTransaction wct = new WindowContainerTransaction(); - final TaskFragmentContainer launchedInTaskFragment = resolveStartActivityIntent(wct, - taskId, intent, launchingActivity); + final TaskFragmentContainer launchedInTaskFragment; + if (launchingActivity != null) { + final int taskId = getTaskId(launchingActivity); + launchedInTaskFragment = resolveStartActivityIntent(wct, taskId, intent, + launchingActivity); + } else { + launchedInTaskFragment = resolveStartActivityIntentFromNonActivityContext(wct, + intent); + } if (launchedInTaskFragment != null) { // Make sure the WCT is applied immediately instead of being queued so that the // TaskFragment will be ready before activity attachment. diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java index 47f1e2e18255..96efeeb0c5eb 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java @@ -96,7 +96,8 @@ public class DisplayLayout { /** * Different from {@link #equals(Object)}, this method compares the basic geometry properties - * of two {@link DisplayLayout} objects including width, height, rotation, density and cutout. + * of two {@link DisplayLayout} objects including width, height, rotation, density, cutout and + * insets. * @return {@code true} if the given {@link DisplayLayout} is identical geometry wise. */ public boolean isSameGeometry(@NonNull DisplayLayout other) { @@ -104,7 +105,8 @@ public class DisplayLayout { && mHeight == other.mHeight && mRotation == other.mRotation && mDensityDpi == other.mDensityDpi - && Objects.equals(mCutout, other.mCutout); + && Objects.equals(mCutout, other.mCutout) + && Objects.equals(mStableInsets, other.mStableInsets); } @Override diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java index 347904e67f3e..18ce3642335d 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java @@ -333,6 +333,7 @@ public abstract class WMShellModule { WindowManagerShellWrapper windowManagerShellWrapper, TaskStackListenerImpl taskStackListener, PipParamsChangedForwarder pipParamsChangedForwarder, + DisplayInsetsController displayInsetsController, Optional<OneHandedController> oneHandedController, @ShellMainThread ShellExecutor mainExecutor) { return Optional.ofNullable(PipController.create( @@ -341,7 +342,7 @@ public abstract class WMShellModule { pipBoundsState, pipMotionHelper, pipMediaController, phonePipMenuController, pipTaskOrganizer, pipTransitionState, pipTouchHandler, pipTransitionController, windowManagerShellWrapper, taskStackListener, pipParamsChangedForwarder, - oneHandedController, mainExecutor)); + displayInsetsController, oneHandedController, mainExecutor)); } @WMSingleton diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java index 6c9a6b64c864..3d879b685706 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java @@ -49,6 +49,7 @@ import android.os.UserManager; import android.util.Pair; import android.util.Size; import android.view.DisplayInfo; +import android.view.InsetsState; import android.view.SurfaceControl; import android.view.WindowManagerGlobal; import android.window.WindowContainerTransaction; @@ -64,6 +65,7 @@ import com.android.wm.shell.R; import com.android.wm.shell.WindowManagerShellWrapper; import com.android.wm.shell.common.DisplayChangeController; import com.android.wm.shell.common.DisplayController; +import com.android.wm.shell.common.DisplayInsetsController; import com.android.wm.shell.common.DisplayLayout; import com.android.wm.shell.common.RemoteCallable; import com.android.wm.shell.common.ShellExecutor; @@ -112,6 +114,9 @@ public class PipController implements PipTransitionController.PipTransitionCallb UserChangeListener { private static final String TAG = "PipController"; + private static final long PIP_KEEP_CLEAR_AREAS_DELAY = + SystemProperties.getLong("persist.wm.debug.pip_keep_clear_areas_delay", 200); + private boolean mEnablePipKeepClearAlgorithm = SystemProperties.getBoolean("persist.wm.debug.enable_pip_keep_clear_algorithm", false); @@ -135,6 +140,7 @@ public class PipController implements PipTransitionController.PipTransitionCallb private PipTransitionController mPipTransitionController; private TaskStackListenerImpl mTaskStackListener; private PipParamsChangedForwarder mPipParamsChangedForwarder; + private DisplayInsetsController mDisplayInsetsController; private Optional<OneHandedController> mOneHandedController; private final ShellCommandHandler mShellCommandHandler; private final ShellController mShellController; @@ -143,6 +149,8 @@ public class PipController implements PipTransitionController.PipTransitionCallb private final Rect mTmpInsetBounds = new Rect(); private final int mEnterAnimationDuration; + private final Runnable mMovePipInResponseToKeepClearAreasChangeCallback; + private boolean mIsInFixedRotation; private PipAnimationListener mPinnedStackAnimationRecentsCallback; @@ -274,14 +282,12 @@ public class PipController implements PipTransitionController.PipTransitionCallb if (mPipBoundsState.getDisplayId() == displayId) { if (mEnablePipKeepClearAlgorithm) { mPipBoundsState.setKeepClearAreas(restricted, unrestricted); - // only move if already in pip, other transitions account for keep clear - // areas - if (mPipTransitionState.hasEnteredPip()) { - Rect destBounds = mPipKeepClearAlgorithm.adjust(mPipBoundsState, - mPipBoundsAlgorithm); - mPipTaskOrganizer.scheduleAnimateResizePip(destBounds, - mEnterAnimationDuration, null); - } + + mMainExecutor.removeCallbacks( + mMovePipInResponseToKeepClearAreasChangeCallback); + mMainExecutor.executeDelayed( + mMovePipInResponseToKeepClearAreasChangeCallback, + PIP_KEEP_CLEAR_AREAS_DELAY); } } } @@ -338,6 +344,7 @@ public class PipController implements PipTransitionController.PipTransitionCallb WindowManagerShellWrapper windowManagerShellWrapper, TaskStackListenerImpl taskStackListener, PipParamsChangedForwarder pipParamsChangedForwarder, + DisplayInsetsController displayInsetsController, Optional<OneHandedController> oneHandedController, ShellExecutor mainExecutor) { if (!context.getPackageManager().hasSystemFeature(FEATURE_PICTURE_IN_PICTURE)) { @@ -351,7 +358,7 @@ public class PipController implements PipTransitionController.PipTransitionCallb pipBoundsState, pipMotionHelper, pipMediaController, phonePipMenuController, pipTaskOrganizer, pipTransitionState, pipTouchHandler, pipTransitionController, windowManagerShellWrapper, taskStackListener, pipParamsChangedForwarder, - oneHandedController, mainExecutor) + displayInsetsController, oneHandedController, mainExecutor) .mImpl; } @@ -374,6 +381,7 @@ public class PipController implements PipTransitionController.PipTransitionCallb WindowManagerShellWrapper windowManagerShellWrapper, TaskStackListenerImpl taskStackListener, PipParamsChangedForwarder pipParamsChangedForwarder, + DisplayInsetsController displayInsetsController, Optional<OneHandedController> oneHandedController, ShellExecutor mainExecutor ) { @@ -406,7 +414,17 @@ public class PipController implements PipTransitionController.PipTransitionCallb mEnterAnimationDuration = mContext.getResources() .getInteger(R.integer.config_pipEnterAnimationDuration); + mMovePipInResponseToKeepClearAreasChangeCallback = () -> { + // only move if already in pip, other transitions account for keep clear areas + if (mPipTransitionState.hasEnteredPip()) { + Rect destBounds = mPipKeepClearAlgorithm.adjust(mPipBoundsState, + mPipBoundsAlgorithm); + mPipTaskOrganizer.scheduleAnimateResizePip(destBounds, + mEnterAnimationDuration, null); + } + }; mPipParamsChangedForwarder = pipParamsChangedForwarder; + mDisplayInsetsController = displayInsetsController; shellInit.addInitCallback(this::onInit, this); } @@ -549,6 +567,16 @@ public class PipController implements PipTransitionController.PipTransitionCallb } }); + mDisplayInsetsController.addInsetsChangedListener(mPipBoundsState.getDisplayId(), + new DisplayInsetsController.OnInsetsChangedListener() { + @Override + public void insetsChanged(InsetsState insetsState) { + onDisplayChanged( + mDisplayController.getDisplayLayout(mPipBoundsState.getDisplayId()), + false /* saveRestoreSnapFraction */); + } + }); + mOneHandedController.ifPresent(controller -> { controller.registerTransitionCallback( new OneHandedTransitionCallback() { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java index 9c9841f33f88..8ed16ce4fbfc 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java @@ -1887,7 +1887,6 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, // properly for the animation itself. mSplitLayout.release(); mSplitLayout.resetDividerPosition(); - mSideStagePosition = SPLIT_POSITION_BOTTOM_OR_RIGHT; mTopStageAfterFoldDismiss = STAGE_TYPE_UNDEFINED; } } diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/CommonAssertions.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/CommonAssertions.kt index 7058cb8ea149..55979905cc4f 100644 --- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/CommonAssertions.kt +++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/CommonAssertions.kt @@ -20,6 +20,7 @@ package com.android.wm.shell.flicker import android.view.Surface import com.android.server.wm.flicker.FlickerTestParameter import com.android.server.wm.flicker.helpers.WindowUtils +import com.android.server.wm.flicker.helpers.isShellTransitionsEnabled import com.android.server.wm.flicker.traces.layers.LayerTraceEntrySubject import com.android.server.wm.flicker.traces.layers.LayersTraceSubject import com.android.server.wm.traces.common.IComponentMatcher @@ -99,15 +100,9 @@ fun FlickerTestParameter.splitAppLayerBoundsBecomesVisible( portraitPosTop: Boolean ) { assertLayers { - // TODO(b/242025948): Use SPLIT_SCREEN_DIVIDER_COMPONENT.or(component) for notContains - // and isInvisible when they are ready. - this.notContains(SPLIT_SCREEN_DIVIDER_COMPONENT) + this.notContains(SPLIT_SCREEN_DIVIDER_COMPONENT.or(component)) .then() - .notContains(component, isOptional = true) - .then() - .isInvisible(SPLIT_SCREEN_DIVIDER_COMPONENT, isOptional = true) - .then() - .isInvisible(component, isOptional = true) + .isInvisible(SPLIT_SCREEN_DIVIDER_COMPONENT.or(component)) .then() .splitAppLayerBoundsSnapToDivider( component, landscapePosLeft, portraitPosTop, endRotation) @@ -118,18 +113,25 @@ fun FlickerTestParameter.splitAppLayerBoundsBecomesVisibleByDrag( component: IComponentMatcher ) { assertLayers { - // TODO(b/242025948): Use SPLIT_SCREEN_DIVIDER_COMPONENT.or(component) for notContains - // and isInvisible when they are ready. - this.notContains(SPLIT_SCREEN_DIVIDER_COMPONENT) - .then() - .notContains(component, isOptional = true) - .then() - .isInvisible(SPLIT_SCREEN_DIVIDER_COMPONENT, isOptional = true) - .then() - .isInvisible(component, isOptional = true) - .then() - // TODO(b/245472831): Verify the component should snap to divider. - .isVisible(component) + if (isShellTransitionsEnabled) { + this.notContains(SPLIT_SCREEN_DIVIDER_COMPONENT.or(component)) + .then() + .isInvisible(SPLIT_SCREEN_DIVIDER_COMPONENT.or(component)) + .then() + // TODO(b/245472831): Verify the component should snap to divider. + .isVisible(component) + } else { + this.notContains(SPLIT_SCREEN_DIVIDER_COMPONENT.or(component)) + .then() + .isInvisible(SPLIT_SCREEN_DIVIDER_COMPONENT.or(component)) + .then() + // TODO(b/245472831): Verify the component should snap to divider. + .isVisible(component) + .then() + .isInvisible(component, isOptional = true) + .then() + .isVisible(component) + } } } diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/CopyContentInSplit.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/CopyContentInSplit.kt index 2acdfbf32a9e..3c439fdb9d98 100644 --- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/CopyContentInSplit.kt +++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/CopyContentInSplit.kt @@ -42,7 +42,6 @@ import org.junit.runners.Parameterized * * To run this test: `atest WMShellFlickerTests:CopyContentInSplit` */ -@IwTest(focusArea = "sysui") @RequiresDevice @RunWith(Parameterized::class) @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class) @@ -63,32 +62,39 @@ class CopyContentInSplit(testSpec: FlickerTestParameter) : SplitScreenBase(testS } } + @IwTest(focusArea = "sysui") @Presubmit @Test fun splitScreenDividerKeepVisible() = testSpec.layerKeepVisible(SPLIT_SCREEN_DIVIDER_COMPONENT) + @IwTest(focusArea = "sysui") @Presubmit @Test fun primaryAppLayerKeepVisible() = testSpec.layerKeepVisible(primaryApp) + @IwTest(focusArea = "sysui") @Presubmit @Test fun textEditAppLayerKeepVisible() = testSpec.layerKeepVisible(textEditApp) + @IwTest(focusArea = "sysui") @Presubmit @Test fun primaryAppBoundsKeepVisible() = testSpec.splitAppLayerBoundsKeepVisible( primaryApp, landscapePosLeft = tapl.isTablet, portraitPosTop = false) + @IwTest(focusArea = "sysui") @Presubmit @Test fun textEditAppBoundsKeepVisible() = testSpec.splitAppLayerBoundsKeepVisible( textEditApp, landscapePosLeft = !tapl.isTablet, portraitPosTop = true) + @IwTest(focusArea = "sysui") @Presubmit @Test fun primaryAppWindowKeepVisible() = testSpec.appWindowKeepVisible(primaryApp) + @IwTest(focusArea = "sysui") @Presubmit @Test fun textEditAppWindowKeepVisible() = testSpec.appWindowKeepVisible(textEditApp) diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/DismissSplitScreenByDivider.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/DismissSplitScreenByDivider.kt index 44157b8aa269..60e5f78fa724 100644 --- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/DismissSplitScreenByDivider.kt +++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/DismissSplitScreenByDivider.kt @@ -46,7 +46,6 @@ import org.junit.runners.Parameterized * * To run this test: `atest WMShellFlickerTests:DismissSplitScreenByDivider` */ -@IwTest(focusArea = "sysui") @RequiresDevice @RunWith(Parameterized::class) @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class) @@ -74,23 +73,28 @@ class DismissSplitScreenByDivider (testSpec: FlickerTestParameter) : SplitScreen } } + @IwTest(focusArea = "sysui") @Presubmit @Test fun splitScreenDividerBecomesInvisible() = testSpec.splitScreenDividerBecomesInvisible() + @IwTest(focusArea = "sysui") @Presubmit @Test fun primaryAppLayerBecomesInvisible() = testSpec.layerBecomesInvisible(primaryApp) + @IwTest(focusArea = "sysui") @Presubmit @Test fun secondaryAppLayerIsVisibleAtEnd() = testSpec.layerIsVisibleAtEnd(secondaryApp) + @IwTest(focusArea = "sysui") @Presubmit @Test fun primaryAppBoundsBecomesInvisible() = testSpec.splitAppLayerBoundsBecomesInvisible( primaryApp, landscapePosLeft = tapl.isTablet, portraitPosTop = false) + @IwTest(focusArea = "sysui") @Presubmit @Test fun secondaryAppBoundsIsFullscreenAtEnd() { @@ -113,10 +117,12 @@ class DismissSplitScreenByDivider (testSpec: FlickerTestParameter) : SplitScreen } } + @IwTest(focusArea = "sysui") @Presubmit @Test fun primaryAppWindowBecomesInvisible() = testSpec.appWindowBecomesInvisible(primaryApp) + @IwTest(focusArea = "sysui") @Presubmit @Test fun secondaryAppWindowIsVisibleAtEnd() = testSpec.appWindowIsVisibleAtEnd(secondaryApp) diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/DismissSplitScreenByGoHome.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/DismissSplitScreenByGoHome.kt index df83d7082936..4e8773f22768 100644 --- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/DismissSplitScreenByGoHome.kt +++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/DismissSplitScreenByGoHome.kt @@ -42,7 +42,6 @@ import org.junit.runners.Parameterized * * To run this test: `atest WMShellFlickerTests:DismissSplitScreenByGoHome` */ -@IwTest(focusArea = "sysui") @RequiresDevice @RunWith(Parameterized::class) @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class) @@ -66,32 +65,39 @@ class DismissSplitScreenByGoHome( } } + @IwTest(focusArea = "sysui") @Presubmit @Test fun splitScreenDividerBecomesInvisible() = testSpec.splitScreenDividerBecomesInvisible() + @IwTest(focusArea = "sysui") @Presubmit @Test fun primaryAppLayerBecomesInvisible() = testSpec.layerBecomesInvisible(primaryApp) + @IwTest(focusArea = "sysui") @Presubmit @Test fun secondaryAppLayerBecomesInvisible() = testSpec.layerBecomesInvisible(primaryApp) + @IwTest(focusArea = "sysui") @Presubmit @Test fun primaryAppBoundsBecomesInvisible() = testSpec.splitAppLayerBoundsBecomesInvisible( primaryApp, landscapePosLeft = tapl.isTablet, portraitPosTop = false) + @IwTest(focusArea = "sysui") @Presubmit @Test fun secondaryAppBoundsBecomesInvisible() = testSpec.splitAppLayerBoundsBecomesInvisible( secondaryApp, landscapePosLeft = !tapl.isTablet, portraitPosTop = true) + @IwTest(focusArea = "sysui") @Presubmit @Test fun primaryAppWindowBecomesInvisible() = testSpec.appWindowBecomesInvisible(primaryApp) + @IwTest(focusArea = "sysui") @Presubmit @Test fun secondaryAppWindowBecomesInvisible() = testSpec.appWindowBecomesInvisible(secondaryApp) diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/DragDividerToResize.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/DragDividerToResize.kt index b77e8da6fca2..fddd84cfe4db 100644 --- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/DragDividerToResize.kt +++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/DragDividerToResize.kt @@ -43,7 +43,6 @@ import org.junit.runners.Parameterized * * To run this test: `atest WMShellFlickerTests:DragDividerToResize` */ -@IwTest(focusArea = "sysui") @RequiresDevice @RunWith(Parameterized::class) @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class) @@ -62,14 +61,17 @@ class DragDividerToResize (testSpec: FlickerTestParameter) : SplitScreenBase(tes } } + @IwTest(focusArea = "sysui") @Presubmit @Test fun splitScreenDividerKeepVisible() = testSpec.layerKeepVisible(SPLIT_SCREEN_DIVIDER_COMPONENT) + @IwTest(focusArea = "sysui") @Presubmit @Test fun primaryAppLayerKeepVisible() = testSpec.layerKeepVisible(primaryApp) + @IwTest(focusArea = "sysui") @Presubmit @Test fun secondaryAppLayerVisibilityChanges() { @@ -82,19 +84,23 @@ class DragDividerToResize (testSpec: FlickerTestParameter) : SplitScreenBase(tes } } + @IwTest(focusArea = "sysui") @Presubmit @Test fun primaryAppWindowKeepVisible() = testSpec.appWindowKeepVisible(primaryApp) + @IwTest(focusArea = "sysui") @Presubmit @Test fun secondaryAppWindowKeepVisible() = testSpec.appWindowKeepVisible(secondaryApp) + @IwTest(focusArea = "sysui") @Presubmit @Test fun primaryAppBoundsChanges() = testSpec.splitAppLayerBoundsChanges( primaryApp, landscapePosLeft = true, portraitPosTop = false) + @IwTest(focusArea = "sysui") @Presubmit @Test fun secondaryAppBoundsChanges() = testSpec.splitAppLayerBoundsChanges( diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/EnterSplitScreenByDragFromAllApps.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/EnterSplitScreenByDragFromAllApps.kt index 3cd74716ec39..a7c689884e98 100644 --- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/EnterSplitScreenByDragFromAllApps.kt +++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/EnterSplitScreenByDragFromAllApps.kt @@ -50,7 +50,6 @@ import org.junit.runners.Parameterized * * To run this test: `atest WMShellFlickerTests:EnterSplitScreenByDragFromAllApps` */ -@IwTest(focusArea = "sysui") @RequiresDevice @RunWith(Parameterized::class) @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class) @@ -81,6 +80,7 @@ class EnterSplitScreenByDragFromAllApps( } } + @IwTest(focusArea = "sysui") @Presubmit @Test fun splitScreenDividerBecomesVisible() { @@ -89,6 +89,7 @@ class EnterSplitScreenByDragFromAllApps( } // TODO(b/245472831): Back to splitScreenDividerBecomesVisible after shell transition ready. + @IwTest(focusArea = "sysui") @Presubmit @Test fun splitScreenDividerIsVisibleAtEnd_ShellTransit() { @@ -98,28 +99,53 @@ class EnterSplitScreenByDragFromAllApps( } } + @IwTest(focusArea = "sysui") @Presubmit @Test fun primaryAppLayerIsVisibleAtEnd() = testSpec.layerIsVisibleAtEnd(primaryApp) + @IwTest(focusArea = "sysui") @Presubmit @Test - fun secondaryAppLayerBecomesVisible() = testSpec.layerBecomesVisible(secondaryApp) + fun secondaryAppLayerBecomesVisible() { + Assume.assumeFalse(isShellTransitionsEnabled) + testSpec.assertLayers { + this.isInvisible(secondaryApp) + .then() + .isVisible(secondaryApp) + .then() + .isInvisible(secondaryApp) + .then() + .isVisible(secondaryApp) + } + } + + // TODO(b/245472831): Align to legacy transition after shell transition ready. + @Presubmit + @Test + fun secondaryAppLayerBecomesVisible_ShellTransit() { + Assume.assumeTrue(isShellTransitionsEnabled) + testSpec.layerBecomesVisible(secondaryApp) + } + @IwTest(focusArea = "sysui") @Presubmit @Test fun primaryAppBoundsIsVisibleAtEnd() = testSpec.splitAppLayerBoundsIsVisibleAtEnd( primaryApp, landscapePosLeft = false, portraitPosTop = false) + @IwTest(focusArea = "sysui") @Presubmit @Test fun secondaryAppBoundsBecomesVisible() = testSpec.splitAppLayerBoundsBecomesVisibleByDrag( secondaryApp) + @IwTest(focusArea = "sysui") @Presubmit @Test fun primaryAppWindowIsVisibleAtEnd() = testSpec.appWindowIsVisibleAtEnd(primaryApp) + @IwTest(focusArea = "sysui") @Presubmit @Test fun secondaryAppWindowBecomesVisible() = testSpec.appWindowBecomesVisible(secondaryApp) diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/EnterSplitScreenByDragFromNotification.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/EnterSplitScreenByDragFromNotification.kt index 7db55ad21a14..7d8a8db1a1ee 100644 --- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/EnterSplitScreenByDragFromNotification.kt +++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/EnterSplitScreenByDragFromNotification.kt @@ -51,7 +51,6 @@ import org.junit.runners.Parameterized * * To run this test: `atest WMShellFlickerTests:EnterSplitScreenByDragFromNotification` */ -@IwTest(focusArea = "sysui") @RequiresDevice @RunWith(Parameterized::class) @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class) @@ -93,6 +92,7 @@ class EnterSplitScreenByDragFromNotification( } } + @IwTest(focusArea = "sysui") @Presubmit @Test fun splitScreenDividerBecomesVisible() { @@ -101,6 +101,7 @@ class EnterSplitScreenByDragFromNotification( } // TODO(b/245472831): Back to splitScreenDividerBecomesVisible after shell transition ready. + @IwTest(focusArea = "sysui") @Presubmit @Test fun splitScreenDividerIsVisibleAtEnd_ShellTransit() { @@ -110,29 +111,53 @@ class EnterSplitScreenByDragFromNotification( } } + @IwTest(focusArea = "sysui") @Presubmit @Test fun primaryAppLayerIsVisibleAtEnd() = testSpec.layerIsVisibleAtEnd(primaryApp) + @IwTest(focusArea = "sysui") @Presubmit @Test - fun secondaryAppLayerBecomesVisible() = + fun secondaryAppLayerBecomesVisible() { + Assume.assumeFalse(isShellTransitionsEnabled) + testSpec.assertLayers { + this.isInvisible(sendNotificationApp) + .then() + .isVisible(sendNotificationApp) + .then() + .isInvisible(sendNotificationApp) + .then() + .isVisible(sendNotificationApp) + } + } + + // TODO(b/245472831): Align to legacy transition after shell transition ready. + @Presubmit + @Test + fun secondaryAppLayerBecomesVisible_ShellTransit() { + Assume.assumeTrue(isShellTransitionsEnabled) testSpec.layerBecomesVisible(sendNotificationApp) + } + @IwTest(focusArea = "sysui") @Presubmit @Test fun primaryAppBoundsIsVisibleAtEnd() = testSpec.splitAppLayerBoundsIsVisibleAtEnd( primaryApp, landscapePosLeft = false, portraitPosTop = false) + @IwTest(focusArea = "sysui") @Presubmit @Test fun secondaryAppBoundsBecomesVisible() = testSpec.splitAppLayerBoundsBecomesVisibleByDrag( sendNotificationApp) + @IwTest(focusArea = "sysui") @Presubmit @Test fun primaryAppWindowIsVisibleAtEnd() = testSpec.appWindowIsVisibleAtEnd(primaryApp) + @IwTest(focusArea = "sysui") @Presubmit @Test fun secondaryAppWindowIsVisibleAtEnd() = testSpec.appWindowIsVisibleAtEnd(sendNotificationApp) diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/EnterSplitScreenByDragFromTaskbar.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/EnterSplitScreenByDragFromTaskbar.kt index 82124128afa1..bfd8a3a53437 100644 --- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/EnterSplitScreenByDragFromTaskbar.kt +++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/EnterSplitScreenByDragFromTaskbar.kt @@ -50,7 +50,6 @@ import org.junit.runners.Parameterized * * To run this test: `atest WMShellFlickerTests:EnterSplitScreenByDragFromTaskbar` */ -@IwTest(focusArea = "sysui") @RequiresDevice @RunWith(Parameterized::class) @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class) @@ -84,6 +83,7 @@ class EnterSplitScreenByDragFromTaskbar( } } + @IwTest(focusArea = "sysui") @Presubmit @Test fun splitScreenDividerBecomesVisible() { @@ -92,6 +92,7 @@ class EnterSplitScreenByDragFromTaskbar( } // TODO(b/245472831): Back to splitScreenDividerBecomesVisible after shell transition ready. + @IwTest(focusArea = "sysui") @Presubmit @Test fun splitScreenDividerIsVisibleAtEnd_ShellTransit() { @@ -101,28 +102,53 @@ class EnterSplitScreenByDragFromTaskbar( } } + @IwTest(focusArea = "sysui") @Presubmit @Test fun primaryAppLayerIsVisibleAtEnd() = testSpec.layerIsVisibleAtEnd(primaryApp) + @IwTest(focusArea = "sysui") @Presubmit @Test - fun secondaryAppLayerBecomesVisible() = testSpec.layerBecomesVisible(secondaryApp) + fun secondaryAppLayerBecomesVisible() { + Assume.assumeFalse(isShellTransitionsEnabled) + testSpec.assertLayers { + this.isInvisible(secondaryApp) + .then() + .isVisible(secondaryApp) + .then() + .isInvisible(secondaryApp) + .then() + .isVisible(secondaryApp) + } + } + + // TODO(b/245472831): Align to legacy transition after shell transition ready. + @Presubmit + @Test + fun secondaryAppLayerBecomesVisible_ShellTransit() { + Assume.assumeTrue(isShellTransitionsEnabled) + testSpec.layerBecomesVisible(secondaryApp) + } + @IwTest(focusArea = "sysui") @Presubmit @Test fun primaryAppBoundsIsVisibleAtEnd() = testSpec.splitAppLayerBoundsIsVisibleAtEnd( primaryApp, landscapePosLeft = false, portraitPosTop = false) + @IwTest(focusArea = "sysui") @Presubmit @Test fun secondaryAppBoundsBecomesVisible() = testSpec.splitAppLayerBoundsBecomesVisibleByDrag( secondaryApp) + @IwTest(focusArea = "sysui") @Presubmit @Test fun primaryAppWindowIsVisibleAtEnd() = testSpec.appWindowIsVisibleAtEnd(primaryApp) + @IwTest(focusArea = "sysui") @Presubmit @Test fun secondaryAppWindowBecomesVisible() = testSpec.appWindowBecomesVisible(secondaryApp) diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/EnterSplitScreenFromOverview.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/EnterSplitScreenFromOverview.kt index 1868602df7a8..cefb9f52d4fe 100644 --- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/EnterSplitScreenFromOverview.kt +++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/EnterSplitScreenFromOverview.kt @@ -43,7 +43,6 @@ import org.junit.runners.Parameterized * * To run this test: `atest WMShellFlickerTests:EnterSplitScreenFromOverview` */ -@IwTest(focusArea = "sysui") @RequiresDevice @RunWith(Parameterized::class) @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class) @@ -70,32 +69,39 @@ class EnterSplitScreenFromOverview(testSpec: FlickerTestParameter) : SplitScreen } } + @IwTest(focusArea = "sysui") @Presubmit @Test fun splitScreenDividerBecomesVisible() = testSpec.splitScreenDividerBecomesVisible() + @IwTest(focusArea = "sysui") @Presubmit @Test fun primaryAppLayerIsVisibleAtEnd() = testSpec.layerIsVisibleAtEnd(primaryApp) + @IwTest(focusArea = "sysui") @Presubmit @Test fun secondaryAppLayerBecomesVisible() = testSpec.layerBecomesVisible(secondaryApp) + @IwTest(focusArea = "sysui") @Presubmit @Test fun primaryAppBoundsIsVisibleAtEnd() = testSpec.splitAppLayerBoundsIsVisibleAtEnd( primaryApp, landscapePosLeft = tapl.isTablet, portraitPosTop = false) + @IwTest(focusArea = "sysui") @Presubmit @Test fun secondaryAppBoundsBecomesVisible() = testSpec.splitAppLayerBoundsBecomesVisible( secondaryApp, landscapePosLeft = !tapl.isTablet, portraitPosTop = true) + @IwTest(focusArea = "sysui") @Presubmit @Test fun primaryAppWindowBecomesVisible() = testSpec.appWindowBecomesVisible(primaryApp) + @IwTest(focusArea = "sysui") @Presubmit @Test fun secondaryAppWindowBecomesVisible() = testSpec.appWindowBecomesVisible(secondaryApp) diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/SwitchAppByDoubleTapDivider.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/SwitchAppByDoubleTapDivider.kt index d265f83ddb96..e174f5ef7917 100644 --- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/SwitchAppByDoubleTapDivider.kt +++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/SwitchAppByDoubleTapDivider.kt @@ -43,7 +43,6 @@ import org.junit.runners.Parameterized * * To run this test: `atest WMShellFlickerTests:SwitchAppByDoubleTapDivider` */ -@IwTest(focusArea = "sysui") @RequiresDevice @RunWith(Parameterized::class) @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class) @@ -65,32 +64,39 @@ class SwitchAppByDoubleTapDivider (testSpec: FlickerTestParameter) : SplitScreen } } + @IwTest(focusArea = "sysui") @Presubmit @Test fun splitScreenDividerKeepVisible() = testSpec.layerKeepVisible(SPLIT_SCREEN_DIVIDER_COMPONENT) + @IwTest(focusArea = "sysui") @Presubmit @Test fun primaryAppLayerIsVisibleAtEnd() = testSpec.layerIsVisibleAtEnd(primaryApp) + @IwTest(focusArea = "sysui") @Presubmit @Test fun secondaryAppLayerIsVisibleAtEnd() = testSpec.layerIsVisibleAtEnd(secondaryApp) + @IwTest(focusArea = "sysui") @Presubmit @Test fun primaryAppBoundsIsVisibleAtEnd() = testSpec.splitAppLayerBoundsIsVisibleAtEnd( primaryApp, landscapePosLeft = !tapl.isTablet, portraitPosTop = true) + @IwTest(focusArea = "sysui") @Presubmit @Test fun secondaryAppBoundsIsVisibleAtEnd() = testSpec.splitAppLayerBoundsIsVisibleAtEnd( secondaryApp, landscapePosLeft = tapl.isTablet, portraitPosTop = false) + @IwTest(focusArea = "sysui") @Presubmit @Test fun primaryAppWindowIsVisibleAtEnd() = testSpec.appWindowIsVisibleAtEnd(primaryApp) + @IwTest(focusArea = "sysui") @Presubmit @Test fun secondaryAppWindowIsVisibleAtEnd() = testSpec.appWindowIsVisibleAtEnd(secondaryApp) diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/SwitchBackToSplitFromAnotherApp.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/SwitchBackToSplitFromAnotherApp.kt index 8b905effa8f8..20c6af7c0530 100644 --- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/SwitchBackToSplitFromAnotherApp.kt +++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/SwitchBackToSplitFromAnotherApp.kt @@ -42,7 +42,6 @@ import org.junit.runners.Parameterized * * To run this test: `atest WMShellFlickerTests:SwitchBackToSplitFromAnotherApp` */ -@IwTest(focusArea = "sysui") @RequiresDevice @RunWith(Parameterized::class) @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class) @@ -68,32 +67,39 @@ class SwitchBackToSplitFromAnotherApp(testSpec: FlickerTestParameter) : SplitScr } } + @IwTest(focusArea = "sysui") @Presubmit @Test fun splitScreenDividerBecomesVisible() = testSpec.splitScreenDividerBecomesVisible() + @IwTest(focusArea = "sysui") @Presubmit @Test fun primaryAppLayerBecomesVisible() = testSpec.layerBecomesVisible(primaryApp) + @IwTest(focusArea = "sysui") @Presubmit @Test fun secondaryAppLayerBecomesVisible() = testSpec.layerBecomesVisible(secondaryApp) + @IwTest(focusArea = "sysui") @Presubmit @Test fun primaryAppBoundsIsVisibleAtEnd() = testSpec.splitAppLayerBoundsIsVisibleAtEnd( primaryApp, landscapePosLeft = tapl.isTablet, portraitPosTop = false) + @IwTest(focusArea = "sysui") @Presubmit @Test fun secondaryAppBoundsIsVisibleAtEnd() = testSpec.splitAppLayerBoundsIsVisibleAtEnd( secondaryApp, landscapePosLeft = !tapl.isTablet, portraitPosTop = true) + @IwTest(focusArea = "sysui") @Presubmit @Test fun primaryAppWindowBecomesVisible() = testSpec.appWindowBecomesVisible(primaryApp) + @IwTest(focusArea = "sysui") @Presubmit @Test fun secondaryAppWindowBecomesVisible() = testSpec.appWindowBecomesVisible(secondaryApp) diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/SwitchBackToSplitFromHome.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/SwitchBackToSplitFromHome.kt index fcab70204909..cb9ca9f13849 100644 --- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/SwitchBackToSplitFromHome.kt +++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/SwitchBackToSplitFromHome.kt @@ -42,7 +42,6 @@ import org.junit.runners.Parameterized * * To run this test: `atest WMShellFlickerTests:SwitchBackToSplitFromHome` */ -@IwTest(focusArea = "sysui") @RequiresDevice @RunWith(Parameterized::class) @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class) @@ -67,32 +66,39 @@ class SwitchBackToSplitFromHome(testSpec: FlickerTestParameter) : SplitScreenBas } } + @IwTest(focusArea = "sysui") @Presubmit @Test fun splitScreenDividerBecomesVisible() = testSpec.splitScreenDividerBecomesVisible() + @IwTest(focusArea = "sysui") @Presubmit @Test fun primaryAppLayerBecomesVisible() = testSpec.layerBecomesVisible(primaryApp) + @IwTest(focusArea = "sysui") @Presubmit @Test fun secondaryAppLayerBecomesVisible() = testSpec.layerBecomesVisible(secondaryApp) + @IwTest(focusArea = "sysui") @Presubmit @Test fun primaryAppBoundsIsVisibleAtEnd() = testSpec.splitAppLayerBoundsIsVisibleAtEnd( primaryApp, landscapePosLeft = tapl.isTablet, portraitPosTop = false) + @IwTest(focusArea = "sysui") @Presubmit @Test fun secondaryAppBoundsIsVisibleAtEnd() = testSpec.splitAppLayerBoundsIsVisibleAtEnd( secondaryApp, landscapePosLeft = !tapl.isTablet, portraitPosTop = true) + @IwTest(focusArea = "sysui") @Presubmit @Test fun primaryAppWindowBecomesVisible() = testSpec.appWindowBecomesVisible(primaryApp) + @IwTest(focusArea = "sysui") @Presubmit @Test fun secondaryAppWindowBecomesVisible() = testSpec.appWindowBecomesVisible(secondaryApp) diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/SwitchBackToSplitFromRecent.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/SwitchBackToSplitFromRecent.kt index 5364492cf59c..266276749c13 100644 --- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/SwitchBackToSplitFromRecent.kt +++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/SwitchBackToSplitFromRecent.kt @@ -42,7 +42,6 @@ import org.junit.runners.Parameterized * * To run this test: `atest WMShellFlickerTests:SwitchBackToSplitFromRecent` */ -@IwTest(focusArea = "sysui") @RequiresDevice @RunWith(Parameterized::class) @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class) @@ -69,32 +68,39 @@ class SwitchBackToSplitFromRecent(testSpec: FlickerTestParameter) : SplitScreenB } } + @IwTest(focusArea = "sysui") @Presubmit @Test fun splitScreenDividerBecomesVisible() = testSpec.splitScreenDividerBecomesVisible() + @IwTest(focusArea = "sysui") @Presubmit @Test fun primaryAppLayerBecomesVisible() = testSpec.layerBecomesVisible(primaryApp) + @IwTest(focusArea = "sysui") @Presubmit @Test fun secondaryAppLayerBecomesVisible() = testSpec.layerBecomesVisible(secondaryApp) + @IwTest(focusArea = "sysui") @Presubmit @Test fun primaryAppBoundsIsVisibleAtEnd() = testSpec.splitAppLayerBoundsIsVisibleAtEnd( primaryApp, landscapePosLeft = tapl.isTablet, portraitPosTop = false) + @IwTest(focusArea = "sysui") @Presubmit @Test fun secondaryAppBoundsIsVisibleAtEnd() = testSpec.splitAppLayerBoundsIsVisibleAtEnd( secondaryApp, landscapePosLeft = !tapl.isTablet, portraitPosTop = true) + @IwTest(focusArea = "sysui") @Presubmit @Test fun primaryAppWindowBecomesVisible() = testSpec.appWindowBecomesVisible(primaryApp) + @IwTest(focusArea = "sysui") @Presubmit @Test fun secondaryAppWindowBecomesVisible() = testSpec.appWindowBecomesVisible(secondaryApp) diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipControllerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipControllerTest.java index 1b5091f58f26..a8d3bdcb7c96 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipControllerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipControllerTest.java @@ -43,6 +43,7 @@ import android.util.Size; import com.android.wm.shell.ShellTestCase; import com.android.wm.shell.WindowManagerShellWrapper; import com.android.wm.shell.common.DisplayController; +import com.android.wm.shell.common.DisplayInsetsController; import com.android.wm.shell.common.DisplayLayout; import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.TaskStackListenerImpl; @@ -99,7 +100,8 @@ public class PipControllerTest extends ShellTestCase { @Mock private TaskStackListenerImpl mMockTaskStackListener; @Mock private ShellExecutor mMockExecutor; @Mock private Optional<OneHandedController> mMockOneHandedController; - @Mock private PipParamsChangedForwarder mPipParamsChangedForwarder; + @Mock private PipParamsChangedForwarder mMockPipParamsChangedForwarder; + @Mock private DisplayInsetsController mMockDisplayInsetsController; @Mock private DisplayLayout mMockDisplayLayout1; @Mock private DisplayLayout mMockDisplayLayout2; @@ -120,8 +122,8 @@ public class PipControllerTest extends ShellTestCase { mMockPipBoundsState, mMockPipMotionHelper, mMockPipMediaController, mMockPhonePipMenuController, mMockPipTaskOrganizer, mMockPipTransitionState, mMockPipTouchHandler, mMockPipTransitionController, mMockWindowManagerShellWrapper, - mMockTaskStackListener, mPipParamsChangedForwarder, - mMockOneHandedController, mMockExecutor); + mMockTaskStackListener, mMockPipParamsChangedForwarder, + mMockDisplayInsetsController, mMockOneHandedController, mMockExecutor); mShellInit.init(); when(mMockPipBoundsAlgorithm.getSnapAlgorithm()).thenReturn(mMockPipSnapAlgorithm); when(mMockPipTouchHandler.getMotionHelper()).thenReturn(mMockPipMotionHelper); @@ -186,8 +188,8 @@ public class PipControllerTest extends ShellTestCase { mMockPipBoundsState, mMockPipMotionHelper, mMockPipMediaController, mMockPhonePipMenuController, mMockPipTaskOrganizer, mMockPipTransitionState, mMockPipTouchHandler, mMockPipTransitionController, mMockWindowManagerShellWrapper, - mMockTaskStackListener, mPipParamsChangedForwarder, - mMockOneHandedController, mMockExecutor)); + mMockTaskStackListener, mMockPipParamsChangedForwarder, + mMockDisplayInsetsController, mMockOneHandedController, mMockExecutor)); } @Test diff --git a/media/java/android/media/ImageReader.java b/media/java/android/media/ImageReader.java index fde7afd21420..ca906d2cd6d1 100644 --- a/media/java/android/media/ImageReader.java +++ b/media/java/android/media/ImageReader.java @@ -342,9 +342,14 @@ public class ImageReader implements AutoCloseable { // Only include memory for 1 buffer, since actually accounting for the memory used is // complex, and 1 buffer is enough for the VM to treat the ImageReader as being of some // size. - mEstimatedNativeAllocBytes = ImageUtils.getEstimatedNativeAllocBytes( - width, height, useLegacyImageFormat ? imageFormat : hardwareBufferFormat, - /*buffer count*/ 1); + if (hardwareBufferFormat == HardwareBuffer.BLOB) { + mEstimatedNativeAllocBytes = ImageUtils.getEstimatedNativeAllocBytes( + width, height, imageFormat, /*buffer count*/ 1); + } else { + mEstimatedNativeAllocBytes = ImageUtils.getEstimatedNativeAllocBytes( + width, height, useLegacyImageFormat ? imageFormat : hardwareBufferFormat, + /*buffer count*/ 1); + } VMRuntime.getRuntime().registerNativeAllocation(mEstimatedNativeAllocBytes); } @@ -370,7 +375,6 @@ public class ImageReader implements AutoCloseable { MultiResolutionImageReader parent, int hardwareBufferFormat, int dataSpace) { mWidth = width; mHeight = height; - mFormat = ImageFormat.UNKNOWN; // set default image format value as UNKNOWN mUsage = usage; mMaxImages = maxImages; mParent = parent; @@ -378,6 +382,7 @@ public class ImageReader implements AutoCloseable { mDataSpace = dataSpace; mUseLegacyImageFormat = false; mNumPlanes = ImageUtils.getNumPlanesForHardwareBufferFormat(mHardwareBufferFormat); + mFormat = PublicFormatUtils.getPublicFormat(hardwareBufferFormat, dataSpace); initializeImageReader(width, height, mFormat, maxImages, usage, hardwareBufferFormat, dataSpace, mUseLegacyImageFormat); diff --git a/media/java/android/media/ImageWriter.java b/media/java/android/media/ImageWriter.java index 9f52bf18f4e3..259c1386aff4 100644 --- a/media/java/android/media/ImageWriter.java +++ b/media/java/android/media/ImageWriter.java @@ -29,7 +29,6 @@ import android.hardware.DataSpace.NamedDataSpace; import android.hardware.HardwareBuffer; import android.hardware.HardwareBuffer.Usage; import android.hardware.SyncFence; -import android.hardware.camera2.params.StreamConfigurationMap; import android.hardware.camera2.utils.SurfaceUtils; import android.os.Handler; import android.os.Looper; @@ -266,31 +265,11 @@ public class ImageWriter implements AutoCloseable { // nativeInit internally overrides UNKNOWN format. So does surface format query after // nativeInit and before getEstimatedNativeAllocBytes(). imageFormat = SurfaceUtils.getSurfaceFormat(surface); - mHardwareBufferFormat = PublicFormatUtils.getHalFormat(imageFormat); - mDataSpace = PublicFormatUtils.getHalDataspace(imageFormat); + mDataSpace = dataSpace = PublicFormatUtils.getHalDataspace(dataSpace); + mHardwareBufferFormat = + hardwareBufferFormat = PublicFormatUtils.getHalFormat(imageFormat); } - // Several public formats use the same native HAL_PIXEL_FORMAT_BLOB. The native - // allocation estimation sequence depends on the public formats values. To avoid - // possible errors, convert where necessary. - if (imageFormat == StreamConfigurationMap.HAL_PIXEL_FORMAT_BLOB) { - int surfaceDataspace = SurfaceUtils.getSurfaceDataspace(surface); - switch (surfaceDataspace) { - case StreamConfigurationMap.HAL_DATASPACE_DEPTH: - imageFormat = ImageFormat.DEPTH_POINT_CLOUD; - break; - case StreamConfigurationMap.HAL_DATASPACE_DYNAMIC_DEPTH: - imageFormat = ImageFormat.DEPTH_JPEG; - break; - case StreamConfigurationMap.HAL_DATASPACE_HEIF: - imageFormat = ImageFormat.HEIC; - break; - default: - imageFormat = ImageFormat.JPEG; - } - mHardwareBufferFormat = PublicFormatUtils.getHalFormat(imageFormat); - mDataSpace = PublicFormatUtils.getHalDataspace(imageFormat); - } // Estimate the native buffer allocation size and register it so it gets accounted for // during GC. Note that this doesn't include the buffers required by the buffer queue // itself and the buffers requested by the producer. @@ -301,17 +280,44 @@ public class ImageWriter implements AutoCloseable { mWidth = width == -1 ? surfSize.getWidth() : width; mHeight = height == -1 ? surfSize.getHeight() : height; - mEstimatedNativeAllocBytes = - ImageUtils.getEstimatedNativeAllocBytes(mWidth, mHeight, - useLegacyImageFormat ? imageFormat : hardwareBufferFormat, /*buffer count*/ 1); + if (hardwareBufferFormat == HardwareBuffer.BLOB) { + // TODO(b/246344817): remove mWriterFormat and mDataSpace re-set here after fixing. + mWriterFormat = imageFormat = getImageFormatByBLOB(dataSpace); + mDataSpace = PublicFormatUtils.getHalDataspace(imageFormat); + + mEstimatedNativeAllocBytes = ImageUtils.getEstimatedNativeAllocBytes(mWidth, mHeight, + imageFormat, /*buffer count*/ 1); + } else { + mEstimatedNativeAllocBytes = + ImageUtils.getEstimatedNativeAllocBytes(mWidth, mHeight, + useLegacyImageFormat ? imageFormat : hardwareBufferFormat, /*buffer count*/ 1); + } VMRuntime.getRuntime().registerNativeAllocation(mEstimatedNativeAllocBytes); } + // Several public formats use the same native HAL_PIXEL_FORMAT_BLOB. The native + // allocation estimation sequence depends on the public formats values. To avoid + // possible errors, convert where necessary. + private int getImageFormatByBLOB(int dataspace) { + switch (dataspace) { + case DataSpace.DATASPACE_DEPTH: + return ImageFormat.DEPTH_POINT_CLOUD; + case DataSpace.DATASPACE_DYNAMIC_DEPTH: + return ImageFormat.DEPTH_JPEG; + case DataSpace.DATASPACE_HEIF: + return ImageFormat.HEIC; + default: + return ImageFormat.JPEG; + } + } + private ImageWriter(Surface surface, int maxImages, boolean useSurfaceImageFormatInfo, int imageFormat, int width, int height) { mMaxImages = maxImages; - mHardwareBufferFormat = PublicFormatUtils.getHalFormat(imageFormat); - mDataSpace = PublicFormatUtils.getHalDataspace(imageFormat); + if (!useSurfaceImageFormatInfo) { + mHardwareBufferFormat = PublicFormatUtils.getHalFormat(imageFormat); + mDataSpace = PublicFormatUtils.getHalDataspace(imageFormat); + } initializeImageWriter(surface, maxImages, useSurfaceImageFormatInfo, true, imageFormat, mHardwareBufferFormat, mDataSpace, width, height, mUsage); @@ -321,8 +327,10 @@ public class ImageWriter implements AutoCloseable { int imageFormat, int width, int height, long usage) { mMaxImages = maxImages; mUsage = usage; - mHardwareBufferFormat = PublicFormatUtils.getHalFormat(imageFormat); - mDataSpace = PublicFormatUtils.getHalDataspace(imageFormat); + if (!useSurfaceImageFormatInfo) { + mHardwareBufferFormat = PublicFormatUtils.getHalFormat(imageFormat); + mDataSpace = PublicFormatUtils.getHalDataspace(imageFormat); + } initializeImageWriter(surface, maxImages, useSurfaceImageFormatInfo, true, imageFormat, mHardwareBufferFormat, mDataSpace, width, height, usage); @@ -337,8 +345,6 @@ public class ImageWriter implements AutoCloseable { // and retrieve corresponding hardwareBufferFormat and dataSpace here. if (useSurfaceImageFormatInfo) { imageFormat = ImageFormat.UNKNOWN; - mHardwareBufferFormat = PublicFormatUtils.getHalFormat(imageFormat); - mDataSpace = PublicFormatUtils.getHalDataspace(imageFormat); } else { imageFormat = PublicFormatUtils.getPublicFormat(hardwareBufferFormat, dataSpace); mHardwareBufferFormat = hardwareBufferFormat; diff --git a/media/java/android/media/MediaCodec.java b/media/java/android/media/MediaCodec.java index 53d4efad5fc6..da2795f6dcfc 100644 --- a/media/java/android/media/MediaCodec.java +++ b/media/java/android/media/MediaCodec.java @@ -3843,11 +3843,10 @@ final public class MediaCodec { private void invalidateByteBufferLocked( @Nullable ByteBuffer[] buffers, int index, boolean input) { if (buffers == null) { - if (index < 0) { - throw new IllegalStateException("index is negative (" + index + ")"); + if (index >= 0) { + BitSet indices = input ? mValidInputIndices : mValidOutputIndices; + indices.clear(index); } - BitSet indices = input ? mValidInputIndices : mValidOutputIndices; - indices.clear(index); } else if (index >= 0 && index < buffers.length) { ByteBuffer buffer = buffers[index]; if (buffer != null) { @@ -3859,10 +3858,9 @@ final public class MediaCodec { private void validateInputByteBufferLocked( @Nullable ByteBuffer[] buffers, int index) { if (buffers == null) { - if (index < 0) { - throw new IllegalStateException("index is negative (" + index + ")"); + if (index >= 0) { + mValidInputIndices.set(index); } - mValidInputIndices.set(index); } else if (index >= 0 && index < buffers.length) { ByteBuffer buffer = buffers[index]; if (buffer != null) { @@ -3876,11 +3874,10 @@ final public class MediaCodec { @Nullable ByteBuffer[] buffers, int index, boolean input) { synchronized(mBufferLock) { if (buffers == null) { - if (index < 0) { - throw new IllegalStateException("index is negative (" + index + ")"); + if (index >= 0) { + BitSet indices = input ? mValidInputIndices : mValidOutputIndices; + indices.set(index); } - BitSet indices = input ? mValidInputIndices : mValidOutputIndices; - indices.set(index); } else if (index >= 0 && index < buffers.length) { ByteBuffer buffer = buffers[index]; if (buffer != null) { @@ -3893,10 +3890,9 @@ final public class MediaCodec { private void validateOutputByteBufferLocked( @Nullable ByteBuffer[] buffers, int index, @NonNull BufferInfo info) { if (buffers == null) { - if (index < 0) { - throw new IllegalStateException("index is negative (" + index + ")"); + if (index >= 0) { + mValidOutputIndices.set(index); } - mValidOutputIndices.set(index); } else if (index >= 0 && index < buffers.length) { ByteBuffer buffer = buffers[index]; if (buffer != null) { diff --git a/media/java/android/media/MediaRouter.java b/media/java/android/media/MediaRouter.java index d7fc205d28d3..2e7896e6cb4f 100644 --- a/media/java/android/media/MediaRouter.java +++ b/media/java/android/media/MediaRouter.java @@ -221,7 +221,7 @@ public class MediaRouter { } else if ((newRoutes.mainType & AudioRoutesInfo.MAIN_DOCK_SPEAKERS) != 0) { name = R.string.default_audio_route_name_dock_speakers; } else if ((newRoutes.mainType&AudioRoutesInfo.MAIN_HDMI) != 0) { - name = R.string.default_audio_route_name_hdmi; + name = R.string.default_audio_route_name_external_device; } else if ((newRoutes.mainType&AudioRoutesInfo.MAIN_USB) != 0) { name = R.string.default_audio_route_name_usb; } else { diff --git a/media/java/android/media/Ringtone.java b/media/java/android/media/Ringtone.java index 86a94a9e0662..82c3139bb4d3 100644 --- a/media/java/android/media/Ringtone.java +++ b/media/java/android/media/Ringtone.java @@ -29,11 +29,12 @@ import android.net.Uri; import android.os.Binder; import android.os.Build; import android.os.RemoteException; +import android.os.Trace; import android.provider.MediaStore; import android.provider.MediaStore.MediaColumns; import android.provider.Settings; import android.util.Log; - +import com.android.internal.annotations.VisibleForTesting; import java.io.IOException; import java.util.ArrayList; @@ -136,13 +137,73 @@ public class Ringtone { */ public void setAudioAttributes(AudioAttributes attributes) throws IllegalArgumentException { + setAudioAttributesField(attributes); + // The audio attributes have to be set before the media player is prepared. + // Re-initialize it. + setUri(mUri, mVolumeShaperConfig); + createLocalMediaPlayer(); + } + + /** + * Same as {@link #setAudioAttributes(AudioAttributes)} except this one does not create + * the media player. + * @hide + */ + public void setAudioAttributesField(@Nullable AudioAttributes attributes) { if (attributes == null) { throw new IllegalArgumentException("Invalid null AudioAttributes for Ringtone"); } mAudioAttributes = attributes; - // The audio attributes have to be set before the media player is prepared. - // Re-initialize it. - setUri(mUri, mVolumeShaperConfig); + } + + /** + * Creates a local media player for the ringtone using currently set attributes. + * @hide + */ + public void createLocalMediaPlayer() { + Trace.beginSection("createLocalMediaPlayer"); + if (mUri == null) { + Log.e(TAG, "Could not create media player as no URI was provided."); + return; + } + destroyLocalPlayer(); + // try opening uri locally before delegating to remote player + mLocalPlayer = new MediaPlayer(); + try { + mLocalPlayer.setDataSource(mContext, mUri); + mLocalPlayer.setAudioAttributes(mAudioAttributes); + synchronized (mPlaybackSettingsLock) { + applyPlaybackProperties_sync(); + } + if (mVolumeShaperConfig != null) { + mVolumeShaper = mLocalPlayer.createVolumeShaper(mVolumeShaperConfig); + } + mLocalPlayer.prepare(); + + } catch (SecurityException | IOException e) { + destroyLocalPlayer(); + if (!mAllowRemote) { + Log.w(TAG, "Remote playback not allowed: " + e); + } + } + + if (LOGD) { + if (mLocalPlayer != null) { + Log.d(TAG, "Successfully created local player"); + } else { + Log.d(TAG, "Problem opening; delegating to remote player"); + } + } + Trace.endSection(); + } + + /** + * Returns whether a local player has been created for this ringtone. + * @hide + */ + @VisibleForTesting + public boolean hasLocalPlayer() { + return mLocalPlayer != null; } /** @@ -336,8 +397,7 @@ public class Ringtone { } /** - * Set {@link Uri} to be used for ringtone playback. Attempts to open - * locally, otherwise will delegate playback to remote + * Set {@link Uri} to be used for ringtone playback. * {@link IRingtonePlayer}. * * @hide @@ -348,6 +408,13 @@ public class Ringtone { } /** + * @hide + */ + public void setVolumeShaperConfig(@Nullable VolumeShaper.Configuration volumeShaperConfig) { + mVolumeShaperConfig = volumeShaperConfig; + } + + /** * Set {@link Uri} to be used for ringtone playback. Attempts to open * locally, otherwise will delegate playback to remote * {@link IRingtonePlayer}. Add {@link VolumeShaper} if required. @@ -356,41 +423,10 @@ public class Ringtone { */ public void setUri(Uri uri, @Nullable VolumeShaper.Configuration volumeShaperConfig) { mVolumeShaperConfig = volumeShaperConfig; - destroyLocalPlayer(); mUri = uri; if (mUri == null) { - return; - } - - // TODO: detect READ_EXTERNAL and specific content provider case, instead of relying on throwing - - // try opening uri locally before delegating to remote player - mLocalPlayer = new MediaPlayer(); - try { - mLocalPlayer.setDataSource(mContext, mUri); - mLocalPlayer.setAudioAttributes(mAudioAttributes); - synchronized (mPlaybackSettingsLock) { - applyPlaybackProperties_sync(); - } - if (mVolumeShaperConfig != null) { - mVolumeShaper = mLocalPlayer.createVolumeShaper(mVolumeShaperConfig); - } - mLocalPlayer.prepare(); - - } catch (SecurityException | IOException e) { destroyLocalPlayer(); - if (!mAllowRemote) { - Log.w(TAG, "Remote playback not allowed: " + e); - } - } - - if (LOGD) { - if (mLocalPlayer != null) { - Log.d(TAG, "Successfully created local player"); - } else { - Log.d(TAG, "Problem opening; delegating to remote player"); - } } } diff --git a/media/java/android/media/RingtoneManager.java b/media/java/android/media/RingtoneManager.java index 27727699d05c..27db41cb9f4e 100644 --- a/media/java/android/media/RingtoneManager.java +++ b/media/java/android/media/RingtoneManager.java @@ -480,8 +480,9 @@ public class RingtoneManager { if (mStopPreviousRingtone && mPreviousRingtone != null) { mPreviousRingtone.stop(); } - - mPreviousRingtone = getRingtone(mContext, getRingtoneUri(position), inferStreamType()); + + mPreviousRingtone = + getRingtone(mContext, getRingtoneUri(position), inferStreamType(), true); return mPreviousRingtone; } @@ -677,7 +678,7 @@ public class RingtoneManager { */ public static Ringtone getRingtone(final Context context, Uri ringtoneUri) { // Don't set the stream type - return getRingtone(context, ringtoneUri, -1); + return getRingtone(context, ringtoneUri, -1, true); } /** @@ -698,7 +699,34 @@ public class RingtoneManager { final Context context, Uri ringtoneUri, @Nullable VolumeShaper.Configuration volumeShaperConfig) { // Don't set the stream type - return getRingtone(context, ringtoneUri, -1 /* streamType */, volumeShaperConfig); + return getRingtone(context, ringtoneUri, -1 /* streamType */, volumeShaperConfig, true); + } + + /** + * @hide + */ + public static Ringtone getRingtone(final Context context, Uri ringtoneUri, + @Nullable VolumeShaper.Configuration volumeShaperConfig, + boolean createLocalMediaPlayer) { + // Don't set the stream type + return getRingtone(context, ringtoneUri, -1 /* streamType */, volumeShaperConfig, + createLocalMediaPlayer); + } + + /** + * @hide + */ + public static Ringtone getRingtone(final Context context, Uri ringtoneUri, + @Nullable VolumeShaper.Configuration volumeShaperConfig, + AudioAttributes audioAttributes) { + // Don't set the stream type + Ringtone ringtone = + getRingtone(context, ringtoneUri, -1 /* streamType */, volumeShaperConfig, false); + if (ringtone != null) { + ringtone.setAudioAttributesField(audioAttributes); + ringtone.createLocalMediaPlayer(); + } + return ringtone; } //FIXME bypass the notion of stream types within the class @@ -707,14 +735,19 @@ public class RingtoneManager { * type. Normally, if you change the stream type on the returned * {@link Ringtone}, it will re-create the {@link MediaPlayer}. This is just * an optimized route to avoid that. - * + * * @param streamType The stream type for the ringtone, or -1 if it should * not be set (and the default used instead). + * @param createLocalMediaPlayer when true, the ringtone returned will be fully + * created otherwise, it will require the caller to create the media player manually + * {@link Ringtone#createLocalMediaPlayer()} in order to play the Ringtone. * @see #getRingtone(Context, Uri) */ @UnsupportedAppUsage - private static Ringtone getRingtone(final Context context, Uri ringtoneUri, int streamType) { - return getRingtone(context, ringtoneUri, streamType, null /* volumeShaperConfig */); + private static Ringtone getRingtone(final Context context, Uri ringtoneUri, int streamType, + boolean createLocalMediaPlayer) { + return getRingtone(context, ringtoneUri, streamType, null /* volumeShaperConfig */, + createLocalMediaPlayer); } //FIXME bypass the notion of stream types within the class @@ -730,16 +763,21 @@ public class RingtoneManager { * @see #getRingtone(Context, Uri) */ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) - private static Ringtone getRingtone( - final Context context, Uri ringtoneUri, int streamType, - @Nullable VolumeShaper.Configuration volumeShaperConfig) { + private static Ringtone getRingtone(final Context context, Uri ringtoneUri, int streamType, + @Nullable VolumeShaper.Configuration volumeShaperConfig, + boolean createLocalMediaPlayer) { try { final Ringtone r = new Ringtone(context, true); if (streamType >= 0) { //FIXME deprecated call r.setStreamType(streamType); } + + r.setVolumeShaperConfig(volumeShaperConfig); r.setUri(ringtoneUri, volumeShaperConfig); + if (createLocalMediaPlayer) { + r.createLocalMediaPlayer(); + } return r; } catch (Exception ex) { Log.e(TAG, "Failed to open ringtone " + ringtoneUri + ": " + ex); diff --git a/packages/CompanionDeviceManager/res/values-ko/strings.xml b/packages/CompanionDeviceManager/res/values-ko/strings.xml index 2e4ef58a6f53..edc7d78cff6b 100644 --- a/packages/CompanionDeviceManager/res/values-ko/strings.xml +++ b/packages/CompanionDeviceManager/res/values-ko/strings.xml @@ -23,7 +23,7 @@ <string name="summary_watch" msgid="3002344206574997652">"이 앱은 <xliff:g id="DEVICE_NAME">%1$s</xliff:g> 프로필을 관리하는 데 필요합니다. <xliff:g id="APP_NAME">%2$s</xliff:g>에서 알림과 상호작용하고 내 전화, SMS, 연락처, Calendar, 통화 기록, 근처 기기에 대한 권한을 갖게 됩니다."</string> <string name="permission_apps" msgid="6142133265286656158">"앱"</string> <string name="permission_apps_summary" msgid="798718816711515431">"휴대전화의 앱을 스트리밍합니다."</string> - <string name="title_app_streaming" msgid="2270331024626446950">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> 앱이 휴대전화에서 이 정보에 액세스하도록 허용합니다."</string> + <string name="title_app_streaming" msgid="2270331024626446950">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong>이 휴대전화의 이 정보에 액세스하도록 허용합니다."</string> <string name="helper_title_app_streaming" msgid="4151687003439969765">"교차 기기 서비스"</string> <string name="helper_summary_app_streaming" msgid="5977509499890099">"<xliff:g id="APP_NAME">%1$s</xliff:g>에서 <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> 대신 기기 간에 앱을 스트리밍할 수 있는 권한을 요청하고 있습니다."</string> <string name="title_automotive_projection" msgid="3296005598978412847"></string> diff --git a/packages/CompanionDeviceManager/res/values-pl/strings.xml b/packages/CompanionDeviceManager/res/values-pl/strings.xml index 360560ac7f37..a6320269f650 100644 --- a/packages/CompanionDeviceManager/res/values-pl/strings.xml +++ b/packages/CompanionDeviceManager/res/values-pl/strings.xml @@ -23,7 +23,7 @@ <string name="summary_watch" msgid="3002344206574997652">"Ta aplikacja jest niezbędna do zarządzania profilem <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. Aplikacja <xliff:g id="APP_NAME">%2$s</xliff:g> będzie mogła korzystać z powiadomień oraz uprawnień dotyczących telefonu, SMS-ów, kontaktów, kalendarza, rejestrów połączeń i urządzeń w pobliżu."</string> <string name="permission_apps" msgid="6142133265286656158">"Aplikacje"</string> <string name="permission_apps_summary" msgid="798718816711515431">"Odtwarzaj strumieniowo aplikacje z telefonu"</string> - <string name="title_app_streaming" msgid="2270331024626446950">"Zezwól aplikacji <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> na dostęp do tych informacji na Twoim telefonie"</string> + <string name="title_app_streaming" msgid="2270331024626446950">"Zezwól urządzeniu <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> na dostęp do tych informacji na Twoim telefonie"</string> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Usługi na innym urządzeniu"</string> <string name="helper_summary_app_streaming" msgid="5977509499890099">"Aplikacja <xliff:g id="APP_NAME">%1$s</xliff:g> prosi w imieniu urządzenia <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> o uprawnienia dotyczące strumieniowego odtwarzania treści z aplikacji na innym urządzeniu"</string> <string name="title_automotive_projection" msgid="3296005598978412847"></string> diff --git a/packages/InputDevices/res/values-hi/strings.xml b/packages/InputDevices/res/values-hi/strings.xml index 55fc5bfb6152..c3291a0d0a44 100644 --- a/packages/InputDevices/res/values-hi/strings.xml +++ b/packages/InputDevices/res/values-hi/strings.xml @@ -35,7 +35,7 @@ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"पुर्तगाली"</string> <string name="keyboard_layout_slovak" msgid="2469379934672837296">"स्लोवाक"</string> <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"स्लोवेनियाई"</string> - <string name="keyboard_layout_turkish" msgid="7736163250907964898">"तुर्की"</string> + <string name="keyboard_layout_turkish" msgid="7736163250907964898">"तुर्किये"</string> <string name="keyboard_layout_turkish_f" msgid="9130320856010776018">"Turkish F"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"यूक्रेनियाई"</string> <string name="keyboard_layout_arabic" msgid="5671970465174968712">"अरबी"</string> diff --git a/packages/PrintSpooler/res/values-am/strings.xml b/packages/PrintSpooler/res/values-am/strings.xml index 832b8551f5d6..c1cec384be33 100644 --- a/packages/PrintSpooler/res/values-am/strings.xml +++ b/packages/PrintSpooler/res/values-am/strings.xml @@ -41,7 +41,7 @@ <string name="current_page_template" msgid="5145005201131935302">"<xliff:g id="CURRENT_PAGE">%1$d</xliff:g>/<xliff:g id="PAGE_COUNT">%2$d</xliff:g>"</string> <string name="page_description_template" msgid="6831239682256197161">"ገጽ <xliff:g id="CURRENT_PAGE">%1$d</xliff:g> ከ<xliff:g id="PAGE_COUNT">%2$d</xliff:g>"</string> <string name="summary_template" msgid="8899734908625669193">"ማጠቃለያ፣ ቅጂዎች <xliff:g id="COPIES">%1$s</xliff:g>፣ የወረቀት መጠን <xliff:g id="PAPER_SIZE">%2$s</xliff:g>"</string> - <string name="expand_handle" msgid="7282974448109280522">"እጀታን ወደ ውጪ ላክ"</string> + <string name="expand_handle" msgid="7282974448109280522">"እጀታን ወደ ውጭ ላክ"</string> <string name="collapse_handle" msgid="6886637989442507451">"እጀታን ሰብስብ"</string> <string name="print_button" msgid="645164566271246268">"አትም"</string> <string name="savetopdf_button" msgid="2976186791686924743">"ወደ ፔዲኤፍ አስቀምጥ"</string> diff --git a/packages/PrintSpooler/res/values-es-rUS/strings.xml b/packages/PrintSpooler/res/values-es-rUS/strings.xml index 441ae73877c0..90c1937a2891 100644 --- a/packages/PrintSpooler/res/values-es-rUS/strings.xml +++ b/packages/PrintSpooler/res/values-es-rUS/strings.xml @@ -56,6 +56,7 @@ <string name="print_select_printer" msgid="7388760939873368698">"Seleccionar impresora"</string> <string name="print_forget_printer" msgid="5035287497291910766">"No recordar impresora"</string> <plurals name="print_search_result_count_utterance" formatted="false" msgid="6997663738361080868"> + <item quantity="many"><xliff:g id="COUNT_1">%1$s</xliff:g> printers found</item> <item quantity="other">Se encontraron <xliff:g id="COUNT_1">%1$s</xliff:g> impresoras.</item> <item quantity="one">Se encontró <xliff:g id="COUNT_0">%1$s</xliff:g> impresora.</item> </plurals> @@ -76,6 +77,7 @@ <string name="disabled_services_title" msgid="7313253167968363211">"Servicios inhabilitados"</string> <string name="all_services_title" msgid="5578662754874906455">"Todos los servicios"</string> <plurals name="print_services_recommendation_subtitle" formatted="false" msgid="5678487708807185138"> + <item quantity="many">Install to discover <xliff:g id="COUNT_1">%1$s</xliff:g> printers</item> <item quantity="other">Instala para ver <xliff:g id="COUNT_1">%1$s</xliff:g> impresoras</item> <item quantity="one">Instala para ver <xliff:g id="COUNT_0">%1$s</xliff:g> impresora</item> </plurals> diff --git a/packages/PrintSpooler/res/values-es/strings.xml b/packages/PrintSpooler/res/values-es/strings.xml index c1ff28207ac3..18e56dbcd6fc 100644 --- a/packages/PrintSpooler/res/values-es/strings.xml +++ b/packages/PrintSpooler/res/values-es/strings.xml @@ -56,6 +56,7 @@ <string name="print_select_printer" msgid="7388760939873368698">"Seleccionar impresora"</string> <string name="print_forget_printer" msgid="5035287497291910766">"Olvidar impresora"</string> <plurals name="print_search_result_count_utterance" formatted="false" msgid="6997663738361080868"> + <item quantity="many"><xliff:g id="COUNT_1">%1$s</xliff:g> printers found</item> <item quantity="other">Se han encontrado <xliff:g id="COUNT_1">%1$s</xliff:g> impresoras</item> <item quantity="one">Se ha encontrado <xliff:g id="COUNT_0">%1$s</xliff:g> impresora</item> </plurals> @@ -76,6 +77,7 @@ <string name="disabled_services_title" msgid="7313253167968363211">"Servicios inhabilitados"</string> <string name="all_services_title" msgid="5578662754874906455">"Todos los servicios"</string> <plurals name="print_services_recommendation_subtitle" formatted="false" msgid="5678487708807185138"> + <item quantity="many">Install to discover <xliff:g id="COUNT_1">%1$s</xliff:g> printers</item> <item quantity="other">Instalar para descubrir <xliff:g id="COUNT_1">%1$s</xliff:g> impresoras</item> <item quantity="one">Instalar para descubrir <xliff:g id="COUNT_0">%1$s</xliff:g> impresora</item> </plurals> diff --git a/packages/PrintSpooler/res/values-fr-rCA/strings.xml b/packages/PrintSpooler/res/values-fr-rCA/strings.xml index 3b7775a97dde..082c148746a3 100644 --- a/packages/PrintSpooler/res/values-fr-rCA/strings.xml +++ b/packages/PrintSpooler/res/values-fr-rCA/strings.xml @@ -57,6 +57,7 @@ <string name="print_forget_printer" msgid="5035287497291910766">"Supprimer l\'imprimante"</string> <plurals name="print_search_result_count_utterance" formatted="false" msgid="6997663738361080868"> <item quantity="one"><xliff:g id="COUNT_1">%1$s</xliff:g> imprimante trouvée</item> + <item quantity="many"><xliff:g id="COUNT_1">%1$s</xliff:g> printers found</item> <item quantity="other"><xliff:g id="COUNT_1">%1$s</xliff:g> imprimante trouvées</item> </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> @@ -77,6 +78,7 @@ <string name="all_services_title" msgid="5578662754874906455">"Tous les services"</string> <plurals name="print_services_recommendation_subtitle" formatted="false" msgid="5678487708807185138"> <item quantity="one">Installer pour détecter <xliff:g id="COUNT_1">%1$s</xliff:g> imprimante</item> + <item quantity="many">Install to discover <xliff:g id="COUNT_1">%1$s</xliff:g> printers</item> <item quantity="other">Installer pour détecter <xliff:g id="COUNT_1">%1$s</xliff:g> imprimantes</item> </plurals> <string name="printing_notification_title_template" msgid="295903957762447362">"Impression de <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> en cours…"</string> diff --git a/packages/PrintSpooler/res/values-fr/strings.xml b/packages/PrintSpooler/res/values-fr/strings.xml index f6e901de8393..560c5dcfe924 100644 --- a/packages/PrintSpooler/res/values-fr/strings.xml +++ b/packages/PrintSpooler/res/values-fr/strings.xml @@ -57,6 +57,7 @@ <string name="print_forget_printer" msgid="5035287497291910766">"Supprimer l\'imprimante"</string> <plurals name="print_search_result_count_utterance" formatted="false" msgid="6997663738361080868"> <item quantity="one"><xliff:g id="COUNT_1">%1$s</xliff:g> imprimante trouvée</item> + <item quantity="many"><xliff:g id="COUNT_1">%1$s</xliff:g> printers found</item> <item quantity="other"><xliff:g id="COUNT_1">%1$s</xliff:g> imprimantes trouvées</item> </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> – <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> @@ -77,6 +78,7 @@ <string name="all_services_title" msgid="5578662754874906455">"Tous les services"</string> <plurals name="print_services_recommendation_subtitle" formatted="false" msgid="5678487708807185138"> <item quantity="one">Installer pour détecter <xliff:g id="COUNT_1">%1$s</xliff:g> imprimante</item> + <item quantity="many">Install to discover <xliff:g id="COUNT_1">%1$s</xliff:g> printers</item> <item quantity="other">Installer pour détecter <xliff:g id="COUNT_1">%1$s</xliff:g> imprimantes</item> </plurals> <string name="printing_notification_title_template" msgid="295903957762447362">"Impression de \"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>\" en cours…"</string> diff --git a/packages/PrintSpooler/res/values-it/strings.xml b/packages/PrintSpooler/res/values-it/strings.xml index 96751ea12081..569bbc2ef045 100644 --- a/packages/PrintSpooler/res/values-it/strings.xml +++ b/packages/PrintSpooler/res/values-it/strings.xml @@ -56,6 +56,7 @@ <string name="print_select_printer" msgid="7388760939873368698">"Seleziona stampante"</string> <string name="print_forget_printer" msgid="5035287497291910766">"Elimina stampante"</string> <plurals name="print_search_result_count_utterance" formatted="false" msgid="6997663738361080868"> + <item quantity="many"><xliff:g id="COUNT_1">%1$s</xliff:g> printers found</item> <item quantity="other"><xliff:g id="COUNT_1">%1$s</xliff:g> stampanti trovate</item> <item quantity="one"><xliff:g id="COUNT_0">%1$s</xliff:g> stampante trovata</item> </plurals> @@ -76,6 +77,7 @@ <string name="disabled_services_title" msgid="7313253167968363211">"Servizi disattivati"</string> <string name="all_services_title" msgid="5578662754874906455">"Tutti i servizi"</string> <plurals name="print_services_recommendation_subtitle" formatted="false" msgid="5678487708807185138"> + <item quantity="many">Install to discover <xliff:g id="COUNT_1">%1$s</xliff:g> printers</item> <item quantity="other">Installa per rilevare <xliff:g id="COUNT_1">%1$s</xliff:g> stampanti</item> <item quantity="one">Installa per rilevare <xliff:g id="COUNT_0">%1$s</xliff:g> stampante</item> </plurals> diff --git a/packages/PrintSpooler/res/values-pt-rBR/strings.xml b/packages/PrintSpooler/res/values-pt-rBR/strings.xml index 6ce46367d8c1..3b460a1fe6dd 100644 --- a/packages/PrintSpooler/res/values-pt-rBR/strings.xml +++ b/packages/PrintSpooler/res/values-pt-rBR/strings.xml @@ -57,6 +57,7 @@ <string name="print_forget_printer" msgid="5035287497291910766">"Esquecer impressora"</string> <plurals name="print_search_result_count_utterance" formatted="false" msgid="6997663738361080868"> <item quantity="one"><xliff:g id="COUNT_1">%1$s</xliff:g> impressoras encontradas</item> + <item quantity="many"><xliff:g id="COUNT_1">%1$s</xliff:g> printers found</item> <item quantity="other"><xliff:g id="COUNT_1">%1$s</xliff:g> impressoras encontradas</item> </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> @@ -77,6 +78,7 @@ <string name="all_services_title" msgid="5578662754874906455">"Todos os serviços"</string> <plurals name="print_services_recommendation_subtitle" formatted="false" msgid="5678487708807185138"> <item quantity="one">Instale para encontrar <xliff:g id="COUNT_1">%1$s</xliff:g> impressoras</item> + <item quantity="many">Install to discover <xliff:g id="COUNT_1">%1$s</xliff:g> printers</item> <item quantity="other">Instale para encontrar <xliff:g id="COUNT_1">%1$s</xliff:g> impressoras</item> </plurals> <string name="printing_notification_title_template" msgid="295903957762447362">"Imprimindo <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-pt-rPT/strings.xml b/packages/PrintSpooler/res/values-pt-rPT/strings.xml index 4517efe0934a..8c1087e463a0 100644 --- a/packages/PrintSpooler/res/values-pt-rPT/strings.xml +++ b/packages/PrintSpooler/res/values-pt-rPT/strings.xml @@ -56,6 +56,7 @@ <string name="print_select_printer" msgid="7388760939873368698">"Selecionar impressora"</string> <string name="print_forget_printer" msgid="5035287497291910766">"Esquecer impressora"</string> <plurals name="print_search_result_count_utterance" formatted="false" msgid="6997663738361080868"> + <item quantity="many"><xliff:g id="COUNT_1">%1$s</xliff:g> printers found</item> <item quantity="other"><xliff:g id="COUNT_1">%1$s</xliff:g> impressoras encontradas</item> <item quantity="one"><xliff:g id="COUNT_0">%1$s</xliff:g> impressora encontrada</item> </plurals> @@ -76,6 +77,7 @@ <string name="disabled_services_title" msgid="7313253167968363211">"Serviços desativados"</string> <string name="all_services_title" msgid="5578662754874906455">"Todos os serviços"</string> <plurals name="print_services_recommendation_subtitle" formatted="false" msgid="5678487708807185138"> + <item quantity="many">Install to discover <xliff:g id="COUNT_1">%1$s</xliff:g> printers</item> <item quantity="other">Instale para detetar <xliff:g id="COUNT_1">%1$s</xliff:g> impressoras</item> <item quantity="one">Instale para detetar <xliff:g id="COUNT_0">%1$s</xliff:g> impressora</item> </plurals> diff --git a/packages/PrintSpooler/res/values-pt/strings.xml b/packages/PrintSpooler/res/values-pt/strings.xml index 6ce46367d8c1..3b460a1fe6dd 100644 --- a/packages/PrintSpooler/res/values-pt/strings.xml +++ b/packages/PrintSpooler/res/values-pt/strings.xml @@ -57,6 +57,7 @@ <string name="print_forget_printer" msgid="5035287497291910766">"Esquecer impressora"</string> <plurals name="print_search_result_count_utterance" formatted="false" msgid="6997663738361080868"> <item quantity="one"><xliff:g id="COUNT_1">%1$s</xliff:g> impressoras encontradas</item> + <item quantity="many"><xliff:g id="COUNT_1">%1$s</xliff:g> printers found</item> <item quantity="other"><xliff:g id="COUNT_1">%1$s</xliff:g> impressoras encontradas</item> </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> @@ -77,6 +78,7 @@ <string name="all_services_title" msgid="5578662754874906455">"Todos os serviços"</string> <plurals name="print_services_recommendation_subtitle" formatted="false" msgid="5678487708807185138"> <item quantity="one">Instale para encontrar <xliff:g id="COUNT_1">%1$s</xliff:g> impressoras</item> + <item quantity="many">Install to discover <xliff:g id="COUNT_1">%1$s</xliff:g> printers</item> <item quantity="other">Instale para encontrar <xliff:g id="COUNT_1">%1$s</xliff:g> impressoras</item> </plurals> <string name="printing_notification_title_template" msgid="295903957762447362">"Imprimindo <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/home/HomePage.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/home/HomePage.kt index 7c57e75f0c40..199a45b35108 100644 --- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/home/HomePage.kt +++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/home/HomePage.kt @@ -20,6 +20,8 @@ import android.os.Bundle import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview +import com.android.settingslib.spa.framework.common.SettingsEntry +import com.android.settingslib.spa.framework.common.SettingsPage import com.android.settingslib.spa.framework.common.SettingsPageProvider import com.android.settingslib.spa.framework.theme.SettingsTheme import com.android.settingslib.spa.gallery.R @@ -35,6 +37,37 @@ import com.android.settingslib.spa.widget.scaffold.HomeScaffold object HomePageProvider : SettingsPageProvider { override val name = "Home" + override fun buildEntry(arguments: Bundle?): List<SettingsEntry> { + val owner = SettingsPage.create(name) + val entryList = mutableListOf<SettingsEntry>() + entryList.add( + PreferenceMainPageProvider.buildInjectEntry() + .setLink(fromPage = owner).build() + ) + entryList.add( + SliderPageProvider.buildInjectEntry() + .setLink(fromPage = owner).build() + ) + entryList.add( + SpinnerPageProvider.buildInjectEntry() + .setLink(fromPage = owner).build() + ) + entryList.add( + SettingsPagerPageProvider.buildInjectEntry() + .setLink(fromPage = owner).build() + ) + entryList.add( + FooterPageProvider.buildInjectEntry() + .setLink(fromPage = owner).build() + ) + entryList.add( + IllustrationPageProvider.buildInjectEntry() + .setLink(fromPage = owner).build() + ) + + return entryList + } + @Composable override fun Page(arguments: Bundle?) { HomePage() diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/FooterPage.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/FooterPage.kt index 4a933acbd805..a8225839c866 100644 --- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/FooterPage.kt +++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/FooterPage.kt @@ -20,6 +20,9 @@ import android.os.Bundle import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.tooling.preview.Preview +import com.android.settingslib.spa.framework.common.SettingsEntry +import com.android.settingslib.spa.framework.common.SettingsEntryBuilder +import com.android.settingslib.spa.framework.common.SettingsPage import com.android.settingslib.spa.framework.common.SettingsPageProvider import com.android.settingslib.spa.framework.compose.navigator import com.android.settingslib.spa.framework.compose.stateOf @@ -34,6 +37,36 @@ private const val TITLE = "Sample Footer" object FooterPageProvider : SettingsPageProvider { override val name = "Footer" + override fun buildEntry(arguments: Bundle?): List<SettingsEntry> { + val owner = SettingsPage.create(name) + val entryList = mutableListOf<SettingsEntry>() + entryList.add( + SettingsEntryBuilder.create( "Some Preference", owner) + .setIsAllowSearch(true) + .setUiLayoutFn { + Preference(remember { + object : PreferenceModel { + override val title = "Some Preference" + override val summary = stateOf("Some summary") + } + }) + }.build() + ) + + return entryList + } + + fun buildInjectEntry(): SettingsEntryBuilder { + return SettingsEntryBuilder.createInject(owner = SettingsPage.create(name)) + .setIsAllowSearch(true) + .setUiLayoutFn { + Preference(object : PreferenceModel { + override val title = TITLE + override val onClick = navigator(name) + }) + } + } + @Composable override fun Page(arguments: Bundle?) { FooterPage() @@ -41,22 +74,16 @@ object FooterPageProvider : SettingsPageProvider { @Composable fun EntryItem() { - Preference(object : PreferenceModel { - override val title = TITLE - override val onClick = navigator(name) - }) + buildInjectEntry().build().uiLayout.let { it() } } } @Composable private fun FooterPage() { RegularScaffold(title = TITLE) { - Preference(remember { - object : PreferenceModel { - override val title = "Some Preference" - override val summary = stateOf("Some summary") - } - }) + for (entry in FooterPageProvider.buildEntry(arguments = null)) { + entry.uiLayout() + } Footer(footerText = "Footer text always at the end of page.") } } diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/IllustrationPage.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/IllustrationPage.kt index 4f8ea0b75e0a..1afb7d8c1cec 100644 --- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/IllustrationPage.kt +++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/IllustrationPage.kt @@ -17,12 +17,11 @@ package com.android.settingslib.spa.gallery.page import android.os.Bundle -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.verticalScroll import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview +import com.android.settingslib.spa.framework.common.SettingsEntry +import com.android.settingslib.spa.framework.common.SettingsEntryBuilder +import com.android.settingslib.spa.framework.common.SettingsPage import com.android.settingslib.spa.framework.common.SettingsPageProvider import com.android.settingslib.spa.framework.compose.navigator import com.android.settingslib.spa.framework.theme.SettingsTheme @@ -32,10 +31,57 @@ import com.android.settingslib.spa.widget.IllustrationModel import com.android.settingslib.spa.widget.ResourceType import com.android.settingslib.spa.widget.preference.Preference import com.android.settingslib.spa.widget.preference.PreferenceModel +import com.android.settingslib.spa.widget.scaffold.RegularScaffold + +private const val TITLE = "Sample Illustration" object IllustrationPageProvider : SettingsPageProvider { override val name = "Illustration" + override fun buildEntry(arguments: Bundle?): List<SettingsEntry> { + val owner = SettingsPage.create(name) + val entryList = mutableListOf<SettingsEntry>() + entryList.add( + SettingsEntryBuilder.create( "Lottie Illustration", owner) + .setUiLayoutFn { + Preference(object : PreferenceModel { + override val title = "Lottie Illustration" + }) + + Illustration(object : IllustrationModel { + override val resId = R.raw.accessibility_shortcut_type_triple_tap + override val resourceType = ResourceType.LOTTIE + }) + }.build() + ) + entryList.add( + SettingsEntryBuilder.create( "Image Illustration", owner) + .setUiLayoutFn { + Preference(object : PreferenceModel { + override val title = "Image Illustration" + }) + + Illustration(object : IllustrationModel { + override val resId = R.drawable.accessibility_captioning_banner + override val resourceType = ResourceType.IMAGE + }) + }.build() + ) + + return entryList + } + + fun buildInjectEntry(): SettingsEntryBuilder { + return SettingsEntryBuilder.createInject(owner = SettingsPage.create(name)) + .setIsAllowSearch(true) + .setUiLayoutFn { + Preference(object : PreferenceModel { + override val title = TITLE + override val onClick = navigator(name) + }) + } + } + @Composable override fun Page(arguments: Bundle?) { IllustrationPage() @@ -43,33 +89,16 @@ object IllustrationPageProvider : SettingsPageProvider { @Composable fun EntryItem() { - Preference(object : PreferenceModel { - override val title = "Sample Illustration" - override val onClick = navigator(name) - }) + buildInjectEntry().build().uiLayout.let { it() } } } @Composable private fun IllustrationPage() { - Column(Modifier.verticalScroll(rememberScrollState())) { - Preference(object : PreferenceModel { - override val title = "Lottie Illustration" - }) - - Illustration(object : IllustrationModel { - override val resId = R.raw.accessibility_shortcut_type_triple_tap - override val resourceType = ResourceType.LOTTIE - }) - - Preference(object : PreferenceModel { - override val title = "Image Illustration" - }) - - Illustration(object : IllustrationModel { - override val resId = R.drawable.accessibility_captioning_banner - override val resourceType = ResourceType.IMAGE - }) + RegularScaffold(title = TITLE) { + for (entry in IllustrationPageProvider.buildEntry(arguments = null)) { + entry.uiLayout() + } } } diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/SettingsPagerPage.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/SettingsPagerPage.kt index 9d8081867663..ff5f71b63560 100644 --- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/SettingsPagerPage.kt +++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/SettingsPagerPage.kt @@ -19,6 +19,8 @@ package com.android.settingslib.spa.gallery.page import android.os.Bundle import androidx.compose.runtime.Composable import androidx.compose.ui.tooling.preview.Preview +import com.android.settingslib.spa.framework.common.SettingsEntryBuilder +import com.android.settingslib.spa.framework.common.SettingsPage import com.android.settingslib.spa.framework.common.SettingsPageProvider import com.android.settingslib.spa.framework.compose.navigator import com.android.settingslib.spa.framework.theme.SettingsTheme @@ -33,6 +35,17 @@ private const val TITLE = "Sample SettingsPager" object SettingsPagerPageProvider : SettingsPageProvider { override val name = "SettingsPager" + fun buildInjectEntry(): SettingsEntryBuilder { + return SettingsEntryBuilder.createInject(owner = SettingsPage.create(name)) + .setIsAllowSearch(true) + .setUiLayoutFn { + Preference(object : PreferenceModel { + override val title = TITLE + override val onClick = navigator(name) + }) + } + } + @Composable override fun Page(arguments: Bundle?) { SettingsPagerPage() @@ -40,10 +53,7 @@ object SettingsPagerPageProvider : SettingsPageProvider { @Composable fun EntryItem() { - Preference(object : PreferenceModel { - override val title = TITLE - override val onClick = navigator(name) - }) + buildInjectEntry().build().uiLayout.let { it() } } } diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/SliderPage.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/SliderPage.kt index 130cbd9f7b7b..53eeda21b49c 100644 --- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/SliderPage.kt +++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/SliderPage.kt @@ -27,6 +27,9 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.tooling.preview.Preview +import com.android.settingslib.spa.framework.common.SettingsEntry +import com.android.settingslib.spa.framework.common.SettingsEntryBuilder +import com.android.settingslib.spa.framework.common.SettingsPage import com.android.settingslib.spa.framework.common.SettingsPageProvider import com.android.settingslib.spa.framework.compose.navigator import com.android.settingslib.spa.framework.theme.SettingsTheme @@ -41,6 +44,81 @@ private const val TITLE = "Sample Slider" object SliderPageProvider : SettingsPageProvider { override val name = "Slider" + override fun buildEntry(arguments: Bundle?): List<SettingsEntry> { + val owner = SettingsPage.create(name) + val entryList = mutableListOf<SettingsEntry>() + entryList.add( + SettingsEntryBuilder.create("Simple Slider", owner) + .setIsAllowSearch(true) + .setUiLayoutFn { + SettingsSlider(object : SettingsSliderModel { + override val title = "Simple Slider" + override val initValue = 40 + }) + }.build() + ) + entryList.add( + SettingsEntryBuilder.create("Slider with icon", owner) + .setIsAllowSearch(true) + .setUiLayoutFn { + SettingsSlider(object : SettingsSliderModel { + override val title = "Slider with icon" + override val initValue = 30 + override val onValueChangeFinished = { + println("onValueChangeFinished") + } + override val icon = Icons.Outlined.AccessAlarm + }) + }.build() + ) + entryList.add( + SettingsEntryBuilder.create("Slider with changeable icon", owner) + .setIsAllowSearch(true) + .setUiLayoutFn { + val initValue = 0 + var icon by remember { mutableStateOf(Icons.Outlined.MusicOff) } + var sliderPosition by remember { mutableStateOf(initValue) } + SettingsSlider(object : SettingsSliderModel { + override val title = "Slider with changeable icon" + override val initValue = initValue + override val onValueChange = { it: Int -> + sliderPosition = it + icon = if (it > 0) Icons.Outlined.MusicNote else Icons.Outlined.MusicOff + } + override val onValueChangeFinished = { + println("onValueChangeFinished: the value is $sliderPosition") + } + override val icon = icon + }) + }.build() + ) + entryList.add( + SettingsEntryBuilder.create("Slider with steps", owner) + .setIsAllowSearch(true) + .setUiLayoutFn { + SettingsSlider(object : SettingsSliderModel { + override val title = "Slider with steps" + override val initValue = 2 + override val valueRange = 1..5 + override val showSteps = true + }) + }.build() + ) + + return entryList + } + + fun buildInjectEntry(): SettingsEntryBuilder { + return SettingsEntryBuilder.createInject(owner = SettingsPage.create(name)) + .setIsAllowSearch(true) + .setUiLayoutFn { + Preference(object : PreferenceModel { + override val title = TITLE + override val onClick = navigator(name) + }) + } + } + @Composable override fun Page(arguments: Bundle?) { SliderPage() @@ -48,52 +126,16 @@ object SliderPageProvider : SettingsPageProvider { @Composable fun EntryItem() { - Preference(object : PreferenceModel { - override val title = TITLE - override val onClick = navigator(name) - }) + buildInjectEntry().build().uiLayout.let { it() } } } @Composable private fun SliderPage() { RegularScaffold(title = TITLE) { - SettingsSlider(object : SettingsSliderModel { - override val title = "Slider" - override val initValue = 40 - }) - - SettingsSlider(object : SettingsSliderModel { - override val title = "Slider with icon" - override val initValue = 30 - override val onValueChangeFinished = { - println("onValueChangeFinished") - } - override val icon = Icons.Outlined.AccessAlarm - }) - - val initValue = 0 - var icon by remember { mutableStateOf(Icons.Outlined.MusicOff) } - var sliderPosition by remember { mutableStateOf(initValue) } - SettingsSlider(object : SettingsSliderModel { - override val title = "Slider with changeable icon" - override val initValue = initValue - override val onValueChange = { it: Int -> - sliderPosition = it - icon = if (it > 0) Icons.Outlined.MusicNote else Icons.Outlined.MusicOff - } - override val onValueChangeFinished = { - println("onValueChangeFinished: the value is $sliderPosition") - } - override val icon = icon - }) - - SettingsSlider(object : SettingsSliderModel { - override val title = "Slider with steps" - override val initValue = 2 - override val valueRange = 1..5 - override val showSteps = true - }) + for (entry in SliderPageProvider.buildEntry(arguments = null)) { + entry.uiLayout() + } } } diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/MainSwitchPreferencePage.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/MainSwitchPreferencePage.kt index 53d764896f5c..04f1543aa9a8 100644 --- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/MainSwitchPreferencePage.kt +++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/MainSwitchPreferencePage.kt @@ -22,6 +22,9 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.ui.tooling.preview.Preview +import com.android.settingslib.spa.framework.common.SettingsEntry +import com.android.settingslib.spa.framework.common.SettingsEntryBuilder +import com.android.settingslib.spa.framework.common.SettingsPage import com.android.settingslib.spa.framework.common.SettingsPageProvider import com.android.settingslib.spa.framework.compose.navigator import com.android.settingslib.spa.framework.compose.stateOf @@ -37,6 +40,38 @@ private const val TITLE = "Sample MainSwitchPreference" object MainSwitchPreferencePageProvider : SettingsPageProvider { override val name = "MainSwitchPreference" + override fun buildEntry(arguments: Bundle?): List<SettingsEntry> { + val owner = SettingsPage.create(name) + val entryList = mutableListOf<SettingsEntry>() + entryList.add( + SettingsEntryBuilder.create( "MainSwitchPreference", owner) + .setIsAllowSearch(true) + .setUiLayoutFn { + SampleMainSwitchPreference() + }.build() + ) + entryList.add( + SettingsEntryBuilder.create( "MainSwitchPreference not changeable", owner) + .setIsAllowSearch(true) + .setUiLayoutFn { + SampleNotChangeableMainSwitchPreference() + }.build() + ) + + return entryList + } + + fun buildInjectEntry(): SettingsEntryBuilder { + return SettingsEntryBuilder.createInject(owner = SettingsPage.create(name)) + .setIsAllowSearch(true) + .setUiLayoutFn { + Preference(object : PreferenceModel { + override val title = TITLE + override val onClick = navigator(name) + }) + } + } + @Composable override fun Page(arguments: Bundle?) { MainSwitchPreferencePage() @@ -44,18 +79,16 @@ object MainSwitchPreferencePageProvider : SettingsPageProvider { @Composable fun EntryItem() { - Preference(object : PreferenceModel { - override val title = TITLE - override val onClick = navigator(name) - }) + buildInjectEntry().build().uiLayout.let { it() } } } @Composable private fun MainSwitchPreferencePage() { RegularScaffold(title = TITLE) { - SampleMainSwitchPreference() - SampleNotChangeableMainSwitchPreference() + for (entry in MainSwitchPreferencePageProvider.buildEntry(arguments = null)) { + entry.uiLayout() + } } } diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/PreferenceMain.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/PreferenceMain.kt index 0a8dae321ac6..417601ed786f 100644 --- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/PreferenceMain.kt +++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/PreferenceMain.kt @@ -18,6 +18,9 @@ package com.android.settingslib.spa.gallery.preference import android.os.Bundle import androidx.compose.runtime.Composable +import com.android.settingslib.spa.framework.common.SettingsEntry +import com.android.settingslib.spa.framework.common.SettingsEntryBuilder +import com.android.settingslib.spa.framework.common.SettingsPage import com.android.settingslib.spa.framework.common.SettingsPageProvider import com.android.settingslib.spa.framework.compose.navigator import com.android.settingslib.spa.widget.preference.Preference @@ -29,6 +32,39 @@ private const val TITLE = "Category: Preference" object PreferenceMainPageProvider : SettingsPageProvider { override val name = "PreferenceMain" + override fun buildEntry(arguments: Bundle?): List<SettingsEntry> { + val entryList = mutableListOf<SettingsEntry>() + entryList.add( + PreferencePageProvider.buildInjectEntry() + .setLink(fromPage = SettingsPage.create(name)).build() + ) + entryList.add( + SwitchPreferencePageProvider.buildInjectEntry() + .setLink(fromPage = SettingsPage.create(name)).build() + ) + entryList.add( + MainSwitchPreferencePageProvider.buildInjectEntry() + .setLink(fromPage = SettingsPage.create(name)).build() + ) + entryList.add( + TwoTargetSwitchPreferencePageProvider.buildInjectEntry() + .setLink(fromPage = SettingsPage.create(name)).build() + ) + + return entryList + } + + fun buildInjectEntry(): SettingsEntryBuilder { + return SettingsEntryBuilder.createInject(owner = SettingsPage.create(name)) + .setIsAllowSearch(true) + .setUiLayoutFn { + Preference(object : PreferenceModel { + override val title = TITLE + override val onClick = navigator(name) + }) + } + } + @Composable override fun Page(arguments: Bundle?) { PreferenceMain() @@ -36,10 +72,7 @@ object PreferenceMainPageProvider : SettingsPageProvider { @Composable fun EntryItem() { - Preference(object : PreferenceModel { - override val title = TITLE - override val onClick = navigator(name) - }) + buildInjectEntry().build().uiLayout.let { it() } } } diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/PreferencePage.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/PreferencePage.kt index 36c619f79f5a..c7547a063c28 100644 --- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/PreferencePage.kt +++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/PreferencePage.kt @@ -29,6 +29,9 @@ import androidx.compose.runtime.produceState import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.tooling.preview.Preview +import com.android.settingslib.spa.framework.common.SettingsEntry +import com.android.settingslib.spa.framework.common.SettingsEntryBuilder +import com.android.settingslib.spa.framework.common.SettingsPage import com.android.settingslib.spa.framework.common.SettingsPageProvider import com.android.settingslib.spa.framework.compose.navigator import com.android.settingslib.spa.framework.compose.toState @@ -44,6 +47,100 @@ private const val TITLE = "Sample Preference" object PreferencePageProvider : SettingsPageProvider { override val name = "Preference" + override fun buildEntry(arguments: Bundle?): List<SettingsEntry> { + val owner = SettingsPage.create(name) + val entryList = mutableListOf<SettingsEntry>() + entryList.add( + SettingsEntryBuilder.create("Preference", owner) + .setIsAllowSearch(true) + .setUiLayoutFn { + Preference(object : PreferenceModel { + override val title = "Preference" + }) + }.build() + ) + entryList.add( + SettingsEntryBuilder.create("Preference with summary", owner) + .setIsAllowSearch(true) + .setUiLayoutFn { + Preference(object : PreferenceModel { + override val title = "Preference" + override val summary = "With summary".toState() + }) + }.build() + ) + entryList.add( + SettingsEntryBuilder.create("Preference with async summary", owner) + .setIsAllowSearch(true) + .setUiLayoutFn { + Preference(object : PreferenceModel { + override val title = "Preference" + override val summary = produceState(initialValue = " ") { + delay(1000L) + value = "Async summary" + } + }) + }.build() + ) + entryList.add( + SettingsEntryBuilder.create("Click me", owner) + .setIsAllowSearch(true) + .setUiLayoutFn { + var count by rememberSaveable { mutableStateOf(0) } + Preference(object : PreferenceModel { + override val title = "Click me" + override val summary = derivedStateOf { count.toString() } + override val onClick: (() -> Unit) = { count++ } + override val icon = @Composable { + SettingsIcon(imageVector = Icons.Outlined.TouchApp) + } + }) + }.build() + ) + entryList.add( + SettingsEntryBuilder.create("Ticker", owner) + .setIsAllowSearch(true) + .setUiLayoutFn { + var ticks by rememberSaveable { mutableStateOf(0) } + LaunchedEffect(ticks) { + delay(1000L) + ticks++ + } + Preference(object : PreferenceModel { + override val title = "Ticker" + override val summary = derivedStateOf { ticks.toString() } + }) + }.build() + ) + entryList.add( + SettingsEntryBuilder.create("Disabled", owner) + .setIsAllowSearch(true) + .setUiLayoutFn { + Preference(object : PreferenceModel { + override val title = "Disabled" + override val summary = "Disabled".toState() + override val enabled = false.toState() + override val icon = @Composable { + SettingsIcon(imageVector = Icons.Outlined.DisabledByDefault) + } + }) + }.build() + ) + + return entryList + } + + fun buildInjectEntry(): SettingsEntryBuilder { + return SettingsEntryBuilder.createInject(owner = SettingsPage.create(name)) + .setIsAllowSearch(true) + .setUiLayoutFn { + Preference(object : PreferenceModel { + override val title = TITLE + override val onClick = navigator(name) + }) + } + } + @Composable override fun Page(arguments: Bundle?) { PreferencePage() @@ -51,61 +148,16 @@ object PreferencePageProvider : SettingsPageProvider { @Composable fun EntryItem() { - Preference(object : PreferenceModel { - override val title = TITLE - override val onClick = navigator(name) - }) + buildInjectEntry().build().uiLayout.let { it() } } } @Composable private fun PreferencePage() { RegularScaffold(title = TITLE) { - Preference(object : PreferenceModel { - override val title = "Preference" - }) - - Preference(object : PreferenceModel { - override val title = "Preference" - override val summary = "With summary".toState() - }) - - Preference(object : PreferenceModel { - override val title = "Preference" - override val summary = produceState(initialValue = " ") { - delay(1000L) - value = "Async summary" - } - }) - - var count by rememberSaveable { mutableStateOf(0) } - Preference(object : PreferenceModel { - override val title = "Click me" - override val summary = derivedStateOf { count.toString() } - override val onClick: (() -> Unit) = { count++ } - override val icon = @Composable { - SettingsIcon(imageVector = Icons.Outlined.TouchApp) - } - }) - - var ticks by rememberSaveable { mutableStateOf(0) } - LaunchedEffect(ticks) { - delay(1000L) - ticks++ + for (entry in PreferencePageProvider.buildEntry(arguments = null)) { + entry.uiLayout() } - Preference(object : PreferenceModel { - override val title = "Ticker" - override val summary = derivedStateOf { ticks.toString() } - }) - - Preference(object : PreferenceModel { - override val title = "Disabled" - override val summary = "Disabled".toState() - override val enabled = false.toState() - override val icon = @Composable { - SettingsIcon(imageVector = Icons.Outlined.DisabledByDefault) - } - }) } } diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/SwitchPreferencePage.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/SwitchPreferencePage.kt index 8be6a895f3a4..c5d52d813b06 100644 --- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/SwitchPreferencePage.kt +++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/SwitchPreferencePage.kt @@ -23,6 +23,9 @@ import androidx.compose.runtime.produceState import androidx.compose.runtime.remember import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.ui.tooling.preview.Preview +import com.android.settingslib.spa.framework.common.SettingsEntry +import com.android.settingslib.spa.framework.common.SettingsEntryBuilder +import com.android.settingslib.spa.framework.common.SettingsPage import com.android.settingslib.spa.framework.common.SettingsPageProvider import com.android.settingslib.spa.framework.compose.navigator import com.android.settingslib.spa.framework.compose.stateOf @@ -39,6 +42,52 @@ private const val TITLE = "Sample SwitchPreference" object SwitchPreferencePageProvider : SettingsPageProvider { override val name = "SwitchPreference" + override fun buildEntry(arguments: Bundle?): List<SettingsEntry> { + val owner = SettingsPage.create(name) + val entryList = mutableListOf<SettingsEntry>() + entryList.add( + SettingsEntryBuilder.create( "SwitchPreference", owner) + .setIsAllowSearch(true) + .setUiLayoutFn { + SampleSwitchPreference() + }.build() + ) + entryList.add( + SettingsEntryBuilder.create( "SwitchPreference with summary", owner) + .setIsAllowSearch(true) + .setUiLayoutFn { + SampleSwitchPreferenceWithSummary() + }.build() + ) + entryList.add( + SettingsEntryBuilder.create( "SwitchPreference with async summary", owner) + .setIsAllowSearch(true) + .setUiLayoutFn { + SampleSwitchPreferenceWithAsyncSummary() + }.build() + ) + entryList.add( + SettingsEntryBuilder.create( "SwitchPreference not changeable", owner) + .setIsAllowSearch(true) + .setUiLayoutFn { + SampleNotChangeableSwitchPreference() + }.build() + ) + + return entryList + } + + fun buildInjectEntry(): SettingsEntryBuilder { + return SettingsEntryBuilder.createInject(owner = SettingsPage.create(name)) + .setIsAllowSearch(true) + .setUiLayoutFn { + Preference(object : PreferenceModel { + override val title = TITLE + override val onClick = navigator(name) + }) + } + } + @Composable override fun Page(arguments: Bundle?) { SwitchPreferencePage() @@ -46,20 +95,16 @@ object SwitchPreferencePageProvider : SettingsPageProvider { @Composable fun EntryItem() { - Preference(object : PreferenceModel { - override val title = TITLE - override val onClick = navigator(name) - }) + buildInjectEntry().build().uiLayout.let { it() } } } @Composable private fun SwitchPreferencePage() { RegularScaffold(title = TITLE) { - SampleSwitchPreference() - SampleSwitchPreferenceWithSummary() - SampleSwitchPreferenceWithAsyncSummary() - SampleNotChangeableSwitchPreference() + for (entry in SwitchPreferencePageProvider.buildEntry(arguments = null)) { + entry.uiLayout() + } } } diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/TwoTargetSwitchPreferencePage.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/TwoTargetSwitchPreferencePage.kt index 894692be13b8..63bb50e419b0 100644 --- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/TwoTargetSwitchPreferencePage.kt +++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/TwoTargetSwitchPreferencePage.kt @@ -23,6 +23,9 @@ import androidx.compose.runtime.produceState import androidx.compose.runtime.remember import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.ui.tooling.preview.Preview +import com.android.settingslib.spa.framework.common.SettingsEntry +import com.android.settingslib.spa.framework.common.SettingsEntryBuilder +import com.android.settingslib.spa.framework.common.SettingsPage import com.android.settingslib.spa.framework.common.SettingsPageProvider import com.android.settingslib.spa.framework.compose.navigator import com.android.settingslib.spa.framework.compose.stateOf @@ -39,6 +42,52 @@ private const val TITLE = "Sample TwoTargetSwitchPreference" object TwoTargetSwitchPreferencePageProvider : SettingsPageProvider { override val name = "TwoTargetSwitchPreference" + override fun buildEntry(arguments: Bundle?): List<SettingsEntry> { + val owner = SettingsPage.create(name) + val entryList = mutableListOf<SettingsEntry>() + entryList.add( + SettingsEntryBuilder.create( "TwoTargetSwitchPreference", owner) + .setIsAllowSearch(true) + .setUiLayoutFn { + SampleTwoTargetSwitchPreference() + }.build() + ) + entryList.add( + SettingsEntryBuilder.create( "TwoTargetSwitchPreference with summary", owner) + .setIsAllowSearch(true) + .setUiLayoutFn { + SampleTwoTargetSwitchPreferenceWithSummary() + }.build() + ) + entryList.add( + SettingsEntryBuilder.create( "TwoTargetSwitchPreference with async summary", owner) + .setIsAllowSearch(true) + .setUiLayoutFn { + SampleTwoTargetSwitchPreferenceWithAsyncSummary() + }.build() + ) + entryList.add( + SettingsEntryBuilder.create( "TwoTargetSwitchPreference not changeable", owner) + .setIsAllowSearch(true) + .setUiLayoutFn { + SampleNotChangeableTwoTargetSwitchPreference() + }.build() + ) + + return entryList + } + + fun buildInjectEntry(): SettingsEntryBuilder { + return SettingsEntryBuilder.createInject(owner = SettingsPage.create(name)) + .setIsAllowSearch(true) + .setUiLayoutFn { + Preference(object : PreferenceModel { + override val title = TITLE + override val onClick = navigator(name) + }) + } + } + @Composable override fun Page(arguments: Bundle?) { TwoTargetSwitchPreferencePage() @@ -46,20 +95,16 @@ object TwoTargetSwitchPreferencePageProvider : SettingsPageProvider { @Composable fun EntryItem() { - Preference(object : PreferenceModel { - override val title = TITLE - override val onClick = navigator(name) - }) + buildInjectEntry().build().uiLayout.let { it() } } } @Composable private fun TwoTargetSwitchPreferencePage() { RegularScaffold(title = TITLE) { - SampleTwoTargetSwitchPreference() - SampleTwoTargetSwitchPreferenceWithSummary() - SampleTwoTargetSwitchPreferenceWithAsyncSummary() - SampleNotChangeableTwoTargetSwitchPreference() + for (entry in TwoTargetSwitchPreferencePageProvider.buildEntry(arguments = null)) { + entry.uiLayout() + } } } diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/ui/SpinnerPage.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/ui/SpinnerPage.kt index 7efa85b4ad78..7479d467826c 100644 --- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/ui/SpinnerPage.kt +++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/ui/SpinnerPage.kt @@ -23,6 +23,8 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.ui.tooling.preview.Preview +import com.android.settingslib.spa.framework.common.SettingsEntryBuilder +import com.android.settingslib.spa.framework.common.SettingsPage import com.android.settingslib.spa.framework.common.SettingsPageProvider import com.android.settingslib.spa.framework.compose.navigator import com.android.settingslib.spa.framework.theme.SettingsTheme @@ -36,6 +38,17 @@ private const val TITLE = "Sample Spinner" object SpinnerPageProvider : SettingsPageProvider { override val name = "Spinner" + fun buildInjectEntry(): SettingsEntryBuilder { + return SettingsEntryBuilder.createInject(owner = SettingsPage.create(name)) + .setIsAllowSearch(true) + .setUiLayoutFn { + Preference(object : PreferenceModel { + override val title = TITLE + override val onClick = navigator(name) + }) + } + } + @Composable override fun Page(arguments: Bundle?) { SpinnerPage() @@ -43,10 +56,7 @@ object SpinnerPageProvider : SettingsPageProvider { @Composable fun EntryItem() { - Preference(object : PreferenceModel { - override val title = TITLE - override val onClick = navigator(name) - }) + buildInjectEntry().build().uiLayout.let { it() } } } diff --git a/packages/SettingsLib/Spa/spa/Android.bp b/packages/SettingsLib/Spa/spa/Android.bp index a4928e6608ab..6871f2154bd6 100644 --- a/packages/SettingsLib/Spa/spa/Android.bp +++ b/packages/SettingsLib/Spa/spa/Android.bp @@ -27,6 +27,7 @@ android_library { "androidx.compose.material3_material3", "androidx.compose.material_material-icons-extended", "androidx.compose.runtime_runtime", + "androidx.compose.runtime_runtime-livedata", "androidx.compose.ui_ui-tooling-preview", "androidx.navigation_navigation-compose", "com.google.android.material_material", diff --git a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/model/app/AppOpsController.kt b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/model/app/AppOpsController.kt index 8876f66bcafe..93ba4f7824b7 100644 --- a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/model/app/AppOpsController.kt +++ b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/model/app/AppOpsController.kt @@ -24,6 +24,7 @@ import android.content.Context import android.content.pm.ApplicationInfo import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.Transformations class AppOpsController( context: Context, @@ -32,21 +33,23 @@ class AppOpsController( ) { private val appOpsManager = checkNotNull(context.getSystemService(AppOpsManager::class.java)) + val mode: LiveData<Int> + get() = _mode val isAllowed: LiveData<Boolean> - get() = _isAllowed + get() = Transformations.map(_mode) { it == MODE_ALLOWED } fun setAllowed(allowed: Boolean) { val mode = if (allowed) MODE_ALLOWED else MODE_ERRORED appOpsManager.setMode(op, app.uid, app.packageName, mode) - _isAllowed.postValue(allowed) + _mode.postValue(mode) } @Mode fun getMode(): Int = appOpsManager.checkOpNoThrow(op, app.uid, app.packageName) - private val _isAllowed = object : MutableLiveData<Boolean>() { + private val _mode = object : MutableLiveData<Int>() { override fun onActive() { - postValue(getMode() == MODE_ALLOWED) + postValue(getMode()) } override fun onInactive() { diff --git a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/model/app/PackageManagers.kt b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/model/app/PackageManagers.kt index e521edd6b845..ba8af5400e18 100644 --- a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/model/app/PackageManagers.kt +++ b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/model/app/PackageManagers.kt @@ -16,31 +16,52 @@ package com.android.settingslib.spaprivileged.model.app +import android.app.AppGlobals import android.content.pm.ApplicationInfo import android.content.pm.PackageInfo +import android.content.pm.PackageInfo.REQUESTED_PERMISSION_GRANTED import android.content.pm.PackageManager import android.util.Log +import com.android.settingslib.spa.framework.util.asyncFilter private const val TAG = "PackageManagers" object PackageManagers { - fun getPackageInfoAsUser(packageName: String, userId: Int): PackageInfo = - PackageManager.getPackageInfoAsUserCached(packageName, 0, userId) + private val iPackageManager by lazy { AppGlobals.getPackageManager() } + + fun getPackageInfoAsUser(packageName: String, userId: Int): PackageInfo? = + getPackageInfoAsUser(packageName, 0, userId) fun getApplicationInfoAsUser(packageName: String, userId: Int): ApplicationInfo = PackageManager.getApplicationInfoAsUserCached(packageName, 0, userId) - fun hasRequestPermission(app: ApplicationInfo, permission: String): Boolean { - val packageInfo = try { - PackageManager.getPackageInfoAsUserCached( - app.packageName, PackageManager.GET_PERMISSIONS.toLong(), app.userId - ) - } catch (e: PackageManager.NameNotFoundException) { - Log.w(TAG, "getPackageInfoAsUserCached() failed", e) - return false - } + fun ApplicationInfo.hasRequestPermission(permission: String): Boolean { + val packageInfo = getPackageInfoAsUser(packageName, PackageManager.GET_PERMISSIONS, userId) return packageInfo?.requestedPermissions?.let { permission in it } ?: false } + + fun ApplicationInfo.hasGrantPermission(permission: String): Boolean { + val packageInfo = getPackageInfoAsUser(packageName, PackageManager.GET_PERMISSIONS, userId) + ?: return false + val index = packageInfo.requestedPermissions.indexOf(permission) + return index >= 0 && + packageInfo.requestedPermissionsFlags[index].hasFlag(REQUESTED_PERMISSION_GRANTED) + } + + suspend fun getAppOpPermissionPackages(userId: Int, permission: String): Set<String> = + iPackageManager.getAppOpPermissionPackages(permission, userId).asIterable().asyncFilter { + iPackageManager.isPackageAvailable(it, userId) + }.toSet() + + private fun getPackageInfoAsUser(packageName: String, flags: Int, userId: Int): PackageInfo? = + try { + PackageManager.getPackageInfoAsUserCached(packageName, flags.toLong(), userId) + } catch (e: PackageManager.NameNotFoundException) { + Log.w(TAG, "getPackageInfoAsUserCached() failed", e) + null + } + + private fun Int.hasFlag(flag: Int) = (this and flag) > 0 } diff --git a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppInfo.kt b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppInfo.kt index 99deb707a351..f51d2dbfdeef 100644 --- a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppInfo.kt +++ b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppInfo.kt @@ -49,7 +49,8 @@ fun AppInfo(packageName: String, userId: Int) { ), horizontalAlignment = Alignment.CenterHorizontally, ) { - val packageInfo = remember { PackageManagers.getPackageInfoAsUser(packageName, userId) } + val packageInfo = + remember { PackageManagers.getPackageInfoAsUser(packageName, userId) } ?: return Box(modifier = Modifier.padding(SettingsDimension.itemPaddingAround)) { AppIcon(app = packageInfo.applicationInfo, size = SettingsDimension.appIconInfoSize) } diff --git a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppOpPermissionAppList.kt b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppOpPermissionAppList.kt new file mode 100644 index 000000000000..c6f41d3bd3e2 --- /dev/null +++ b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppOpPermissionAppList.kt @@ -0,0 +1,101 @@ +/* + * Copyright (C) 2022 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.settingslib.spaprivileged.template.app + +import android.app.AppOpsManager.MODE_ALLOWED +import android.app.AppOpsManager.MODE_DEFAULT +import android.content.Context +import android.content.pm.ApplicationInfo +import androidx.compose.runtime.Composable +import androidx.compose.runtime.State +import androidx.compose.runtime.derivedStateOf +import androidx.compose.runtime.livedata.observeAsState +import androidx.compose.runtime.remember +import com.android.settingslib.spaprivileged.model.app.AppOpsController +import com.android.settingslib.spaprivileged.model.app.AppRecord +import com.android.settingslib.spaprivileged.model.app.PackageManagers +import com.android.settingslib.spaprivileged.model.app.PackageManagers.hasGrantPermission +import com.android.settingslib.spaprivileged.model.app.PackageManagers.hasRequestPermission +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.map + +data class AppOpPermissionRecord( + override val app: ApplicationInfo, + val hasRequestPermission: Boolean, + var appOpsController: AppOpsController, +) : AppRecord + +abstract class AppOpPermissionListModel(private val context: Context) : + TogglePermissionAppListModel<AppOpPermissionRecord> { + + abstract val appOp: Int + abstract val permission: String + + private val notChangeablePackages = + setOf("android", "com.android.systemui", context.packageName) + + override fun transform(userIdFlow: Flow<Int>, appListFlow: Flow<List<ApplicationInfo>>) = + userIdFlow.map { userId -> + PackageManagers.getAppOpPermissionPackages(userId, permission) + }.combine(appListFlow) { packageNames, appList -> + appList.map { app -> + AppOpPermissionRecord( + app = app, + hasRequestPermission = app.packageName in packageNames, + appOpsController = AppOpsController(context = context, app = app, op = appOp), + ) + } + } + + override fun transformItem(app: ApplicationInfo) = AppOpPermissionRecord( + app = app, + hasRequestPermission = app.hasRequestPermission(permission), + appOpsController = AppOpsController(context = context, app = app, op = appOp), + ) + + override fun filter(userIdFlow: Flow<Int>, recordListFlow: Flow<List<AppOpPermissionRecord>>) = + recordListFlow.map { recordList -> + recordList.filter { it.hasRequestPermission } + } + + /** + * Defining the default behavior as permissible as long as the package requested this permission + * (This means pre-M gets approval during install time; M apps gets approval during runtime). + */ + @Composable + override fun isAllowed(record: AppOpPermissionRecord): State<Boolean?> { + val mode = record.appOpsController.mode.observeAsState() + return remember { + derivedStateOf { + when (mode.value) { + null -> null + MODE_ALLOWED -> true + MODE_DEFAULT -> record.app.hasGrantPermission(permission) + else -> false + } + } + } + } + + override fun isChangeable(record: AppOpPermissionRecord) = + record.hasRequestPermission && record.app.packageName !in notChangeablePackages + + override fun setAllowed(record: AppOpPermissionRecord, newAllowed: Boolean) { + record.appOpsController.setAllowed(newAllowed) + } +} diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml index d8ed7ed03480..5b3aae3304c0 100644 --- a/packages/SettingsLib/res/values-ta/strings.xml +++ b/packages/SettingsLib/res/values-ta/strings.xml @@ -597,7 +597,7 @@ <string name="guest_reset_guest" msgid="6110013010356013758">"கெஸ்ட் அமர்வை மீட்டமை"</string> <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"கெஸ்ட்டை மீட்டமைக்கவா?"</string> <string name="guest_remove_guest_dialog_title" msgid="4548511006624088072">"கெஸ்ட் பயனரை அகற்றவா?"</string> - <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"மீட்டமை"</string> + <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"ரீசெட்"</string> <string name="guest_remove_guest_confirm_button" msgid="7858123434954143879">"அகற்று"</string> <string name="guest_resetting" msgid="7822120170191509566">"கெஸ்ட்டை மீட்டமைக்கிறது…"</string> <string name="guest_reset_and_restart_dialog_title" msgid="3396657008451616041">"கெஸ்ட் அமர்வை ரீசெட் செய்யவா?"</string> diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java index 3ca94dba027e..7927c5d460a4 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java @@ -81,8 +81,10 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> private int mDeviceMode; private long mHiSyncId; private int mGroupId; + // Need this since there is no method for getting RSSI short mRssi; + // mProfiles and mRemovedProfiles does not do swap() between main and sub device. It is // because current sub device is only for HearingAid and its profile is the same. private final Collection<LocalBluetoothProfile> mProfiles = new CopyOnWriteArrayList<>(); @@ -398,6 +400,7 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> * @param id the group id from the CSIP. */ public void setGroupId(int id) { + Log.d(TAG, this.getDevice().getAnonymizedAddress() + " set GroupId " + id); mGroupId = id; } diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java index 26a208026411..5662ce6bd808 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java @@ -357,8 +357,12 @@ public class CachedBluetoothDeviceManager { * {@code false}. */ public synchronized boolean shouldPairByCsip(BluetoothDevice device, int groupId) { - if (mOngoingSetMemberPair != null || device.getBondState() != BluetoothDevice.BOND_NONE + boolean isOngoingSetMemberPair = mOngoingSetMemberPair != null; + int bondState = device.getBondState(); + if (isOngoingSetMemberPair || bondState != BluetoothDevice.BOND_NONE || !mCsipDeviceManager.isExistedGroupId(groupId)) { + Log.d(TAG, "isOngoingSetMemberPair: " + isOngoingSetMemberPair + + " , device.getBondState: " + bondState); return false; } diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CsipDeviceManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CsipDeviceManager.java index 9b38238ca8b8..d5de3f0525a0 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CsipDeviceManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CsipDeviceManager.java @@ -102,9 +102,12 @@ public class CsipDeviceManager { } private CachedBluetoothDevice getCachedDevice(int groupId) { + log("getCachedDevice: groupId: " + groupId); for (int i = mCachedDevices.size() - 1; i >= 0; i--) { CachedBluetoothDevice cachedDevice = mCachedDevices.get(i); if (cachedDevice.getGroupId() == groupId) { + log("getCachedDevice: found cachedDevice with the groupId: " + + cachedDevice.getDevice().getAnonymizedAddress()); return cachedDevice; } } diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidDeviceManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidDeviceManager.java index 818f5ca33ebf..cf4e1ee99f92 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidDeviceManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidDeviceManager.java @@ -46,16 +46,43 @@ public class HearingAidDeviceManager { if (isValidHiSyncId(hiSyncId)) { // Once hiSyncId is valid, assign hiSyncId newDevice.setHiSyncId(hiSyncId); + final int side = getDeviceSide(newDevice.getDevice()); + final int mode = getDeviceMode(newDevice.getDevice()); + newDevice.setDeviceSide(side); + newDevice.setDeviceMode(mode); } } private long getHiSyncId(BluetoothDevice device) { - LocalBluetoothProfileManager profileManager = mBtManager.getProfileManager(); - HearingAidProfile profileProxy = profileManager.getHearingAidProfile(); - if (profileProxy != null) { - return profileProxy.getHiSyncId(device); + final LocalBluetoothProfileManager profileManager = mBtManager.getProfileManager(); + final HearingAidProfile profileProxy = profileManager.getHearingAidProfile(); + if (profileProxy == null) { + return BluetoothHearingAid.HI_SYNC_ID_INVALID; } - return BluetoothHearingAid.HI_SYNC_ID_INVALID; + + return profileProxy.getHiSyncId(device); + } + + private int getDeviceSide(BluetoothDevice device) { + final LocalBluetoothProfileManager profileManager = mBtManager.getProfileManager(); + final HearingAidProfile profileProxy = profileManager.getHearingAidProfile(); + if (profileProxy == null) { + Log.w(TAG, "HearingAidProfile is not supported and not ready to fetch device side"); + return HearingAidProfile.DeviceSide.SIDE_INVALID; + } + + return profileProxy.getDeviceSide(device); + } + + private int getDeviceMode(BluetoothDevice device) { + final LocalBluetoothProfileManager profileManager = mBtManager.getProfileManager(); + final HearingAidProfile profileProxy = profileManager.getHearingAidProfile(); + if (profileProxy == null) { + Log.w(TAG, "HearingAidProfile is not supported and not ready to fetch device mode"); + return HearingAidProfile.DeviceMode.MODE_INVALID; + } + + return profileProxy.getDeviceMode(device); } boolean setSubDeviceIfNeeded(CachedBluetoothDevice newDevice) { @@ -98,6 +125,10 @@ public class HearingAidDeviceManager { if (isValidHiSyncId(newHiSyncId)) { cachedDevice.setHiSyncId(newHiSyncId); newSyncIdSet.add(newHiSyncId); + final int side = getDeviceSide(cachedDevice.getDevice()); + final int mode = getDeviceMode(cachedDevice.getDevice()); + cachedDevice.setDeviceSide(side); + cachedDevice.setDeviceMode(mode); } } } diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidStatsLogUtils.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidStatsLogUtils.java new file mode 100644 index 000000000000..feb5e0bf6e69 --- /dev/null +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidStatsLogUtils.java @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2022 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.settingslib.bluetooth; + +import android.util.Log; + +import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.util.FrameworkStatsLog; + +import java.util.HashMap; + +/** Utils class to report hearing aid metrics to statsd */ +public final class HearingAidStatsLogUtils { + + private static final String TAG = "HearingAidStatsLogUtils"; + private static final HashMap<String, Integer> sDeviceAddressToBondEntryMap = new HashMap<>(); + + /** + * Sets the mapping from hearing aid device to the bond entry where this device starts it's + * bonding(connecting) process. + * + * @param bondEntry The entry page id where the bonding process starts + * @param device The bonding(connecting) hearing aid device + */ + public static void setBondEntryForDevice(int bondEntry, CachedBluetoothDevice device) { + sDeviceAddressToBondEntryMap.put(device.getAddress(), bondEntry); + } + + /** + * Logs hearing aid device information to westworld, including device mode, device side, and + * entry page id where the binding(connecting) process starts. + * + * Only logs the info once after hearing aid is bonded(connected). Clears the map entry of this + * device when logging is completed. + * + * @param device The bonded(connected) hearing aid device + */ + public static void logHearingAidInfo(CachedBluetoothDevice device) { + final String deviceAddress = device.getAddress(); + if (sDeviceAddressToBondEntryMap.containsKey(deviceAddress)) { + final int bondEntry = sDeviceAddressToBondEntryMap.getOrDefault(deviceAddress, -1); + final int deviceMode = device.getDeviceMode(); + final int deviceSide = device.getDeviceSide(); + FrameworkStatsLog.write(FrameworkStatsLog.HEARING_AID_INFO_REPORTED, deviceMode, + deviceSide, bondEntry); + + sDeviceAddressToBondEntryMap.remove(deviceAddress); + } else { + Log.w(TAG, "The device address was not found. Hearing aid device info is not logged."); + } + } + + @VisibleForTesting + static HashMap<String, Integer> getDeviceAddressToBondEntryMap() { + return sDeviceAddressToBondEntryMap; + } + + private HearingAidStatsLogUtils() {} +} diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothLeBroadcast.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothLeBroadcast.java index 01d581ed28db..123c01b6e12f 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothLeBroadcast.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothLeBroadcast.java @@ -26,11 +26,17 @@ import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothLeAudioContentMetadata; import android.bluetooth.BluetoothLeBroadcast; import android.bluetooth.BluetoothLeBroadcastMetadata; +import android.bluetooth.BluetoothLeBroadcastSubgroup; import android.bluetooth.BluetoothProfile; import android.bluetooth.BluetoothProfile.ServiceListener; +import android.content.ContentResolver; import android.content.Context; -import android.content.SharedPreferences; +import android.database.ContentObserver; +import android.net.Uri; import android.os.Build; +import android.os.Handler; +import android.os.Looper; +import android.provider.Settings; import android.text.TextUtils; import android.util.Log; @@ -40,6 +46,7 @@ import com.android.settingslib.R; import java.nio.charset.StandardCharsets; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.UUID; @@ -54,19 +61,20 @@ import java.util.concurrent.ThreadLocalRandom; */ public class LocalBluetoothLeBroadcast implements LocalBluetoothProfile { private static final String TAG = "LocalBluetoothLeBroadcast"; - private static final int UNKNOWN_VALUE_PLACEHOLDER = -1; private static final boolean DEBUG = BluetoothUtils.D; static final String NAME = "LE_AUDIO_BROADCAST"; - // Order of this profile in device profiles list - private static final int ORDINAL = 1; - private static final String PREF_NAME = "LocalBluetoothLeBroadcast"; - private static final String PREF_PROGRAM_INFO = "PrefProgramInfo"; - private static final String PREF_BROADCAST_CODE = "PrefBroadcastCode"; - private static final String PREF_APP_SOURCE_NAME = "PrefAppSourceName"; private static final String UNDERLINE = "_"; - private static final int DEFAULT_CODE_MIN = 1000; private static final int DEFAULT_CODE_MAX = 9999; + private static final int DEFAULT_CODE_MIN = 1000; + // Order of this profile in device profiles list + private static final int ORDINAL = 1; + private static final int UNKNOWN_VALUE_PLACEHOLDER = -1; + private static final Uri[] SETTINGS_URIS = new Uri[]{ + Settings.Secure.getUriFor(Settings.Secure.BLUETOOTH_LE_BROADCAST_PROGRAM_INFO), + Settings.Secure.getUriFor(Settings.Secure.BLUETOOTH_LE_BROADCAST_CODE), + Settings.Secure.getUriFor(Settings.Secure.BLUETOOTH_LE_BROADCAST_APP_SOURCE_NAME), + }; private BluetoothLeBroadcast mService; private BluetoothLeAudioContentMetadata mBluetoothLeAudioContentMetadata; @@ -78,8 +86,9 @@ public class LocalBluetoothLeBroadcast implements LocalBluetoothProfile { private boolean mIsProfileReady; private String mProgramInfo; private byte[] mBroadcastCode; - private SharedPreferences mSharedPref; private Executor mExecutor; + private ContentResolver mContentResolver; + private ContentObserver mSettingsObserver; private final ServiceListener mServiceListener = new ServiceListener() { @Override @@ -91,6 +100,11 @@ public class LocalBluetoothLeBroadcast implements LocalBluetoothProfile { mService = (BluetoothLeBroadcast) proxy; mIsProfileReady = true; registerServiceCallBack(mExecutor, mBroadcastCallback); + List<BluetoothLeBroadcastMetadata> metadata = getAllBroadcastMetadata(); + if (!metadata.isEmpty()) { + updateBroadcastInfoFromBroadcastMetadata(metadata.get(0)); + } + registerContentObserver(); } } @@ -102,6 +116,7 @@ public class LocalBluetoothLeBroadcast implements LocalBluetoothProfile { if(mIsProfileReady) { mIsProfileReady = false; unregisterServiceCallBack(mBroadcastCallback); + unregisterContentObserver(); } } }; @@ -116,7 +131,7 @@ public class LocalBluetoothLeBroadcast implements LocalBluetoothProfile { + broadcastId); } setLatestBroadcastId(broadcastId); - setAppSourceName(mNewAppSourceName); + setAppSourceName(mNewAppSourceName, /*updateContentResolver=*/ true); } @Override @@ -160,7 +175,7 @@ public class LocalBluetoothLeBroadcast implements LocalBluetoothProfile { + broadcastId); } setLatestBroadcastId(broadcastId); - setAppSourceName(mNewAppSourceName); + setAppSourceName(mNewAppSourceName, /*updateContentResolver=*/ true); } @Override @@ -181,30 +196,27 @@ public class LocalBluetoothLeBroadcast implements LocalBluetoothProfile { } }; + private class BroadcastSettingsObserver extends ContentObserver { + BroadcastSettingsObserver(Handler h) { + super(h); + } + + @Override + public void onChange(boolean selfChange) { + Log.d(TAG, "BroadcastSettingsObserver: onChange"); + updateBroadcastInfoFromContentProvider(); + } + } + LocalBluetoothLeBroadcast(Context context) { mExecutor = Executors.newSingleThreadExecutor(); BluetoothAdapter.getDefaultAdapter(). getProfileProxy(context, mServiceListener, BluetoothProfile.LE_AUDIO_BROADCAST); mBuilder = new BluetoothLeAudioContentMetadata.Builder(); - mSharedPref = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE); - if (mSharedPref != null) { - String programInfo = mSharedPref.getString(PREF_PROGRAM_INFO, ""); - if (programInfo.isEmpty()) { - programInfo = getDefaultValueOfProgramInfo(); - } - setProgramInfo(programInfo); - - String prefBroadcastCode = mSharedPref.getString(PREF_BROADCAST_CODE, ""); - byte[] broadcastCode; - if (prefBroadcastCode.isEmpty()) { - broadcastCode = getDefaultValueOfBroadcastCode(); - } else { - broadcastCode = prefBroadcastCode.getBytes(StandardCharsets.UTF_8); - } - setBroadcastCode(broadcastCode); - - mAppSourceName = mSharedPref.getString(PREF_APP_SOURCE_NAME, ""); - } + mContentResolver = context.getContentResolver(); + Handler handler = new Handler(Looper.getMainLooper()); + mSettingsObserver = new BroadcastSettingsObserver(handler); + updateBroadcastInfoFromContentProvider(); } /** @@ -217,11 +229,12 @@ public class LocalBluetoothLeBroadcast implements LocalBluetoothProfile { Log.d(TAG, "The BluetoothLeBroadcast is null when starting the broadcast."); return; } + String programInfo = getProgramInfo(); if (DEBUG) { Log.d(TAG, - "startBroadcast: language = " + language + " ,programInfo = " + mProgramInfo); + "startBroadcast: language = " + language + " ,programInfo = " + programInfo); } - buildContentMetadata(language, mProgramInfo); + buildContentMetadata(language, programInfo); mService.startBroadcast(mBluetoothLeAudioContentMetadata, mBroadcastCode); } @@ -230,21 +243,28 @@ public class LocalBluetoothLeBroadcast implements LocalBluetoothProfile { } public void setProgramInfo(String programInfo) { - if (programInfo == null || programInfo.isEmpty()) { + setProgramInfo(programInfo, /*updateContentResolver=*/ true); + } + + private void setProgramInfo(String programInfo, boolean updateContentResolver) { + if (TextUtils.isEmpty(programInfo)) { Log.d(TAG, "setProgramInfo: programInfo is null or empty"); return; } + if (mProgramInfo != null && TextUtils.equals(mProgramInfo, programInfo)) { + Log.d(TAG, "setProgramInfo: programInfo is not changed"); + return; + } Log.d(TAG, "setProgramInfo: " + programInfo); mProgramInfo = programInfo; - - if (mSharedPref == null) { - Log.d(TAG, "setProgramInfo: sharedPref is null"); - return; + if (updateContentResolver) { + if (mContentResolver == null) { + Log.d(TAG, "mContentResolver is null"); + return; + } + Settings.Secure.putString(mContentResolver, + Settings.Secure.BLUETOOTH_LE_BROADCAST_PROGRAM_INFO, programInfo); } - SharedPreferences.Editor editor = mSharedPref.edit(); - editor.putString(PREF_PROGRAM_INFO, mProgramInfo); - editor.apply(); - } public byte[] getBroadcastCode() { @@ -252,22 +272,31 @@ public class LocalBluetoothLeBroadcast implements LocalBluetoothProfile { } public void setBroadcastCode(byte[] broadcastCode) { - if (broadcastCode == null || broadcastCode.length == 0) { - Log.d(TAG, "setBroadcastCode: broadcastCode is null or empty"); + setBroadcastCode(broadcastCode, /*updateContentResolver=*/ true); + } + + private void setBroadcastCode(byte[] broadcastCode, boolean updateContentResolver) { + if (broadcastCode == null) { + Log.d(TAG, "setBroadcastCode: broadcastCode is null"); return; } - mBroadcastCode = broadcastCode; - - if (mSharedPref == null) { - Log.d(TAG, "setBroadcastCode: sharedPref is null"); + if (mBroadcastCode != null && Arrays.equals(broadcastCode, mBroadcastCode)) { + Log.d(TAG, "setBroadcastCode: broadcastCode is not changed"); return; } - SharedPreferences.Editor editor = mSharedPref.edit(); - editor.putString(PREF_BROADCAST_CODE, new String(broadcastCode, StandardCharsets.UTF_8)); - editor.apply(); + mBroadcastCode = broadcastCode; + if (updateContentResolver) { + if (mContentResolver == null) { + Log.d(TAG, "mContentResolver is null"); + return; + } + Settings.Secure.putString(mContentResolver, Settings.Secure.BLUETOOTH_LE_BROADCAST_CODE, + new String(broadcastCode, StandardCharsets.UTF_8)); + } } private void setLatestBroadcastId(int broadcastId) { + Log.d(TAG, "setLatestBroadcastId: mBroadcastId is " + broadcastId); mBroadcastId = broadcastId; } @@ -275,19 +304,24 @@ public class LocalBluetoothLeBroadcast implements LocalBluetoothProfile { return mBroadcastId; } - private void setAppSourceName(String appSourceName) { + private void setAppSourceName(String appSourceName, boolean updateContentResolver) { if (TextUtils.isEmpty(appSourceName)) { appSourceName = ""; } + if (mAppSourceName != null && TextUtils.equals(mAppSourceName, appSourceName)) { + Log.d(TAG, "setAppSourceName: appSourceName is not changed"); + return; + } mAppSourceName = appSourceName; mNewAppSourceName = ""; - if (mSharedPref == null) { - Log.d(TAG, "setBroadcastCode: sharedPref is null"); - return; + if (updateContentResolver) { + if (mContentResolver == null) { + Log.d(TAG, "mContentResolver is null"); + return; + } + Settings.Secure.putString(mContentResolver, + Settings.Secure.BLUETOOTH_LE_BROADCAST_APP_SOURCE_NAME, mAppSourceName); } - SharedPreferences.Editor editor = mSharedPref.edit(); - editor.putString(PREF_APP_SOURCE_NAME, appSourceName); - editor.apply(); } public String getAppSourceName() { @@ -299,6 +333,7 @@ public class LocalBluetoothLeBroadcast implements LocalBluetoothProfile { if (bluetoothLeBroadcastMetadata != null && bluetoothLeBroadcastMetadata.getBroadcastId() == mBroadcastId) { mBluetoothLeBroadcastMetadata = bluetoothLeBroadcastMetadata; + updateBroadcastInfoFromBroadcastMetadata(bluetoothLeBroadcastMetadata); } } @@ -318,6 +353,48 @@ public class LocalBluetoothLeBroadcast implements LocalBluetoothProfile { return mBluetoothLeBroadcastMetadata; } + private void updateBroadcastInfoFromContentProvider() { + if (mContentResolver == null) { + Log.d(TAG, "updateBroadcastInfoFromContentProvider: mContentResolver is null"); + return; + } + String programInfo = Settings.Secure.getString(mContentResolver, + Settings.Secure.BLUETOOTH_LE_BROADCAST_PROGRAM_INFO); + if (programInfo == null) { + programInfo = getDefaultValueOfProgramInfo(); + } + setProgramInfo(programInfo, /*updateContentResolver=*/ false); + + String prefBroadcastCode = Settings.Secure.getString(mContentResolver, + Settings.Secure.BLUETOOTH_LE_BROADCAST_CODE); + byte[] broadcastCode = (prefBroadcastCode == null) ? getDefaultValueOfBroadcastCode() + : prefBroadcastCode.getBytes(StandardCharsets.UTF_8); + setBroadcastCode(broadcastCode, /*updateContentResolver=*/ false); + + String appSourceName = Settings.Secure.getString(mContentResolver, + Settings.Secure.BLUETOOTH_LE_BROADCAST_APP_SOURCE_NAME); + setAppSourceName(appSourceName, /*updateContentResolver=*/ false); + } + + private void updateBroadcastInfoFromBroadcastMetadata( + BluetoothLeBroadcastMetadata bluetoothLeBroadcastMetadata) { + if (bluetoothLeBroadcastMetadata == null) { + Log.d(TAG, "The bluetoothLeBroadcastMetadata is null"); + return; + } + setBroadcastCode(bluetoothLeBroadcastMetadata.getBroadcastCode()); + setLatestBroadcastId(bluetoothLeBroadcastMetadata.getBroadcastId()); + + List<BluetoothLeBroadcastSubgroup> subgroup = bluetoothLeBroadcastMetadata.getSubgroups(); + if (subgroup == null || subgroup.size() < 1) { + Log.d(TAG, "The subgroup is not valid value"); + return; + } + BluetoothLeAudioContentMetadata contentMetadata = subgroup.get(0).getContentMetadata(); + setProgramInfo(contentMetadata.getProgramInfo()); + setAppSourceName(getAppSourceName(), /*updateContentResolver=*/ true); + } + /** * Stop the latest LE Broadcast. If the system stopped the LE Broadcast, then the system * calls the corresponding callback {@link BluetoothLeBroadcast.Callback}. @@ -350,12 +427,13 @@ public class LocalBluetoothLeBroadcast implements LocalBluetoothProfile { Log.d(TAG, "The BluetoothLeBroadcast is null when updating the broadcast."); return; } + String programInfo = getProgramInfo(); if (DEBUG) { Log.d(TAG, - "updateBroadcast: language = " + language + " ,programInfo = " + mProgramInfo); + "updateBroadcast: language = " + language + " ,programInfo = " + programInfo); } mNewAppSourceName = appSourceName; - mBluetoothLeAudioContentMetadata = mBuilder.setProgramInfo(mProgramInfo).build(); + mBluetoothLeAudioContentMetadata = mBuilder.setProgramInfo(programInfo).build(); mService.updateBroadcast(mBroadcastId, mBluetoothLeAudioContentMetadata); } @@ -517,8 +595,7 @@ public class LocalBluetoothLeBroadcast implements LocalBluetoothProfile { if (DEBUG) { Log.d(TAG, "resetCacheInfo:"); } - mNewAppSourceName = ""; - mAppSourceName = ""; + setAppSourceName("", /*updateContentResolver=*/ true); mBluetoothLeBroadcastMetadata = null; mBroadcastId = UNKNOWN_VALUE_PLACEHOLDER; } @@ -528,4 +605,22 @@ public class LocalBluetoothLeBroadcast implements LocalBluetoothProfile { //first 12 chars from xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx return randomUUID.substring(0, 8) + randomUUID.substring(9, 13); } + + private void registerContentObserver() { + if (mContentResolver == null) { + Log.d(TAG, "mContentResolver is null"); + return; + } + for (Uri uri : SETTINGS_URIS) { + mContentResolver.registerContentObserver(uri, false, mSettingsObserver); + } + } + + private void unregisterContentObserver() { + if (mContentResolver == null) { + Log.d(TAG, "mContentResolver is null"); + return; + } + mContentResolver.unregisterContentObserver(mSettingsObserver); + } } diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java index 4714ff93625b..8a9f9dd9c3fb 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java @@ -352,6 +352,8 @@ public class LocalBluetoothProfileManager { cachedDevice.setHiSyncId(newHiSyncId); } } + + HearingAidStatsLogUtils.logHearingAidInfo(cachedDevice); } if (getCsipSetCoordinatorProfile() != null diff --git a/packages/SettingsLib/src/com/android/settingslib/users/AvatarPhotoController.java b/packages/SettingsLib/src/com/android/settingslib/users/AvatarPhotoController.java index adfa39e3df80..4ce88ee115a2 100644 --- a/packages/SettingsLib/src/com/android/settingslib/users/AvatarPhotoController.java +++ b/packages/SettingsLib/src/com/android/settingslib/users/AvatarPhotoController.java @@ -21,6 +21,8 @@ import android.content.ClipData; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; @@ -46,6 +48,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.util.List; import java.util.concurrent.ExecutionException; class AvatarPhotoController { @@ -57,9 +60,9 @@ class AvatarPhotoController { void startActivityForResult(Intent intent, int resultCode); - int getPhotoSize(); + boolean startSystemActivityForResult(Intent intent, int resultCode); - boolean canCropPhoto(); + int getPhotoSize(); } interface ContextInjector { @@ -82,6 +85,7 @@ class AvatarPhotoController { private static final long DELAY_BEFORE_CROP_MILLIS = 150; private static final String IMAGES_DIR = "multi_user"; + private static final String PRE_CROP_PICTURE_FILE_NAME = "PreCropEditUserPhoto.jpg"; private static final String CROP_PICTURE_FILE_NAME = "CropEditUserPhoto.jpg"; private static final String TAKE_PICTURE_FILE_NAME = "TakeEditUserPhoto.jpg"; @@ -91,6 +95,7 @@ class AvatarPhotoController { private final ContextInjector mContextInjector; private final File mImagesDir; + private final Uri mPreCropPictureUri; private final Uri mCropPictureUri; private final Uri mTakePictureUri; @@ -100,6 +105,8 @@ class AvatarPhotoController { mImagesDir = new File(mContextInjector.getCacheDir(), IMAGES_DIR); mImagesDir.mkdir(); + mPreCropPictureUri = mContextInjector + .createTempImageUri(mImagesDir, PRE_CROP_PICTURE_FILE_NAME, !waiting); mCropPictureUri = mContextInjector.createTempImageUri(mImagesDir, CROP_PICTURE_FILE_NAME, !waiting); mTakePictureUri = @@ -131,7 +138,7 @@ class AvatarPhotoController { return true; case REQUEST_CODE_TAKE_PHOTO: if (mTakePictureUri.equals(pictureUri)) { - cropPhoto(); + cropPhoto(pictureUri); } else { copyAndCropPhoto(pictureUri, false); } @@ -160,7 +167,7 @@ class AvatarPhotoController { ThreadUtils.postOnBackgroundThread(() -> { final ContentResolver cr = mContextInjector.getContentResolver(); try (InputStream in = cr.openInputStream(pictureUri); - OutputStream out = cr.openOutputStream(mTakePictureUri)) { + OutputStream out = cr.openOutputStream(mPreCropPictureUri)) { Streams.copy(in, out); } catch (IOException e) { Log.w(TAG, "Failed to copy photo", e); @@ -168,7 +175,7 @@ class AvatarPhotoController { } Runnable cropRunnable = () -> { if (!mAvatarUi.isFinishing()) { - cropPhoto(); + cropPhoto(mPreCropPictureUri); } }; if (delayBeforeCrop) { @@ -183,22 +190,21 @@ class AvatarPhotoController { } } - private void cropPhoto() { - if (mAvatarUi.canCropPhoto()) { - // TODO: Use a public intent, when there is one. - Intent intent = new Intent("com.android.camera.action.CROP"); - intent.setDataAndType(mTakePictureUri, "image/*"); - appendOutputExtra(intent, mCropPictureUri); - appendCropExtras(intent); - try { - StrictMode.disableDeathOnFileUriExposure(); - mAvatarUi.startActivityForResult(intent, REQUEST_CODE_CROP_PHOTO); - } finally { - StrictMode.enableDeathOnFileUriExposure(); + private void cropPhoto(final Uri pictureUri) { + // TODO: Use a public intent, when there is one. + Intent intent = new Intent("com.android.camera.action.CROP"); + intent.setDataAndType(pictureUri, "image/*"); + appendOutputExtra(intent, mCropPictureUri); + appendCropExtras(intent); + try { + StrictMode.disableDeathOnFileUriExposure(); + if (mAvatarUi.startSystemActivityForResult(intent, REQUEST_CODE_CROP_PHOTO)) { + return; } - } else { - onPhotoNotCropped(mTakePictureUri); + } finally { + StrictMode.enableDeathOnFileUriExposure(); } + onPhotoNotCropped(pictureUri); } private void appendOutputExtra(Intent intent, Uri pictureUri) { @@ -320,14 +326,22 @@ class AvatarPhotoController { } @Override - public int getPhotoSize() { - return mActivity.getResources() - .getDimensionPixelSize(com.android.internal.R.dimen.user_icon_size); + public boolean startSystemActivityForResult(Intent intent, int code) { + List<ResolveInfo> resolveInfos = mActivity.getPackageManager() + .queryIntentActivities(intent, PackageManager.MATCH_SYSTEM_ONLY); + if (resolveInfos.isEmpty()) { + Log.w(TAG, "No system package activity could be found for code " + code); + return false; + } + intent.setPackage(resolveInfos.get(0).activityInfo.packageName); + mActivity.startActivityForResult(intent, code); + return true; } @Override - public boolean canCropPhoto() { - return PhotoCapabilityUtils.canCropPhoto(mActivity); + public int getPhotoSize() { + return mActivity.getResources() + .getDimensionPixelSize(com.android.internal.R.dimen.user_icon_size); } } diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/AvatarPhotoControllerTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/AvatarPhotoControllerTest.java index 3dc2fabe051a..d988111c29d5 100644 --- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/AvatarPhotoControllerTest.java +++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/AvatarPhotoControllerTest.java @@ -34,6 +34,7 @@ import android.app.Activity; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import android.net.Uri; import android.provider.MediaStore; @@ -51,6 +52,7 @@ import org.mockito.MockitoAnnotations; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStream; import java.io.OutputStream; @RunWith(AndroidJUnit4.class) @@ -73,6 +75,7 @@ public class AvatarPhotoControllerTest { public void setUp() { MockitoAnnotations.initMocks(this); when(mMockAvatarUi.getPhotoSize()).thenReturn(PHOTO_SIZE); + when(mMockAvatarUi.startSystemActivityForResult(any(), anyInt())).thenReturn(true); mImagesDir = new File( InstrumentationRegistry.getTargetContext().getCacheDir(), "multi_user"); @@ -110,9 +113,7 @@ public class AvatarPhotoControllerTest { } @Test - public void takePhotoIsFollowedByCropWhenSupported() throws IOException { - when(mMockAvatarUi.canCropPhoto()).thenReturn(true); - + public void takePhotoIsFollowedByCrop() throws IOException { new File(mImagesDir, "file.txt").createNewFile(); Intent intent = new Intent(); @@ -121,14 +122,12 @@ public class AvatarPhotoControllerTest { mController.onActivityResult( REQUEST_CODE_TAKE_PHOTO, Activity.RESULT_OK, intent); - verifyStartActivityForResult( + verifyStartSystemActivityForResult( "com.android.camera.action.CROP", REQUEST_CODE_CROP_PHOTO); } @Test public void takePhotoIsNotFollowedByCropWhenResultCodeNotOk() throws IOException { - when(mMockAvatarUi.canCropPhoto()).thenReturn(true); - new File(mImagesDir, "file.txt").createNewFile(); Intent intent = new Intent(); @@ -138,12 +137,11 @@ public class AvatarPhotoControllerTest { REQUEST_CODE_TAKE_PHOTO, Activity.RESULT_CANCELED, intent); verify(mMockAvatarUi, never()).startActivityForResult(any(), anyInt()); + verify(mMockAvatarUi, never()).startSystemActivityForResult(any(), anyInt()); } @Test public void takePhotoIsFollowedByCropWhenTakePhotoUriReturned() throws IOException { - when(mMockAvatarUi.canCropPhoto()).thenReturn(true); - new File(mImagesDir, "TakeEditUserPhoto.jpg").createNewFile(); Intent intent = new Intent(); @@ -151,14 +149,12 @@ public class AvatarPhotoControllerTest { mController.onActivityResult( REQUEST_CODE_TAKE_PHOTO, Activity.RESULT_OK, intent); - verifyStartActivityForResult( + verifyStartSystemActivityForResult( "com.android.camera.action.CROP", REQUEST_CODE_CROP_PHOTO); } @Test public void choosePhotoIsFollowedByCrop() throws IOException { - when(mMockAvatarUi.canCropPhoto()).thenReturn(true); - new File(mImagesDir, "file.txt").createNewFile(); Intent intent = new Intent(); @@ -167,14 +163,12 @@ public class AvatarPhotoControllerTest { mController.onActivityResult( REQUEST_CODE_CHOOSE_PHOTO, Activity.RESULT_OK, intent); - verifyStartActivityForResult( + verifyStartSystemActivityForResult( "com.android.camera.action.CROP", REQUEST_CODE_CROP_PHOTO); } @Test public void choosePhotoIsNotFollowedByCropWhenResultCodeNotOk() throws IOException { - when(mMockAvatarUi.canCropPhoto()).thenReturn(true); - new File(mImagesDir, "file.txt").createNewFile(); Intent intent = new Intent(); @@ -184,12 +178,11 @@ public class AvatarPhotoControllerTest { REQUEST_CODE_CHOOSE_PHOTO, Activity.RESULT_CANCELED, intent); verify(mMockAvatarUi, never()).startActivityForResult(any(), anyInt()); + verify(mMockAvatarUi, never()).startSystemActivityForResult(any(), anyInt()); } @Test public void choosePhotoIsFollowedByCropWhenTakePhotoUriReturned() throws IOException { - when(mMockAvatarUi.canCropPhoto()).thenReturn(true); - new File(mImagesDir, "TakeEditUserPhoto.jpg").createNewFile(); Intent intent = new Intent(); @@ -197,28 +190,11 @@ public class AvatarPhotoControllerTest { mController.onActivityResult( REQUEST_CODE_CHOOSE_PHOTO, Activity.RESULT_OK, intent); - verifyStartActivityForResult( + verifyStartSystemActivityForResult( "com.android.camera.action.CROP", REQUEST_CODE_CROP_PHOTO); } @Test - public void choosePhotoIsNotFollowedByCropIntentWhenCropNotSupported() throws IOException { - when(mMockAvatarUi.canCropPhoto()).thenReturn(false); - - File file = new File(mImagesDir, "file.txt"); - saveBitmapToFile(file); - - Intent intent = new Intent(); - intent.setData(Uri.parse( - "content://com.android.settingslib.test/my_cache/multi_user/file.txt")); - mController.onActivityResult( - REQUEST_CODE_CHOOSE_PHOTO, Activity.RESULT_OK, intent); - - verify(mMockAvatarUi, never()).startActivityForResult(any(), anyInt()); - verify(mMockAvatarUi, timeout(TIMEOUT_MILLIS)).returnUriResult(mCropPhotoUri); - } - - @Test public void cropPhotoResultIsReturnedIfResultOkAndContent() { Intent intent = new Intent(); intent.setData(mCropPhotoUri); @@ -242,11 +218,58 @@ public class AvatarPhotoControllerTest { verify(mMockAvatarUi, timeout(TIMEOUT_MILLIS).times(0)).returnUriResult(mCropPhotoUri); } - private void verifyStartActivityForResult(String action, int resultCode) { + @Test + public void cropDoesNotUseTakePhotoUri() throws IOException { + new File(mImagesDir, "file.txt").createNewFile(); + + Intent intent = new Intent(); + intent.setData(Uri.parse( + "content://com.android.settingslib.test/my_cache/multi_user/file.txt")); + mController.onActivityResult( + REQUEST_CODE_TAKE_PHOTO, Activity.RESULT_OK, intent); + + Intent startIntent = verifyStartSystemActivityForResult( + "com.android.camera.action.CROP", REQUEST_CODE_CROP_PHOTO); + assertThat(startIntent.getData()).isNotEqualTo(mTakePhotoUri); + } + + @Test + public void internalCropUsedIfNoSystemCropperFound() throws IOException { + when(mMockAvatarUi.startSystemActivityForResult(any(), anyInt())).thenReturn(false); + + File file = new File(mImagesDir, "file.txt"); + saveBitmapToFile(file); + + Intent intent = new Intent(); + intent.setData(Uri.parse( + "content://com.android.settingslib.test/my_cache/multi_user/file.txt")); + mController.onActivityResult( + REQUEST_CODE_TAKE_PHOTO, Activity.RESULT_OK, intent); + + verify(mMockAvatarUi, timeout(TIMEOUT_MILLIS)).returnUriResult(mCropPhotoUri); + + InputStream imageStream = mContext.getContentResolver().openInputStream(mCropPhotoUri); + Bitmap bitmap = BitmapFactory.decodeStream(imageStream); + assertThat(bitmap.getWidth()).isEqualTo(PHOTO_SIZE); + assertThat(bitmap.getHeight()).isEqualTo(PHOTO_SIZE); + } + + private Intent verifyStartActivityForResult(String action, int resultCode) { ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class); verify(mMockAvatarUi, timeout(TIMEOUT_MILLIS)) .startActivityForResult(captor.capture(), eq(resultCode)); - assertThat(captor.getValue().getAction()).isEqualTo(action); + Intent intent = captor.getValue(); + assertThat(intent.getAction()).isEqualTo(action); + return intent; + } + + private Intent verifyStartSystemActivityForResult(String action, int resultCode) { + ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class); + verify(mMockAvatarUi, timeout(TIMEOUT_MILLIS)) + .startSystemActivityForResult(captor.capture(), eq(resultCode)); + Intent intent = captor.getValue(); + assertThat(intent.getAction()).isEqualTo(action); + return intent; } private void saveBitmapToFile(File file) throws IOException { diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/HearingAidDeviceManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/HearingAidDeviceManagerTest.java index d80a59178c1c..611b0a4a28b8 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/HearingAidDeviceManagerTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/HearingAidDeviceManagerTest.java @@ -102,16 +102,25 @@ public class HearingAidDeviceManagerTest { } /** - * Test initHearingAidDeviceIfNeeded, a valid HiSyncId will be assigned + * Test initHearingAidDeviceIfNeeded, set HearingAid's information, including HiSyncId, + * deviceSide, deviceMode. */ @Test - public void initHearingAidDeviceIfNeeded_validHiSyncId_verifyHiSyncId() { + public void initHearingAidDeviceIfNeeded_validHiSyncId_setHearingAidInfos() { when(mHearingAidProfile.getHiSyncId(mDevice1)).thenReturn(HISYNCID1); + when(mHearingAidProfile.getDeviceMode(mDevice1)).thenReturn( + HearingAidProfile.DeviceMode.MODE_BINAURAL); + when(mHearingAidProfile.getDeviceSide(mDevice1)).thenReturn( + HearingAidProfile.DeviceSide.SIDE_RIGHT); assertThat(mCachedDevice1.getHiSyncId()).isNotEqualTo(HISYNCID1); mHearingAidDeviceManager.initHearingAidDeviceIfNeeded(mCachedDevice1); assertThat(mCachedDevice1.getHiSyncId()).isEqualTo(HISYNCID1); + assertThat(mCachedDevice1.getDeviceMode()).isEqualTo( + HearingAidProfile.DeviceMode.MODE_BINAURAL); + assertThat(mCachedDevice1.getDeviceSide()).isEqualTo( + HearingAidProfile.DeviceSide.SIDE_RIGHT); } /** @@ -251,6 +260,29 @@ public class HearingAidDeviceManagerTest { } /** + * Test updateHearingAidsDevices, set HearingAid's information, including HiSyncId, deviceSide, + * deviceMode. + */ + @Test + public void updateHearingAidsDevices_validHiSyncId_setHearingAidInfos() { + when(mHearingAidProfile.getHiSyncId(mDevice1)).thenReturn(HISYNCID1); + when(mHearingAidProfile.getDeviceMode(mDevice1)).thenReturn( + HearingAidProfile.DeviceMode.MODE_BINAURAL); + when(mHearingAidProfile.getDeviceSide(mDevice1)).thenReturn( + HearingAidProfile.DeviceSide.SIDE_RIGHT); + mCachedDeviceManager.mCachedDevices.add(mCachedDevice1); + + mHearingAidDeviceManager.updateHearingAidsDevices(); + + assertThat(mCachedDevice1.getHiSyncId()).isEqualTo(HISYNCID1); + assertThat(mCachedDevice1.getDeviceMode()).isEqualTo( + HearingAidProfile.DeviceMode.MODE_BINAURAL); + assertThat(mCachedDevice1.getDeviceSide()).isEqualTo( + HearingAidProfile.DeviceSide.SIDE_RIGHT); + verify(mHearingAidDeviceManager).onHiSyncIdChanged(HISYNCID1); + } + + /** * Test onProfileConnectionStateChangedIfProcessed. * When first hearing aid device is connected, to process it same as other generic devices. * No need to process it. diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/HearingAidStatsLogUtilsTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/HearingAidStatsLogUtilsTest.java new file mode 100644 index 000000000000..0cf5b8900245 --- /dev/null +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/HearingAidStatsLogUtilsTest.java @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2022 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.settingslib.bluetooth; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.Mockito.when; + +import com.android.internal.util.FrameworkStatsLog; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; +import org.robolectric.RobolectricTestRunner; + +import java.util.HashMap; + +@RunWith(RobolectricTestRunner.class) +public class HearingAidStatsLogUtilsTest { + + private static final String TEST_DEVICE_ADDRESS = "00:A1:A1:A1:A1:A1"; + + @Rule + public final MockitoRule mockito = MockitoJUnit.rule(); + + @Mock + private CachedBluetoothDevice mCachedBluetoothDevice; + + @Test + public void setBondEntryForDevice_addsEntryToDeviceAddressToBondEntryMap() { + when(mCachedBluetoothDevice.getAddress()).thenReturn(TEST_DEVICE_ADDRESS); + + HearingAidStatsLogUtils.setBondEntryForDevice( + FrameworkStatsLog.HEARING_AID_INFO_REPORTED__BOND_ENTRY__BLUETOOTH, + mCachedBluetoothDevice); + + final HashMap<String, Integer> map = + HearingAidStatsLogUtils.getDeviceAddressToBondEntryMap(); + assertThat(map.containsKey(TEST_DEVICE_ADDRESS)).isTrue(); + assertThat(map.get(TEST_DEVICE_ADDRESS)).isEqualTo( + FrameworkStatsLog.HEARING_AID_INFO_REPORTED__BOND_ENTRY__BLUETOOTH); + } + + @Test + public void logHearingAidInfo_removesEntryFromDeviceAddressToBondEntryMap() { + when(mCachedBluetoothDevice.getAddress()).thenReturn(TEST_DEVICE_ADDRESS); + + HearingAidStatsLogUtils.setBondEntryForDevice( + FrameworkStatsLog.HEARING_AID_INFO_REPORTED__BOND_ENTRY__BLUETOOTH, + mCachedBluetoothDevice); + HearingAidStatsLogUtils.logHearingAidInfo(mCachedBluetoothDevice); + + final HashMap<String, Integer> map = + HearingAidStatsLogUtils.getDeviceAddressToBondEntryMap(); + assertThat(map.containsKey(TEST_DEVICE_ADDRESS)).isFalse(); + } +} diff --git a/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java b/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java index a9416307229f..e8474de7067c 100644 --- a/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java +++ b/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java @@ -218,5 +218,8 @@ public class SecureSettings { Settings.Secure.ACCESSIBILITY_SOFTWARE_CURSOR_KEYBOARD_SHIFT_ENABLED, Settings.Secure.ASSIST_TOUCH_GESTURE_ENABLED, Settings.Secure.ASSIST_LONG_PRESS_HOME_ENABLED, + Settings.Secure.BLUETOOTH_LE_BROADCAST_PROGRAM_INFO, + Settings.Secure.BLUETOOTH_LE_BROADCAST_CODE, + Settings.Secure.BLUETOOTH_LE_BROADCAST_APP_SOURCE_NAME }; } diff --git a/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java b/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java index 67ea0245da48..0d52164a190e 100644 --- a/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java +++ b/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java @@ -351,5 +351,8 @@ public class SecureSettingsValidators { Secure.ACCESSIBILITY_SOFTWARE_CURSOR_TRIGGER_HINTS_ENABLED, BOOLEAN_VALIDATOR); VALIDATORS.put( Secure.ACCESSIBILITY_SOFTWARE_CURSOR_KEYBOARD_SHIFT_ENABLED, BOOLEAN_VALIDATOR); + VALIDATORS.put(Secure.BLUETOOTH_LE_BROADCAST_PROGRAM_INFO, ANY_STRING_VALIDATOR); + VALIDATORS.put(Secure.BLUETOOTH_LE_BROADCAST_CODE, ANY_STRING_VALIDATOR); + VALIDATORS.put(Secure.BLUETOOTH_LE_BROADCAST_APP_SOURCE_NAME, ANY_STRING_VALIDATOR); } } diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml index 7649de649cf8..2737ecf5ffa6 100644 --- a/packages/SystemUI/AndroidManifest.xml +++ b/packages/SystemUI/AndroidManifest.xml @@ -414,7 +414,7 @@ </intent-filter> </receiver> - <service android:name=".ImageWallpaper" + <service android:name=".wallpapers.ImageWallpaper" android:singleUser="true" android:permission="android.permission.BIND_WALLPAPER" android:exported="true" /> diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java index 57193e7060f9..436145ec0692 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java +++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java @@ -16,6 +16,8 @@ package com.android.systemui.plugins.qs; import android.view.View; +import androidx.annotation.FloatRange; + import com.android.systemui.plugins.FragmentBase; import com.android.systemui.plugins.annotations.DependsOn; import com.android.systemui.plugins.annotations.ProvidesInterface; @@ -107,10 +109,24 @@ public interface QS extends FragmentBase { void setInSplitShade(boolean shouldTranslate); /** - * Set the amount of pixels we have currently dragged down if we're transitioning to the full - * shade. 0.0f means we're not transitioning yet. + * Sets the progress of the transition to full shade on the lockscreen. + * + * @param isTransitioningToFullShade + * whether the transition to full shade is in progress. This might be {@code true}, even + * though {@code qsTransitionFraction} is still 0. + * The reason for that is that on some device configurations, the QS transition has a + * start delay compared to the overall transition. + * + * @param qsTransitionFraction + * the fraction of the QS transition progress, from 0 to 1. + * + * @param qsSquishinessFraction + * the fraction of the QS "squish" transition progress, from 0 to 1. */ - default void setTransitionToFullShadeAmount(float pxAmount, float progress) {} + default void setTransitionToFullShadeProgress( + boolean isTransitioningToFullShade, + @FloatRange(from = 0.0, to = 1.0) float qsTransitionFraction, + @FloatRange(from = 0.0, to = 1.0) float qsSquishinessFraction) {} /** * A rounded corner clipping that makes QS feel as if it were behind everything. @@ -140,6 +156,12 @@ public interface QS extends FragmentBase { default void setOverScrollAmount(int overScrollAmount) {} /** + * Sets whether the notification panel is using the full width of the screen. Typically true on + * small screens and false on large screens. + */ + void setIsNotificationPanelFullWidth(boolean isFullWidth); + + /** * Callback for when QSPanel container is scrolled */ @ProvidesInterface(version = ScrollListener.VERSION) diff --git a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml index fc9c4026bdfa..9dc054a53393 100644 --- a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml +++ b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml @@ -53,7 +53,7 @@ <string name="kg_wrong_pattern" msgid="5907301342430102842">"Patrón incorrecto"</string> <string name="kg_wrong_password" msgid="4143127991071670512">"Contraseña incorrecta"</string> <string name="kg_wrong_pin" msgid="4160978845968732624">"PIN incorrecto"</string> - <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Vuelve a intentarlo en # segundo.}other{Vuelve a intentarlo en # segundos.}}"</string> + <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Vuelve a intentarlo en # segundo.}many{Vuelve a intentarlo en # segundos.}other{Vuelve a intentarlo en # segundos.}}"</string> <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Ingresa el PIN de la tarjeta SIM."</string> <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Ingresa el PIN de la tarjeta SIM de \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string> <string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Inhabilita la tarjeta eSIM para usar el dispositivo sin servicio móvil."</string> @@ -68,9 +68,9 @@ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="190984061975729494">"Escribiste tu contraseña <xliff:g id="NUMBER_0">%1$d</xliff:g> veces de manera incorrecta. \n\nVuelve a intentarlo en <xliff:g id="NUMBER_1">%2$d</xliff:g> segundos."</string> <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4252405904570284368">"Dibujaste tu patrón de desbloqueo <xliff:g id="NUMBER_0">%1$d</xliff:g> veces de manera incorrecta. \n\nVuelve a intentarlo en <xliff:g id="NUMBER_1">%2$d</xliff:g> segundos."</string> <string name="kg_password_wrong_pin_code_pukked" msgid="8047350661459040581">"El código PIN de la tarjeta SIM es incorrecto. Debes comunicarte con tu proveedor para desbloquear el dispositivo."</string> - <string name="kg_password_wrong_pin_code" msgid="5629415765976820357">"{count,plural, =1{El código PIN de la tarjeta SIM es incorrecto. Tienes # intento restante antes de que debas comunicarte con tu operador para desbloquear el dispositivo.}other{El código PIN de la tarjeta SIM es incorrecto. Tienes # intentos restantes. }}"</string> + <string name="kg_password_wrong_pin_code" msgid="5629415765976820357">"{count,plural, =1{El código PIN de la tarjeta SIM es incorrecto. Tienes # intento restante antes de que debas comunicarte con tu operador para desbloquear el dispositivo.}many{El código PIN de la tarjeta SIM es incorrecto. Tienes # intentos restantes. }other{El código PIN de la tarjeta SIM es incorrecto. Tienes # intentos restantes. }}"</string> <string name="kg_password_wrong_puk_code_dead" msgid="3698285357028468617">"La tarjeta SIM no se puede usar. Comunícate con tu proveedor."</string> - <string name="kg_password_wrong_puk_code" msgid="6820515467645087827">"{count,plural, =1{El código PUK de la tarjeta SIM es incorrecto. Tienes # intento restante antes de que la tarjeta SIM quede inutilizable permanentemente.}other{El código PUK de la tarjeta SIM es incorrecto. Tienes # intentos restantes antes de que la tarjeta SIM quede inutilizable permanentemente.}}"</string> + <string name="kg_password_wrong_puk_code" msgid="6820515467645087827">"{count,plural, =1{El código PUK de la tarjeta SIM es incorrecto. Tienes # intento restante antes de que la tarjeta SIM quede inutilizable permanentemente.}many{El código PUK de la tarjeta SIM es incorrecto. Tienes # intentos restantes antes de que la tarjeta SIM quede inutilizable permanentemente.}other{El código PUK de la tarjeta SIM es incorrecto. Tienes # intentos restantes antes de que la tarjeta SIM quede inutilizable permanentemente.}}"</string> <string name="kg_password_pin_failed" msgid="5136259126330604009">"Se produjo un error al desbloquear la tarjeta SIM con el PIN."</string> <string name="kg_password_puk_failed" msgid="6778867411556937118">"Se produjo un error al desbloquear la tarjeta SIM con el PUK."</string> <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Cambiar método de entrada"</string> @@ -85,8 +85,8 @@ <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"El dispositivo se bloqueó de forma manual"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"No se reconoció"</string> <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Activa acceso a cámara en Config. y usa Desb. facial"</string> - <string name="kg_password_default_pin_message" msgid="1434544655827987873">"{count,plural, =1{Ingresa el PIN de la tarjeta SIM. Tienes # intento restante antes de que debas comunicarte con tu operador para desbloquear el dispositivo.}other{Ingresa el PIN de la tarjeta SIM. Tienes # intentos restantes.}}"</string> - <string name="kg_password_default_puk_message" msgid="1025139786449741950">"{count,plural, =1{Se inhabilitó la tarjeta SIM. Para continuar, ingresa el código PUK. Tienes # intento restante antes de que la SIM quede inutilizable permanentemente. Comunícate con tu operador para conocer más detalles.}other{Se inhabilitó la tarjeta SIM. Para continuar, ingresa el código PUK. Tienes # intentos restantes antes de que la SIM quede inutilizable permanentemente. Comunícate con tu operador para conocer más detalles.}}"</string> + <string name="kg_password_default_pin_message" msgid="1434544655827987873">"{count,plural, =1{Ingresa el PIN de la tarjeta SIM. Tienes # intento restante antes de que debas comunicarte con tu operador para desbloquear el dispositivo.}many{Ingresa el PIN de la tarjeta SIM. Tienes # intentos restantes.}other{Ingresa el PIN de la tarjeta SIM. Tienes # intentos restantes.}}"</string> + <string name="kg_password_default_puk_message" msgid="1025139786449741950">"{count,plural, =1{Se inhabilitó la tarjeta SIM. Para continuar, ingresa el código PUK. Tienes # intento restante antes de que la SIM quede inutilizable permanentemente. Comunícate con tu operador para conocer más detalles.}many{Se inhabilitó la tarjeta SIM. Para continuar, ingresa el código PUK. Tienes # intentos restantes antes de que la SIM quede inutilizable permanentemente. Comunícate con tu operador para conocer más detalles.}other{Se inhabilitó la tarjeta SIM. Para continuar, ingresa el código PUK. Tienes # intentos restantes antes de que la SIM quede inutilizable permanentemente. Comunícate con tu operador para conocer más detalles.}}"</string> <string name="clock_title_default" msgid="6342735240617459864">"Predeterminado"</string> <string name="clock_title_bubble" msgid="2204559396790593213">"Burbuja"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analógico"</string> diff --git a/packages/SystemUI/res-keyguard/values-es/strings.xml b/packages/SystemUI/res-keyguard/values-es/strings.xml index 405316165c57..f9f0452771af 100644 --- a/packages/SystemUI/res-keyguard/values-es/strings.xml +++ b/packages/SystemUI/res-keyguard/values-es/strings.xml @@ -53,7 +53,7 @@ <string name="kg_wrong_pattern" msgid="5907301342430102842">"Patrón incorrecto"</string> <string name="kg_wrong_password" msgid="4143127991071670512">"Contraseña incorrecta"</string> <string name="kg_wrong_pin" msgid="4160978845968732624">"PIN incorrecto"</string> - <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Vuelve a intentarlo en # segundo.}other{Vuelve a intentarlo en # segundos.}}"</string> + <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Vuelve a intentarlo en # segundo.}many{Vuelve a intentarlo en # segundos.}other{Vuelve a intentarlo en # segundos.}}"</string> <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Introduce el PIN de la tarjeta SIM."</string> <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Introduce el PIN de la tarjeta SIM de <xliff:g id="CARRIER">%1$s</xliff:g>."</string> <string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Inhabilita la tarjeta eSIM para usar el dispositivo sin servicio móvil."</string> @@ -68,9 +68,9 @@ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="190984061975729494">"Has fallado <xliff:g id="NUMBER_0">%1$d</xliff:g> veces al introducir la contraseña. \n\nVuelve a intentarlo dentro de <xliff:g id="NUMBER_1">%2$d</xliff:g> segundos."</string> <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4252405904570284368">"Has fallado <xliff:g id="NUMBER_0">%1$d</xliff:g> veces al dibujar el patrón de desbloqueo. \n\nVuelve a intentarlo dentro de <xliff:g id="NUMBER_1">%2$d</xliff:g> segundos."</string> <string name="kg_password_wrong_pin_code_pukked" msgid="8047350661459040581">"El código PIN de la tarjeta SIM es incorrecto. Debes ponerte en contacto con tu operador para desbloquear el dispositivo."</string> - <string name="kg_password_wrong_pin_code" msgid="5629415765976820357">"{count,plural, =1{Código PIN de la SIM incorrecto. Te queda # intento antes de tener que ponerte en contacto con tu operador para desbloquear el dispositivo.}other{Código PIN de la SIM incorrecto. Te quedan # intentos. }}"</string> + <string name="kg_password_wrong_pin_code" msgid="5629415765976820357">"{count,plural, =1{Código PIN de la SIM incorrecto. Te queda # intento antes de tener que ponerte en contacto con tu operador para desbloquear el dispositivo.}many{Código PIN de la SIM incorrecto. Te quedan # intentos. }other{Código PIN de la SIM incorrecto. Te quedan # intentos. }}"</string> <string name="kg_password_wrong_puk_code_dead" msgid="3698285357028468617">"La tarjeta SIM no se puede utilizar. Ponte en contacto con tu operador."</string> - <string name="kg_password_wrong_puk_code" msgid="6820515467645087827">"{count,plural, =1{Código PUK de la SIM incorrecto. Te queda # intento antes de que la SIM quede inservible permanentemente.}other{Código PUK de la SIM incorrecto. Te quedan # intentos antes de que la SIM quede inservible permanentemente.}}"</string> + <string name="kg_password_wrong_puk_code" msgid="6820515467645087827">"{count,plural, =1{Código PUK de la SIM incorrecto. Te queda # intento antes de que la SIM quede inservible permanentemente.}many{Código PUK de la SIM incorrecto. Te quedan # intentos antes de que la SIM quede inservible permanentemente.}other{Código PUK de la SIM incorrecto. Te quedan # intentos antes de que la SIM quede inservible permanentemente.}}"</string> <string name="kg_password_pin_failed" msgid="5136259126330604009">"No se ha podido desbloquear la tarjeta SIM con el código PIN."</string> <string name="kg_password_puk_failed" msgid="6778867411556937118">"No se ha podido desbloquear la tarjeta SIM con el código PUK."</string> <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Cambiar método de introducción"</string> @@ -85,8 +85,8 @@ <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"El dispositivo se ha bloqueado manualmente"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"No se reconoce"</string> <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Desbloqueo facial: activa el acceso a la cámara"</string> - <string name="kg_password_default_pin_message" msgid="1434544655827987873">"{count,plural, =1{Introduce el PIN de la SIM. Te queda # intento antes de tener que ponerte en contacto con tu operador para desbloquear el dispositivo.}other{Introduce el PIN de la SIM. Te quedan # intentos.}}"</string> - <string name="kg_password_default_puk_message" msgid="1025139786449741950">"{count,plural, =1{La SIM se ha inhabilitado. Introduce el código PUK para continuar. Te queda # intento antes de que la SIM quede inservible permanentemente. Ponte en contacto con tu operador para obtener más información.}other{La SIM se ha inhabilitado. Introduce el código PUK para continuar. Te quedan # intentos antes de que la SIM quede inservible permanentemente. Ponte en contacto con tu operador para obtener más información.}}"</string> + <string name="kg_password_default_pin_message" msgid="1434544655827987873">"{count,plural, =1{Introduce el PIN de la SIM. Te queda # intento antes de tener que ponerte en contacto con tu operador para desbloquear el dispositivo.}many{Introduce el PIN de la SIM. Te quedan # intentos.}other{Introduce el PIN de la SIM. Te quedan # intentos.}}"</string> + <string name="kg_password_default_puk_message" msgid="1025139786449741950">"{count,plural, =1{La SIM se ha inhabilitado. Introduce el código PUK para continuar. Te queda # intento antes de que la SIM quede inservible permanentemente. Ponte en contacto con tu operador para obtener más información.}many{La SIM se ha inhabilitado. Introduce el código PUK para continuar. Te quedan # intentos antes de que la SIM quede inservible permanentemente. Ponte en contacto con tu operador para obtener más información.}other{La SIM se ha inhabilitado. Introduce el código PUK para continuar. Te quedan # intentos antes de que la SIM quede inservible permanentemente. Ponte en contacto con tu operador para obtener más información.}}"</string> <string name="clock_title_default" msgid="6342735240617459864">"Predeterminado"</string> <string name="clock_title_bubble" msgid="2204559396790593213">"Burbuja"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analógico"</string> diff --git a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml index 92ab77e301db..077fe11be4f2 100644 --- a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml @@ -53,7 +53,7 @@ <string name="kg_wrong_pattern" msgid="5907301342430102842">"Schéma incorrect"</string> <string name="kg_wrong_password" msgid="4143127991071670512">"Mot de passe incorrect"</string> <string name="kg_wrong_pin" msgid="4160978845968732624">"NIP incorrect"</string> - <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Réessayez dans # seconde.}one{Réessayez dans # seconde.}other{Réessayez dans # secondes.}}"</string> + <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Réessayez dans # seconde.}one{Réessayez dans # seconde.}many{Réessayez dans # secondes.}other{Réessayez dans # secondes.}}"</string> <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Entrez le NIP de la carte SIM."</string> <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Entrez le NIP de la carte SIM pour « <xliff:g id="CARRIER">%1$s</xliff:g> »."</string> <string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Désactivez la carte eSIM pour utiliser l\'appareil sans service cellulaire."</string> @@ -68,9 +68,9 @@ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="190984061975729494">"Vous avez entré un mot de passe incorrect à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises.\n\nVeuillez réessayer dans <xliff:g id="NUMBER_1">%2$d</xliff:g> secondes."</string> <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4252405904570284368">"Vous avez dessiné un schéma de déverrouillage incorrect à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises.\n\nVeuillez réessayer dans <xliff:g id="NUMBER_1">%2$d</xliff:g> secondes."</string> <string name="kg_password_wrong_pin_code_pukked" msgid="8047350661459040581">"NIP de carte SIM incorrect. Vous devez maintenant communiquer avec votre fournisseur de services pour déverrouiller votre appareil."</string> - <string name="kg_password_wrong_pin_code" msgid="5629415765976820357">"{count,plural, =1{NIP de la carte SIM incorrect. Il vous reste # tentative. Après cela, vous devrez communiquer avec votre fournisseur de services pour déverrouiller votre appareil.}one{NIP de la carte SIM incorrect. Il vous reste # tentative. }other{NIP de la carte SIM incorrect. Il vous reste # tentatives. }}"</string> + <string name="kg_password_wrong_pin_code" msgid="5629415765976820357">"{count,plural, =1{NIP de la carte SIM incorrect. Il vous reste # tentative. Après cela, vous devrez communiquer avec votre fournisseur de services pour déverrouiller votre appareil.}one{NIP de la carte SIM incorrect. Il vous reste # tentative. }many{NIP de la carte SIM incorrect. Il vous reste # de tentatives. }other{NIP de la carte SIM incorrect. Il vous reste # tentatives. }}"</string> <string name="kg_password_wrong_puk_code_dead" msgid="3698285357028468617">"La carte SIM est inutilisable. Communiquez avec votre fournisseur de services."</string> - <string name="kg_password_wrong_puk_code" msgid="6820515467645087827">"{count,plural, =1{Code PUK de la carte SIM incorrect. Il vous reste # tentative avant que votre carte SIM devienne définitivement inutilisable.}one{Code PUK de la carte SIM incorrect. Il vous reste # tentative avant que votre carte SIM devienne définitivement inutilisable.}other{Code PUK de la carte SIM incorrect. Il vous reste # tentatives avant que votre carte SIM devienne définitivement inutilisable.}}"</string> + <string name="kg_password_wrong_puk_code" msgid="6820515467645087827">"{count,plural, =1{Code PUK de la carte SIM incorrect. Il vous reste # tentative avant que votre carte SIM devienne définitivement inutilisable.}one{Code PUK de la carte SIM incorrect. Il vous reste # tentative avant que votre carte SIM devienne définitivement inutilisable.}many{Code PUK de la carte SIM incorrect. Il vous reste # de tentatives avant que votre carte SIM devienne définitivement inutilisable.}other{Code PUK de la carte SIM incorrect. Il vous reste # tentatives avant que votre carte SIM devienne définitivement inutilisable.}}"</string> <string name="kg_password_pin_failed" msgid="5136259126330604009">"Le déverrouillage par NIP de la carte SIM a échoué."</string> <string name="kg_password_puk_failed" msgid="6778867411556937118">"Le déverrouillage de la carte SIM par code PUK a échoué."</string> <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Changer de méthode d\'entrée"</string> @@ -85,8 +85,8 @@ <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"L\'appareil a été verrouillé manuellement"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Doigt non reconnu"</string> <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Déverr. rec. faciale : activez accès app. photo dans Param."</string> - <string name="kg_password_default_pin_message" msgid="1434544655827987873">"{count,plural, =1{Entrez le NIP de la carte SIM. Il vous reste # tentative. Après cela, vous devrez communiquer avec votre fournisseur de services pour déverrouiller votre appareil.}one{Entrez le NIP de la carte SIM. Il vous reste # tentative.}other{Entrez le NIP de la carte SIM. Il vous reste # tentatives.}}"</string> - <string name="kg_password_default_puk_message" msgid="1025139786449741950">"{count,plural, =1{La carte SIM est maintenant désactivée. Entrez le code PUK pour continuer. Il vous reste # tentative avant que votre carte SIM devienne définitivement inutilisable. Communiquez avec votre fournisseur de services pour en savoir plus.}one{La carte SIM est maintenant désactivée. Entrez le code PUK pour continuer. Il vous reste # tentative avant que votre carte SIM devienne définitivement inutilisable. Communiquez avec votre fournisseur de services pour en savoir plus.}other{La carte SIM est maintenant désactivée. Entrez le code PUK pour continuer. Il vous reste # tentatives avant que votre carte SIM devienne définitivement inutilisable. Communiquez avec votre fournisseur de services pour en savoir plus.}}"</string> + <string name="kg_password_default_pin_message" msgid="1434544655827987873">"{count,plural, =1{Entrez le NIP de la carte SIM. Il vous reste # tentative. Après cela, vous devrez communiquer avec votre fournisseur de services pour déverrouiller votre appareil.}one{Entrez le NIP de la carte SIM. Il vous reste # tentative.}many{Entrez le NIP de la carte SIM. Il vous reste # de tentatives.}other{Entrez le NIP de la carte SIM. Il vous reste # tentatives.}}"</string> + <string name="kg_password_default_puk_message" msgid="1025139786449741950">"{count,plural, =1{La carte SIM est maintenant désactivée. Entrez le code PUK pour continuer. Il vous reste # tentative avant que votre carte SIM devienne définitivement inutilisable. Communiquez avec votre fournisseur de services pour en savoir plus.}one{La carte SIM est maintenant désactivée. Entrez le code PUK pour continuer. Il vous reste # tentative avant que votre carte SIM devienne définitivement inutilisable. Communiquez avec votre fournisseur de services pour en savoir plus.}many{La carte SIM est maintenant désactivée. Entrez le code PUK pour continuer. Il vous reste # de tentatives avant que votre carte SIM devienne définitivement inutilisable. Communiquez avec votre fournisseur de services pour en savoir plus.}other{La carte SIM est maintenant désactivée. Entrez le code PUK pour continuer. Il vous reste # tentatives avant que votre carte SIM devienne définitivement inutilisable. Communiquez avec votre fournisseur de services pour en savoir plus.}}"</string> <string name="clock_title_default" msgid="6342735240617459864">"Par défaut"</string> <string name="clock_title_bubble" msgid="2204559396790593213">"Bulle"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analogique"</string> diff --git a/packages/SystemUI/res-keyguard/values-fr/strings.xml b/packages/SystemUI/res-keyguard/values-fr/strings.xml index 01facd109717..62379f8e37dc 100644 --- a/packages/SystemUI/res-keyguard/values-fr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-fr/strings.xml @@ -53,7 +53,7 @@ <string name="kg_wrong_pattern" msgid="5907301342430102842">"Schéma incorrect"</string> <string name="kg_wrong_password" msgid="4143127991071670512">"Mot de passe incorrect"</string> <string name="kg_wrong_pin" msgid="4160978845968732624">"Code incorrect"</string> - <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Réessayez dans # seconde.}one{Réessayez dans # seconde.}other{Réessayez dans # secondes.}}"</string> + <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Réessayez dans # seconde.}one{Réessayez dans # seconde.}many{Réessayez dans # secondes.}other{Réessayez dans # secondes.}}"</string> <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Saisissez le code PIN de la carte SIM."</string> <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Saisissez le code PIN de la carte SIM \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string> <string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Désactivez la carte eSIM pour utiliser l\'appareil sans service mobile."</string> @@ -68,9 +68,9 @@ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="190984061975729494">"Vous avez saisi un mot de passe incorrect à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises.\n\nRéessayez dans <xliff:g id="NUMBER_1">%2$d</xliff:g> secondes."</string> <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4252405904570284368">"Vous avez dessiné un schéma de déverrouillage incorrect à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises.\n\nRéessayez dans <xliff:g id="NUMBER_1">%2$d</xliff:g> secondes."</string> <string name="kg_password_wrong_pin_code_pukked" msgid="8047350661459040581">"Code PIN de la carte SIM incorrect. Vous devez désormais contacter votre opérateur pour déverrouiller votre appareil."</string> - <string name="kg_password_wrong_pin_code" msgid="5629415765976820357">"{count,plural, =1{Code PIN SIM incorrect. Il vous reste # tentative avant de devoir contacter votre opérateur pour déverrouiller l\'appareil.}one{Code PIN SIM incorrect. Il vous reste # tentative. }other{Code PIN SIM incorrect. Il vous reste # tentatives. }}"</string> + <string name="kg_password_wrong_pin_code" msgid="5629415765976820357">"{count,plural, =1{Code PIN SIM incorrect. Il vous reste # tentative avant de devoir contacter votre opérateur pour déverrouiller l\'appareil.}one{Code PIN SIM incorrect. Il vous reste # tentative. }many{Code PIN SIM incorrect. Il vous reste # tentatives. }other{Code PIN SIM incorrect. Il vous reste # tentatives. }}"</string> <string name="kg_password_wrong_puk_code_dead" msgid="3698285357028468617">"La carte SIM est inutilisable. Contactez votre opérateur."</string> - <string name="kg_password_wrong_puk_code" msgid="6820515467645087827">"{count,plural, =1{Clé PUK de la SIM incorrecte. Il vous reste # tentative avant que la SIM ne devienne définitivement inutilisable.}one{Clé PUK de la SIM incorrecte. Il vous reste # tentative avant que la carte SIM ne devienne définitivement inutilisable.}other{Clé PUK de la SIM incorrecte. Il vous reste # tentatives avant que la carte SIM ne devienne définitivement inutilisable.}}"</string> + <string name="kg_password_wrong_puk_code" msgid="6820515467645087827">"{count,plural, =1{Clé PUK de la SIM incorrecte. Il vous reste # tentative avant que la SIM ne devienne définitivement inutilisable.}one{Clé PUK de la SIM incorrecte. Il vous reste # tentative avant que la carte SIM ne devienne définitivement inutilisable.}many{Clé PUK de la SIM incorrecte. Il vous reste # tentatives avant que la carte SIM ne devienne définitivement inutilisable.}other{Clé PUK de la SIM incorrecte. Il vous reste # tentatives avant que la carte SIM ne devienne définitivement inutilisable.}}"</string> <string name="kg_password_pin_failed" msgid="5136259126330604009">"Échec du déverrouillage à l\'aide du code PIN de la carte SIM."</string> <string name="kg_password_puk_failed" msgid="6778867411556937118">"Échec du déverrouillage à l\'aide de la clé PUK de la carte SIM."</string> <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Changer le mode de saisie"</string> @@ -85,8 +85,8 @@ <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Appareil verrouillé manuellement"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Non reconnu"</string> <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Pour le déverrouillage par reconnaissance faciale, activez l\'accès à l\'app. photo dans Paramètres"</string> - <string name="kg_password_default_pin_message" msgid="1434544655827987873">"{count,plural, =1{Saisissez le code PIN SIM. Il vous reste # tentative avant de devoir contacter votre opérateur pour déverrouiller l\'appareil.}one{Saisissez le code PIN SIM. Il vous reste # tentative.}other{Saisissez le code PIN SIM. Il vous reste # tentatives.}}"</string> - <string name="kg_password_default_puk_message" msgid="1025139786449741950">"{count,plural, =1{La SIM est maintenant désactivée. Saisissez la clé PUK pour continuer. Il vous reste # tentative avant que la SIM ne devienne définitivement inutilisable. Pour plus d\'infos, contactez votre opérateur.}one{La SIM est maintenant désactivée. Saisissez la clé PUK pour continuer. Il vous reste # tentative avant que la SIM ne devienne définitivement inutilisable. Pour plus d\'infos, contactez votre opérateur.}other{La SIM est maintenant désactivée. Saisissez la clé PUK pour continuer. Il vous reste # tentatives avant que la SIM ne devienne définitivement inutilisable. Pour plus d\'infos, contactez votre opérateur.}}"</string> + <string name="kg_password_default_pin_message" msgid="1434544655827987873">"{count,plural, =1{Saisissez le code PIN SIM. Il vous reste # tentative avant de devoir contacter votre opérateur pour déverrouiller l\'appareil.}one{Saisissez le code PIN SIM. Il vous reste # tentative.}many{Saisissez le code PIN SIM. Il vous reste # tentatives.}other{Saisissez le code PIN SIM. Il vous reste # tentatives.}}"</string> + <string name="kg_password_default_puk_message" msgid="1025139786449741950">"{count,plural, =1{La SIM est maintenant désactivée. Saisissez la clé PUK pour continuer. Il vous reste # tentative avant que la SIM ne devienne définitivement inutilisable. Pour plus d\'infos, contactez votre opérateur.}one{La SIM est maintenant désactivée. Saisissez la clé PUK pour continuer. Il vous reste # tentative avant que la SIM ne devienne définitivement inutilisable. Pour plus d\'infos, contactez votre opérateur.}many{La SIM est maintenant désactivée. Saisissez la clé PUK pour continuer. Il vous reste # tentatives avant que la SIM ne devienne définitivement inutilisable. Pour plus d\'infos, contactez votre opérateur.}other{La SIM est maintenant désactivée. Saisissez la clé PUK pour continuer. Il vous reste # tentatives avant que la SIM ne devienne définitivement inutilisable. Pour plus d\'infos, contactez votre opérateur.}}"</string> <string name="clock_title_default" msgid="6342735240617459864">"Par défaut"</string> <string name="clock_title_bubble" msgid="2204559396790593213">"Bulle"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analogique"</string> diff --git a/packages/SystemUI/res-keyguard/values-it/strings.xml b/packages/SystemUI/res-keyguard/values-it/strings.xml index d3a683bf3869..9fed5f72afa1 100644 --- a/packages/SystemUI/res-keyguard/values-it/strings.xml +++ b/packages/SystemUI/res-keyguard/values-it/strings.xml @@ -53,7 +53,7 @@ <string name="kg_wrong_pattern" msgid="5907301342430102842">"Sequenza errata"</string> <string name="kg_wrong_password" msgid="4143127991071670512">"Password errata"</string> <string name="kg_wrong_pin" msgid="4160978845968732624">"PIN errato"</string> - <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Riprova fra # secondo.}other{Riprova fra # secondi.}}"</string> + <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Riprova fra # secondo.}many{Riprova fra # secondi.}other{Riprova fra # secondi.}}"</string> <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Inserisci il PIN della SIM."</string> <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Inserisci il PIN della SIM \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string> <string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Disattiva la eSIM per usare il dispositivo senza servizio dati mobile."</string> @@ -68,9 +68,9 @@ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="190984061975729494">"Hai digitato la tua password <xliff:g id="NUMBER_0">%1$d</xliff:g> volte in modo errato. \n\nRiprova tra <xliff:g id="NUMBER_1">%2$d</xliff:g> secondi."</string> <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4252405904570284368">"<xliff:g id="NUMBER_0">%1$d</xliff:g> tentativi errati di inserimento della sequenza di sblocco. \n\nRiprova tra <xliff:g id="NUMBER_1">%2$d</xliff:g> secondi."</string> <string name="kg_password_wrong_pin_code_pukked" msgid="8047350661459040581">"Codice PIN della SIM errato. Devi contattare l\'operatore per sbloccare il dispositivo."</string> - <string name="kg_password_wrong_pin_code" msgid="5629415765976820357">"{count,plural, =1{Codice PIN della SIM errato. Hai ancora # tentativo a disposizione, dopodiché dovrai contattare l\'operatore per sbloccare il dispositivo.}other{Codice PIN della SIM errato. Hai ancora # tentativi a disposizione. }}"</string> + <string name="kg_password_wrong_pin_code" msgid="5629415765976820357">"{count,plural, =1{Codice PIN della SIM errato. Hai ancora # tentativo a disposizione, dopodiché dovrai contattare l\'operatore per sbloccare il dispositivo.}many{Codice PIN della SIM errato. Hai ancora # tentativi a disposizione. }other{Codice PIN della SIM errato. Hai ancora # tentativi a disposizione. }}"</string> <string name="kg_password_wrong_puk_code_dead" msgid="3698285357028468617">"SIM inutilizzabile. Contatta il tuo operatore."</string> - <string name="kg_password_wrong_puk_code" msgid="6820515467645087827">"{count,plural, =1{Codice PUK della SIM errato. Hai ancora # tentativo a disposizione prima che la SIM diventi definitivamente inutilizzabile.}other{Codice PUK della SIM errato. Hai ancora # tentativi a disposizione prima che la SIM diventi definitivamente inutilizzabile.}}"</string> + <string name="kg_password_wrong_puk_code" msgid="6820515467645087827">"{count,plural, =1{Codice PUK della SIM errato. Hai ancora # tentativo a disposizione prima che la SIM diventi definitivamente inutilizzabile.}many{Codice PUK della SIM errato. Hai ancora # tentativi a disposizione prima che la SIM diventi definitivamente inutilizzabile.}other{Codice PUK della SIM errato. Hai ancora # tentativi a disposizione prima che la SIM diventi definitivamente inutilizzabile.}}"</string> <string name="kg_password_pin_failed" msgid="5136259126330604009">"Operazione con PIN della SIM non riuscita."</string> <string name="kg_password_puk_failed" msgid="6778867411556937118">"Operazione con PUK della SIM non riuscita."</string> <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Cambia metodo di immissione"</string> @@ -85,8 +85,8 @@ <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Il dispositivo è stato bloccato manualmente"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Non riconosciuto"</string> <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Sblocco con volto richiede l\'accesso alla fotocamera"</string> - <string name="kg_password_default_pin_message" msgid="1434544655827987873">"{count,plural, =1{Inserisci il codice PIN della SIM. Hai ancora # tentativo a disposizione, dopodiché dovrai contattare l\'operatore per sbloccare il dispositivo.}other{Inserisci il PIN della SIM. Hai a disposizione ancora # tentativi.}}"</string> - <string name="kg_password_default_puk_message" msgid="1025139786449741950">"{count,plural, =1{La scheda SIM è ora disattivata. Inserisci il codice PUK per continuare. Hai ancora # tentativo a disposizione prima che la SIM diventi definitivamente inutilizzabile. Per informazioni dettagliate, contatta l\'operatore.}other{La scheda SIM è ora disattivata. Inserisci il codice PUK per continuare. Hai ancora # tentativi a disposizione prima che la SIM diventi definitivamente inutilizzabile. Per informazioni dettagliate, contatta l\'operatore.}}"</string> + <string name="kg_password_default_pin_message" msgid="1434544655827987873">"{count,plural, =1{Inserisci il codice PIN della SIM. Hai ancora # tentativo a disposizione, dopodiché dovrai contattare l\'operatore per sbloccare il dispositivo.}many{Inserisci il PIN della SIM. Hai a disposizione ancora # tentativi.}other{Inserisci il PIN della SIM. Hai a disposizione ancora # tentativi.}}"</string> + <string name="kg_password_default_puk_message" msgid="1025139786449741950">"{count,plural, =1{La scheda SIM è ora disattivata. Inserisci il codice PUK per continuare. Hai ancora # tentativo a disposizione prima che la SIM diventi definitivamente inutilizzabile. Per informazioni dettagliate, contatta l\'operatore.}many{La scheda SIM è ora disattivata. Inserisci il codice PUK per continuare. Hai ancora # tentativi a disposizione prima che la SIM diventi definitivamente inutilizzabile. Per informazioni dettagliate, contatta l\'operatore.}other{La scheda SIM è ora disattivata. Inserisci il codice PUK per continuare. Hai ancora # tentativi a disposizione prima che la SIM diventi definitivamente inutilizzabile. Per informazioni dettagliate, contatta l\'operatore.}}"</string> <string name="clock_title_default" msgid="6342735240617459864">"Predefinito"</string> <string name="clock_title_bubble" msgid="2204559396790593213">"Bolla"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analogico"</string> diff --git a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml index 76ced1251358..b9348260d40e 100644 --- a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml @@ -53,7 +53,7 @@ <string name="kg_wrong_pattern" msgid="5907301342430102842">"Padrão incorreto"</string> <string name="kg_wrong_password" msgid="4143127991071670512">"Senha incorreta"</string> <string name="kg_wrong_pin" msgid="4160978845968732624">"PIN incorreto"</string> - <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Tente novamente em # segundo.}one{Tente novamente em # segundo.}other{Tente novamente em # segundos.}}"</string> + <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Tente novamente em # segundo.}one{Tente novamente em # segundo.}many{Tente novamente em # segundos.}other{Tente novamente em # segundos.}}"</string> <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Informe o PIN do chip."</string> <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Informe o PIN do chip para \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string> <string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Desative o eSIM para usar o dispositivo sem serviço móvel."</string> @@ -68,9 +68,9 @@ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="190984061975729494">"Você digitou sua senha incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. \n\nTente novamente em <xliff:g id="NUMBER_1">%2$d</xliff:g> segundos."</string> <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4252405904570284368">"Você desenhou sua sequência de desbloqueio incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. \n\nTente novamente em <xliff:g id="NUMBER_1">%2$d</xliff:g> segundos."</string> <string name="kg_password_wrong_pin_code_pukked" msgid="8047350661459040581">"Código PIN do chip incorreto. Entre em contato com a operadora para desbloquear o dispositivo."</string> - <string name="kg_password_wrong_pin_code" msgid="5629415765976820357">"{count,plural, =1{Código PIN do chip incorreto. Você tem # tentativa restante. Se o código correto não for digitado, será necessário entrar em contato com a operadora para desbloquear o dispositivo.}one{Código PIN do chip incorreto. Você tem # tentativa restante. }other{Código PIN do chip incorreto. Você tem # tentativas restantes. }}"</string> + <string name="kg_password_wrong_pin_code" msgid="5629415765976820357">"{count,plural, =1{Código PIN do chip incorreto. Você tem # tentativa restante. Se o código correto não for digitado, será necessário entrar em contato com a operadora para desbloquear o dispositivo.}one{Código PIN do chip incorreto. Você tem # tentativa restante. }many{Código PIN do chip incorreto. Você tem # de tentativas restantes. }other{Código PIN do chip incorreto. Você tem # tentativas restantes. }}"</string> <string name="kg_password_wrong_puk_code_dead" msgid="3698285357028468617">"O chip não pode ser utilizado. Entre em contato com a operadora."</string> - <string name="kg_password_wrong_puk_code" msgid="6820515467645087827">"{count,plural, =1{Código PUK do chip incorreto. Você tem # tentativa restante. Se o código correto não for digitado, o chip vai ficar permanentemente inutilizável.}one{Código PUK do chip incorreto. Você tem # tentativa restante. Se o código correto não for digitado, o chip vai ficar permanentemente inutilizável.}other{Código PUK do chip incorreto. Você tem # tentativas restantes. Se o código correto não for digitado, o chip vai ficar permanentemente inutilizável.}}"</string> + <string name="kg_password_wrong_puk_code" msgid="6820515467645087827">"{count,plural, =1{Código PUK do chip incorreto. Você tem # tentativa restante. Se o código correto não for digitado, o chip vai ficar permanentemente inutilizável.}one{Código PUK do chip incorreto. Você tem # tentativa restante. Se o código correto não for digitado, o chip vai ficar permanentemente inutilizável.}many{Código PUK do chip incorreto. Você tem # de tentativas restantes. Se o código correto não for digitado, o chip vai ficar permanentemente inutilizável.}other{Código PUK do chip incorreto. Você tem # tentativas restantes. Se o código correto não for digitado, o chip vai ficar permanentemente inutilizável.}}"</string> <string name="kg_password_pin_failed" msgid="5136259126330604009">"Falha na operação de PIN do chip."</string> <string name="kg_password_puk_failed" msgid="6778867411556937118">"Falha na operação de PUK do chip."</string> <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Alterar o método de entrada"</string> @@ -85,8 +85,8 @@ <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"O dispositivo foi bloqueado manualmente"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Não reconhecido"</string> <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Para usar o Desbloqueio facial, ative o acesso à câmera nas Configurações"</string> - <string name="kg_password_default_pin_message" msgid="1434544655827987873">"{count,plural, =1{Informe o PIN do chip. Você tem # tentativa restante antes de precisar entrar em contato com a operadora para desbloquear seu dispositivo.}one{Informe o PIN do chip. Você tem # tentativa restante.}other{Informe o PIN do chip. Você tem # tentativas restantes.}}"</string> - <string name="kg_password_default_puk_message" msgid="1025139786449741950">"{count,plural, =1{O chip está desativado. Informe o código PUK para continuar. Você tem # tentativa restante antes que o chip fique permanentemente inutilizável. Consulte sua operadora para saber mais.}one{O chip está desativado. Informe o código PUK para continuar. Você tem # tentativa restante antes que o chip fique permanentemente inutilizável. Consulte sua operadora para saber mais.}other{O chip está desativado. Informe o código PUK para continuar. Você tem # tentativas restantes antes que o chip fique permanentemente inutilizável. Consulte sua operadora para saber mais.}}"</string> + <string name="kg_password_default_pin_message" msgid="1434544655827987873">"{count,plural, =1{Informe o PIN do chip. Você tem # tentativa restante antes de precisar entrar em contato com a operadora para desbloquear seu dispositivo.}one{Informe o PIN do chip. Você tem # tentativa restante.}many{Informe o PIN do chip. Você tem # de tentativas restantes.}other{Informe o PIN do chip. Você tem # tentativas restantes.}}"</string> + <string name="kg_password_default_puk_message" msgid="1025139786449741950">"{count,plural, =1{O chip está desativado. Informe o código PUK para continuar. Você tem # tentativa restante antes que o chip fique permanentemente inutilizável. Consulte sua operadora para saber mais.}one{O chip está desativado. Informe o código PUK para continuar. Você tem # tentativa restante antes que o chip fique permanentemente inutilizável. Consulte sua operadora para saber mais.}many{O chip está desativado. Informe o código PUK para continuar. Você tem # de tentativas restantes antes que o chip fique permanentemente inutilizável. Consulte sua operadora para saber mais.}other{O chip está desativado. Informe o código PUK para continuar. Você tem # tentativas restantes antes que o chip fique permanentemente inutilizável. Consulte sua operadora para saber mais.}}"</string> <string name="clock_title_default" msgid="6342735240617459864">"Padrão"</string> <string name="clock_title_bubble" msgid="2204559396790593213">"Bolha"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analógico"</string> diff --git a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml index 94afc5f3678b..a67bfb020a3c 100644 --- a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml @@ -53,7 +53,7 @@ <string name="kg_wrong_pattern" msgid="5907301342430102842">"Padrão incorreto."</string> <string name="kg_wrong_password" msgid="4143127991071670512">"Palavra-passe incorreta."</string> <string name="kg_wrong_pin" msgid="4160978845968732624">"PIN incorreto"</string> - <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Tente novamente dentro de # segundo.}other{Tente novamente dentro de # segundos.}}"</string> + <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Tente novamente dentro de # segundo.}many{Tente novamente dentro de # segundos.}other{Tente novamente dentro de # segundos.}}"</string> <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Introduza o PIN do cartão SIM."</string> <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Introduza o PIN do cartão SIM \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string> <string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Desative o eSIM para utilizar o dispositivo sem serviço móvel."</string> @@ -68,9 +68,9 @@ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="190984061975729494">"Introduziu a palavra-passe incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. \n\nTente novamente dentro de <xliff:g id="NUMBER_1">%2$d</xliff:g> segundos."</string> <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4252405904570284368">"Desenhou a sua padrão de desbloqueio incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. \n\nTente novamente dentro de <xliff:g id="NUMBER_1">%2$d</xliff:g> segundos."</string> <string name="kg_password_wrong_pin_code_pukked" msgid="8047350661459040581">"Código PIN do cartão SIM incorreto. Tem de contactar o seu operador para desbloquear o dispositivo."</string> - <string name="kg_password_wrong_pin_code" msgid="5629415765976820357">"{count,plural, =1{Código PIN do SIM incorreto. Tem mais # tentativa antes de ser necessário contactar o operador para desbloquear o dispositivo.}other{Código PIN do SIM incorreto. Tem mais # tentativas. }}"</string> + <string name="kg_password_wrong_pin_code" msgid="5629415765976820357">"{count,plural, =1{Código PIN do SIM incorreto. Tem mais # tentativa antes de ser necessário contactar o operador para desbloquear o dispositivo.}many{Código PIN do SIM incorreto. Tem mais # tentativas. }other{Código PIN do SIM incorreto. Tem mais # tentativas. }}"</string> <string name="kg_password_wrong_puk_code_dead" msgid="3698285357028468617">"Cartão SIM inutilizável. Contacte o seu operador."</string> - <string name="kg_password_wrong_puk_code" msgid="6820515467645087827">"{count,plural, =1{Código PUK do SIM incorreto. Tem mais # tentativa antes de o SIM ficar permanentemente inutilizável.}other{Código PUK do SIM incorreto. Tem mais # tentativas antes de o SIM ficar permanentemente inutilizável.}}"</string> + <string name="kg_password_wrong_puk_code" msgid="6820515467645087827">"{count,plural, =1{Código PUK do SIM incorreto. Tem mais # tentativa antes de o SIM ficar permanentemente inutilizável.}many{Código PUK do SIM incorreto. Tem mais # tentativas antes de o SIM ficar permanentemente inutilizável.}other{Código PUK do SIM incorreto. Tem mais # tentativas antes de o SIM ficar permanentemente inutilizável.}}"</string> <string name="kg_password_pin_failed" msgid="5136259126330604009">"Falha ao introduzir o PIN do cartão SIM!"</string> <string name="kg_password_puk_failed" msgid="6778867411556937118">"Falha ao introduzir o PUK do cartão SIM!"</string> <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Alternar o método de introdução"</string> @@ -85,8 +85,8 @@ <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"O dispositivo foi bloqueado manualmente"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Não reconhecido."</string> <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Ative acesso à câmara nas Def. p/ usar Desbl. facial"</string> - <string name="kg_password_default_pin_message" msgid="1434544655827987873">"{count,plural, =1{Introduza o PIN do SIM. Tem mais # tentativa antes de ser necessário contactar o operador para desbloquear o dispositivo.}other{Introduza o PIN do SIM. Tem mais # tentativas.}}"</string> - <string name="kg_password_default_puk_message" msgid="1025139786449741950">"{count,plural, =1{O SIM está desativado. Introduza o código PUK para continuar. Tem mais # tentativa antes de o SIM ficar permanentemente inutilizável. Contacte o operador para obter mais detalhes.}other{O SIM está desativado. Introduza o código PUK para continuar. Tem mais # tentativas antes de o SIM ficar permanentemente inutilizável. Contacte o operador para obter mais detalhes.}}"</string> + <string name="kg_password_default_pin_message" msgid="1434544655827987873">"{count,plural, =1{Introduza o PIN do SIM. Tem mais # tentativa antes de ser necessário contactar o operador para desbloquear o dispositivo.}many{Introduza o PIN do SIM. Tem mais # tentativas.}other{Introduza o PIN do SIM. Tem mais # tentativas.}}"</string> + <string name="kg_password_default_puk_message" msgid="1025139786449741950">"{count,plural, =1{O SIM está desativado. Introduza o código PUK para continuar. Tem mais # tentativa antes de o SIM ficar permanentemente inutilizável. Contacte o operador para obter mais detalhes.}many{O SIM está desativado. Introduza o código PUK para continuar. Tem mais # tentativas antes de o SIM ficar permanentemente inutilizável. Contacte o operador para obter mais detalhes.}other{O SIM está desativado. Introduza o código PUK para continuar. Tem mais # tentativas antes de o SIM ficar permanentemente inutilizável. Contacte o operador para obter mais detalhes.}}"</string> <string name="clock_title_default" msgid="6342735240617459864">"Predefinido"</string> <string name="clock_title_bubble" msgid="2204559396790593213">"Balão"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analógico"</string> diff --git a/packages/SystemUI/res-keyguard/values-pt/strings.xml b/packages/SystemUI/res-keyguard/values-pt/strings.xml index 76ced1251358..b9348260d40e 100644 --- a/packages/SystemUI/res-keyguard/values-pt/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pt/strings.xml @@ -53,7 +53,7 @@ <string name="kg_wrong_pattern" msgid="5907301342430102842">"Padrão incorreto"</string> <string name="kg_wrong_password" msgid="4143127991071670512">"Senha incorreta"</string> <string name="kg_wrong_pin" msgid="4160978845968732624">"PIN incorreto"</string> - <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Tente novamente em # segundo.}one{Tente novamente em # segundo.}other{Tente novamente em # segundos.}}"</string> + <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Tente novamente em # segundo.}one{Tente novamente em # segundo.}many{Tente novamente em # segundos.}other{Tente novamente em # segundos.}}"</string> <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Informe o PIN do chip."</string> <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Informe o PIN do chip para \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string> <string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Desative o eSIM para usar o dispositivo sem serviço móvel."</string> @@ -68,9 +68,9 @@ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="190984061975729494">"Você digitou sua senha incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. \n\nTente novamente em <xliff:g id="NUMBER_1">%2$d</xliff:g> segundos."</string> <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4252405904570284368">"Você desenhou sua sequência de desbloqueio incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. \n\nTente novamente em <xliff:g id="NUMBER_1">%2$d</xliff:g> segundos."</string> <string name="kg_password_wrong_pin_code_pukked" msgid="8047350661459040581">"Código PIN do chip incorreto. Entre em contato com a operadora para desbloquear o dispositivo."</string> - <string name="kg_password_wrong_pin_code" msgid="5629415765976820357">"{count,plural, =1{Código PIN do chip incorreto. Você tem # tentativa restante. Se o código correto não for digitado, será necessário entrar em contato com a operadora para desbloquear o dispositivo.}one{Código PIN do chip incorreto. Você tem # tentativa restante. }other{Código PIN do chip incorreto. Você tem # tentativas restantes. }}"</string> + <string name="kg_password_wrong_pin_code" msgid="5629415765976820357">"{count,plural, =1{Código PIN do chip incorreto. Você tem # tentativa restante. Se o código correto não for digitado, será necessário entrar em contato com a operadora para desbloquear o dispositivo.}one{Código PIN do chip incorreto. Você tem # tentativa restante. }many{Código PIN do chip incorreto. Você tem # de tentativas restantes. }other{Código PIN do chip incorreto. Você tem # tentativas restantes. }}"</string> <string name="kg_password_wrong_puk_code_dead" msgid="3698285357028468617">"O chip não pode ser utilizado. Entre em contato com a operadora."</string> - <string name="kg_password_wrong_puk_code" msgid="6820515467645087827">"{count,plural, =1{Código PUK do chip incorreto. Você tem # tentativa restante. Se o código correto não for digitado, o chip vai ficar permanentemente inutilizável.}one{Código PUK do chip incorreto. Você tem # tentativa restante. Se o código correto não for digitado, o chip vai ficar permanentemente inutilizável.}other{Código PUK do chip incorreto. Você tem # tentativas restantes. Se o código correto não for digitado, o chip vai ficar permanentemente inutilizável.}}"</string> + <string name="kg_password_wrong_puk_code" msgid="6820515467645087827">"{count,plural, =1{Código PUK do chip incorreto. Você tem # tentativa restante. Se o código correto não for digitado, o chip vai ficar permanentemente inutilizável.}one{Código PUK do chip incorreto. Você tem # tentativa restante. Se o código correto não for digitado, o chip vai ficar permanentemente inutilizável.}many{Código PUK do chip incorreto. Você tem # de tentativas restantes. Se o código correto não for digitado, o chip vai ficar permanentemente inutilizável.}other{Código PUK do chip incorreto. Você tem # tentativas restantes. Se o código correto não for digitado, o chip vai ficar permanentemente inutilizável.}}"</string> <string name="kg_password_pin_failed" msgid="5136259126330604009">"Falha na operação de PIN do chip."</string> <string name="kg_password_puk_failed" msgid="6778867411556937118">"Falha na operação de PUK do chip."</string> <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Alterar o método de entrada"</string> @@ -85,8 +85,8 @@ <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"O dispositivo foi bloqueado manualmente"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Não reconhecido"</string> <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Para usar o Desbloqueio facial, ative o acesso à câmera nas Configurações"</string> - <string name="kg_password_default_pin_message" msgid="1434544655827987873">"{count,plural, =1{Informe o PIN do chip. Você tem # tentativa restante antes de precisar entrar em contato com a operadora para desbloquear seu dispositivo.}one{Informe o PIN do chip. Você tem # tentativa restante.}other{Informe o PIN do chip. Você tem # tentativas restantes.}}"</string> - <string name="kg_password_default_puk_message" msgid="1025139786449741950">"{count,plural, =1{O chip está desativado. Informe o código PUK para continuar. Você tem # tentativa restante antes que o chip fique permanentemente inutilizável. Consulte sua operadora para saber mais.}one{O chip está desativado. Informe o código PUK para continuar. Você tem # tentativa restante antes que o chip fique permanentemente inutilizável. Consulte sua operadora para saber mais.}other{O chip está desativado. Informe o código PUK para continuar. Você tem # tentativas restantes antes que o chip fique permanentemente inutilizável. Consulte sua operadora para saber mais.}}"</string> + <string name="kg_password_default_pin_message" msgid="1434544655827987873">"{count,plural, =1{Informe o PIN do chip. Você tem # tentativa restante antes de precisar entrar em contato com a operadora para desbloquear seu dispositivo.}one{Informe o PIN do chip. Você tem # tentativa restante.}many{Informe o PIN do chip. Você tem # de tentativas restantes.}other{Informe o PIN do chip. Você tem # tentativas restantes.}}"</string> + <string name="kg_password_default_puk_message" msgid="1025139786449741950">"{count,plural, =1{O chip está desativado. Informe o código PUK para continuar. Você tem # tentativa restante antes que o chip fique permanentemente inutilizável. Consulte sua operadora para saber mais.}one{O chip está desativado. Informe o código PUK para continuar. Você tem # tentativa restante antes que o chip fique permanentemente inutilizável. Consulte sua operadora para saber mais.}many{O chip está desativado. Informe o código PUK para continuar. Você tem # de tentativas restantes antes que o chip fique permanentemente inutilizável. Consulte sua operadora para saber mais.}other{O chip está desativado. Informe o código PUK para continuar. Você tem # tentativas restantes antes que o chip fique permanentemente inutilizável. Consulte sua operadora para saber mais.}}"</string> <string name="clock_title_default" msgid="6342735240617459864">"Padrão"</string> <string name="clock_title_bubble" msgid="2204559396790593213">"Bolha"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analógico"</string> diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index b5e93e8799d4..7f6f006bb993 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Kan nie gesig herken nie. Gebruik eerder vingerafdruk."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Kan nie gesig herken nie"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Gebruik eerder vingerafdruk"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth gekoppel."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Batterypersentasie is onbekend."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Gekoppel aan <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Onderskrifteoorlegger"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"aktiveer"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"deaktiveer"</string> + <string name="sound_settings" msgid="8874581353127418308">"Klank en vibrasie"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Instellings"</string> <string name="screen_pinning_title" msgid="9058007390337841305">"Program is vasgespeld"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Dit hou dit in sig totdat jy dit ontspeld. Raak en hou Terug en Oorsig om dit te ontspeld."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Dit hou dit in sig totdat jy dit ontspeld. Raak en hou Terug en Tuis om dit te ontspeld."</string> @@ -594,7 +598,7 @@ <string name="switch_bar_on" msgid="1770868129120096114">"Aan"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Af"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Onbeskikbaar"</string> - <string name="tile_disabled" msgid="373212051546573069">"Gedeaktiveer"</string> + <string name="accessibility_tile_disabled_by_policy_action_description" msgid="6958422730461646926">"kom meer te wete"</string> <string name="nav_bar" msgid="4642708685386136807">"Navigasiebalk"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Uitleg"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Ekstra linksknoppie-tipe"</string> @@ -667,8 +671,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Sommige kenmerke is beperk terwyl foon afkoel.\nTik vir meer inligting"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"Jou foon sal outomaties probeer om af te koel. Jy kan steeds jou foon gebruik, maar dit sal dalk stadiger wees.\n\nJou foon sal normaalweg werk nadat dit afgekoel het."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Sien versorgingstappe"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Trek laaier uit"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"Kan nie hierdie toestel laai nie. Trek die kragprop uit, en wees versigtig, want die kabel kan warm wees."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"Sien versorgingstappe"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Links-kortpad"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Regs-kortpad"</string> diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index aee515373a27..a3ebb60490ac 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"መልክን መለየት አልተቻለም። በምትኩ የጣት አሻራ ይጠቀሙ።"</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"መልክን መለየት አልተቻለም"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"በምትኩ የጣት አሻራን ይጠቀሙ"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"ብሉቱዝ ተያይዟል።"</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"የባትሪ መቶኛ አይታወቅም።"</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"ከ<xliff:g id="BLUETOOTH">%s</xliff:g> ጋር ተገናኝቷል።"</string> @@ -339,8 +341,7 @@ <string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • ኃይል በመሙላት ላይ • በ<xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> ውስጥ ይሞላል"</string> <string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • በፍጥነት ኃይልን በመሙላት ላይ • በ<xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> ውስጥ ይሞላል"</string> <string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • በዝግታ ኃይልን በመሙላት ላይ • በ<xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> ውስጥ ይሞላል"</string> - <!-- no translation found for keyguard_indication_charging_time_dock (3149328898931741271) --> - <skip /> + <string name="keyguard_indication_charging_time_dock" msgid="3149328898931741271">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • ኃይል በመሙላት ላይ • በ<xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> ውስጥ ይሞላል"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"ተጠቃሚ ቀይር"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"ወደታች ተጎታች ምናሌ"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"በዚህ ክፍለ-ጊዜ ውስጥ ያሉ ሁሉም መተግበሪያዎች እና ውሂብ ይሰረዛሉ።"</string> @@ -420,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"የሥዕል መግለጫ ጽሑፎች ንብርብር"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"አንቃ"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"አሰናክል"</string> + <string name="sound_settings" msgid="8874581353127418308">"ድምጽ እና ንዝረት"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"ቅንብሮች"</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> @@ -595,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"በርቷል"</string> <string name="switch_bar_off" msgid="5669805115416379556">"ጠፍቷል"</string> <string name="tile_unavailable" msgid="3095879009136616920">"አይገኝም"</string> - <string name="tile_disabled" msgid="373212051546573069">"ተሰናክሏል"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"የአሰሳ አሞሌ"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"አቀማመጥ"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"ተጨማሪ የግራ አዝራር ዓይነት"</string> @@ -668,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"አንዳንድ ባሕሪያት ስልኩ እየቀዘቀዘ እያለ ውስን ይሆናሉ።\nለተጨማሪ መረጃ መታ ያድርጉ"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"የእርስዎ ስልክ በራስ-ሰር ለመቀዝቀዝ ይሞክራል። አሁንም ስልክዎን መጠቀም ይችላሉ፣ ነገር ግን ሊንቀራፈፍ ይችላል።\n\nአንዴ ስልክዎ ከቀዘቀዘ በኋላ በመደበኝነት ያሄዳል።"</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"የእንክብካቤ ደረጃዎችን ይመልከቱ"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"ኃይል መሙያን ይንቀሉ"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"የዚህን መሣሪያ ባትሪ መሙላት ላይ ችግር አለ። የኃይል አስማሚውን ይንቀሉትና ሊግል ስለሚችል ገመዱን ይጠብቁት።"</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"የእንክብካቤ ደረጃዎችን ይመልከቱ"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"የግራ አቋራጭ"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"የቀኝ አቋራጭ"</string> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index 7a2d5cafc4db..5a35e9023832 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -21,7 +21,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="4811759950673118541">"واجهة مستخدم النظام"</string> <string name="battery_low_title" msgid="5319680173344341779">"هل تريد تفعيل ميزة \"توفير شحن البطارية\"؟"</string> - <string name="battery_low_description" msgid="3282977755476423966">"يتبقى لديك <xliff:g id="PERCENTAGE">%s</xliff:g> من شحن البطارية. يؤدي استخدام ميزة \"توفير شحن البطارية\" إلى تفعيل وضع \"المظهر الداكن\" وتقييد الأنشطة في الخلفية وتأخير الإشعارات."</string> + <string name="battery_low_description" msgid="3282977755476423966">"يتبقى لديك <xliff:g id="PERCENTAGE">%s</xliff:g> من شحن البطارية. يؤدي استخدام ميزة \"توفير شحن البطارية\" إلى تفعيل وضع \"المظهر الداكن\" وحظر الأنشطة في الخلفية وتأخير الإشعارات."</string> <string name="battery_low_intro" msgid="5148725009653088790">"يؤدي استخدام ميزة \"توفير شحن البطارية\" إلى تفعيل وضع \"المظهر الداكن\" وتقييد الأنشطة في الخلفية وتأخير الإشعارات."</string> <string name="battery_low_percent_format" msgid="4276661262843170964">"متبقي <xliff:g id="PERCENTAGE">%s</xliff:g>"</string> <string name="invalid_charger_title" msgid="938685362320735167">"يتعذّر الشحن باستخدام USB."</string> @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"يتعذّر التعرّف على الوجه. استخدِم بصمة الإصبع بدلاً من ذلك."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"يتعذّر التعرّف على الوجه."</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"يمكنك استخدام بصمة إصبعك."</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"تم توصيل البلوتوث."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"نسبة شحن البطارية غير معروفة."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"متصل بـ <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"تراكب الشرح"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"تفعيل"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"إيقاف"</string> + <string name="sound_settings" msgid="8874581353127418308">"الصوت والاهتزاز"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"الإعدادات"</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> @@ -594,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"مفعّل"</string> <string name="switch_bar_off" msgid="5669805115416379556">"متوقف"</string> <string name="tile_unavailable" msgid="3095879009136616920">"غير متوفّر"</string> - <string name="tile_disabled" msgid="373212051546573069">"غير مفعّل"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"شريط التنقل"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"التنسيق"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"نوع زر اليسار الإضافي"</string> @@ -667,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"يتم تقييد عمل بعض الميزات إلى أن تنخفض درجة حرارة الهاتف.\nانقر للحصول على مزيد من المعلومات."</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"سيحاول الهاتف تخفيض درجة حرارته تلقائيًا. سيظل بإمكانك استخدام هاتفك، ولكن قد يعمل بشكل أبطأ.\n\nبعد أن تنخفض درجة حرارة الهاتف، سيستعيد سرعته المعتادة."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"الاطّلاع على خطوات العناية"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"فصل الشاحن"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"هناك مشكلة في شحن هذا الجهاز. يُرجى فصل محوِّل الطاقة بحرص لأن الكابل قد يكون ساخنًا."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"الاطّلاع على خطوات العناية"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"اختصار اليسار"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"اختصار اليمين"</string> diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index 86f3a0eab3a8..912c82eac52c 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"মুখাৱয়ব চিনিব নোৱাৰি। ফিংগাৰপ্ৰিণ্ট ব্যৱহাৰ কৰক।"</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"মুখাৱয়ব চিনিব নোৱাৰি"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"ইয়াৰ সলনি ফিংগাৰপ্ৰিণ্ট ব্যৱহাৰ কৰক"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"ব্লুটুথ সংযোগ হ’ল।"</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"বেটাৰীৰ চাৰ্জৰ শতাংশ অজ্ঞাত।"</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g>ৰ লগত সংযোগ কৰা হ’ল।"</string> @@ -300,7 +302,7 @@ <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"অৱলোকন ট’গল কৰক"</string> <string name="zen_priority_introduction" msgid="3159291973383796646">"আপুনি নিৰ্দিষ্ট কৰা এলাৰ্ম, ৰিমাইণ্ডাৰ, ইভেন্ট আৰু কল কৰোঁতাৰ বাহিৰে আন কোনো শব্দৰ পৰা আপুনি অসুবিধা নাপাব। কিন্তু, সংগীত, ভিডিঅ\' আৰু খেলসমূহকে ধৰি আপুনি প্লে কৰিব খোজা যিকোনো বস্তু তথাপি শুনিব পাৰিব।"</string> <string name="zen_alarms_introduction" msgid="3987266042682300470">"আপুনি নিৰ্দিষ্ট কৰা এলাৰ্মৰ বাহিৰে আন কোনো ধ্বনি আৰু কম্পনৰ পৰা আপুনি অসুবিধা নাপাব। কিন্তু, সংগীত, ভিডিঅ\' আৰু খেলসমূহকে ধৰি আপুনি প্লে কৰিব খোজা যিকোনো বস্তু তথাপি শুনিব পাৰিব।"</string> - <string name="zen_priority_customize_button" msgid="4119213187257195047">"নিজৰ উপযোগিতা অনুসৰি"</string> + <string name="zen_priority_customize_button" msgid="4119213187257195047">"কাষ্টমাইজ কৰক"</string> <string name="zen_silence_introduction_voice" msgid="853573681302712348">"এই কার্যই এলার্ম, সংগীত, ভিডিঅ\' আৰু খেলসমূহকে ধৰি আটাইবোৰৰ বাবে ধ্বনি আৰু কম্পন অৱৰোধ কৰিব। আপুনি ফ\'ন কল তথাপি কৰিবলৈ সক্ষম হ\'ব।"</string> <string name="zen_silence_introduction" msgid="6117517737057344014">"এই কার্যই এলার্ম, মিউজিক, ভিডিঅ\' আৰু গেইমকে ধৰি আটাইবোৰৰ ধ্বনি আৰু কম্পন অৱৰোধ কৰে।"</string> <string name="notification_tap_again" msgid="4477318164947497249">"খুলিবলৈ পুনৰাই টিপক"</string> @@ -339,8 +341,7 @@ <string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • চাৰ্জ হৈ আছে • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>ত সম্পূৰ্ণ হ’ব"</string> <string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • দ্ৰুতগতিৰে চাৰ্জ হৈ আছে • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>ত সম্পূৰ্ণ হ’ব"</string> <string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • লাহে লাহে চাৰ্জ হৈ আছে • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>ত সম্পূৰ্ণ হ’ব"</string> - <!-- no translation found for keyguard_indication_charging_time_dock (3149328898931741271) --> - <skip /> + <string name="keyguard_indication_charging_time_dock" msgid="3149328898931741271">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • চাৰ্জ হৈ আছে • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>ত সম্পূৰ্ণ হ’ব"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"ব্যৱহাৰকাৰী সলনি কৰক"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"পুল-ডাউনৰ মেনু"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"এই ছেশ্বনৰ আটাইবোৰ এপ্ আৰু ডেটা মচা হ\'ব।"</string> @@ -420,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"কেপশ্বন অভাৰলে’"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"সক্ষম কৰক"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"অক্ষম কৰক"</string> + <string name="sound_settings" msgid="8874581353127418308">"ধ্বনি আৰু কম্পন"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"ছেটিং"</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> @@ -529,7 +532,7 @@ <string name="notification_channel_controls_opened_accessibility" msgid="6111817750774381094">"<xliff:g id="APP_NAME">%1$s</xliff:g>ৰ জাননী নিয়ন্ত্ৰণসমূহ খোলা অৱস্থাত আছে"</string> <string name="notification_channel_controls_closed_accessibility" msgid="1561909368876911701">"<xliff:g id="APP_NAME">%1$s</xliff:g>ৰ জাননী নিয়ন্ত্ৰণসমূহ বন্ধ অৱস্থাত আছে"</string> <string name="notification_more_settings" msgid="4936228656989201793">"অধিক ছেটিং"</string> - <string name="notification_app_settings" msgid="8963648463858039377">"নিজৰ উপযোগিতা অনুসৰি"</string> + <string name="notification_app_settings" msgid="8963648463858039377">"কাষ্টমাইজ কৰক"</string> <string name="notification_conversation_bubble" msgid="2242180995373949022">"বাবল হিচাপে দেখুৱাওক"</string> <string name="notification_conversation_unbubble" msgid="6908427185031099868">"Bubbles আঁতৰাওক"</string> <string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string> @@ -595,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"অন"</string> <string name="switch_bar_off" msgid="5669805115416379556">"অফ"</string> <string name="tile_unavailable" msgid="3095879009136616920">"উপলব্ধ নহয়"</string> - <string name="tile_disabled" msgid="373212051546573069">"অক্ষম কৰা আছে"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"নেভিগেশ্বন দণ্ড"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"লেআউট"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"বাওঁ বুটামৰ অতিৰিক্ত প্ৰকাৰ"</string> @@ -668,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"ফ’নটো ঠাণ্ডা হৈ থকাৰ সময়ত কিছুমান সুবিধা উপলব্ধ নহয়।\nঅধিক তথ্যৰ বাবে টিপক"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"আপোনাৰ ফ\'নটোৱে নিজে নিজে ঠাণ্ডা হ\'বলৈ স্বয়ংক্ৰিয়ভাৱে চেষ্টা কৰিব। আপুনি ফ\'নটো ব্যৱহাৰ কৰি থাকিব পাৰে কিন্তু ই লাহে লাহে চলিব পাৰে।\n\nফ\'নটো সম্পূৰ্ণভাৱে ঠাণ্ডা হোৱাৰ পিছত ই আগৰ নিচিনাকৈয়েই চলিব।"</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"যত্ন লোৱাৰ পদক্ষেপসমূহ চাওক"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"চ্চার্জাৰ আনপ্লাগ কৰক"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"এই ডিভাইচটো চ্চার্জ কৰোঁতে কিবা সমস্যা হৈছে। পাৱাৰ এডাপ্টাৰটো আনপ্লাগ কৰক, কেব’লডাল গৰম হ’ব পাৰে গতিকে সাবধান হ’ব।"</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"যত্ন লোৱাৰ পদক্ষেপসমূহ চাওক"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"বাওঁ শ্বৰ্টকাট"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"সোঁ শ্বৰ্টকাট"</string> diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index 1a028656687c..fd2d848cc294 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Tanımaq olmur. Barmaq izini işlədin."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Üzü tanımaq olmur"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Barmaq izi istifadə edin"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth qoşulub."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Batareyanın faizi naməlumdur."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> üzərindən qoşuldu."</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Subtitr başlığı"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"aktiv edin"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"deaktiv edin"</string> + <string name="sound_settings" msgid="8874581353127418308">"Səs və vibrasiya"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Ayarlar"</string> <string name="screen_pinning_title" msgid="9058007390337841305">"Tətbiq bərkidilib"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Sancaq götürülənə qədər bu görünəcək. Sancağı götürmək üçün Geri və İcmal düymələrinə basıb saxlayın."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"\"Geri\" və \"Əsas ekran\" düymələrinin davamlı basılması ilə çıxarılana qədər tətbiq göz önündə qalır."</string> @@ -594,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"Aktiv"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Deaktiv"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Əlçatan deyil"</string> - <string name="tile_disabled" msgid="373212051546573069">"Deaktiv edilib"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"Naviqasiya paneli"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Tərtibat"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Əlavə sol düymə növü"</string> @@ -667,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Telefon soyuyana kimi bəzi funksiyalar məhdudlaşdırılır.\nƏtraflı məlumat üçün toxunun"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"Telefonunuz avtomatik olaraq soyumağa başlayacaq. Telefon istifadəsinə davam edə bilərsiniz, lakin sürəti yavaşlaya bilər.\n\nTelefonunuz soyuduqdan sonra normal işləyəcək."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Ehtiyat tədbiri mərhələlərinə baxın"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Adapteri cərəyandan ayırın"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"Bu cihazın batareya yığmasında problem var. Adapteri cərəyandan ayırın. Ehtiyatlı olun, kabel isti ola bilər."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"Ehtiyat tədbiri mərhələlərinə baxın"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Sol qısayol"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Sağ qısayol"</string> diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index 453a364ff6e4..dbef1e40eb81 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Lice nije prepoznato. Koristite otisak prsta."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Lice nije prepoznato"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Koristite otisak prsta"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth je priključen."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Procenat napunjenosti baterije nije poznat."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Povezani ste sa <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Preklapanje titlova"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"omogućite"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"onemogućite"</string> + <string name="sound_settings" msgid="8874581353127418308">"Zvuk i vibriranje"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Podešavanja"</string> <string name="screen_pinning_title" msgid="9058007390337841305">"Aplikacija je zakačena"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Na ovaj način se ovo stalno prikazuje dok ga ne otkačite. Dodirnite i zadržite Nazad i Pregled da biste ga otkačili."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Na ovaj način se ovo stalno prikazuje dok ga ne otkačite. Dodirnite i zadržite Nazad i Početna da biste ga otkačili."</string> @@ -594,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"Uključeno"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Isključeno"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Nedostupno"</string> - <string name="tile_disabled" msgid="373212051546573069">"Onemogućeno"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"Traka za navigaciju"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Raspored"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Dodatni tip levog dugmeta"</string> @@ -667,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Neke funkcije su ograničene dok se telefon ne ohladi.\nDodirnite za više informacija"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"Telefon će automatski pokušati da se ohladi. I dalje ćete moći da koristite telefon, ali će sporije reagovati.\n\nKada se telefon ohladi, normalno će raditi."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Pogledajte upozorenja"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Isključite punjač iz struje"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"Došlo je do problema sa punjenjem ovog uređaja. Isključite adapter iz napajanja i budite pažljivi jer kabl može da bude topao."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"Pogledajte upozorenja"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Leva prečica"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Desna prečica"</string> diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index b35ddbec08b3..372392c8131d 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Твар не распазнаны. Скарыстайце адбітак пальца."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Твар не распазнаны"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Скарыстайце адбітак пальца"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth-сувязь."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Працэнт зараду акумулятара невядомы."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Падлучаны да <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> @@ -339,8 +341,7 @@ <string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Ідзе зарадка • Поўны зарад праз <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> <string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Ідзе хуткая зарадка • Поўны зарад праз <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> <string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Ідзе павольная зарадка • Поўны зарад праз <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> - <!-- no translation found for keyguard_indication_charging_time_dock (3149328898931741271) --> - <skip /> + <string name="keyguard_indication_charging_time_dock" msgid="3149328898931741271">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Ідзе зарадка • Поўны зарад праз <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Перайсці да іншага карыстальніка"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"высоўнае меню"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Усе праграмы і даныя гэтага сеанса будуць выдалены."</string> @@ -420,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Накладанне субцітраў"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"уключыць"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"адключыць"</string> + <string name="sound_settings" msgid="8874581353127418308">"Гук і вібрацыя"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Налады"</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> @@ -595,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"Уключана"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Выключана"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Недаступна"</string> - <string name="tile_disabled" msgid="373212051546573069">"Выключана"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"Панэль навігацыі"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Раскладка"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Дадатковы тып кнопкі \"ўлева\""</string> @@ -668,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Некаторыя функцыі абмежаваны, пакуль тэлефон не астыне.\nНацісніце, каб даведацца больш"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"Ваш тэлефон аўтаматычна паспрабуе астыць. Вы можаце па-ранейшаму карыстацца сваім тэлефонам, але ён можа працаваць больш павольна.\n\nПасля таго як ваш тэлефон астыне, ён будзе працаваць у звычайным рэжыме."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Глядзець паэтапную дапамогу"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Адключыце зарадную прыладу"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"Узнікла праблема з зарадкай гэтай прылады. Адключыце адаптар сілкавання і праверце, ці не нагрэўся кабель."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"Глядзець паэтапную дапамогу"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Ярлык \"улева\""</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Ярлык \"управа\""</string> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index c2bb8ad6d8ec..1bca6a479f0c 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Лицето не е разпознато. Използвайте отпечатък."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Лицето не е разпознато"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Използвайте отпечатък"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth е включен."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Процентът на батерията е неизвестен."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Има връзка с <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Наслагване на надписите"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"активиране"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"деактивиране"</string> + <string name="sound_settings" msgid="8874581353127418308">"Звук и вибриране"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Настройки"</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> @@ -594,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"Вкл."</string> <string name="switch_bar_off" msgid="5669805115416379556">"Изкл."</string> <string name="tile_unavailable" msgid="3095879009136616920">"Не е налице"</string> - <string name="tile_disabled" msgid="373212051546573069">"Деактивирано"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"Лента за навигация"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Оформление"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Тип на допълнителния ляв бутон"</string> @@ -667,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Някои функции са ограничени, докато телефонът се охлажда.\nДокоснете за още информация"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"Телефонът ви автоматично ще направи опит за охлаждане. Пак можете да го използвате, но той може да работи по-бавно.\n\nСлед като се охлади, ще работи нормално."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Вижте стъпките, които да предприемете"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Изключете зарядното устройство"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"При зареждането на това устройство възникна проблем. Изключете захранващия адаптер и внимавайте, тъй като кабелът може да е топъл."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"Вижте стъпките, които да предприемете"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Ляв пряк път"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Десен пряк път"</string> diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index 39435cddd922..80beebc2f789 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"মুখ শনাক্ত করতে পারছি না। পরিবর্তে আঙ্গুলের ছাপ ব্যবহার করুন।"</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"ফেস শনাক্ত করা যায়নি"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"পরিবর্তে ফিঙ্গারপ্রিন্ট ব্যবহার করুন"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"ব্লুটুথ সংযুক্ত হয়েছে৷"</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"ব্যাটারি কত শতাংশ আছে তা জানা যায়নি।"</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g>এ সংযুক্ত হয়ে আছে।"</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"ক্যাপশন ওভারলে"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"চালু হবে"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"বন্ধ হবে"</string> + <string name="sound_settings" msgid="8874581353127418308">"সাউন্ড ও ভাইব্রেশন"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"সেটিংস"</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> @@ -594,7 +598,7 @@ <string name="switch_bar_on" msgid="1770868129120096114">"চালু আছে"</string> <string name="switch_bar_off" msgid="5669805115416379556">"বন্ধ আছে"</string> <string name="tile_unavailable" msgid="3095879009136616920">"উপলভ্য নয়"</string> - <string name="tile_disabled" msgid="373212051546573069">"বন্ধ করা আছে"</string> + <string name="accessibility_tile_disabled_by_policy_action_description" msgid="6958422730461646926">"আরও জানুন"</string> <string name="nav_bar" msgid="4642708685386136807">"নেভিগেশন বার"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"লেআউট"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"অতিরিক্ত বাঁদিকের বোতামের ধরণ"</string> @@ -667,8 +671,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"ফোন ঠাণ্ডা না হওয়া পর্যন্ত কিছু ফিচার কাজ করে না।\nআরও তথ্যের জন্য ট্যাপ করুন"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"আপনার ফোনটি নিজে থেকেই ঠাণ্ডা হওয়ার চেষ্টা করবে৷ আপনি তবুও আপনার ফোন ব্যবহার করতে পারেন, কিন্তু এটি একটু ধীরে চলতে পারে৷\n\nআপনার ফোনটি পুরোপুরি ঠাণ্ডা হয়ে গেলে এটি স্বাভাবিকভাবে চলবে৷"</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"ডিভাইস রক্ষণাবেক্ষণের ধাপগুলি দেখুন"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"চার্জার আনপ্লাগ করুন"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"এই ডিভাইস চার্জ করার সময় সমস্যা হয়েছে। চার্জিং কেবলটি হয়ত গরম হয়ে গেছে, পাওয়ার অ্যাডাপ্টারটি আনপ্লাগ করুন।"</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"কী করতে হবে ধাপে ধাপে দেখুন"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"বাঁদিকের শর্টকাট"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"ডানদিকের শর্টকাট"</string> diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index c60682f97b3b..ecb0e24ad742 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Nije moguće prepoznati lice. Koristite otisak prsta."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Nije moguće prepoznati lice"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Koristite otisak prsta"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth je povezan."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Postotak napunjenosti baterije nije poznat"</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Povezan na <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Preklapanje titlova"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"omogući"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"onemogući"</string> + <string name="sound_settings" msgid="8874581353127418308">"Zvuk i vibracija"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Postavke"</string> <string name="screen_pinning_title" msgid="9058007390337841305">"Aplikacija je zakačena"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Ekran ostaje prikazan ovako dok ga ne otkačite. Da ga otkačite, dodirnite i držite dugme Nazad."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Na ovaj način ekran ostaje prikazan dok ga ne otkačite. Da otkačite ekran, dodirnite i držite dugme Nazad i Početna."</string> @@ -594,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"Uključeno"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Isključeno"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Nedostupno"</string> - <string name="tile_disabled" msgid="373212051546573069">"Onemogućeno"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"Navigaciona traka"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Raspored"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Vrsta dodatnog dugmeta lijevo"</string> @@ -667,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Neke funkcije su ograničene dok se telefon hladi.\nDodirnite za više informacija"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"Vaš telefon će se automatski pokušati ohladiti. I dalje možete koristi telefon, ali će možda raditi sporije.\n\nNakon što se ohladi, telefon će normalno raditi."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Pogledajte korake za zaštitu"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Isključite punjač"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"Došlo je do problema prilikom punjenja ovog uređaja. Pažljivo isključite adapter za napajanje jer je moguće da je kabl vruć."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"Prikaz koraka za zaštitu"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Prečica lijevo"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Prečica desno"</string> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index 14e0cd54821e..bbffb029361e 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"No podem detectar la cara. Usa l\'empremta digital."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"No es reconeix la cara"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Utilitza l\'empremta digital"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth connectat."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Es desconeix el percentatge de bateria."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"S\'ha connectat a <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Superposició de subtítols"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"activar"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"desactivar"</string> + <string name="sound_settings" msgid="8874581353127418308">"So i vibració"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Configuració"</string> <string name="screen_pinning_title" msgid="9058007390337841305">"L\'aplicació està fixada"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Aquest element es continuarà mostrant fins que deixis de fixar-lo. Per fer-ho, toca i mantén premudes els botons Enrere i Aplicacions recents."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Aquest element es continuarà mostrant fins que deixis de fixar-lo. Per fer-ho, mantén premuts els botons Enrere i Inici."</string> @@ -594,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"Activat"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Desactivat"</string> <string name="tile_unavailable" msgid="3095879009136616920">"No disponible"</string> - <string name="tile_disabled" msgid="373212051546573069">"Desactivat"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"Barra de navegació"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Disposició"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Tipus de botó addicional de l\'esquerra"</string> @@ -667,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Algunes funcions estan limitades mentre el telèfon es refreda.\nToca per obtenir més informació"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"El telèfon provarà de refredar-se automàticament. Podràs continuar utilitzant-lo, però és possible que funcioni més lentament.\n\nUn cop s\'hagi refredat, funcionarà amb normalitat."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Mostra els passos de manteniment"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Desconnecta el carregador"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"No es pot carregar el dispositiu. Desconnecta l\'adaptador de corrent amb compte, ja que el cable podria estar calent."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"Mostra els pasos de manteniment"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Drecera de l\'esquerra"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Drecera de la dreta"</string> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index 25fa56f594b3..66874fdef434 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Obličej se nepodařilo rozpoznat. Použijte místo něj otisk prstu."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Obličej nelze rozpoznat"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Použijte otisk prstu"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Rozhraní Bluetooth je připojeno."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Procento baterie není známé."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Připojeno k zařízení <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Překryvná vrstva titulků"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"aktivovat"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"deaktivovat"</string> + <string name="sound_settings" msgid="8874581353127418308">"Zvuk a vibrace"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Nastavení"</string> <string name="screen_pinning_title" msgid="9058007390337841305">"Aplikace je připnutá"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Obsah bude připnut v zobrazení, dokud jej neuvolníte. Uvolníte jej stisknutím a podržením tlačítek Zpět a Přehled."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Obsah bude připnut v zobrazení, dokud ho neuvolníte. Uvolníte ho podržením tlačítek Zpět a Plocha."</string> @@ -594,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"Zapnuto"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Vypnuto"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Nedostupné"</string> - <string name="tile_disabled" msgid="373212051546573069">"Vypnuto"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"Navigační panel"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Rozvržení"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Zvláštní typ tlačítka vlevo"</string> @@ -667,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Některé funkce jsou při chladnutí telefonu omezeny.\nKlepnutím zobrazíte další informace"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"Telefon se automaticky pokusí vychladnout. Lze jej nadále používat, ale může být pomalejší.\n\nAž telefon vychladne, bude fungovat normálně."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Zobrazit pokyny, co dělat"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Odpojte nabíječku"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"Při nabíjení zařízení došlo k problému. Odpojte napájecí adaptér (dávejte pozor, kabel může být horký)."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"Zobrazit pokyny, co dělat"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Zkratka vlevo"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Zkratka vpravo"</string> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index a3a548820618..ab201d7522ac 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Ansigtet kan ikke genkendes. Brug fingeraftryk i stedet."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Ansigt kan ikke genkendes"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Brug fingeraftryk i stedet"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth tilsluttet."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Batteriniveauet er ukendt."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Tilsluttet <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> @@ -339,8 +341,7 @@ <string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Oplader • Fuldt opladet om <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> <string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Oplader hurtigt • Fuldt opladet om <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> <string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Oplader langsomt • Fuldt opladet om <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> - <!-- no translation found for keyguard_indication_charging_time_dock (3149328898931741271) --> - <skip /> + <string name="keyguard_indication_charging_time_dock" msgid="3149328898931741271">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Oplader • Fuldt opladet om <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Skift bruger"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"rullemenu"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Alle apps og data i denne session slettes."</string> @@ -420,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Overlejrede undertekster"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"aktivér"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"deaktiver"</string> + <string name="sound_settings" msgid="8874581353127418308">"Lyd og vibration"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Indstillinger"</string> <string name="screen_pinning_title" msgid="9058007390337841305">"Appen er fastgjort"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Dette fastholder skærmen i visningen, indtil du frigør den. Tryk på Tilbage og Overblik, og hold fingeren nede for at frigøre skærmen."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Dette fastholder skærmen i visningen, indtil du frigør den. Hold Tilbage og Startskærm nede for at frigøre skærmen."</string> @@ -595,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"Til"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Fra"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Ikke tilgængelig"</string> - <string name="tile_disabled" msgid="373212051546573069">"Deaktiveret"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"Navigationslinje"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Layout"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Ekstra venstre knaptype"</string> @@ -668,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Nogle funktioner er begrænsede, mens telefonen køler ned.\nTryk for at få flere oplysninger"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"Din telefon forsøger automatisk at køle ned. Du kan stadig bruge telefonen, men den kører muligvis langsommere.\n\nNår din telefon er kølet ned, fungerer den normalt igen."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Se håndteringsvejledning"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Frakobl opladeren"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"Der er et problem med opladning af denne enhed. Frakobl strømadapteren, og vær forsigtig, da kablet kan være varmt."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"Se vejledningen i pleje"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Venstre genvej"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Højre genvej"</string> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index 3df0b43da1d8..5bf907cc5ce6 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Gesicht wurde nicht erkannt. Verwende stattdessen den Fingerabdruck."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Gesicht nicht erkannt"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Fingerabdruck verwenden"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Mit Bluetooth verbunden"</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Akkustand unbekannt."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Mit <xliff:g id="BLUETOOTH">%s</xliff:g> verbunden"</string> @@ -312,10 +314,8 @@ <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Gerät mit dem Gesicht entsperrt. Tippe zum Öffnen."</string> <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Gesicht erkannt. Tippe zum Öffnen."</string> <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Gesicht erkannt. Tippe zum Öffnen auf das Symbol „Entsperren“."</string> - <!-- no translation found for keyguard_face_successful_unlock (4203999851465708287) --> - <skip /> - <!-- no translation found for keyguard_face_successful_unlock_alt1 (5853906076353839628) --> - <skip /> + <string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Gerät mit Gesicht entsperrt"</string> + <string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Gesicht erkannt"</string> <string-array name="udfps_accessibility_touch_hints"> <item msgid="1901953991150295169">"Nach links bewegen"</item> <item msgid="5558598599408514296">"Nach unten bewegen"</item> @@ -341,8 +341,7 @@ <string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Wird geladen • Voll in <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> <string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Wird schnell geladen • Voll in <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> <string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Wird langsam geladen • Voll in <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> - <!-- no translation found for keyguard_indication_charging_time_dock (3149328898931741271) --> - <skip /> + <string name="keyguard_indication_charging_time_dock" msgid="3149328898931741271">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Wird geladen • Voll in <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Nutzer wechseln"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"Pull-down-Menü"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Alle Apps und Daten in dieser Sitzung werden gelöscht."</string> @@ -422,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Untertitel-Overlay"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"aktivieren"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"deaktivieren"</string> + <string name="sound_settings" msgid="8874581353127418308">"Ton & Vibration"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Einstellungen"</string> <string name="screen_pinning_title" msgid="9058007390337841305">"App ist auf dem Bildschirm fixiert"</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> @@ -597,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"An"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Aus"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Nicht verfügbar"</string> - <string name="tile_disabled" msgid="373212051546573069">"Deaktiviert"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"Navigationsleiste"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Layout"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Zusätzlicher linker Schaltflächentyp"</string> @@ -670,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Einige Funktionen sind während der Abkühlphase des Smartphones eingeschränkt.\nFür mehr Informationen tippen."</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"Dein Smartphone kühlt sich automatisch ab. Du kannst dein Smartphone weiterhin nutzen, aber es reagiert möglicherweise langsamer.\n\nSobald dein Smartphone abgekühlt ist, funktioniert es wieder normal."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Schritte zur Abkühlung des Geräts ansehen"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Ladegerät vom Stromnetz trennen"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"Beim Laden dieses Geräts ist ein Problem aufgetreten. Trenne das Netzteil vom Stromnetz. Sei dabei vorsichtig, denn das Netzteil oder das Kabel könnte heiß sein."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"Schritte zur Fehlerbehebung ansehen"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Linke Verknüpfung"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Rechte Verknüpfung"</string> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index 16f8796d11c2..2a1403cd293e 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Το πρόσωπο δεν αναγνωρίζεται. Χρησιμ. δακτ. αποτ."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Αδύνατη η αναγν. προσώπου"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Χρησιμ. δακτυλ. αποτύπ."</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Το Bluetooth είναι συνδεδεμένο."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Άγνωστο ποσοστό μπαταρίας."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Συνδέθηκε στο <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Επικάλυψη υπότιτλων"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"ενεργοποίηση"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"απενεργοποίηση"</string> + <string name="sound_settings" msgid="8874581353127418308">"Ήχος και δόνηση"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Ρυθμίσεις"</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> @@ -594,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"Ενεργό"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Απενεργοποίηση"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Μη διαθέσιμο"</string> - <string name="tile_disabled" msgid="373212051546573069">"Ανενεργό"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"Γραμμή πλοήγησης"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Διάταξη"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Επιπλέον τύπος αριστερού κουμπιού"</string> @@ -667,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Ορισμένες λειτουργίες περιορίζονται κατά τη μείωση της θερμοκρασίας.\nΠατήστε για περισσότερες πληροφορίες."</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"Το τηλέφωνό σας θα προσπαθήσει να μειώσει αυτόματα τη θερμοκρασία. Μπορείτε να εξακολουθήσετε να το χρησιμοποιείτε, αλλά είναι πιθανό να λειτουργεί πιο αργά.\n\nΜόλις μειωθεί η θερμοκρασία του τηλεφώνου σας, θα λειτουργεί ξανά κανονικά."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Δείτε βήματα αντιμετώπισης."</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Αποσυνδέστε τον φορτιστή"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"Υπάρχει κάποιο πρόβλημα με τη φόρτιση αυτής της συσκευής. Αποσυνδέστε τον μετασχηματιστή με προσοχή, λαμβάνοντας υπόψη ότι το καλώδιο μπορεί να είναι ζεστό."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"Δείτε βήματα αντιμετώπισης"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Αριστερή συντόμευση"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Δεξιά συντόμευση"</string> diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index d9fea1469adc..7b9c7562bd23 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Can’t recognise face. Use fingerprint instead."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Can’t recognise face"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Use fingerprint instead"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth connected."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Battery percentage unknown."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Connected to <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Captions overlay"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"enable"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"disable"</string> + <string name="sound_settings" msgid="8874581353127418308">"Sound and vibration"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Settings"</string> <string name="screen_pinning_title" msgid="9058007390337841305">"App is pinned"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"This keeps it in view until you unpin. Touch & hold Back and Overview to unpin."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"This keeps it in view until you unpin. Touch & hold Back and Home to unpin."</string> @@ -594,7 +598,7 @@ <string name="switch_bar_on" msgid="1770868129120096114">"On"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Off"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Unavailable"</string> - <string name="tile_disabled" msgid="373212051546573069">"Disabled"</string> + <string name="accessibility_tile_disabled_by_policy_action_description" msgid="6958422730461646926">"learn more"</string> <string name="nav_bar" msgid="4642708685386136807">"Navigation bar"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Layout"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Extra left button type"</string> @@ -667,8 +671,8 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Some features are limited while phone cools down.\nTap for more info"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"Your phone will automatically try to cool down. You can still use your phone, but it may run more slowly.\n\nOnce your phone has cooled down, it will run normally."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"See care steps"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Unplug charger"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"There’s an issue charging this device. Unplug the power adaptor, and take care as the cable may be warm."</string> + <string name="high_temp_alarm_title" msgid="8654754369605452169">"Unplug your device"</string> + <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Your device is getting warm near the charging port. If it’s connected to a charger or USB accessory, unplug it and take care as the cable may also be warm."</string> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"See care steps"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Left shortcut"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Right shortcut"</string> diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml index 43783069ca37..4e7d8a3d1e95 100644 --- a/packages/SystemUI/res/values-en-rCA/strings.xml +++ b/packages/SystemUI/res/values-en-rCA/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Can’t recognise face. Use fingerprint instead."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Can’t recognise face"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Use fingerprint instead"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth connected."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Battery percentage unknown."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Connected to <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Captions overlay"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"enable"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"disable"</string> + <string name="sound_settings" msgid="8874581353127418308">"Sound and vibration"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Settings"</string> <string name="screen_pinning_title" msgid="9058007390337841305">"App is pinned"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"This keeps it in view until you unpin. Touch & hold Back and Overview to unpin."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"This keeps it in view until you unpin. Touch & hold Back and Home to unpin."</string> @@ -594,7 +598,7 @@ <string name="switch_bar_on" msgid="1770868129120096114">"On"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Off"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Unavailable"</string> - <string name="tile_disabled" msgid="373212051546573069">"Disabled"</string> + <string name="accessibility_tile_disabled_by_policy_action_description" msgid="6958422730461646926">"learn more"</string> <string name="nav_bar" msgid="4642708685386136807">"Navigation bar"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Layout"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Extra left button type"</string> @@ -667,8 +671,8 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Some features are limited while phone cools down.\nTap for more info"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"Your phone will automatically try to cool down. You can still use your phone, but it may run more slowly.\n\nOnce your phone has cooled down, it will run normally."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"See care steps"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Unplug charger"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"There’s an issue charging this device. Unplug the power adaptor, and take care as the cable may be warm."</string> + <string name="high_temp_alarm_title" msgid="8654754369605452169">"Unplug your device"</string> + <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Your device is getting warm near the charging port. If it’s connected to a charger or USB accessory, unplug it and take care as the cable may also be warm."</string> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"See care steps"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Left shortcut"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Right shortcut"</string> diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index d9fea1469adc..7b9c7562bd23 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Can’t recognise face. Use fingerprint instead."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Can’t recognise face"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Use fingerprint instead"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth connected."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Battery percentage unknown."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Connected to <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Captions overlay"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"enable"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"disable"</string> + <string name="sound_settings" msgid="8874581353127418308">"Sound and vibration"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Settings"</string> <string name="screen_pinning_title" msgid="9058007390337841305">"App is pinned"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"This keeps it in view until you unpin. Touch & hold Back and Overview to unpin."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"This keeps it in view until you unpin. Touch & hold Back and Home to unpin."</string> @@ -594,7 +598,7 @@ <string name="switch_bar_on" msgid="1770868129120096114">"On"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Off"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Unavailable"</string> - <string name="tile_disabled" msgid="373212051546573069">"Disabled"</string> + <string name="accessibility_tile_disabled_by_policy_action_description" msgid="6958422730461646926">"learn more"</string> <string name="nav_bar" msgid="4642708685386136807">"Navigation bar"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Layout"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Extra left button type"</string> @@ -667,8 +671,8 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Some features are limited while phone cools down.\nTap for more info"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"Your phone will automatically try to cool down. You can still use your phone, but it may run more slowly.\n\nOnce your phone has cooled down, it will run normally."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"See care steps"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Unplug charger"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"There’s an issue charging this device. Unplug the power adaptor, and take care as the cable may be warm."</string> + <string name="high_temp_alarm_title" msgid="8654754369605452169">"Unplug your device"</string> + <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Your device is getting warm near the charging port. If it’s connected to a charger or USB accessory, unplug it and take care as the cable may also be warm."</string> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"See care steps"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Left shortcut"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Right shortcut"</string> diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index d9fea1469adc..7b9c7562bd23 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Can’t recognise face. Use fingerprint instead."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Can’t recognise face"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Use fingerprint instead"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth connected."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Battery percentage unknown."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Connected to <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Captions overlay"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"enable"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"disable"</string> + <string name="sound_settings" msgid="8874581353127418308">"Sound and vibration"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Settings"</string> <string name="screen_pinning_title" msgid="9058007390337841305">"App is pinned"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"This keeps it in view until you unpin. Touch & hold Back and Overview to unpin."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"This keeps it in view until you unpin. Touch & hold Back and Home to unpin."</string> @@ -594,7 +598,7 @@ <string name="switch_bar_on" msgid="1770868129120096114">"On"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Off"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Unavailable"</string> - <string name="tile_disabled" msgid="373212051546573069">"Disabled"</string> + <string name="accessibility_tile_disabled_by_policy_action_description" msgid="6958422730461646926">"learn more"</string> <string name="nav_bar" msgid="4642708685386136807">"Navigation bar"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Layout"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Extra left button type"</string> @@ -667,8 +671,8 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Some features are limited while phone cools down.\nTap for more info"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"Your phone will automatically try to cool down. You can still use your phone, but it may run more slowly.\n\nOnce your phone has cooled down, it will run normally."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"See care steps"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Unplug charger"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"There’s an issue charging this device. Unplug the power adaptor, and take care as the cable may be warm."</string> + <string name="high_temp_alarm_title" msgid="8654754369605452169">"Unplug your device"</string> + <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Your device is getting warm near the charging port. If it’s connected to a charger or USB accessory, unplug it and take care as the cable may also be warm."</string> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"See care steps"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Left shortcut"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Right shortcut"</string> diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml index d1c353be9cce..4262413c0bca 100644 --- a/packages/SystemUI/res/values-en-rXC/strings.xml +++ b/packages/SystemUI/res/values-en-rXC/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Can’t recognize face. Use fingerprint instead."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Can’t recognize face"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Use fingerprint instead"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth connected."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Battery percentage unknown."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Connected to <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Captions overlay"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"enable"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"disable"</string> + <string name="sound_settings" msgid="8874581353127418308">"Sound & vibration"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Settings"</string> <string name="screen_pinning_title" msgid="9058007390337841305">"App is pinned"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"This keeps it in view until you unpin. Touch & hold Back and Overview to unpin."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"This keeps it in view until you unpin. Touch & hold Back and Home to unpin."</string> @@ -594,7 +598,7 @@ <string name="switch_bar_on" msgid="1770868129120096114">"On"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Off"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Unavailable"</string> - <string name="tile_disabled" msgid="373212051546573069">"Disabled"</string> + <string name="accessibility_tile_disabled_by_policy_action_description" msgid="6958422730461646926">"learn more"</string> <string name="nav_bar" msgid="4642708685386136807">"Navigation bar"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Layout"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Extra left button type"</string> @@ -667,8 +671,8 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Some features limited while phone cools down.\nTap for more info"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"Your phone will automatically try to cool down. You can still use your phone, but it may run slower.\n\nOnce your phone has cooled down, it will run normally."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"See care steps"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Unplug charger"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"There’s an issue charging this device. Unplug the power adapter, and take care as the cable may be warm."</string> + <string name="high_temp_alarm_title" msgid="8654754369605452169">"Unplug your device"</string> + <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Your device is getting warm near the charging port. If it’s connected to a charger or USB accessory, unplug it, and take care as the cable may also be warm."</string> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"See care steps"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Left shortcut"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Right shortcut"</string> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index 97ddfd1a61b5..9a01ac8e39ab 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"No se reconoce el rostro. Usa la huella dactilar."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"No se reconoce el rostro"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Usa la huella dactilar"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth conectado"</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Se desconoce el porcentaje de la batería."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Conectado a <xliff:g id="BLUETOOTH">%s</xliff:g>"</string> @@ -202,7 +204,7 @@ <string name="accessibility_sensors_off_active" msgid="2619725434618911551">"Sensores desactivados sí"</string> <string name="accessibility_clear_all" msgid="970525598287244592">"Eliminar todas las notificaciones"</string> <string name="notification_group_overflow_indicator" msgid="7605120293801012648">"<xliff:g id="NUMBER">%s</xliff:g> más"</string> - <string name="notification_group_overflow_description" msgid="7176322877233433278">"{count,plural, =1{# notificación más en el grupo.}other{# notificaciones más en el grupo.}}"</string> + <string name="notification_group_overflow_description" msgid="7176322877233433278">"{count,plural, =1{# notificación más en el grupo.}many{# notificaciones más en el grupo.}other{# notificaciones más en el grupo.}}"</string> <string name="accessibility_rotation_lock_on_landscape" msgid="936972553861524360">"La pantalla está bloqueada en modo horizontal."</string> <string name="accessibility_rotation_lock_on_portrait" msgid="2356633398683813837">"La pantalla está bloqueada en modo vertical."</string> <string name="dessert_case" msgid="9104973640704357717">"Caja para postres"</string> @@ -250,7 +252,7 @@ <string name="quick_settings_hotspot_label" msgid="1199196300038363424">"Hotspot"</string> <string name="quick_settings_hotspot_secondary_label_transient" msgid="7585604088079160564">"Activando…"</string> <string name="quick_settings_hotspot_secondary_label_data_saver_enabled" msgid="1280433136266439372">"Ahorro de datos act."</string> - <string name="quick_settings_hotspot_secondary_label_num_devices" msgid="7536823087501239457">"{count,plural, =1{# dispositivo}other{# dispositivos}}"</string> + <string name="quick_settings_hotspot_secondary_label_num_devices" msgid="7536823087501239457">"{count,plural, =1{# dispositivo}many{# dispositivos}other{# dispositivos}}"</string> <string name="quick_settings_flashlight_label" msgid="4904634272006284185">"Linterna"</string> <string name="quick_settings_flashlight_camera_in_use" msgid="4820591564526512571">"Cámara en uso"</string> <string name="quick_settings_cellular_detail_title" msgid="792977203299358893">"Datos móviles"</string> @@ -351,7 +353,7 @@ <string name="guest_notification_session_active" msgid="5567273684713471450">"Estás en el modo de invitado"</string> <string name="user_add_user_message_guest_remove" msgid="5589286604543355007">\n\n"Si agregas un usuario nuevo, se desactivará el modo de invitado y se borrarán todas las apps y los datos de la sesión de invitado actual."</string> <string name="user_limit_reached_title" msgid="2429229448830346057">"Alcanzaste el límite de usuarios"</string> - <string name="user_limit_reached_message" msgid="1070703858915935796">"{count,plural, =1{Solo se puede crear un usuario.}other{Puedes agregar hasta # usuarios.}}"</string> + <string name="user_limit_reached_message" msgid="1070703858915935796">"{count,plural, =1{Solo se puede crear un usuario.}many{Puedes agregar hasta # usuarios.}other{Puedes agregar hasta # usuarios.}}"</string> <string name="user_remove_user_title" msgid="9124124694835811874">"¿Confirmas que quieres quitar el usuario?"</string> <string name="user_remove_user_message" msgid="6702834122128031833">"Se borrarán todas las aplicaciones y los datos de este usuario."</string> <string name="user_remove_user_remove" msgid="8387386066949061256">"Quitar"</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Superposición de subtítulos"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"habilitar"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"inhabilitar"</string> + <string name="sound_settings" msgid="8874581353127418308">"Sonido y vibración"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Configuración"</string> <string name="screen_pinning_title" msgid="9058007390337841305">"La app está fijada"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Esta función mantiene la pantalla visible hasta que dejes de fijarla. Para ello, mantén presionados los botones Atrás y Recientes."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Esta función mantiene la pantalla visible hasta que dejes de fijarla. Para ello, mantén presionados los botones de inicio y Atrás."</string> @@ -537,8 +541,8 @@ <string name="notification_menu_snooze_action" msgid="5415729610393475019">"Recuérdame"</string> <string name="snooze_undo" msgid="2738844148845992103">"Deshacer"</string> <string name="snoozed_for_time" msgid="7586689374860469469">"Posponer <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string> - <string name="snoozeHourOptions" msgid="2332819756222425558">"{count,plural, =1{# hora}=2{# horas}other{# horas}}"</string> - <string name="snoozeMinuteOptions" msgid="2222082405822030979">"{count,plural, =1{# minuto}other{# minutos}}"</string> + <string name="snoozeHourOptions" msgid="2332819756222425558">"{count,plural, =1{# hora}=2{# horas}many{# horas}other{# horas}}"</string> + <string name="snoozeMinuteOptions" msgid="2222082405822030979">"{count,plural, =1{# minuto}many{# minutos}other{# minutos}}"</string> <string name="battery_detail_switch_title" msgid="6940976502957380405">"Ahorro de batería"</string> <string name="keyboard_key_button_template" msgid="8005673627272051429">"Botón <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="3734400625170020657">"Inicio"</string> @@ -594,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"Activado"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Desactivado"</string> <string name="tile_unavailable" msgid="3095879009136616920">"No disponible"</string> - <string name="tile_disabled" msgid="373212051546573069">"Inhabilitada"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"Barra de navegación"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Diseño"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Tipo de botón izquierdo adicional"</string> @@ -667,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Algunas funciones se limitan durante el enfriamiento del teléfono.\nPresiona para obtener más información"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"Tu teléfono intentará enfriarse automáticamente. Podrás usarlo, pero es posible que funcione más lento.\n\nUna vez que se haya enfriado, volverá a funcionar correctamente."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Ver pasos de mantenimiento"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Desconectar cargador"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"No se puede cargar el dispositivo. Desconecta el adaptador de la corriente con cuidado, ya que el cable podría estar caliente."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"Ver pasos de mantenimiento"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Acceso directo izquierdo"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Acceso directo derecho"</string> @@ -778,7 +785,7 @@ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"activar o desactivar"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Controles de dispositivos"</string> <string name="controls_providers_title" msgid="6879775889857085056">"Elige la app para agregar los controles"</string> - <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{Se agregó # control.}other{Se agregaron # controles.}}"</string> + <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{Se agregó # control.}many{Se agregaron # controles.}other{Se agregaron # controles.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Quitados"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Está en favoritos"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Está en favoritos en la posición <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -935,7 +942,7 @@ <string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Agregar tarjeta"</string> <string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"No agregar tarjeta"</string> <string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Seleccionar usuario"</string> - <string name="fgs_manager_footer_label" msgid="8276763570622288231">"{count,plural, =1{# app está activa}other{# apps están activas}}"</string> + <string name="fgs_manager_footer_label" msgid="8276763570622288231">"{count,plural, =1{# app está activa}many{# apps están activas}other{# apps están activas}}"</string> <string name="fgs_dot_content_description" msgid="2865071539464777240">"Nueva información"</string> <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Apps activas"</string> <string name="fgs_manager_dialog_message" msgid="2670045017200730076">"Estas apps están activas y en ejecución, incluso mientras no las usas. Esto mejora su funcionalidad, pero también afecta la duración de batería."</string> @@ -965,7 +972,7 @@ <string name="dream_overlay_status_bar_camera_off" msgid="5273073778969890823">"La cámara está desactivada"</string> <string name="dream_overlay_status_bar_mic_off" msgid="8366534415013819396">"El micrófono está desactivado"</string> <string name="dream_overlay_status_bar_camera_mic_off" msgid="3199425257833773569">"La cámara y el micrófono están apagados"</string> - <string name="dream_overlay_status_bar_notification_indicator" msgid="8091389255691081711">"{count,plural, =1{# notificación}other{# notificaciones}}"</string> + <string name="dream_overlay_status_bar_notification_indicator" msgid="8091389255691081711">"{count,plural, =1{# notificación}many{# notificaciones}other{# notificaciones}}"</string> <string name="dream_overlay_weather_complication_desc" msgid="824503662089783824">"<xliff:g id="WEATHER_CONDITION">%1$s</xliff:g>, <xliff:g id="TEMPERATURE">%2$s</xliff:g>"</string> <string name="broadcasting_description_is_broadcasting" msgid="765627502786404290">"Transmitiendo"</string> <string name="bt_le_audio_broadcast_dialog_title" msgid="3605428497924077811">"¿Quieres dejar de transmitir <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index b2c29dff8590..038c7b53c099 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"No se reconoce la cara. Usa la huella digital."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"No se reconoce la cara"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Usa la huella digital"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth conectado"</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Porcentaje de batería desconocido."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Conectado a <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> @@ -202,7 +204,7 @@ <string name="accessibility_sensors_off_active" msgid="2619725434618911551">"Sensores desactivados"</string> <string name="accessibility_clear_all" msgid="970525598287244592">"Borrar todas las notificaciones"</string> <string name="notification_group_overflow_indicator" msgid="7605120293801012648">"<xliff:g id="NUMBER">%s</xliff:g> más"</string> - <string name="notification_group_overflow_description" msgid="7176322877233433278">"{count,plural, =1{# notificación más en el grupo.}other{# notificaciones más en el grupo.}}"</string> + <string name="notification_group_overflow_description" msgid="7176322877233433278">"{count,plural, =1{# notificación más en el grupo.}many{# notificaciones más en el grupo.}other{# notificaciones más en el grupo.}}"</string> <string name="accessibility_rotation_lock_on_landscape" msgid="936972553861524360">"La pantalla está bloqueada en modo horizontal."</string> <string name="accessibility_rotation_lock_on_portrait" msgid="2356633398683813837">"La pantalla está bloqueada en modo vertical."</string> <string name="dessert_case" msgid="9104973640704357717">"Caja para postres"</string> @@ -250,7 +252,7 @@ <string name="quick_settings_hotspot_label" msgid="1199196300038363424">"Compartir Internet"</string> <string name="quick_settings_hotspot_secondary_label_transient" msgid="7585604088079160564">"Activando…"</string> <string name="quick_settings_hotspot_secondary_label_data_saver_enabled" msgid="1280433136266439372">"Ahorro de datos activado"</string> - <string name="quick_settings_hotspot_secondary_label_num_devices" msgid="7536823087501239457">"{count,plural, =1{# dispositivo}other{# dispositivos}}"</string> + <string name="quick_settings_hotspot_secondary_label_num_devices" msgid="7536823087501239457">"{count,plural, =1{# dispositivo}many{# dispositivos}other{# dispositivos}}"</string> <string name="quick_settings_flashlight_label" msgid="4904634272006284185">"Linterna"</string> <string name="quick_settings_flashlight_camera_in_use" msgid="4820591564526512571">"Cámara en uso"</string> <string name="quick_settings_cellular_detail_title" msgid="792977203299358893">"Datos móviles"</string> @@ -351,7 +353,7 @@ <string name="guest_notification_session_active" msgid="5567273684713471450">"Estás en modo Invitado"</string> <string name="user_add_user_message_guest_remove" msgid="5589286604543355007">\n\n"Si añades un nuevo usuario, saldrás del modo Invitado y se eliminarán todas las aplicaciones y datos de la sesión de invitado actual."</string> <string name="user_limit_reached_title" msgid="2429229448830346057">"Has alcanzado el límite de usuarios"</string> - <string name="user_limit_reached_message" msgid="1070703858915935796">"{count,plural, =1{Solo se puede crear un usuario.}other{Puedes añadir # usuarios como máximo.}}"</string> + <string name="user_limit_reached_message" msgid="1070703858915935796">"{count,plural, =1{Solo se puede crear un usuario.}many{Puedes añadir # usuarios como máximo.}other{Puedes añadir # usuarios como máximo.}}"</string> <string name="user_remove_user_title" msgid="9124124694835811874">"¿Quitar usuario?"</string> <string name="user_remove_user_message" msgid="6702834122128031833">"Se eliminarán todas las aplicaciones y datos de este usuario."</string> <string name="user_remove_user_remove" msgid="8387386066949061256">"Quitar"</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Superposición de subtítulos"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"activar"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"desactivar"</string> + <string name="sound_settings" msgid="8874581353127418308">"Sonido y vibración"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Ajustes"</string> <string name="screen_pinning_title" msgid="9058007390337841305">"Aplicación fijada"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"La aplicación se mantendrá visible hasta que dejes de fijarla. Para dejar de fijarla, mantén pulsados los botones Atrás y Aplicaciones recientes."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"La aplicación se mantendrá visible hasta que dejes de fijarla. Para dejar de fijarla, mantén pulsados los botones Atrás e Inicio."</string> @@ -537,8 +541,8 @@ <string name="notification_menu_snooze_action" msgid="5415729610393475019">"Recordar"</string> <string name="snooze_undo" msgid="2738844148845992103">"Deshacer"</string> <string name="snoozed_for_time" msgid="7586689374860469469">"Volverá a mostrarse en <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string> - <string name="snoozeHourOptions" msgid="2332819756222425558">"{count,plural, =1{# hora}=2{# horas}other{# horas}}"</string> - <string name="snoozeMinuteOptions" msgid="2222082405822030979">"{count,plural, =1{# minuto}other{# minutos}}"</string> + <string name="snoozeHourOptions" msgid="2332819756222425558">"{count,plural, =1{# hora}=2{# horas}many{# horas}other{# horas}}"</string> + <string name="snoozeMinuteOptions" msgid="2222082405822030979">"{count,plural, =1{# minuto}many{# minutos}other{# minutos}}"</string> <string name="battery_detail_switch_title" msgid="6940976502957380405">"Ahorro de batería"</string> <string name="keyboard_key_button_template" msgid="8005673627272051429">"Botón <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="3734400625170020657">"Inicio"</string> @@ -594,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"Activado"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Desactivado"</string> <string name="tile_unavailable" msgid="3095879009136616920">"No disponible"</string> - <string name="tile_disabled" msgid="373212051546573069">"Inhabilitado"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"Barra de navegación"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Diseño"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Tipo de botón a la izquierda extra"</string> @@ -667,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Se han limitado algunas funciones mientras el teléfono se enfría.\nToca para ver más información"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"El teléfono intentará enfriarse. Puedes seguir utilizándolo, pero es posible que funcione con mayor lentitud.\n\nUna vez que se haya enfriado, funcionará con normalidad."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Ver pasos de mantenimiento"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Desconecta el cargador"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"No se puede cargar el dispositivo. Desconecta el adaptador de corriente con cuidado, ya que el cable puede estar caliente."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"Ver pasos de mantenimiento"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Acceso directo a la izquierda"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Acceso directo a la derecha"</string> @@ -778,7 +785,7 @@ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"activar/desactivar"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Control de dispositivos"</string> <string name="controls_providers_title" msgid="6879775889857085056">"Elige una aplicación para añadir controles"</string> - <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# control añadido.}other{# controles añadidos.}}"</string> + <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# control añadido.}many{# controles añadidos.}other{# controles añadidos.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Quitado"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Añadido a favoritos"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Añadido a favoritos (posición <xliff:g id="NUMBER">%d</xliff:g>)"</string> @@ -935,7 +942,7 @@ <string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Añadir recuadro"</string> <string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"No añadir recuadro"</string> <string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Selecciona un usuario"</string> - <string name="fgs_manager_footer_label" msgid="8276763570622288231">"{count,plural, =1{# aplicación activa}other{# aplicaciones activas}}"</string> + <string name="fgs_manager_footer_label" msgid="8276763570622288231">"{count,plural, =1{# aplicación activa}many{# aplicaciones activas}other{# aplicaciones activas}}"</string> <string name="fgs_dot_content_description" msgid="2865071539464777240">"Información nueva"</string> <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Aplicaciones activas"</string> <string name="fgs_manager_dialog_message" msgid="2670045017200730076">"Estas aplicaciones están activas y en funcionamiento, incluso aunque no las estés usando. Esto mejora su funcionalidad, pero también puede afectar a la duración de la batería."</string> @@ -965,7 +972,7 @@ <string name="dream_overlay_status_bar_camera_off" msgid="5273073778969890823">"La cámara está desactivada"</string> <string name="dream_overlay_status_bar_mic_off" msgid="8366534415013819396">"El micrófono está desactivado"</string> <string name="dream_overlay_status_bar_camera_mic_off" msgid="3199425257833773569">"La cámara y el micrófono están desactivados"</string> - <string name="dream_overlay_status_bar_notification_indicator" msgid="8091389255691081711">"{count,plural, =1{# notificación}other{# notificaciones}}"</string> + <string name="dream_overlay_status_bar_notification_indicator" msgid="8091389255691081711">"{count,plural, =1{# notificación}many{# notificaciones}other{# notificaciones}}"</string> <string name="dream_overlay_weather_complication_desc" msgid="824503662089783824">"<xliff:g id="WEATHER_CONDITION">%1$s</xliff:g>, <xliff:g id="TEMPERATURE">%2$s</xliff:g>"</string> <string name="broadcasting_description_is_broadcasting" msgid="765627502786404290">"Emitiendo"</string> <string name="bt_le_audio_broadcast_dialog_title" msgid="3605428497924077811">"¿Dejar de emitir <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml index 6b339f07fd4a..731740453430 100644 --- a/packages/SystemUI/res/values-et/strings.xml +++ b/packages/SystemUI/res/values-et/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Nägu ei õnnestu tuvastada. Kasutage sõrmejälge."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Nägu ei õnnestu tuvastada"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Kasutage sõrmejälge"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth on ühendatud."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Aku laetuse protsent on teadmata."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Ühendatud: <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> @@ -339,8 +341,7 @@ <string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Laadimine • Täis <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> pärast"</string> <string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Kiirlaadimine • Täis <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> pärast"</string> <string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Aeglane laadimine • Täis <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> pärast"</string> - <!-- no translation found for keyguard_indication_charging_time_dock (3149328898931741271) --> - <skip /> + <string name="keyguard_indication_charging_time_dock" msgid="3149328898931741271">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Laadimine • Täis <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> pärast"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Kasutaja vahetamine"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"rippmenüü"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Seansi kõik rakendused ja andmed kustutatakse."</string> @@ -420,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Subtiitrite ülekate"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"luba"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"keela"</string> + <string name="sound_settings" msgid="8874581353127418308">"Heli ja vibreerimine"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Seaded"</string> <string name="screen_pinning_title" msgid="9058007390337841305">"Rakendus on kinnitatud"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"See hoitakse kuval, kuni selle vabastate. Vabastamiseks puudutage pikalt nuppe Tagasi ja Ülevaade."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"See hoitakse kuval, kuni selle vabastate. Vabastamiseks puudutage pikalt nuppe Tagasi ja Avakuva."</string> @@ -595,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"Sees"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Väljas"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Pole saadaval"</string> - <string name="tile_disabled" msgid="373212051546573069">"Keelatud"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"Navigeerimisriba"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Paigutus"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Täiendava vasaku nupu tüüp"</string> @@ -668,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Mõned funktsioonid on piiratud, kuni telefon jahtub.\nPuudutage lisateabe saamiseks."</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"Teie telefon proovib automaatselt maha jahtuda. Saate telefoni ikka kasutada, kuid see võib olla aeglasem.\n\nKui telefon on jahtunud, töötab see tavapäraselt."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Vaadake hooldusjuhiseid"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Eemaldage laadija vooluvõrgust"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"Selle seadme laadimisega on probleem. Eemaldage toiteadapter ja olge ettevaatlik, sest kaabel võib olla soe."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"Vaadake hooldusjuhiseid"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Vasak otsetee"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Parem otsetee"</string> diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index 024275a1c80b..a76109854f3a 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Ezin da hauteman aurpegia. Erabili hatz-marka."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Ezin da ezagutu aurpegia"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Erabili hatz-marka"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth-a konektatuta."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Bateriaren ehunekoa ezezaguna da."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> gailura konektatuta."</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Azpititulu gainjarriak"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"gaitu"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"desgaitu"</string> + <string name="sound_settings" msgid="8874581353127418308">"Audioa eta dardara"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Ezarpenak"</string> <string name="screen_pinning_title" msgid="9058007390337841305">"Aplikazioa ainguratuta dago"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Horrela, ikusgai egongo da aingura kendu arte. Aingura kentzeko, eduki sakatuta \"Atzera\" eta \"Ikuspegi orokorra\" botoiak."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Horrela, ikusgai egongo da aingura kendu arte. Aingura kentzeko, eduki sakatuta Atzera eta Hasiera botoiak."</string> @@ -594,7 +598,7 @@ <string name="switch_bar_on" msgid="1770868129120096114">"Aktibatuta"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Desaktibatuta"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Ez dago erabilgarri"</string> - <string name="tile_disabled" msgid="373212051546573069">"Desgaituta"</string> + <string name="accessibility_tile_disabled_by_policy_action_description" msgid="6958422730461646926">"lortu informazio gehiago"</string> <string name="nav_bar" msgid="4642708685386136807">"Nabigazio-barra"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Diseinua"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Ezkerreko botoi gehigarriaren mota"</string> @@ -667,8 +671,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Eginbide batzuk ezingo dira erabili telefonoa hoztu arte.\nInformazio gehiago lortzeko, sakatu hau."</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"Telefonoa automatikoki saiatuko da hozten. Hoztu bitartean, telefonoa erabiltzen jarrai dezakezu, baina mantsoago funtziona lezake.\n\nTelefonoaren tenperatura jaitsi bezain laster, ohi bezala funtzionatzen jarraituko du."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Ikusi zaintzeko urratsak"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Deskonektatu kargagailua"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"Arazo bat izan da gailua kargatzean. Deskonektatu egokigailua eta kontuz ibili, kablea bero egon baitaiteke."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"Ikusi zaintzeko urratsak"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Ezkerreko lasterbidea"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Eskuineko lasterbidea"</string> diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index 5e6820044c9e..e7aefda13a00 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"چهره شناسایی نشد. درعوض از اثر انگشت استفاده کنید."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"چهره شناسایی نشد"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"از اثر انگشت استفاده کنید"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"بلوتوث متصل است."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"درصد شارژ باتری مشخص نیست."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"به <xliff:g id="BLUETOOTH">%s</xliff:g> متصل شد."</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"همپوشانی زیرنویس ناشنوایان"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"فعال کردن"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"غیرفعال کردن"</string> + <string name="sound_settings" msgid="8874581353127418308">"صدا و لرزش"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"تنظیمات"</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> @@ -550,8 +554,8 @@ <string name="keyboard_key_dpad_center" msgid="4079412840715672825">"مرکز"</string> <string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string> <string name="keyboard_key_space" msgid="6980847564173394012">"Space"</string> - <string name="keyboard_key_enter" msgid="8633362970109751646">"ورود"</string> - <string name="keyboard_key_backspace" msgid="4095278312039628074">"پسبر"</string> + <string name="keyboard_key_enter" msgid="8633362970109751646">"Enter"</string> + <string name="keyboard_key_backspace" msgid="4095278312039628074">"Backspace"</string> <string name="keyboard_key_media_play_pause" msgid="8389984232732277478">"پخش/مکث"</string> <string name="keyboard_key_media_stop" msgid="1509943745250377699">"متوقف کردن"</string> <string name="keyboard_key_media_next" msgid="8502476691227914952">"بعدی"</string> @@ -562,9 +566,9 @@ <string name="keyboard_key_page_down" msgid="9035902490071829731">"صفحه قبل"</string> <string name="keyboard_key_forward_del" msgid="5325501825762733459">"حذف"</string> <string name="keyboard_key_move_home" msgid="3496502501803911971">"ابتدا"</string> - <string name="keyboard_key_move_end" msgid="99190401463834854">"انتها"</string> - <string name="keyboard_key_insert" msgid="4621692715704410493">"درج"</string> - <string name="keyboard_key_num_lock" msgid="7209960042043090548">"قفل اعداد"</string> + <string name="keyboard_key_move_end" msgid="99190401463834854">"End"</string> + <string name="keyboard_key_insert" msgid="4621692715704410493">"Insert"</string> + <string name="keyboard_key_num_lock" msgid="7209960042043090548">"Num Lock"</string> <string name="keyboard_key_numpad_template" msgid="7316338238459991821">"صفحهکلید عددی <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="notif_inline_reply_remove_attachment_description" msgid="7954075334095405429">"برداشتن پیوست"</string> <string name="keyboard_shortcut_group_system" msgid="1583416273777875970">"سیستم"</string> @@ -594,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"روشن"</string> <string name="switch_bar_off" msgid="5669805115416379556">"خاموش"</string> <string name="tile_unavailable" msgid="3095879009136616920">"در دسترس نیست"</string> - <string name="tile_disabled" msgid="373212051546573069">"غیرفعال"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"نوار پیمایش"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"طرحبندی"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"نوع دکمه منتهیالیه چپ"</string> @@ -667,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"وقتی تلفن درحال خنک شدن است، بعضی از ویژگیها محدود میشوند.\nبرای اطلاعات بیشتر ضربه بزنید"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"تلفنتان بهطور خودکار سعی میکند خنک شود. همچنان میتوانید از تلفنتان استفاده کنید، اما ممکن است کندتر عمل کند.\n\nوقتی تلفن خنک شد، عملکرد عادیاش از سرگرفته میشود."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"دیدن اقدامات محافظتی"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"جدا کردن شارژر از برق"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"مشکلی در شارژ کردن این دستگاه وجود دارد. آداپتور برق را از برق جدا کنید و مراقب باشید زیرا ممکن است کابل گرم باشد."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"مشاهده مراحل احتیاط"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"میانبر چپ"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"میانبر راست"</string> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 728f27d70348..21c8dfc17cf0 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Kasvoja ei voi tunnistaa. Käytä sormenjälkeä."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Kasvoja ei voi tunnistaa"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Käytä sormenjälkeä"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth yhdistetty."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Akun varaustaso ei tiedossa."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Yhteys: <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> @@ -339,8 +341,7 @@ <string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Latautuu • Täynnä <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> päästä"</string> <string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Latautuu nopeasti • Täynnä <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> päästä"</string> <string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Latautuu hitaasti • Täynnä <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> päästä"</string> - <!-- no translation found for keyguard_indication_charging_time_dock (3149328898931741271) --> - <skip /> + <string name="keyguard_indication_charging_time_dock" msgid="3149328898931741271">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Latautuu • Täynnä <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> päästä"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Vaihda käyttäjää"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"alasvetovalikko"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Kaikki sovellukset ja tämän istunnon tiedot poistetaan."</string> @@ -420,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Tekstitysten peitto"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"ota käyttöön"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"poista käytöstä"</string> + <string name="sound_settings" msgid="8874581353127418308">"Ääni ja värinä"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Asetukset"</string> <string name="screen_pinning_title" msgid="9058007390337841305">"Sovellus on kiinnitetty"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Pysyy näkyvissä, kunnes irrotat sen. Irrota painamalla pitkään Edellinen ja Viimeisimmät."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Pysyy näkyvissä, kunnes irrotat sen. Irrota painamalla pitkään Edellinen ja Aloitusnäyttö."</string> @@ -595,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"Päällä"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Pois päältä"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Ei käytettävissä"</string> - <string name="tile_disabled" msgid="373212051546573069">"Ei käytössä"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"Navigointipalkki"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Asettelu"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Ylimääräinen vasen painiketyyppi"</string> @@ -668,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Joidenkin ominaisuuksien käyttöä on rajoitettu puhelimen jäähtymisen aikana.\nLue lisää napauttamalla"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"Puhelimesi yrittää automaattisesti jäähdyttää itsensä. Voit silti käyttää puhelinta, mutta se voi toimia hitaammin.\n\nKun puhelin on jäähtynyt, se toimii normaalisti."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Katso huoltovaiheet"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Irrota laturi"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"Laitetta ladattaessa tapahtui virhe. Irrota virtalähde varovasti – johto voi olla lämmin."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"Katso huoltovaiheet"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Vasen pikakuvake"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Oikea pikakuvake"</string> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index 3a7ff2acf8f4..b3439ae969a9 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Visage non reconnu. Utilisez plutôt l\'empreinte digitale."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Visage non reconnu"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Utiliser l\'empreinte digitale"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth connecté"</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Pourcentage de la pile inconnu."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Connecté à : <xliff:g id="BLUETOOTH">%s</xliff:g>"</string> @@ -202,7 +204,7 @@ <string name="accessibility_sensors_off_active" msgid="2619725434618911551">"Option « Capteurs désactivés » active"</string> <string name="accessibility_clear_all" msgid="970525598287244592">"Supprimer toutes les notifications"</string> <string name="notification_group_overflow_indicator" msgid="7605120293801012648">"+ <xliff:g id="NUMBER">%s</xliff:g>"</string> - <string name="notification_group_overflow_description" msgid="7176322877233433278">"{count,plural, =1{# autre notification à l\'intérieur.}one{# autre notification à l\'intérieur.}other{# autres notifications à l\'intérieur.}}"</string> + <string name="notification_group_overflow_description" msgid="7176322877233433278">"{count,plural, =1{# autre notification à l\'intérieur.}one{# autre notification à l\'intérieur.}many{# d\'autres notifications à l\'intérieur.}other{# autres notifications à l\'intérieur.}}"</string> <string name="accessibility_rotation_lock_on_landscape" msgid="936972553861524360">"L\'écran est verrouillé en mode paysage."</string> <string name="accessibility_rotation_lock_on_portrait" msgid="2356633398683813837">"L\'écran est verrouillé en mode portrait."</string> <string name="dessert_case" msgid="9104973640704357717">"Vitrine des desserts"</string> @@ -250,7 +252,7 @@ <string name="quick_settings_hotspot_label" msgid="1199196300038363424">"Point d\'accès sans fil"</string> <string name="quick_settings_hotspot_secondary_label_transient" msgid="7585604088079160564">"Activation en cours…"</string> <string name="quick_settings_hotspot_secondary_label_data_saver_enabled" msgid="1280433136266439372">"Écon. données activé"</string> - <string name="quick_settings_hotspot_secondary_label_num_devices" msgid="7536823087501239457">"{count,plural, =1{# appareil}one{# appareil}other{# appareils}}"</string> + <string name="quick_settings_hotspot_secondary_label_num_devices" msgid="7536823087501239457">"{count,plural, =1{# appareil}one{# appareil}many{# d\'appareils}other{# appareils}}"</string> <string name="quick_settings_flashlight_label" msgid="4904634272006284185">"Lampe de poche"</string> <string name="quick_settings_flashlight_camera_in_use" msgid="4820591564526512571">"L\'appareil photo est en cours d\'utilisation"</string> <string name="quick_settings_cellular_detail_title" msgid="792977203299358893">"Données cellulaires"</string> @@ -351,7 +353,7 @@ <string name="guest_notification_session_active" msgid="5567273684713471450">"Vous êtes en mode Invité"</string> <string name="user_add_user_message_guest_remove" msgid="5589286604543355007">\n\n"Si vous ajoutez un nouvel utilisateur, vous quitterez le mode Invité, et toutes les applications et données de la session d\'invité en cours seront supprimées."</string> <string name="user_limit_reached_title" msgid="2429229448830346057">"Limite d\'utilisateurs atteinte"</string> - <string name="user_limit_reached_message" msgid="1070703858915935796">"{count,plural, =1{Vous ne pouvez créer qu\'un seul utilisateur.}one{Vous pouvez ajouter jusqu\'à # utilisateur.}other{Vous pouvez ajouter jusqu\'à # utilisateurs.}}"</string> + <string name="user_limit_reached_message" msgid="1070703858915935796">"{count,plural, =1{Vous ne pouvez créer qu\'un seul utilisateur.}one{Vous pouvez ajouter jusqu\'à # utilisateur.}many{Vous pouvez ajouter jusqu\'à # d\'utilisateurs.}other{Vous pouvez ajouter jusqu\'à # utilisateurs.}}"</string> <string name="user_remove_user_title" msgid="9124124694835811874">"Supprimer l\'utilisateur?"</string> <string name="user_remove_user_message" msgid="6702834122128031833">"Toutes les applications et les données de cet utilisateur seront supprimées."</string> <string name="user_remove_user_remove" msgid="8387386066949061256">"Supprimer"</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Superposition de sous-titres"</string> <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="sound_settings" msgid="8874581353127418308">"Son et vibration"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Paramètres"</string> <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\'à ce que vous annuliez l\'opération. Pour annuler l\'épinglage, maintenez le doigt sur « Retour » et « Aperçu »."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Cet écran est épinglé jusqu\'à ce que vous annuliez l\'opération. Pour annuler l\'épinglage, maintenez le doigt sur les touches Retour et Accueil."</string> @@ -537,8 +541,8 @@ <string name="notification_menu_snooze_action" msgid="5415729610393475019">"Me rappeler"</string> <string name="snooze_undo" msgid="2738844148845992103">"Annuler"</string> <string name="snoozed_for_time" msgid="7586689374860469469">"Reporté pour <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string> - <string name="snoozeHourOptions" msgid="2332819756222425558">"{count,plural, =1{# heure}=2{# heures}one{# heure}other{# heures}}"</string> - <string name="snoozeMinuteOptions" msgid="2222082405822030979">"{count,plural, =1{# minute}one{# minute}other{# minutes}}"</string> + <string name="snoozeHourOptions" msgid="2332819756222425558">"{count,plural, =1{# heure}=2{# heures}one{# heure}many{# d\'heures}other{# heures}}"</string> + <string name="snoozeMinuteOptions" msgid="2222082405822030979">"{count,plural, =1{# minute}one{# minute}many{# de minutes}other{# minutes}}"</string> <string name="battery_detail_switch_title" msgid="6940976502957380405">"Économiseur de pile"</string> <string name="keyboard_key_button_template" msgid="8005673627272051429">"Bouton <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="3734400625170020657">"Accueil"</string> @@ -594,7 +598,7 @@ <string name="switch_bar_on" msgid="1770868129120096114">"Activé"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Désactivé"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Non disponible"</string> - <string name="tile_disabled" msgid="373212051546573069">"Désactivé"</string> + <string name="accessibility_tile_disabled_by_policy_action_description" msgid="6958422730461646926">"En savoir plus"</string> <string name="nav_bar" msgid="4642708685386136807">"Barre de navigation"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Disposition"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Type de bouton gauche supplémentaire"</string> @@ -667,8 +671,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Certaines fonctionnalités sont limitées pendant que le téléphone refroidit.\nTouchez pour en savoir plus"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"Votre téléphone va essayer de se refroidir automatiquement. Vous pouvez toujours l\'utiliser, mais il risque d\'être plus lent.\n\nUne fois refroidi, il fonctionnera normalement."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Afficher les étapes d\'entretien"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Débranchez le chargeur"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"Il y a un problème avec la recharge de cet appareil. Débranchez l\'adaptateur d\'alimentation, et faites attention, car le câble pourrait être chaud."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"Afficher les étapes d\'entretien"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Raccourci gauche"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Raccourci droit"</string> @@ -751,38 +757,22 @@ <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"Agrandir la totalité de l\'écran"</string> <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"Agrandir une partie de l\'écran"</string> <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"Commutateur"</string> - <!-- no translation found for accessibility_allow_diagonal_scrolling (3258050349191496398) --> - <skip /> - <!-- no translation found for accessibility_resize (5733759136600611551) --> - <skip /> - <!-- no translation found for accessibility_change_magnification_type (666000085077432421) --> - <skip /> - <!-- no translation found for accessibility_magnification_end_resizing (4881690585800302628) --> - <skip /> - <!-- no translation found for accessibility_magnification_top_handle (2716851102182220718) --> - <skip /> - <!-- no translation found for accessibility_magnification_left_handle (6694953733271752950) --> - <skip /> - <!-- no translation found for accessibility_magnification_right_handle (9055988237319397605) --> - <skip /> - <!-- no translation found for accessibility_magnification_bottom_handle (6531646968813821258) --> - <skip /> - <!-- no translation found for accessibility_magnifier_size (3038755600030422334) --> - <skip /> - <!-- no translation found for accessibility_magnification_zoom (4222088982642063979) --> - <skip /> - <!-- no translation found for accessibility_magnification_medium (6994632616884562625) --> - <skip /> - <!-- no translation found for accessibility_magnification_small (8144502090651099970) --> - <skip /> - <!-- no translation found for accessibility_magnification_large (6602944330021308774) --> - <skip /> - <!-- no translation found for accessibility_magnification_close (1099965835844673375) --> - <skip /> - <!-- no translation found for accessibility_magnifier_edit (1522877239671820636) --> - <skip /> - <!-- no translation found for accessibility_magnification_magnifier_window_settings (2834685072221468434) --> - <skip /> + <string name="accessibility_allow_diagonal_scrolling" msgid="3258050349191496398">"Autoriser le défilement en diagonale"</string> + <string name="accessibility_resize" msgid="5733759136600611551">"Redimensionner"</string> + <string name="accessibility_change_magnification_type" msgid="666000085077432421">"Changer le type d\'agrandissement"</string> + <string name="accessibility_magnification_end_resizing" msgid="4881690585800302628">"Terminer le redimensionnement"</string> + <string name="accessibility_magnification_top_handle" msgid="2716851102182220718">"Poignée supérieure"</string> + <string name="accessibility_magnification_left_handle" msgid="6694953733271752950">"Poignée gauche"</string> + <string name="accessibility_magnification_right_handle" msgid="9055988237319397605">"Poignée droite"</string> + <string name="accessibility_magnification_bottom_handle" msgid="6531646968813821258">"Poignée inférieure"</string> + <string name="accessibility_magnifier_size" msgid="3038755600030422334">"Taille de loupe"</string> + <string name="accessibility_magnification_zoom" msgid="4222088982642063979">"Zoom"</string> + <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Moyenne"</string> + <string name="accessibility_magnification_small" msgid="8144502090651099970">"Petite"</string> + <string name="accessibility_magnification_large" msgid="6602944330021308774">"Grande"</string> + <string name="accessibility_magnification_close" msgid="1099965835844673375">"Fermer"</string> + <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Modifier"</string> + <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Paramètres de la fenêtre de loupe"</string> <string name="accessibility_floating_button_migration_tooltip" msgid="5217151214439341902">"Touchez pour ouvrir fonction. d\'access. Personnalisez ou remplacez bouton dans Param.\n\n"<annotation id="link">"Afficher param."</annotation></string> <string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Déplacez le bouton vers le bord pour le masquer temporairement"</string> <string name="accessibility_floating_button_action_move_top_left" msgid="6253520703618545705">"Déplacer dans coin sup. gauche"</string> @@ -794,7 +784,7 @@ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"basculer"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Commandes des appareils"</string> <string name="controls_providers_title" msgid="6879775889857085056">"Sélectionnez l\'application pour laquelle ajouter des commandes"</string> - <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# commande ajoutée.}one{# commande ajoutée.}other{# commandes ajoutées.}}"</string> + <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# commande ajoutée.}one{# commande ajoutée.}many{# de commandes ajoutées.}other{# commandes ajoutées.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Supprimé"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Ajouté aux favoris"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Ajouté aux favoris, en position <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -951,7 +941,7 @@ <string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Ajouter la tuile"</string> <string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Ne pas ajouter de tuile"</string> <string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Choisir l\'utilisateur"</string> - <string name="fgs_manager_footer_label" msgid="8276763570622288231">"{count,plural, =1{# application est active}one{# application est active}other{# applications sont actives}}"</string> + <string name="fgs_manager_footer_label" msgid="8276763570622288231">"{count,plural, =1{# application est active}one{# application est active}many{# d\'applications sont actives}other{# applications sont actives}}"</string> <string name="fgs_dot_content_description" msgid="2865071539464777240">"Nouvelle information"</string> <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Applications actives"</string> <string name="fgs_manager_dialog_message" msgid="2670045017200730076">"Ces applications sont actives et s\'exécutent même lorsque vous ne les utilisez pas. Cela améliore leur fonctionnalité, mais peut également affecter l\'autonomie de la pile."</string> @@ -981,7 +971,7 @@ <string name="dream_overlay_status_bar_camera_off" msgid="5273073778969890823">"L\'appareil photo est désactivé"</string> <string name="dream_overlay_status_bar_mic_off" msgid="8366534415013819396">"Le micro est désactivé"</string> <string name="dream_overlay_status_bar_camera_mic_off" msgid="3199425257833773569">"L\'appareil photo et le micro sont désactivés"</string> - <string name="dream_overlay_status_bar_notification_indicator" msgid="8091389255691081711">"{count,plural, =1{# notification}one{# notification}other{# notifications}}"</string> + <string name="dream_overlay_status_bar_notification_indicator" msgid="8091389255691081711">"{count,plural, =1{# notification}one{# notification}many{# de notifications}other{# notifications}}"</string> <string name="dream_overlay_weather_complication_desc" msgid="824503662089783824">"<xliff:g id="WEATHER_CONDITION">%1$s</xliff:g>, <xliff:g id="TEMPERATURE">%2$s</xliff:g>"</string> <string name="broadcasting_description_is_broadcasting" msgid="765627502786404290">"Diffusion en cours…"</string> <string name="bt_le_audio_broadcast_dialog_title" msgid="3605428497924077811">"Arrêter la diffusion de <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index b71882582cb9..2ffb38934b5b 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Visage non reconnu. Utilisez votre empreinte."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Visage non reconnu"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Utilisez empreinte digit."</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth connecté"</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Pourcentage de la batterie inconnu."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Connecté à : <xliff:g id="BLUETOOTH">%s</xliff:g>"</string> @@ -202,7 +204,7 @@ <string name="accessibility_sensors_off_active" msgid="2619725434618911551">"Option \"Capteurs désactivés\" active"</string> <string name="accessibility_clear_all" msgid="970525598287244592">"Supprimer toutes les notifications"</string> <string name="notification_group_overflow_indicator" msgid="7605120293801012648">"<xliff:g id="NUMBER">%s</xliff:g> autres"</string> - <string name="notification_group_overflow_description" msgid="7176322877233433278">"{count,plural, =1{# autre notification dans le groupe.}one{# autre notification dans le groupe.}other{# autres notifications dans le groupe.}}"</string> + <string name="notification_group_overflow_description" msgid="7176322877233433278">"{count,plural, =1{# autre notification dans le groupe.}one{# autre notification dans le groupe.}many{# autres notifications dans le groupe.}other{# autres notifications dans le groupe.}}"</string> <string name="accessibility_rotation_lock_on_landscape" msgid="936972553861524360">"L\'écran est verrouillé en mode paysage."</string> <string name="accessibility_rotation_lock_on_portrait" msgid="2356633398683813837">"L\'écran est verrouillé en mode portrait."</string> <string name="dessert_case" msgid="9104973640704357717">"Vitrine des desserts"</string> @@ -250,7 +252,7 @@ <string name="quick_settings_hotspot_label" msgid="1199196300038363424">"Point d\'accès"</string> <string name="quick_settings_hotspot_secondary_label_transient" msgid="7585604088079160564">"Activation…"</string> <string name="quick_settings_hotspot_secondary_label_data_saver_enabled" msgid="1280433136266439372">"Écon. données activé"</string> - <string name="quick_settings_hotspot_secondary_label_num_devices" msgid="7536823087501239457">"{count,plural, =1{# appareil}one{# appareil}other{# appareils}}"</string> + <string name="quick_settings_hotspot_secondary_label_num_devices" msgid="7536823087501239457">"{count,plural, =1{# appareil}one{# appareil}many{# appareils}other{# appareils}}"</string> <string name="quick_settings_flashlight_label" msgid="4904634272006284185">"Lampe de poche"</string> <string name="quick_settings_flashlight_camera_in_use" msgid="4820591564526512571">"Caméra en cours d\'utilisation"</string> <string name="quick_settings_cellular_detail_title" msgid="792977203299358893">"Données mobiles"</string> @@ -351,7 +353,7 @@ <string name="guest_notification_session_active" msgid="5567273684713471450">"Vous êtes en mode Invité"</string> <string name="user_add_user_message_guest_remove" msgid="5589286604543355007">\n\n"Si vous ajoutez un utilisateur, le mode Invité sera désactivé et toutes les applis et les données de la session Invité actuelle seront supprimées."</string> <string name="user_limit_reached_title" msgid="2429229448830346057">"Limite nombre utilisateurs atteinte"</string> - <string name="user_limit_reached_message" msgid="1070703858915935796">"{count,plural, =1{Vous ne pouvez créer qu\'un seul utilisateur.}one{Vous pouvez ajouter # utilisateur.}other{Vous pouvez ajouter jusqu\'à # utilisateurs.}}"</string> + <string name="user_limit_reached_message" msgid="1070703858915935796">"{count,plural, =1{Vous ne pouvez créer qu\'un seul utilisateur.}one{Vous pouvez ajouter # utilisateur.}many{Vous pouvez ajouter jusqu\'à # utilisateurs.}other{Vous pouvez ajouter jusqu\'à # utilisateurs.}}"</string> <string name="user_remove_user_title" msgid="9124124694835811874">"Supprimer l\'utilisateur ?"</string> <string name="user_remove_user_message" msgid="6702834122128031833">"Toutes les applications et les données de cet utilisateur seront supprimées."</string> <string name="user_remove_user_remove" msgid="8387386066949061256">"Supprimer"</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Sous-titres en superposition"</string> <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="sound_settings" msgid="8874581353127418308">"Son et vibreur"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Paramètres"</string> <string name="screen_pinning_title" msgid="9058007390337841305">"L\'application est épinglée"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Elle restera visible jusqu\'à ce que vous la retiriez. Pour la retirer, appuyez de manière prolongée sur les boutons Retour et Aperçu."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Elle restera visible jusqu\'à ce que vous la retiriez. Pour la retirer, appuyez de manière prolongée sur les boutons Retour et Accueil."</string> @@ -537,8 +541,8 @@ <string name="notification_menu_snooze_action" msgid="5415729610393475019">"M\'envoyer un rappel"</string> <string name="snooze_undo" msgid="2738844148845992103">"Annuler"</string> <string name="snoozed_for_time" msgid="7586689374860469469">"Répétée après <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string> - <string name="snoozeHourOptions" msgid="2332819756222425558">"{count,plural, =1{# heure}=2{# heures}one{# heure}other{# heures}}"</string> - <string name="snoozeMinuteOptions" msgid="2222082405822030979">"{count,plural, =1{# minute}one{# minute}other{# minutes}}"</string> + <string name="snoozeHourOptions" msgid="2332819756222425558">"{count,plural, =1{# heure}=2{# heures}one{# heure}many{# heures}other{# heures}}"</string> + <string name="snoozeMinuteOptions" msgid="2222082405822030979">"{count,plural, =1{# minute}one{# minute}many{# minutes}other{# minutes}}"</string> <string name="battery_detail_switch_title" msgid="6940976502957380405">"Économiseur de batterie"</string> <string name="keyboard_key_button_template" msgid="8005673627272051429">"Bouton <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="3734400625170020657">"Accueil"</string> @@ -594,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"Activé"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Désactivé"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Indisponible"</string> - <string name="tile_disabled" msgid="373212051546573069">"Désactivé"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"Barre de navigation"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Disposition"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Type de bouton gauche supplémentaire"</string> @@ -667,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Fonctionnalités limitées pendant le refroidissement du téléphone.\nAppuyer pour en savoir plus"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"Votre téléphone va essayer de se refroidir automatiquement. Vous pouvez toujours l\'utiliser, mais il risque d\'être plus lent.\n\nUne fois refroidi, il fonctionnera normalement."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Afficher les étapes d\'entretien"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Débrancher le chargeur"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"Un problème est survenu lors de la recharge de cet appareil. Débranchez l\'adaptateur secteur en faisant attention, car le câble risque d\'être chaud."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"Afficher les étapes d\'entretien"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Raccourci gauche"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Raccourci droit"</string> @@ -778,7 +785,7 @@ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"activer/désactiver"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Commandes des appareils"</string> <string name="controls_providers_title" msgid="6879775889857085056">"Sélectionnez l\'appli pour laquelle ajouter des commandes"</string> - <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# commande ajoutée.}one{# commande ajoutée.}other{# commandes ajoutées.}}"</string> + <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# commande ajoutée.}one{# commande ajoutée.}many{# commandes ajoutées.}other{# commandes ajoutées.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Supprimé"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Ajouté aux favoris"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Ajouté aux favoris, en position <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -935,7 +942,7 @@ <string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Ajouter le bloc"</string> <string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Ne pas ajouter le bloc"</string> <string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Choisir l\'utilisateur"</string> - <string name="fgs_manager_footer_label" msgid="8276763570622288231">"{count,plural, =1{# appli est active}one{# appli est active}other{# applis sont actives}}"</string> + <string name="fgs_manager_footer_label" msgid="8276763570622288231">"{count,plural, =1{# appli est active}one{# appli est active}many{# applis sont actives}other{# applis sont actives}}"</string> <string name="fgs_dot_content_description" msgid="2865071539464777240">"Nouvelles informations"</string> <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Applis actives"</string> <string name="fgs_manager_dialog_message" msgid="2670045017200730076">"Ces applis sont actives et s\'exécutent même lorsque vous ne les utilisez pas. Cela améliore leur fonctionnement, mais peut également affecter l\'autonomie de la batterie."</string> @@ -965,7 +972,7 @@ <string name="dream_overlay_status_bar_camera_off" msgid="5273073778969890823">"Caméra désactivée"</string> <string name="dream_overlay_status_bar_mic_off" msgid="8366534415013819396">"Micro désactivé"</string> <string name="dream_overlay_status_bar_camera_mic_off" msgid="3199425257833773569">"Appareil photo et micro désactivés"</string> - <string name="dream_overlay_status_bar_notification_indicator" msgid="8091389255691081711">"{count,plural, =1{# notification}one{# notification}other{# notifications}}"</string> + <string name="dream_overlay_status_bar_notification_indicator" msgid="8091389255691081711">"{count,plural, =1{# notification}one{# notification}many{# notifications}other{# notifications}}"</string> <string name="dream_overlay_weather_complication_desc" msgid="824503662089783824">"<xliff:g id="WEATHER_CONDITION">%1$s</xliff:g>, <xliff:g id="TEMPERATURE">%2$s</xliff:g>"</string> <string name="broadcasting_description_is_broadcasting" msgid="765627502786404290">"Diffusion…"</string> <string name="bt_le_audio_broadcast_dialog_title" msgid="3605428497924077811">"Arrêter la diffusion de <xliff:g id="APP_NAME">%1$s</xliff:g> ?"</string> diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index e7905e8593c4..2da351a0dca2 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Non se recoñeceu a cara. Usa a impresión dixital."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Non se recoñeceu a cara"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Usa a impresión dixital"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth conectado"</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Descoñécese a porcentaxe da batería."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Conectado a <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> @@ -339,8 +341,7 @@ <string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Cargando • A carga completarase en <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> <string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Cargando rapidamente • A carga completarase en <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> <string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Cargando lentamente • A carga completarase en <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> - <!-- no translation found for keyguard_indication_charging_time_dock (3149328898931741271) --> - <skip /> + <string name="keyguard_indication_charging_time_dock" msgid="3149328898931741271">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Cargando • A carga completarase en <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Cambiar usuario"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menú despregable"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Eliminaranse todas as aplicacións e datos desta sesión."</string> @@ -420,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Superposición de subtítulos"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"activa"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"desactiva"</string> + <string name="sound_settings" msgid="8874581353127418308">"Son e vibración"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Configuración"</string> <string name="screen_pinning_title" msgid="9058007390337841305">"A aplicación está fixada"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"A pantalla manterase visible ata que deixes de fixala. Para facelo, mantén premido Atrás e Visión xeral."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"A pantalla manterase visible ata que deixes de fixala. Para facelo, mantén premido Atrás e Inicio."</string> @@ -595,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"Activado"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Desactivado"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Non dispoñible"</string> - <string name="tile_disabled" msgid="373212051546573069">"Desactivado"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"Barra de navegación"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Deseño"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Tipo de botón adicional á esquerda"</string> @@ -668,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"O uso dalgunhas funcións é limitado mentres o teléfono arrefría.\nToca para obter máis información"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"O teléfono tentará arrefriar automaticamente. Podes utilizalo, pero é probable que funcione máis lento.\n\nUnha vez que arrefríe, funcionará con normalidade."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Ver pasos de mantemento"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Desconecta o cargador"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"Produciuse un problema ao cargar este dispositivo. Desconecta o adaptador de corrente e ten coidado porque o cable pode estar quente."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"Ver pasos de mantemento"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Atallo á esquerda"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Atallo á dereita"</string> diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index 8123785a8f41..97fed2367825 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"ચહેરો ઓળખી શકતા નથી. તેને બદલે ફિંગરપ્રિન્ટ વાપરો."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"ચહેરો ઓળખાતો નથી"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"તો ફિંગરપ્રિન્ટ વાપરો"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"બ્લૂટૂથ કનેક્ટ થયું."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"બૅટરીની ટકાવારી અજાણ છે."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> થી કનેક્ટ થયાં."</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"કૅપ્શન ઓવરલે"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"ચાલુ કરો"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"બંધ કરો"</string> + <string name="sound_settings" msgid="8874581353127418308">"સાઉન્ડ અને વાઇબ્રેશન"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"સેટિંગ"</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> @@ -594,7 +598,7 @@ <string name="switch_bar_on" msgid="1770868129120096114">"ચાલુ"</string> <string name="switch_bar_off" msgid="5669805115416379556">"બંધ"</string> <string name="tile_unavailable" msgid="3095879009136616920">"ઉપલબ્ધ નથી"</string> - <string name="tile_disabled" msgid="373212051546573069">"બંધ છે"</string> + <string name="accessibility_tile_disabled_by_policy_action_description" msgid="6958422730461646926">"વધુ જાણો"</string> <string name="nav_bar" msgid="4642708685386136807">"નેવિગેશન બાર"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"લેઆઉટ"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"અતિરિક્ત ડાબો બટન પ્રકાર"</string> @@ -667,8 +671,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"ફોન ઠંડો થાય ત્યાં સુધી અમુક સુવિધાઓ મર્યાદિત હોય છે.\nવધુ માહિતી માટે ટૅપ કરો"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"તમારો ફોન ઑટોમૅટિક રીતે ઠંડો થવાનો પ્રયાસ કરશે. તમે હજી પણ તમારા ફોનનો ઉપયોગ કરી શકો છો, પરંતુ તે કદાચ થોડો ધીમો ચાલે.\n\nતમારો ફોન ઠંડો થઈ જવા પર, તે સામાન્ય રીતે ચાલશે."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"સારસંભાળના પગલાં જુઓ"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"ચાર્જરને અનપ્લગ કરો"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"આ ડિવાઇસને ચાર્જ કરવામાં કોઈ સમસ્યા છે. પાવર અડૅપ્ટર અનપ્લગ કરો અને કાળજી લેજો કદાચ કેબલ થોડો ગરમ થયો હોઈ શકે છે."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"સારસંભાળના પગલાં જુઓ"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"ડાબો શૉર્ટકટ"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"જમણો શૉર્ટકટ"</string> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index 97ae5df5ef14..81a11b425fbd 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"चेहरे की पहचान नहीं हुई. फ़िंगरप्रिंट इस्तेमाल करें."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"चेहरे की पहचान नहीं हुई"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"फ़िंगरप्रिंट इस्तेमाल करें"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"ब्लूटूथ कनेक्ट किया गया."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"इस बारे में जानकारी नहीं है कि अभी बैटरी कितने प्रतिशत चार्ज है."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> से कनेक्ट किया गया."</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"कैप्शन ऊपर लगाएं"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"चालू करें"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"बंद करें"</string> + <string name="sound_settings" msgid="8874581353127418308">"आवाज़ और वाइब्रेशन"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"सेटिंग"</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> @@ -594,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"चालू"</string> <string name="switch_bar_off" msgid="5669805115416379556">"बंद"</string> <string name="tile_unavailable" msgid="3095879009136616920">"उपलब्ध नहीं है"</string> - <string name="tile_disabled" msgid="373212051546573069">"बंद है"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"नेविगेशन बार"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"लेआउट"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"कुछ और बाएं बटन के प्रकार"</string> @@ -667,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"फ़ोन के ठंडा होने तक कुछ सुविधाएं काम नहीं करतीं.\nज़्यादा जानकारी के लिए टैप करें"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"आपका फ़ोन अपने आप ठंडा होने की कोशिश करेगा. आप अब भी अपने फ़ोन का उपयोग कर सकते हैं, लेकिन हो सकता है कि यह धीमी गति से चले.\n\nठंडा हो जाने पर आपका फ़ोन सामान्य रूप से चलेगा."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"डिवाइस के रखरखाव के तरीके देखें"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"चार्जर निकालें"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"इस डिवाइस को चार्ज करने में समस्या हुई. पावर अडैप्टर का प्लग निकालें. ऐसा करते समय सावधानी बरतें क्योंकि तार गर्म हो सकता है."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"प्रबंधन से जुड़े चरण देखें"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"बायां शॉर्टकट"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"दायां शॉर्टकट"</string> diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index 5de94f1c3aef..7ef30b6886c7 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Prepoznavanje lica nije uspjelo. Upotrijebite otisak prsta."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Lice nije prepoznato"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Upotrijebite otisak prsta"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth povezan."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Postotak baterije nije poznat."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Spojen na <xliff:g id="BLUETOOTH">%s</xliff:g> ."</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Sloj titlova"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"omogući"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"onemogući"</string> + <string name="sound_settings" msgid="8874581353127418308">"Zvuk i vibracija"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Postavke"</string> <string name="screen_pinning_title" msgid="9058007390337841305">"Aplikacija je prikvačena"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Zaslon će tako ostati u prvom planu dok ga ne otkvačite. Dodirnite i zadržite Natrag i Pregled da biste ga otkvačili."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Zaslon će tako ostati u prvom planu dok ga ne otkvačite. Dodirnite gumbe Natrag i Početna i zadržite pritisak da biste ga otkvačili."</string> @@ -594,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"Uključeno"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Isključeno"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Nedostupno"</string> - <string name="tile_disabled" msgid="373212051546573069">"Onemogućeno"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"Navigacijska traka"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Izgled"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Vrsta dodatnog lijevog gumba"</string> @@ -667,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Neke su značajke ograničene dok se telefon ne ohladi.\nDodirnite za više informacija"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"Telefon će se automatski pokušati ohladiti. Možete ga nastaviti koristiti, no mogao bi raditi sporije.\n\nKad se ohladi, radit će normalno."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Pročitajte upute za održavanje"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Iskopčajte punjač"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"Pojavio se problem s punjenjem uređaja. Iskopčajte pretvarač napona i pazite jer se kabel može zagrijati."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"Pogledajte upute za održavanje"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Lijevi prečac"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Desni prečac"</string> diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index efe27e507308..b6bfc1b3946e 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Az arc nem felismerhető. Használjon ujjlenyomatot."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Az arc nem ismerhető fel"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Használjon ujjlenyomatot"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth csatlakoztatva."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Az akkumulátor töltöttségi szintje ismeretlen."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Csatlakoztatva a következőhöz: <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Feliratok fedvény"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"engedélyezés"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"letiltás"</string> + <string name="sound_settings" msgid="8874581353127418308">"Hang és rezgés"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Beállítások"</string> <string name="screen_pinning_title" msgid="9058007390337841305">"Az alkalmazás ki van tűzve"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Megjelenítve tartja addig, amíg Ön fel nem oldja a rögzítést. A feloldáshoz tartsa lenyomva a Vissza és az Áttekintés lehetőséget."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Megjelenítve tartja addig, amíg Ön fel nem oldja a rögzítést. A feloldáshoz tartsa lenyomva a Vissza és a Kezdőképernyő elemet."</string> @@ -594,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"Be"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Ki"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Nem használható"</string> - <string name="tile_disabled" msgid="373212051546573069">"Kikapcsolva"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"Navigációs sáv"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Elrendezés"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"További bal oldali gombtípus"</string> @@ -667,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Bizonyos funkciók korlátozottan működnek a telefon lehűlése közben.\nKoppintson, ha további információra van szüksége."</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"A telefon automatikusan megpróbál lehűlni. Továbbra is tudja használni a telefont, de elképzelhető, hogy működése lelassul.\n\nAmint a telefon lehűl, újra a szokásos módon működik majd."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Olvassa el a kímélő használat lépéseit"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Húzza ki a töltőt"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"Probléma adódott az eszköz töltése során. Húzza ki a hálózati adaptert. Vigyázzon, a kábel forró lehet."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"Olvassa el a megfelelő használat lépéseit"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Bal oldali parancsikon"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Jobb oldali parancsikon"</string> diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index 17c178a587cd..038030350c1b 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Դեմքը չի հաջողվում ճանաչել։ Օգտագործեք մատնահետքը։"</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Դեմքը չի ճանաչվել"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Օգտագործեք մատնահետք"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth-ը միացված է:"</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Մարտկոցի լիցքի մակարդակն անհայտ է։"</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Միացված է <xliff:g id="BLUETOOTH">%s</xliff:g>-ին:"</string> @@ -339,8 +341,7 @@ <string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Լիցքավորում • Մնացել է <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> <string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Արագ լիցքավորում • Մնացել է <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> <string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Դանդաղ լիցքավորում • Մնացել է <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> - <!-- no translation found for keyguard_indication_charging_time_dock (3149328898931741271) --> - <skip /> + <string name="keyguard_indication_charging_time_dock" msgid="3149328898931741271">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Լիցքավորում • Մնացել է <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Անջատել օգտվողին"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"իջնող ընտրացանկ"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Այս աշխատաշրջանի բոլոր հավելվածներն ու տվյալները կջնջվեն:"</string> @@ -420,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Ենթագրերի վրադրում"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"միացնել"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"անջատել"</string> + <string name="sound_settings" msgid="8874581353127418308">"Ձայն և թրթռոց"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Կարգավորումներ"</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> @@ -595,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"Միացված է"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Անջատված է"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Հասանելի չէ"</string> - <string name="tile_disabled" msgid="373212051546573069">"Անջատված է"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"Նավիգացիայի գոտի"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Դասավորություն"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Լրացուցիչ ձախ կոճակի տեսակ"</string> @@ -668,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Հովանալու ընթացքում հեռախոսի որոշ գործառույթներ սահմանափակ են։\nՀպեք՝ ավելին իմանալու համար։"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"Ձեր հեռախոսն ավտոմատ կերպով կփորձի hովանալ: Կարող եք շարունակել օգտագործել հեռախոսը, սակայն հնարավոր է, որ այն ավելի դանդաղ աշխատի:\n\nՀովանալուց հետո հեռախոսը կաշխատի կանոնավոր կերպով:"</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Քայլեր գերտաքացման ահազանգի դեպքում"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Անջատեք լիցքավորիչը հոսանքից"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"Չհաջողվեց լիցքավորել սարքը: Անջատեք հոսանքի ադապտերը և ուշադիր եղեք՝ մալուխը կարող է տաքացած լինել:"</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"Քայլեր գերտաքացման ահազանգի դեպքում"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Ձախ դյուրանցում"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Աջ դյուրանցում"</string> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index e0f39b06264f..163dd9f94f2f 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Tidak dapat mengenali wajah. Gunakan sidik jari."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Tidak mengenali wajah"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Gunakan sidik jari"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth terhubung."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Persentase baterai tidak diketahui."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Terhubung ke <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Overlay teks"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"aktifkan"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"nonaktifkan"</string> + <string name="sound_settings" msgid="8874581353127418308">"Suara & getaran"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Setelan"</string> <string name="screen_pinning_title" msgid="9058007390337841305">"Aplikasi disematkan"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Ini akan terus ditampilkan sampai Anda melepas sematan. Sentuh lama tombol Kembali dan Ringkasan untuk melepas sematan."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Ini akan terus ditampilkan sampai Anda melepas sematan. Sentuh lama tombol Kembali dan Beranda untuk melepas sematan."</string> @@ -594,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"Aktif"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Nonaktif"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Tidak tersedia"</string> - <string name="tile_disabled" msgid="373212051546573069">"Nonaktif"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"Bilah navigasi"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Tata Letak"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Jenis tombol ekstra kiri"</string> @@ -667,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Beberapa fitur dibatasi saat ponsel mendingin.\nKetuk untuk info selengkapnya"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"Ponsel akan otomatis mencoba mendingin. Anda tetap dapat menggunakan ponsel, tetapi mungkin berjalan lebih lambat.\n\nSetelah dingin, ponsel akan berjalan seperti biasa."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Lihat langkah-langkah perawatan"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Cabut pengisi daya"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"Ada masalah saat mengisi daya perangkat ini. Cabut adaptor daya dan berhati-hatilah karena kabelnya mungkin panas."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"Lihat langkah-langkah perawatan"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Pintasan kiri"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Pintasan kanan"</string> diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml index 955c9247a9e8..f2a0304a4844 100644 --- a/packages/SystemUI/res/values-is/strings.xml +++ b/packages/SystemUI/res/values-is/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Andlit þekkist ekki. Notaðu fingrafar í staðinn."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Andlit þekkist ekki"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Nota fingrafar í staðinn"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth tengt."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Staða rafhlöðu óþekkt."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Tengt við <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> @@ -339,8 +341,7 @@ <string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Í hleðslu • Full hleðsla eftir <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> <string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Hraðhleðsla • Full hleðsla eftir <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> <string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Hæg hleðsla • Full hleðsla eftir <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> - <!-- no translation found for keyguard_indication_charging_time_dock (3149328898931741271) --> - <skip /> + <string name="keyguard_indication_charging_time_dock" msgid="3149328898931741271">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Í hleðslu • Full hleðsla eftir <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Skipta um notanda"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"Fellivalmynd"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Öllum forritum og gögnum í þessari lotu verður eytt."</string> @@ -420,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Yfirlögn myndatexta"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"virkja"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"slökkva"</string> + <string name="sound_settings" msgid="8874581353127418308">"Hljóð og titringur"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Stillingar"</string> <string name="screen_pinning_title" msgid="9058007390337841305">"Forrit er fest"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Þetta heldur þessu opnu þangað til þú losar það. Haltu fingri á „Til baka“ og „Yfirlit“ til að losa."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Þetta heldur þessu opnu þangað til það er losað. Haltu inni bakkhnappinum og heimahnappinum til að losa."</string> @@ -595,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"Kveikt"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Slökkt"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Ekki í boði"</string> - <string name="tile_disabled" msgid="373212051546573069">"Slökkt"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"Yfirlitsstika"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Útlit"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Gerð aukahnapps til vinstri"</string> @@ -668,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Sumir eiginleikar eru takmarkaðir meðan síminn kælir sig.\nÝttu til að fá frekari upplýsingar"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"Síminn reynir sjálfkrafa að kæla sig. Þú getur enn notað símann en hann gæti verið hægvirkari.\n\nEftir að síminn hefur kælt sig niður virkar hann eðlilega."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Sjá varúðarskref"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Taktu hleðslutækið úr sambandi"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"Upp kom vandamál varðandi hleðslu tækisins. Taktu straumbreytinn úr sambandi og farðu varlega því snúran gæti verið heit."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"Sjá varúðarskref"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Flýtilykill til vinstri"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Flýtilykill til hægri"</string> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index 73160c335a08..74f3e475555b 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Impossibile riconoscere il volto. Usa l\'impronta."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Volto non riconosciuto"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Usa l\'impronta"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth collegato."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Percentuale della batteria sconosciuta."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Connesso a <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> @@ -202,7 +204,7 @@ <string name="accessibility_sensors_off_active" msgid="2619725434618911551">"Opzione Sensori disattivati attiva"</string> <string name="accessibility_clear_all" msgid="970525598287244592">"Cancella tutte le notifiche."</string> <string name="notification_group_overflow_indicator" msgid="7605120293801012648">"+ <xliff:g id="NUMBER">%s</xliff:g>"</string> - <string name="notification_group_overflow_description" msgid="7176322877233433278">"{count,plural, =1{# altra notifica nel gruppo.}other{Altre # notifiche nel gruppo.}}"</string> + <string name="notification_group_overflow_description" msgid="7176322877233433278">"{count,plural, =1{# altra notifica nel gruppo.}many{Altre # notifiche nel gruppo.}other{Altre # notifiche nel gruppo.}}"</string> <string name="accessibility_rotation_lock_on_landscape" msgid="936972553861524360">"Lo schermo è bloccato in orientamento orizzontale."</string> <string name="accessibility_rotation_lock_on_portrait" msgid="2356633398683813837">"Lo schermo è bloccato in orientamento verticale."</string> <string name="dessert_case" msgid="9104973640704357717">"Vetrina di dolci"</string> @@ -250,7 +252,7 @@ <string name="quick_settings_hotspot_label" msgid="1199196300038363424">"Hotspot"</string> <string name="quick_settings_hotspot_secondary_label_transient" msgid="7585604088079160564">"Attivazione…"</string> <string name="quick_settings_hotspot_secondary_label_data_saver_enabled" msgid="1280433136266439372">"Risp. dati attivo"</string> - <string name="quick_settings_hotspot_secondary_label_num_devices" msgid="7536823087501239457">"{count,plural, =1{# dispositivo}other{# dispositivi}}"</string> + <string name="quick_settings_hotspot_secondary_label_num_devices" msgid="7536823087501239457">"{count,plural, =1{# dispositivo}many{# dispositivi}other{# dispositivi}}"</string> <string name="quick_settings_flashlight_label" msgid="4904634272006284185">"Torcia"</string> <string name="quick_settings_flashlight_camera_in_use" msgid="4820591564526512571">"Fotocamera in uso"</string> <string name="quick_settings_cellular_detail_title" msgid="792977203299358893">"Dati mobili"</string> @@ -351,7 +353,7 @@ <string name="guest_notification_session_active" msgid="5567273684713471450">"Sei in modalità Ospite"</string> <string name="user_add_user_message_guest_remove" msgid="5589286604543355007">\n\n"Se aggiungi un nuovo utente, la modalità Ospite viene disattivata e vengono eliminati tutti i dati e le app della sessione Ospite corrente."</string> <string name="user_limit_reached_title" msgid="2429229448830346057">"Limite di utenti raggiunto"</string> - <string name="user_limit_reached_message" msgid="1070703858915935796">"{count,plural, =1{Può essere creato un solo utente.}other{Puoi aggiungere fino a # utenti.}}"</string> + <string name="user_limit_reached_message" msgid="1070703858915935796">"{count,plural, =1{Può essere creato un solo utente.}many{Puoi aggiungere fino a # utenti.}other{Puoi aggiungere fino a # utenti.}}"</string> <string name="user_remove_user_title" msgid="9124124694835811874">"Rimuovere l\'utente?"</string> <string name="user_remove_user_message" msgid="6702834122128031833">"Tutte le app e i dati di questo utente verranno eliminati."</string> <string name="user_remove_user_remove" msgid="8387386066949061256">"Rimuovi"</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Overlay sottotitoli"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"attiva"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"disattiva"</string> + <string name="sound_settings" msgid="8874581353127418308">"Suoni e vibrazione"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Impostazioni"</string> <string name="screen_pinning_title" msgid="9058007390337841305">"L\'app è bloccata sullo schermo"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"La schermata rimane visibile finché non viene sganciata. Per sganciarla, tieni premuto Indietro e Panoramica."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"La schermata rimane visibile finché non viene disattivato il blocco su schermo. Per disattivarlo, tocca e tieni premuto Indietro e Home."</string> @@ -537,8 +541,8 @@ <string name="notification_menu_snooze_action" msgid="5415729610393475019">"Ricordamelo"</string> <string name="snooze_undo" msgid="2738844148845992103">"Annulla"</string> <string name="snoozed_for_time" msgid="7586689374860469469">"Posticipato di <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string> - <string name="snoozeHourOptions" msgid="2332819756222425558">"{count,plural, =1{# ora}=2{# ore}other{# ore}}"</string> - <string name="snoozeMinuteOptions" msgid="2222082405822030979">"{count,plural, =1{# minuto}other{# minuti}}"</string> + <string name="snoozeHourOptions" msgid="2332819756222425558">"{count,plural, =1{# ora}=2{# ore}many{# ore}other{# ore}}"</string> + <string name="snoozeMinuteOptions" msgid="2222082405822030979">"{count,plural, =1{# minuto}many{# minuti}other{# minuti}}"</string> <string name="battery_detail_switch_title" msgid="6940976502957380405">"Risparmio energetico"</string> <string name="keyboard_key_button_template" msgid="8005673627272051429">"Pulsante <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="3734400625170020657">"Home page"</string> @@ -594,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"On"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Off"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Non disponibile"</string> - <string name="tile_disabled" msgid="373212051546573069">"Riquadro disattivato"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"Barra di navigazione"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Layout"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Tipo di pulsante extra sinistra"</string> @@ -667,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Alcune funzionalità limitate durante il raffreddamento del telefono.\nTocca per ulteriori informazioni"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"Il telefono cercherà automaticamente di raffreddarsi. Puoi comunque usarlo, ma potrebbe essere più lento.\n\nUna volta raffreddato, il telefono funzionerà normalmente."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Leggi le misure da adottare"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Scollega il caricabatterie"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"Si è verificato un problema durante la ricarica del dispositivo. Scollega l\'alimentatore e presta attenzione perché il cavo potrebbe essere caldo."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"Leggi le misure da adottare"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Scorciatoia sinistra"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Scorciatoia destra"</string> @@ -778,7 +785,7 @@ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"attiva/disattiva"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Controllo dispositivi"</string> <string name="controls_providers_title" msgid="6879775889857085056">"Scegli un\'app per aggiungere controlli"</string> - <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# controllo aggiunto.}other{# controlli aggiunti.}}"</string> + <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# controllo aggiunto.}many{# controlli aggiunti.}other{# controlli aggiunti.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Rimosso"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Aggiunto ai preferiti"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Preferito, posizione <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -935,7 +942,7 @@ <string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Aggiungi riquadro"</string> <string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Non aggiungerlo"</string> <string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Seleziona utente"</string> - <string name="fgs_manager_footer_label" msgid="8276763570622288231">"{count,plural, =1{C\'è # app attiva}other{Ci sono # app attive}}"</string> + <string name="fgs_manager_footer_label" msgid="8276763570622288231">"{count,plural, =1{C\'è # app attiva}many{Ci sono # app attive}other{Ci sono # app attive}}"</string> <string name="fgs_dot_content_description" msgid="2865071539464777240">"Nuove informazioni"</string> <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"App attive"</string> <string name="fgs_manager_dialog_message" msgid="2670045017200730076">"Queste app sono attive e in esecuzione, anche quando non le utilizzi. Questo migliora la loro funzionalità, ma influisce sulla durata della batteria."</string> @@ -965,7 +972,7 @@ <string name="dream_overlay_status_bar_camera_off" msgid="5273073778969890823">"La fotocamera è disattivata"</string> <string name="dream_overlay_status_bar_mic_off" msgid="8366534415013819396">"Il microfono è disattivato"</string> <string name="dream_overlay_status_bar_camera_mic_off" msgid="3199425257833773569">"Fotocamera e microfono non attivi"</string> - <string name="dream_overlay_status_bar_notification_indicator" msgid="8091389255691081711">"{count,plural, =1{# notifica}other{# notifiche}}"</string> + <string name="dream_overlay_status_bar_notification_indicator" msgid="8091389255691081711">"{count,plural, =1{# notifica}many{# notifiche}other{# notifiche}}"</string> <string name="dream_overlay_weather_complication_desc" msgid="824503662089783824">"<xliff:g id="WEATHER_CONDITION">%1$s</xliff:g>, <xliff:g id="TEMPERATURE">%2$s</xliff:g>"</string> <string name="broadcasting_description_is_broadcasting" msgid="765627502786404290">"Trasmissione in corso…"</string> <string name="bt_le_audio_broadcast_dialog_title" msgid="3605428497924077811">"Vuoi interrompere la trasmissione dell\'app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index e34987cc7635..ac70efd1d535 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"לא ניתן לזהות את הפנים. יש להשתמש בטביעת אצבע במקום."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"לא ניתן לזהות את הפנים"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"שימוש בטביעת אצבע במקום זאת"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth מחובר."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"אחוז טעינת הסוללה לא ידוע."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"התבצע חיבור אל <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"שכבת-על לכיתוב"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"הפעלה"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"השבתה"</string> + <string name="sound_settings" msgid="8874581353127418308">"צליל ורטט"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"הגדרות"</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> @@ -594,7 +598,7 @@ <string name="switch_bar_on" msgid="1770868129120096114">"פועל"</string> <string name="switch_bar_off" msgid="5669805115416379556">"כבוי"</string> <string name="tile_unavailable" msgid="3095879009136616920">"לא זמין"</string> - <string name="tile_disabled" msgid="373212051546573069">"מושבת"</string> + <string name="accessibility_tile_disabled_by_policy_action_description" msgid="6958422730461646926">"מידע נוסף"</string> <string name="nav_bar" msgid="4642708685386136807">"סרגל הניווט"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"פריסה"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"סוג נוסף של לחצן שמאלי"</string> @@ -667,8 +671,8 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"חלק מהתכונות מוגבלות כל עוד הטלפון מתקרר.\nיש להקיש כדי להציג מידע נוסף"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"קירור הטלפון ייעשה באופן אוטומטי. ניתן עדיין להשתמש בטלפון, אבל ייתכן שהוא יפעל לאט יותר.\n\nהטלפון יחזור לפעול כרגיל לאחר שיתקרר."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"לצפייה בשלבי הטיפול"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"יש לנתק את המטען"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"יש בעיה עם הטעינה של המכשיר הזה. צריך לנתק את מתאם המתח בזהירות כי הכבל עלול להיות חם."</string> + <string name="high_temp_alarm_title" msgid="8654754369605452169">"ניתוק המכשיר"</string> + <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"המכשיר שלך מתחמם בקרבת יציאת הטעינה. אם המכשיר מחובר למטען או לאביזר בחיבור USB, צריך לנתק אותו בזהירות כיוון שגם הכבל עלול להיות חם."</string> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"לצפייה בשלבי הטיפול"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"קיצור דרך שמאלי"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"קיצור דרך ימני"</string> diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index d471610249e7..3fa66efe08fc 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"顔を認識できません。指紋認証を使用してください。"</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"顔を認識できません"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"指紋認証をお使いください"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetoothに接続済み。"</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"バッテリー残量は不明です。"</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g>に接続しました。"</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"字幕のオーバーレイ"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"有効にする"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"無効にする"</string> + <string name="sound_settings" msgid="8874581353127418308">"着信音とバイブレーション"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"設定"</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> @@ -594,7 +598,7 @@ <string name="switch_bar_on" msgid="1770868129120096114">"ON"</string> <string name="switch_bar_off" msgid="5669805115416379556">"OFF"</string> <string name="tile_unavailable" msgid="3095879009136616920">"使用不可"</string> - <string name="tile_disabled" msgid="373212051546573069">"無効"</string> + <string name="accessibility_tile_disabled_by_policy_action_description" msgid="6958422730461646926">"詳細"</string> <string name="nav_bar" msgid="4642708685386136807">"ナビゲーション バー"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"レイアウト"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"その他の左ボタンタイプ"</string> @@ -667,8 +671,8 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"スマートフォンのクールダウン中は一部の機能が制限されます。\nタップして詳細を表示"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"スマートフォンは自動的にクールダウンを行います。その間もスマートフォンを使用できますが、動作が遅くなる可能性があります。\n\nクールダウンが完了すると、通常どおり動作します。"</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"取り扱いに関する手順をご覧ください"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"充電器を電源から外してください"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"このデバイスの充電中に問題が発生しました。電源アダプターを電源から外してください。ケーブルが熱くなっている可能性がありますのでご注意ください。"</string> + <string name="high_temp_alarm_title" msgid="8654754369605452169">"デバイスを電源から外します"</string> + <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"充電ポートの近くにデバイスを置くと、本体が熱くなります。デバイスが充電器や USB アクセサリに接続されている場合は外してください。ケーブルが熱くなっていることもあるので注意してください。"</string> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"取り扱いに関する手順をご覧ください"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"左ショートカット"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"右ショートカット"</string> diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml index 14e41417ed42..4e0d5cebc030 100644 --- a/packages/SystemUI/res/values-ka/strings.xml +++ b/packages/SystemUI/res/values-ka/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"სახის ამოცნობა ვერ ხერხდება. სანაცვლოდ თითის ანაბეჭდი გამოიყენეთ."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"სახის ამოცნობა შეუძლებ."</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"გამოიყენეთ თითის ანაბეჭდი"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth დაკავშირებულია."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"ბატარეის პროცენტული მაჩვენებელი უცნობია."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"დაკავშირებულია <xliff:g id="BLUETOOTH">%s</xliff:g>-თან."</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"სუბტიტრების გადაფარვა"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"ჩართვა"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"გამორთვა"</string> + <string name="sound_settings" msgid="8874581353127418308">"ხმა და ვიბრაცია"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"პარამეტრები"</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> @@ -594,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"ჩართული"</string> <string name="switch_bar_off" msgid="5669805115416379556">"გამორთვა"</string> <string name="tile_unavailable" msgid="3095879009136616920">"მიუწვდომელი"</string> - <string name="tile_disabled" msgid="373212051546573069">"გათიშულია"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"ნავიგაციის ზოლი"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"განლაგება"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"მარცხენა დამატებითი ღილაკის ტიპი"</string> @@ -667,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"ზოგიერთი ფუნქცია შეზღუდული იქნება, სანამ ტელეფონი გაგრილდება.\nშეეხეთ დამატებითი ინფორმაციის მისაღებად"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"თქვენი ტელეფონი გაგრილებას ავტომატურად შეეცდება. შეგიძლიათ გააგრძელოთ მისით სარგებლობა, თუმცა ტელეფონმა შეიძლება უფრო ნელა იმუშაოს.\n\nგაგრილების შემდგომ ის ჩვეულებრივად იმუშავებს."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"მისაღები ზომების გაცნობა"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"გამოაერთეთ დამტენი"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"ამ მოწყობილობის დატენა ვერ ხერხდება პრობლემის გამო. გამოაერთეთ ელკვების ადაპტერი და გამოიჩინეთ სიფრთხილე, რადგან კაბელი შეიძლებოდა გაცხელებულიყო."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"მისაღები ზომების გაცნობა"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"მარცხენა მალსახმობი"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"მარჯვენა მალსახმობი"</string> diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index 9d2f91a00139..10c47e39164b 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -161,6 +161,10 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Бет танылмады. Орнына саусақ ізін пайдаланыңыз."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <!-- no translation found for keyguard_face_failed (9044619102286917151) --> + <skip /> + <!-- no translation found for keyguard_suggest_fingerprint (8742015961962702960) --> + <skip /> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth қосылған."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Батарея зарядының мөлшері белгісіз."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> қосылған."</string> @@ -339,8 +343,7 @@ <string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Зарядталуда • Толуына <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> қалды."</string> <string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Жылдам зарядталуда • Толуына <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> қалды."</string> <string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Баяу зарядталуда • Толуына <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> қалды."</string> - <!-- no translation found for keyguard_indication_charging_time_dock (3149328898931741271) --> - <skip /> + <string name="keyguard_indication_charging_time_dock" msgid="3149328898931741271">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Зарядталып жатыр. • Толуына <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> қалды."</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Пайдаланушыны ауыстыру"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"ашылмалы мәзір"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Осы сеанстағы барлық қолданбалар мен деректер жойылады."</string> @@ -420,6 +423,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Субтитр қою"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"қосу"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"өшіру"</string> + <string name="sound_settings" msgid="8874581353127418308">"Дыбыс және діріл"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Параметрлер"</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> @@ -595,7 +600,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"Қосулы"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Өшірулі"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Қолжетімді емес"</string> - <string name="tile_disabled" msgid="373212051546573069">"Өшірілген"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"Шарлау тақтасы"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Формат"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Қосымша сол жақ түйме түрі"</string> @@ -668,8 +674,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Телефон толық суығанға дейін, кейбір функциялардың жұмысы шектеледі.\nТолығырақ ақпарат үшін түртіңіз."</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"Телефон автоматты түрде суи бастайды. Оны пайдалана бере аласыз, бірақ ол баяуырақ жұмыс істеуі мүмкін.\n\nТелефон суығаннан кейін, оның жұмысы қалпына келеді."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Пайдалану нұсқаулығын қараңыз"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Зарядтағышты ажыратыңыз"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"Құрылғыны зарядтау кезінде ақау шықты. Қуат адаптерін ажыратыңыз. Кабель ыстық болуы мүмкін, абай болыңыз."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"Пайдалану нұсқаулығын қараңыз"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Сол жақ таңбаша"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Оң жақ таңбаша"</string> diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml index 5aa9a531c82c..7ee2a9399fb9 100644 --- a/packages/SystemUI/res/values-km/strings.xml +++ b/packages/SystemUI/res/values-km/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"មិនអាចសម្គាល់មុខបានទេ។ សូមប្រើស្នាមម្រាមដៃជំនួសវិញ។"</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"មិនអាចសម្គាល់មុខបានទេ"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"ប្រើស្នាមម្រាមដៃជំនួសវិញ"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"បានតភ្ជាប់ប៊្លូធូស។"</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"មិនដឹងអំពីភាគរយថ្មទេ។"</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"បានភ្ជាប់ទៅ <xliff:g id="BLUETOOTH">%s</xliff:g> ។"</string> @@ -339,8 +341,7 @@ <string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • កំពុងសាកថ្ម • ពេញក្នុងរយៈពេល <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> <string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • កំពុងសាកថ្មយ៉ាងឆាប់រហ័ស • ពេញក្នុងរយៈពេល <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> <string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • កំពុងសាកថ្មយឺត • ពេញក្នុងរយៈពេល <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> - <!-- no translation found for keyguard_indication_charging_time_dock (3149328898931741271) --> - <skip /> + <string name="keyguard_indication_charging_time_dock" msgid="3149328898931741271">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • កំពុងសាកថ្ម • ពេញក្នុងរយៈពេល <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"ប្ដូរអ្នកប្រើ"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"ម៉ឺនុយទាញចុះ"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"កម្មវិធី និងទិន្នន័យទាំងអស់ក្នុងវគ្គនេះនឹងត្រូវលុប។"</string> @@ -420,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"ការដាក់ត្រួតគ្នាលើអក្សររត់"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"បើក"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"បិទ"</string> + <string name="sound_settings" msgid="8874581353127418308">"សំឡេង និងការញ័រ"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"ការកំណត់"</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> @@ -595,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"បើក"</string> <string name="switch_bar_off" msgid="5669805115416379556">"បិទ"</string> <string name="tile_unavailable" msgid="3095879009136616920">"មិនអាចប្រើបាន"</string> - <string name="tile_disabled" msgid="373212051546573069">"បានបិទ"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"របាររុករក"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"ប្លង់"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"ប្រភេទប៊ូតុងខាងឆ្វេងបន្ថែម"</string> @@ -668,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"មុខងារមួយចំនួននឹងមិនអាចប្រើបានពេញលេញនោះទេ ខណៈពេលដែលទូរសព្ទកំពុងបញ្ចុះកម្ដៅ។\nសូមចុចដើម្បីទទួលបានព័ត៌មានបន្ថែម"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"ទូរសព្ទរបស់អ្នកនឹងព្យាយាមបញ្ចុះកម្តៅដោយស្វ័យប្រវត្តិ។ អ្នកនៅតែអាចប្រើទូរសព្ទរបស់អ្នកបានដដែល ប៉ុន្តែវានឹងដំណើរការយឺតជាងមុន។\n\nបន្ទាប់ពីទូរសព្ទរបស់អ្នកត្រជាក់ជាងមុនហើយ វានឹងដំណើរការដូចធម្មតា។"</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"មើលជំហានថែទាំ"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"ផ្ដាច់ឆ្នាំងសាក"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"មានបញ្ហាក្នុងការសាកថ្មឧបករណ៍នេះ។ សូមផ្ដាច់ឆ្នាំងសាក ហើយប្រុងប្រយ័ត្ន ដោយសារខ្សែអាចមានកម្ដៅក្ដៅ។"</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"មើលជំហានថែទាំ"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"ផ្លូវកាត់ខាងឆ្វេង"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"ផ្លូវកាត់ខាងស្តាំ"</string> diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index 15c17e46c0f6..2aec2e305fa4 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"ಮುಖ ಗುರುತಿಸಲಾಗುತ್ತಿಲ್ಲ ಬದಲಿಗೆ ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಬಳಸಿ."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"ಮುಖ ಗುರುತಿಸಲಾಗುತ್ತಿಲ್ಲ"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"ಬದಲಿಗೆ ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಬಳಸಿ"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"ಬ್ಲೂಟೂತ್ ಸಂಪರ್ಕಗೊಂಡಿದೆ."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"ಬ್ಯಾಟರಿ ಶೇಕಡಾವಾರು ತಿಳಿದಿಲ್ಲ."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> ಗೆ ಸಂಪರ್ಕಪಡಿಸಲಾಗಿದೆ."</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"ಶೀರ್ಷಿಕೆಗಳ ಓವರ್ಲೇ"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"ಸಕ್ರಿಯಗೊಳಿಸಿ"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ"</string> + <string name="sound_settings" msgid="8874581353127418308">"ಧ್ವನಿ & ವೈಬ್ರೇಷನ್"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"ಸೆಟ್ಟಿಂಗ್ಗಳು"</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> @@ -594,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"ಆನ್"</string> <string name="switch_bar_off" msgid="5669805115416379556">"ಆಫ್"</string> <string name="tile_unavailable" msgid="3095879009136616920">"ಲಭ್ಯವಿಲ್ಲ"</string> - <string name="tile_disabled" msgid="373212051546573069">"ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"ನ್ಯಾವಿಗೇಷನ್ ಬಾರ್"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"ಲೇಔಟ್"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"ಹೆಚ್ಚುವರಿ ಎಡ ಬಟನ್ ವಿಧ"</string> @@ -667,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"ಫೋನ್ ತಣ್ಣಗಾಗುವವರೆಗೂ ಕೆಲವು ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಸೀಮಿತಗೊಳಿಸಲಾಗುತ್ತದೆ\nಇನ್ನಷ್ಟು ಮಾಹಿತಿಗಾಗಿ ಟ್ಯಾಪ್ ಮಾಡಿ"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"ನಿಮ್ಮ ಫೋನ್ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ತಣ್ಣಗಾಗಲು ಪ್ರಯತ್ನಿಸುತ್ತದೆ. ನಿಮ್ಮ ಫೋನ್ ಅನ್ನು ನೀವು ಈಗಲೂ ಬಳಸಬಹುದಾಗಿರುತ್ತದೆ, ಆದರೆ ಇದು ನಿಧಾನವಾಗಿರಬಹುದು.\n\nಒಮ್ಮೆ ನಿಮ್ಮ ಫೋನ್ ತಣ್ಣಗಾದ ನಂತರ ಇದು ಸಾಮಾನ್ಯ ರೀತಿಯಲ್ಲಿ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"ಕಾಳಜಿಯ ಹಂತಗಳನ್ನು ವೀಕ್ಷಿಸಿ"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"ಚಾರ್ಜರ್ ಅನ್ಪ್ಲಗ್ ಮಾಡಿ"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"ಈ ಸಾಧನವನ್ನು ಚಾರ್ಜ್ ಮಾಡುತ್ತಿರುವಾಗ ಸಮಸ್ಯೆ ಎದುರಾಗಿದೆ. ಪವರ್ ಅಡಾಪ್ಟರ್ ಅನ್ನು ಅನ್ಪ್ಲಗ್ ಮಾಡಿ ಮತ್ತು ಕೇಬಲ್ ಬೆಚ್ಚಗಿರಬೇಕೆಂದು ಜಾಗ್ರತೆ ವಹಿಸಿ."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"ಕಾಳಜಿ ಹಂತಗಳನ್ನು ನೋಡಿ"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"ಎಡ ಶಾರ್ಟ್ಕಟ್"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"ಬಲ ಶಾರ್ಟ್ಕಟ್"</string> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index 4aed17fcf3ad..b33d766e1986 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"얼굴을 인식할 수 없습니다. 대신 지문을 사용하세요."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"얼굴을 인식할 수 없습니다."</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"대신 지문을 사용하세요."</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"블루투스가 연결되었습니다."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"배터리 잔량을 알 수 없습니다."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g>에 연결되었습니다."</string> @@ -281,7 +283,7 @@ <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"시작"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"중지"</string> <string name="quick_settings_onehanded_label" msgid="2416537930246274991">"한 손 사용 모드"</string> - <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"기기 마이크를 차단 해제하시겠습니까?"</string> + <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"기기 마이크를 &#173;차단 해제하시겠습니까?"</string> <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"기기 카메라를 차단 해제하시겠습니까?"</string> <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"기기 카메라 및 마이크를 차단 해제하시겠습니까?"</string> <string name="sensor_privacy_start_use_mic_dialog_content" msgid="1624701280680913717">"마이크를 사용할 수 있는 모든 앱 및 서비스에 대해 액세스가 차단 해제됩니다."</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"캡션 오버레이"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"사용"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"사용 중지"</string> + <string name="sound_settings" msgid="8874581353127418308">"소리 및 진동"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"설정"</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> @@ -594,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"사용"</string> <string name="switch_bar_off" msgid="5669805115416379556">"사용 안함"</string> <string name="tile_unavailable" msgid="3095879009136616920">"사용할 수 없음"</string> - <string name="tile_disabled" msgid="373212051546573069">"사용 안함"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"탐색 메뉴"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"레이아웃"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"추가 왼쪽 버튼 유형"</string> @@ -667,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"휴대전화 온도를 낮추는 동안 일부 기능이 제한됩니다.\n자세히 알아보려면 탭하세요."</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"휴대전화 온도를 자동으로 낮추려고 시도합니다. 휴대전화를 계속 사용할 수는 있지만 작동이 느려질 수도 있습니다.\n\n휴대전화 온도가 낮아지면 정상적으로 작동됩니다."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"해결 방법 확인하기"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"충전기를 연결 해제하세요"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"기기를 충전하는 중에 문제가 발생했습니다. 케이블이 뜨거울 수 있으므로 주의하여 전원 어댑터를 분리하세요."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"취해야 할 조치 확인"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"왼쪽 바로가기"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"오른쪽 바로가기"</string> diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index cf196bc3ff07..b352277792a9 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Жүз таанылбай жатат. Манжа изин колдонуңуз."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Жүз таанылбай жатат"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Манжа изин колдонуңуз"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth байланышта"</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Батарея кубатынын деңгээли белгисиз."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> менен туташкан."</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Коштомо жазуулардын үстүнө коюу"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"иштетүү"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"өчүрүү"</string> + <string name="sound_settings" msgid="8874581353127418308">"Үн жана дирилдөө"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Параметрлер"</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> @@ -594,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"Күйүк"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Өчүк"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Жеткиликсиз"</string> - <string name="tile_disabled" msgid="373212051546573069">"Өчүрүлгөн"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"Чабыттоо тилкеси"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Калып"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Сол жактагы кошумча баскычтын түрү"</string> @@ -667,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Телефон сууганча айрым элементтердин иши чектелген.\nКеңири маалымат алуу үчүн таптап коюңуз"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"Телефонуңуз автоматтык түрдө сууйт. Аны колдоно берсеңиз болот, бирок ал жайыраак иштеп калат.\n\nТелефонуңуз суугандан кийин адаттагыдай эле иштеп баштайт."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Тейлөө кадамдарын көрүңүз"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Кубаттагычты сууруңуз"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"Бул түзмөктү кубаттоодо маселе келип чыкты. Кабель ысып кетиши мүмкүн, андыктан кубаттагыч адаптерин сууруп коюңуз."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"Тейлөө кадамдарын көрүңүз"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Сол жактагы кыска жол"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Оң жактагы кыска жол"</string> diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml index ed5d3f7eb0ef..f90e869e7b27 100644 --- a/packages/SystemUI/res/values-lo/strings.xml +++ b/packages/SystemUI/res/values-lo/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"ບໍ່ສາມາດຈຳແນກໜ້າໄດ້. ກະລຸນາໃຊ້ລາຍນິ້ວມືແທນ."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"ບໍ່ສາມາດຈຳແນກໃບໜ້າໄດ້"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"ກະລຸນາໃຊ້ລາຍນິ້ວມືແທນ"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"ເຊື່ອມຕໍ່ Bluetooth ແລ້ວ."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"ບໍ່ຮູ້ເປີເຊັນແບັດເຕີຣີ."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"ເຊື່ອມຕໍ່ຫາ <xliff:g id="BLUETOOTH">%s</xliff:g> ແລ້ວ."</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"ຄຳບັນຍາຍແບບວາງທັບ"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"ເປີດນຳໃຊ້"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"ປິດນຳໃຊ້"</string> + <string name="sound_settings" msgid="8874581353127418308">"ສຽງ ແລະ ການສັ່ນເຕືອນ"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"ການຕັ້ງຄ່າ"</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> @@ -594,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"ເປີດ"</string> <string name="switch_bar_off" msgid="5669805115416379556">"ປິດ"</string> <string name="tile_unavailable" msgid="3095879009136616920">"ບໍ່ສາມາດໃຊ້ໄດ້"</string> - <string name="tile_disabled" msgid="373212051546573069">"ປິດການນຳໃຊ້ແລ້ວ"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"ແຖບນຳທາງ"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"ຮູບແບບ"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"ປະເພດປຸ່ມຊ້າຍພິເສດ"</string> @@ -667,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"ຄຸນສົມບັດບາງຢ່າງຖືກຈຳກັດໄວ້ໃນເວລາຫຼຸດອຸນຫະພູມຂອງໂທລະສັບ.\nແຕະເພື່ອເບິ່ງຂໍ້ມູນເພີ່ມເຕີມ"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"ໂທລະສັບຂອງທ່ານຈະພະຍາຍາມລົດອຸນຫະພູມລົງ. ທ່ານຍັງຄົງສາມາດໃຊ້ໂທລະສັບຂອງທ່ານໄດ້ຢູ່, ແຕ່ມັນຈະເຮັດວຽກຊ້າລົງ.\n\nເມື່ອໂທລະສັບຂອງທ່ານບໍ່ຮ້ອນຫຼາຍແລ້ວ, ມັນຈະກັບມາເຮັດວຽກຕາມປົກກະຕິ."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"ເບິ່ງຂັ້ນຕອນການເບິ່ງແຍງ"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"ຖອດສາຍສາກອອກ"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"ເກີດບັນຫາໃນການສາກໄຟອຸປະກອນນີ້. ກະລຸນາຖອດສາຍສາກອອກ ແລະ ລະວັງເນື່ອງຈາກສາຍອາດຈະຍັງອຸ່ນຢູ່."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"ເບິ່ງຂັ້ນຕອນການເບິ່ງແຍງ"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"ປຸ່ມລັດຊ້າຍ"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"ປຸ່ມລັດຂວາ"</string> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index c535108fe10a..fdf45707ca43 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Veidas neatpažintas. Naudokite kontrolinį kodą."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Veidas neatpažintas"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Naudoti piršto antspaudą"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"„Bluetooth“ prijungtas."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Akumuliatoriaus energija procentais nežinoma."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Prisijungta prie „<xliff:g id="BLUETOOTH">%s</xliff:g>“."</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Subtitrų perdanga"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"įgalinti"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"išjungti"</string> + <string name="sound_settings" msgid="8874581353127418308">"Garsas ir vibravimas"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Nustatymai"</string> <string name="screen_pinning_title" msgid="9058007390337841305">"Programa prisegta"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Tai bus rodoma, kol atsegsite. Palieskite ir palaikykite „Atgal“ ir „Apžvalga“, kad atsegtumėte."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Tai bus rodoma, kol atsegsite. Palieskite ir palaikykite „Atgal“ ir „Pagrindinis ekranas“, kad atsegtumėte."</string> @@ -594,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"Įjungta"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Išjungta"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Nepasiekiama"</string> - <string name="tile_disabled" msgid="373212051546573069">"Išjungta"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"Naršymo juosta"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Išdėstymas"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Papildomo mygtuko kairėje tipas"</string> @@ -667,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Kai kurios funkcijos gali neveikti, kol telefonas vėsta.\nPalietę gausite daugiau informacijos"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"Telefonas automatiškai bandys atvėsti. Telefoną vis tiek galėsite naudoti, tačiau jis gali veikti lėčiau.\n\nKai telefonas atvės, jis veiks įprastai."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Žr. priežiūros veiksmus"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Atjunkite kroviklį"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"Įkraunant šį įrenginį iškilo problema. Atjunkite maitinimo adapterį. Būkite atsargūs, nes laidas gali būti įkaitęs."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"Žr. priežiūros veiksmus"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Spartusis klavišas kairėje"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Spartusis klavišas dešinėje"</string> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index 834cf77db604..9ca7da534145 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Nevar atpazīt seju. Lietojiet pirksta nospiedumu."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Nevar atpazīt seju"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Lietot pirksta nospiedumu"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth savienojums ir izveidots."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Akumulatora uzlādes līmenis procentos nav zināms."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Ir izveidots savienojum ar <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> @@ -339,8 +341,7 @@ <string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Notiek uzlāde • Laiks līdz pilnai uzlādei: <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> <string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Ātrā uzlāde • Laiks līdz pilnai uzlādei: <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> <string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Lēnā uzlāde • Laiks līdz pilnai uzlādei: <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> - <!-- no translation found for keyguard_indication_charging_time_dock (3149328898931741271) --> - <skip /> + <string name="keyguard_indication_charging_time_dock" msgid="3149328898931741271">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Notiek uzlāde • Laiks līdz pilnai uzlādei: <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Mainīt lietotāju"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"novelkamā izvēlne"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Tiks dzēstas visas šīs sesijas lietotnes un dati."</string> @@ -420,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Subtitri pārklājas"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"iespējot"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"atspējot"</string> + <string name="sound_settings" msgid="8874581353127418308">"Skaņa un vibrācija"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Iestatījumi"</string> <string name="screen_pinning_title" msgid="9058007390337841305">"Lietotne ir piesprausta"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Šādi tas būs redzams līdz brīdim, kad to atspraudīsiet. Lai atspraustu, pieskarieties pogām Atpakaļ un Pārskats un turiet tās."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Šādi tas būs redzams līdz brīdim, kad to atspraudīsiet. Lai atspraustu, pieskarieties pogām “Atpakaļ” un “Sākums” un turiet tās."</string> @@ -595,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"Ieslēgts"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Izslēgts"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Nav pieejams"</string> - <string name="tile_disabled" msgid="373212051546573069">"Atspējots"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"Navigācijas josla"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Izkārtojums"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Kreisās puses papildu pogas veids"</string> @@ -668,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Dažas funkcijas ir ierobežotas, kamēr notiek tālruņa atdzišana.\nPieskarieties, lai uzzinātu vairāk."</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"Jūsu tālrunis automātiski mēģinās atdzist. Jūs joprojām varat izmantot tālruni, taču tas, iespējams, darbosies lēnāk.\n\nTiklīdz tālrunis būs atdzisis, tas darbosies normāli."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Skatīt apkopes norādījumus"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Lādētāja atvienošana"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"Uzlādējot šo ierīci, radās problēma. Atvienojiet strāvas adapteri. Esiet uzmanīgs — vads var būt uzsilis."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"Skatīt apkopes norādījumus"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Saīsne kreisajā pusē"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Saīsne labajā pusē"</string> diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml index 523ae5d744cd..a241e54cd855 100644 --- a/packages/SystemUI/res/values-mk/strings.xml +++ b/packages/SystemUI/res/values-mk/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Не се препознава ликот. Користете отпечаток."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Не се препознава ликот"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Користи отпечаток"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth е поврзан."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Процентот на батеријата е непознат."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Поврзано со <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> @@ -339,8 +341,7 @@ <string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Се полни • Полна по <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> <string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Се полни брзо • Полна по <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> <string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Се полни бавно • Полна по <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> - <!-- no translation found for keyguard_indication_charging_time_dock (3149328898931741271) --> - <skip /> + <string name="keyguard_indication_charging_time_dock" msgid="3149328898931741271">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Се полни • Полна по <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Промени го корисникот"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"паѓачко мени"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Сите апликации и податоци во сесијата ќе се избришат."</string> @@ -420,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Преклопување титли"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"овозможи"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"оневозможи"</string> + <string name="sound_settings" msgid="8874581353127418308">"Звук и вибрации"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Поставки"</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> @@ -595,7 +598,7 @@ <string name="switch_bar_on" msgid="1770868129120096114">"Вклучено"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Исклучено"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Недостапно"</string> - <string name="tile_disabled" msgid="373212051546573069">"Оневозможено"</string> + <string name="accessibility_tile_disabled_by_policy_action_description" msgid="6958422730461646926">"дознајте повеќе"</string> <string name="nav_bar" msgid="4642708685386136807">"Лента за навигација"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Распоред"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Тип дополнително лево копче"</string> @@ -668,8 +671,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Некои функции се ограничени додека телефонот се лади.\nДопрете за повеќе информации"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"Телефонот автоматски ќе се обиде да се олади. Вие сепак ќе може да го користите, но тој може да работи побавно.\n\nОткако ќе се олади, ќе работи нормално."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Прикажи ги чекорите за грижа за уредот"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Исклучете го полначот"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"Има проблем со полнењето на уредов. Исклучете го адаптерот за напојување и внимавајте зошто кабелот може да е топол."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"Прикажи ги чекорите за грижа за уредот"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Лева кратенка"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Десна кратенка"</string> diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index 26a47de860ca..4ff230181581 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"മുഖം തിരിച്ചറിയാനായില്ല. പകരം ഫിംഗർപ്രിന്റ് ഉപയോഗിക്കൂ."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"മുഖം തിരിച്ചറിയാനാകുന്നില്ല"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"പകരം ഫിംഗർപ്രിന്റ് ഉപയോഗിക്കൂ"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"ബ്ലൂടൂത്ത് കണക്റ്റുചെയ്തു."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"ബാറ്ററി ശതമാനം അജ്ഞാതമാണ്."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> എന്നതിലേക്ക് കണക്റ്റുചെയ്തു."</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"അടിക്കുറിപ്പുകൾ മുകളിൽ വയ്ക്കുക"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"പ്രവർത്തനക്ഷമമാക്കുക"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"പ്രവർത്തനരഹിതമാക്കുക"</string> + <string name="sound_settings" msgid="8874581353127418308">"ശബ്ദവും വൈബ്രേഷനും"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"ക്രമീകരണം"</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> @@ -594,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"ഓൺ"</string> <string name="switch_bar_off" msgid="5669805115416379556">"ഓഫ്"</string> <string name="tile_unavailable" msgid="3095879009136616920">"ലഭ്യമല്ല"</string> - <string name="tile_disabled" msgid="373212051546573069">"പ്രവർത്തനരഹിതമാക്കി"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"നാവിഗേഷൻ ബാർ"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"ലേഔട്ട്"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"അധിക ഇടത് ബട്ടൺ തരം"</string> @@ -667,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"ഫോൺ തണുത്തുകൊണ്ടിരിക്കുമ്പോൾ ചില ഫീച്ചറുകൾ പരിമിതപ്പെടുത്തപ്പെടും.\nകൂടുതൽ വിവരങ്ങൾക്ക് ടാപ്പ് ചെയ്യുക"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"നിങ്ങളുടെ ഫോൺ സ്വയമേവ തണുക്കാൻ ശ്രമിക്കും. നിങ്ങൾക്ക് അപ്പോഴും ഫോൺ ഉപയോഗിക്കാമെങ്കിലും പ്രവർത്തനം മന്ദഗതിയിലായിരിക്കും.\n\nതണുത്തുകഴിഞ്ഞാൽ, ഫോൺ സാധാരണ ഗതിയിൽ പ്രവർത്തിക്കും."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"പരിപാലന നിർദ്ദേശങ്ങൾ കാണുക"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"ചാർജർ അൺപ്ലഗ് ചെയ്യുക"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"ഈ ഉപകരണം ചാർജ് ചെയ്യുന്നതിൽ തടസ്സമുണ്ട്. പവർ അഡാപ്റ്റർ അൺപ്ലഗ് ചെയ്യുക, കേബിളിന് ചൂടുണ്ടായിരിക്കുമെന്നതിനാൽ ശ്രദ്ധിക്കണം."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"മുൻകരുതൽ നടപടികൾ കാണുക"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"ഇടത് കുറുക്കുവഴി"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"വലത് കുറുക്കുവഴി"</string> diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml index 0f01c7a462bb..a3d13bd447de 100644 --- a/packages/SystemUI/res/values-mn/strings.xml +++ b/packages/SystemUI/res/values-mn/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Царай таних боломжгүй. Оронд нь хурууны хээ ашигла"</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Царайг танихгүй байна"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Оронд нь хурууны хээ ашиглах"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth холбогдсон."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Батарейн хувь тодорхойгүй байна."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g>-тай холбогдсон."</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Давхарласан хадмал"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"идэвхжүүлэх"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"идэвхгүй болгох"</string> + <string name="sound_settings" msgid="8874581353127418308">"Дуу, чичиргээ"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Тохиргоо"</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> @@ -594,7 +598,7 @@ <string name="switch_bar_on" msgid="1770868129120096114">"Идэвхтэй"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Идэвхгүй"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Боломжгүй"</string> - <string name="tile_disabled" msgid="373212051546573069">"Идэвхгүй болгосон"</string> + <string name="accessibility_tile_disabled_by_policy_action_description" msgid="6958422730461646926">"нэмэлт мэдээлэл авах"</string> <string name="nav_bar" msgid="4642708685386136807">"Навигацын самбар"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Бүдүүвч"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Нэмэлт зүүн товчлуураар шивэх"</string> @@ -667,8 +671,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Утсыг хөрөх үед зарим онцлогийг хязгаарлана.\nДэлгэрэнгүй мэдээлэл авах бол товшино уу"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"Таны утас автоматаар хөрөх болно. Та утсаа ашиглаж болох хэдий ч удаан ажиллаж болзошгүй.\n\nТаны утас хөрсний дараагаар хэвийн ажиллана."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Хянамж болгоомжийн алхмыг харах"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Цэнэглэгчийг салгана уу"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"Энэ төхөөрөмжийг цэнэглэхэд асуудал гарлаа. Тэжээлийн залгуурыг салгана уу. Кабель халсан байж болзошгүй тул болгоомжтой байгаарай."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"Хянамж болгоомжийн алхмыг харна уу"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Зүүн товчлол"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Баруун товчлол"</string> diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index 167ad7b995ff..c9f3bc27cdc2 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"चेहरा ओळखू शकत नाही. त्याऐवजी फिंगरप्रिंट वापरा."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"चेहरा ओळखू शकत नाही"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"त्याऐवजी फिंगरप्रिंट वापरा"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"ब्लूटूथ कनेक्ट केले."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"बॅटरीच्या चार्जिंगची टक्केवारी माहित नाही."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> शी कनेक्ट केले."</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"कॅप्शन ओव्हरले करा"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"सुरू करा"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"बंद करा"</string> + <string name="sound_settings" msgid="8874581353127418308">"आवाज आणि व्हायब्रेशन"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"सेटिंग्ज"</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> @@ -594,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"सुरू"</string> <string name="switch_bar_off" msgid="5669805115416379556">"बंद"</string> <string name="tile_unavailable" msgid="3095879009136616920">"उपलब्ध नाही"</string> - <string name="tile_disabled" msgid="373212051546573069">"बंद केली"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"नॅव्हिगेशन बार"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"लेआउट"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"अतिरिक्त डाव्या बटणाचा प्रकार"</string> @@ -667,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"फोन थंड होईपर्यंत काही वैशिष्ट्ये मर्यादित केली.\nअधिक माहितीसाठी टॅप करा"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"तुमचा फोन स्वयंचलितपणे थंड होईल. तुम्ही अद्यापही तुमचा फोन वापरू शकता परंतु तो कदाचित धीमेपणे कार्य करेल.\n\nतुमचा फोन एकदा थंड झाला की, तो सामान्यपणे कार्य करेल."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"काय काळजी घ्यावी ते पहा"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"चार्जर अनप्लग करा"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"हे डिव्हाइस चार्ज करताना समस्या आहे. पॉवर अडॅप्टर अनप्लग करा आणि शक्य तेवढी काळजी घ्या कदाचित केबल गरम असू शकते."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"काय काळजी घ्यावी ते पहा"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"डावा शॉर्टकट"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"उजवा शॉर्टकट"</string> diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index 5e1c517d21b7..b161345a3d9c 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Tidak mengenali wajah. Gunakan cap jari."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Tak dapat mengecam wajah"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Gunakan cap jari"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth disambungkan."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Peratusan kuasa bateri tidak diketahui."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Disambungkan kepada <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Tindanan kapsyen"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"dayakan"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"lumpuhkan"</string> + <string name="sound_settings" msgid="8874581353127418308">"Bunyi & getaran"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Tetapan"</string> <string name="screen_pinning_title" msgid="9058007390337841305">"Apl telah disemat"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Tindakan ini memastikan skrin kelihatan sehingga anda menyahsemat. Sentuh & tahan Kembali dan Ikhtisar untuk menyahsemat."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Tindakan ini memastikan skrin kelihatan sehingga anda menyahsemat. Sentuh & tahan Kembali dan Skrin Utama untuk menyahsemat."</string> @@ -594,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"Hidup"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Mati"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Tidak tersedia"</string> - <string name="tile_disabled" msgid="373212051546573069">"Dilumpuhkan"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"Bar navigasi"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Reka letak"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Jenis butang kiri tambahan"</string> @@ -667,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Sesetengah ciri adalah terhad semasa telefon menyejuk.\nKetik untuk mendapatkan maklumat lanjut"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"Telefon anda akan cuba menyejuk secara automatik. Anda masih dapat menggunakan telefon itu tetapi telefon tersebut mungkin berjalan lebih perlahan.\n\nSetelah telefon anda sejuk, telefon itu akan berjalan seperti biasa."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Lihat langkah penjagaan"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Cabut palam pengejas"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"Terdapat isu semasa mengecas peranti ini. Cabut palam penyesuai kuasa. Berhati-hati kerana kabel mungkin hangat."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"Lihat langkah penjagaan"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Pintasan kiri"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Pintasan kanan"</string> diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml index e7ddf6895139..3f201ac37ded 100644 --- a/packages/SystemUI/res/values-my/strings.xml +++ b/packages/SystemUI/res/values-my/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"မျက်နှာကို မမှတ်မိပါ။ လက်ဗွေကို အစားထိုးသုံးပါ။"</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"မျက်နှာကို မမှတ်မိပါ"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"လက်ဗွေကို အစားထိုးသုံးပါ"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"ဘလူးတုသ်ချိတ်ဆက်ထားမှု"</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"ဘက်ထရီရာခိုင်နှုန်းကို မသိပါ။"</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g>သို့ ချိတ်ဆက်ထား"</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"စာတန်းများ ထပ်ပိုးရန်"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"ဖွင့်ရန်"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"ပိတ်ရန်"</string> + <string name="sound_settings" msgid="8874581353127418308">"အသံနှင့် တုန်ခါမှု"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"ဆက်တင်များ"</string> <string name="screen_pinning_title" msgid="9058007390337841305">"အက်ပ်ကို ပင်ထိုးထားသည်"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"သင်ပင်မဖြုတ်မခြင်း ၎င်းကို ပြသထားပါမည်။ ပင်ဖြုတ်ရန် Back နှင့် Overview ကို ထိ၍ဖိထားပါ။"</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"သင်က ပင်မဖြုတ်မခြင်း ၎င်းကို ပြသထားပါမည်။ ပင်ဖြုတ်ရန် \'နောက်သို့\' နှင့် \'ပင်မ\' ခလုတ်တို့ကို တို့၍ဖိထားပါ။"</string> @@ -569,7 +573,7 @@ <string name="notif_inline_reply_remove_attachment_description" msgid="7954075334095405429">"ပူးတွဲပါဖိုင်ကို ဖယ်ရှားရန်"</string> <string name="keyboard_shortcut_group_system" msgid="1583416273777875970">"စနစ်"</string> <string name="keyboard_shortcut_group_system_home" msgid="7465138628692109907">"ပင်မ"</string> - <string name="keyboard_shortcut_group_system_recents" msgid="8628108256824616927">"လတ်တလော"</string> + <string name="keyboard_shortcut_group_system_recents" msgid="8628108256824616927">"မကြာသေးမီက"</string> <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"နောက်သို့"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"အကြောင်းကြားချက်များ"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"ကီးဘုတ် ဖြတ်လမ်းများ"</string> @@ -594,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"ဖွင့်"</string> <string name="switch_bar_off" msgid="5669805115416379556">"ပိတ်"</string> <string name="tile_unavailable" msgid="3095879009136616920">"မရနိုင်ပါ"</string> - <string name="tile_disabled" msgid="373212051546573069">"ပိတ်ထားသည်"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"ရွှေ့လျားရန်ဘားတန်း"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"အပြင်အဆင်"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"လက်ဝဲခလုတ် အမျိုးအစားအပို"</string> @@ -667,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"ဖုန်းကို အေးအောင်ပြုလုပ်နေစဉ်တွင် အချို့ဝန်ဆောင်မှုများကို ကန့်သတ်ထားပါသည်။\nနောက်ထပ်အချက်အလက်များအတွက် တို့ပါ"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"သင့်ဖုန်းသည် အလိုအလျောက် ပြန်အေးသွားပါလိမ့်မည်။ ဖုန်းကို အသုံးပြုနိုင်ပါသေးသည် သို့သော် ပိုနှေးနိုင်ပါသည်။\n\nသင့်ဖုန်း အေးသွားသည်နှင့် ပုံမှန်အတိုင်း ပြန်အလုပ်လုပ်ပါလိမ့်မည်။"</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"ဂရုပြုစရာ အဆင့်များ ကြည့်ရန်"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"အားသွင်းကိရိယာ ပလပ်ဖြုတ်ပါ"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"ဤစက်ပစ္စည်းကို အားသွင်းရာတွင် ပြဿနာရှိနေသည်။ ပါဝါ ကြားခံကိရိယာကို ပလပ်ဖြုတ်ပါ။ ကေဘယ်ကြိုး ပူနွေးနေနိုင်သဖြင့် သတိထားပါ။"</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"ဂရုပြုစရာ အဆင့်များ ကြည့်ရန်"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"လက်ဝဲ ဖြတ်လမ်းလင့်ခ်"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"လက်ယာ ဖြတ်လမ်းလင့်ခ်"</string> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index 839569441690..24dcef7fdf76 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Ansiktet gjenkjennes ikke. Bruk fingeravtrykk."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Ansiktet gjenkjennes ikke"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Bruk fingeravtrykk"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth er tilkoblet."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Batteriprosenten er ukjent."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Koblet til <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Overlegg med teksting"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"aktivér"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"deaktiver"</string> + <string name="sound_settings" msgid="8874581353127418308">"Lyd og vibrering"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Innstillinger"</string> <string name="screen_pinning_title" msgid="9058007390337841305">"Appen er festet"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Gjør at den vises til du løsner den. Trykk og hold inne Tilbake og Oversikt for å løsne den."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Gjør at den vises til du løsner den. Trykk og hold inne Tilbake og Startside for å løsne den."</string> @@ -594,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"På"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Av"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Utilgjengelig"</string> - <string name="tile_disabled" msgid="373212051546573069">"Slått av"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"Navigasjonsrad"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Oppsett"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Ekstra venstre-knapptype"</string> @@ -667,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Enkelte funksjoner er begrenset mens telefonen kjøles ned.\nTrykk for å se mer informasjon"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"Telefonen din kommer til å prøve å kjøle seg ned automatisk. Du kan fremdeles bruke telefonen, men den kjører muligens saktere.\n\nTelefonen kommer til å kjøre som normalt, når den har kjølt seg ned."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Se vedlikeholdstrinnene"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Koble fra laderen"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"Det oppsto et problem med lading av enheten. Koble fra strømadapteren, og vær forsiktig, kabelen kan være varm."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"Se vedlikeholdstrinnene"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Venstre hurtigtast"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Høyre hurtigtast"</string> diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index 8e97af9def4f..4f85e3e9c0d0 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"अनुहार पहिचान गर्न सकिएन। बरु फिंगरप्रिन्ट प्रयोग गर्नुहोस्।"</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"अनुहार पहिचान गर्न सकिएन"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"बरु फिंगरप्रिन्ट प्रयोग गर्नुहोस्"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"ब्लुटुथ जडान भयो।"</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"ब्याट्रीमा कति प्रतिशत चार्ज छ भन्ने कुराको जानाकरी छैन।"</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> मा जडित।"</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"क्याप्सनको ओभरले"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"सक्षम पार्नुहोस्"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"असक्षम पार्नुहोस्"</string> + <string name="sound_settings" msgid="8874581353127418308">"साउन्ड तथा भाइब्रेसन"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"सेटिङ"</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> @@ -594,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"अन छ"</string> <string name="switch_bar_off" msgid="5669805115416379556">"अफ छ"</string> <string name="tile_unavailable" msgid="3095879009136616920">"उपलब्ध छैन"</string> - <string name="tile_disabled" msgid="373212051546573069">"अफ गरियो"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"नेभिगेशन पट्टी"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"लेआउट"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"अतिरिक्त बायाँतिरको बटनको प्रकार"</string> @@ -667,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"फोन नचिस्सिँदासम्म केही सुविधाहरू उपलब्ध हुने छैनन्।\nथप जानकारीका लागि ट्याप गर्नुहोस्"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"तपाईंको फोन स्वतः चिसो हुने प्रयास गर्ने छ। तपाईं अझै पनि आफ्नो फोनको प्रयोग गर्न सक्नुहुन्छ तर त्यो अझ ढिलो चल्न सक्छ।\n\nचिसो भएपछि तपाईंको फोन सामान्य गतिमा चल्नेछ।"</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"डिभाइसको हेरचाह गर्ने तरिका हेर्नुहोस्"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"चार्जर अनप्लग गर्नुहोस्"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"यो डिभाइस चार्ज गर्दा कुनै समस्या भयो। पावर एडाप्टर अनप्लग गर्नुहोस् र केबल तातो हुन सक्ने भएकाले ध्यान दिनुहोस्।"</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"हेरचाहसम्बन्धी चरणहरू हेर्नुहोस्"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"बायाँतिरको सर्टकट"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"दायाँतिरको सर्टकट"</string> diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index ea865225d8fb..ee08b0146965 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Gezicht niet herkend. Gebruik je vingerafdruk."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Gezicht niet herkend"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Vingerafdruk gebruiken"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth-verbinding ingesteld."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Batterijpercentage onbekend."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Verbonden met <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Ondertitelingsoverlay"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"aanzetten"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"uitzetten"</string> + <string name="sound_settings" msgid="8874581353127418308">"Geluid en trillen"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Instellingen"</string> <string name="screen_pinning_title" msgid="9058007390337841305">"App is vastgezet"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Het scherm blijft zichtbaar totdat je het losmaakt. Tik op Terug en Overzicht en houd deze vast om het scherm los te maken."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Het scherm blijft zichtbaar totdat je het losmaakt. Tik op Terug en Home en houd deze vast om het scherm los te maken."</string> @@ -594,7 +598,7 @@ <string name="switch_bar_on" msgid="1770868129120096114">"Aan"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Uit"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Niet beschikbaar"</string> - <string name="tile_disabled" msgid="373212051546573069">"Uitgezet"</string> + <string name="accessibility_tile_disabled_by_policy_action_description" msgid="6958422730461646926">"meer informatie"</string> <string name="nav_bar" msgid="4642708685386136807">"Navigatiebalk"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Lay-out"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Extra knoptype links"</string> @@ -667,8 +671,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Bepaalde functies zijn beperkt terwijl de telefoon afkoelt.\nTik voor meer informatie"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"Je telefoon probeert automatisch af te koelen. Je kunt je telefoon nog steeds gebruiken, maar deze kan langzamer werken.\n\nZodra de telefoon is afgekoeld, werkt deze weer normaal."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Onderhoudsstappen bekijken"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Oplader loskoppelen"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"Er is een probleem met het opladen van dit apparaat. Koppel de voedingsadapter los. Wees voorzichtig, want de kabel kan warm zijn."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"Onderhoudsstappen bekijken"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Snelkoppeling links"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Snelkoppeling rechts"</string> diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml index 31929c520767..6923145f93b5 100644 --- a/packages/SystemUI/res/values-or/strings.xml +++ b/packages/SystemUI/res/values-or/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"ଫେସ୍ ଚିହ୍ନଟ କରିହେବ ନାହିଁ। ଟିପଚିହ୍ନ ବ୍ୟବହାର କରନ୍ତୁ।"</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"ଫେସ ଚିହ୍ନଟ ହୋଇପାରିବ ନାହିଁ"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"ଟିପଚିହ୍ନ ବ୍ୟବହାର କରନ୍ତୁ"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"ବ୍ଲୁଟୂଥ୍ ସଂଯୋଗ କରାଯାଇଛି।"</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"ବ୍ୟାଟେରୀ ଶତକଡ଼ା ଅଜଣା ଅଟେ।"</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> ସହ ସଂଯୁକ୍ତ"</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"କ୍ୟାପ୍ସନ୍ର ଓଭର୍ଲେ"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"ସକ୍ଷମ କରନ୍ତୁ"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"ଅକ୍ଷମ କରନ୍ତୁ"</string> + <string name="sound_settings" msgid="8874581353127418308">"ସାଉଣ୍ଡ ଓ ଭାଇବ୍ରେସନ"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"ସେଟିଂସ"</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> @@ -594,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"ଚାଲୁ ଅଛି"</string> <string name="switch_bar_off" msgid="5669805115416379556">"ବନ୍ଦ ଅଛି"</string> <string name="tile_unavailable" msgid="3095879009136616920">"ଅନୁପଲବ୍ଧ"</string> - <string name="tile_disabled" msgid="373212051546573069">"ଅକ୍ଷମ କରାଯାଇଛି"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"ନାଭିଗେଶନ୍ ବାର୍"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"ଲେଆଉଟ୍"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"ସମ୍ପୂର୍ଣ୍ଣ ବାମ ବଟନ୍ ପ୍ରକାର"</string> @@ -667,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"ଫୋନ୍ ଥଣ୍ଡା ହେବା ସମୟରେ କିଛି ଫିଚର୍ ଠିକ ଭାବେ କାମ କରିନଥାଏ।\nଅଧିକ ସୂଚନା ପାଇଁ ଟାପ୍ କରନ୍ତୁ"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"ଆପଣଙ୍କ ଫୋନ୍ ସ୍ୱଚାଳିତ ଭାବେ ଥଣ୍ଡା ହେବାକୁ ଚେଷ୍ଟା କରିବ। ଆପଣ ତଥାପି ନିଜ ଫୋନ୍ ବ୍ୟବହାର କରିପାରିବେ, କିନ୍ତୁ ଏହା ଧୀରେ ଚାଲିପାରେ।\n\nଆପଣଙ୍କ ଫୋନ୍ ଥଣ୍ଡା ହୋଇଯିବାପରେ, ଏହା ସାମାନ୍ୟ ଭାବେ ଚାଲିବ।"</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"ଯତ୍ନ ନେବା ପାଇଁ ଷ୍ଟେପଗୁଡ଼ିକ ଦେଖନ୍ତୁ"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"ଚାର୍ଜର୍ ଅନ୍ପ୍ଲଗ୍ କରନ୍ତୁ"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"ଏହି ଡିଭାଇସ୍ ଚାର୍ଜ କରିବାରେ ଗୋଟିଏ ସମସ୍ୟା ଅଛି। ଯେହେତୁ କେବଳ ଗରମ ହୋଇଯାଇପାରେ, ତେଣୁ ପାୱାର୍ ଆଡପ୍ଟର୍ ଅନ୍ପ୍ଲଗ୍ କରନ୍ତୁ ଏବଂ ଯତ୍ନ ନିଅନ୍ତୁ।"</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"ସେବା ସମ୍ବନ୍ଧିତ ଷ୍ଟେପ୍ଗୁଡ଼ିକ ଦେଖନ୍ତୁ"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"ବାମ ଶର୍ଟକଟ୍"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"ଡାହାଣ ଶର୍ଟକଟ୍"</string> diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index 13741218c364..2beeb5969b1b 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"ਚਿਹਰਾ ਨਹੀਂ ਪਛਾਣ ਸਕਦੇ। ਇਸਦੀ ਬਜਾਏ ਫਿੰਗਰਪ੍ਰਿੰਟ ਵਰਤੋ।"</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"ਚਿਹਰੇ ਦੀ ਪਛਾਣ ਨਹੀਂ ਹੋਈ"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"ਇਸਦੀ ਬਜਾਏ ਫਿੰਗਰਪ੍ਰਿੰਟ ਵਰਤੋ"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth ਕਨੈਕਟ ਕੀਤੀ।"</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"ਬੈਟਰੀ ਪ੍ਰਤੀਸ਼ਤ ਅਗਿਆਤ ਹੈ।"</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ।"</string> @@ -339,8 +341,7 @@ <string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • ਚਾਰਜ ਹੋ ਰਿਹਾ ਹੈ • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> ਵਿੱਚ ਪੂਰਾ ਚਾਰਜ ਹੋਵੇਗਾ"</string> <string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • ਤੇਜ਼ ਚਾਰਜ ਹੋ ਰਿਹਾ ਹੈ • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> ਵਿੱਚ ਪੂਰਾ ਚਾਰਜ ਹੋਵੇਗਾ"</string> <string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • ਹੌਲੀ ਚਾਰਜ ਹੋ ਰਿਹਾ ਹੈ • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> ਵਿੱਚ ਪੂਰਾ ਚਾਰਜ ਹੋਵੇਗਾ"</string> - <!-- no translation found for keyguard_indication_charging_time_dock (3149328898931741271) --> - <skip /> + <string name="keyguard_indication_charging_time_dock" msgid="3149328898931741271">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • ਚਾਰਜ ਹੋ ਰਿਹਾ ਹੈ • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> ਵਿੱਚ ਪੂਰਾ ਚਾਰਜ ਹੋਵੇਗਾ"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"ਵਰਤੋਂਕਾਰ ਸਵਿੱਚ ਕਰੋ"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"ਪੁੱਲਡਾਊਨ ਮੀਨੂ"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"ਇਸ ਸੈਸ਼ਨ ਵਿਚਲੀਆਂ ਸਾਰੀਆਂ ਐਪਾਂ ਅਤੇ ਡਾਟਾ ਨੂੰ ਮਿਟਾ ਦਿੱਤਾ ਜਾਏਗਾ।"</string> @@ -420,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"ਸੁਰਖੀਆਂ ਓਵਰਲੇ"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"ਚਾਲੂ ਕਰੋ"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"ਬੰਦ ਕਰੋ"</string> + <string name="sound_settings" msgid="8874581353127418308">"ਧੁਨੀ ਅਤੇ ਥਰਥਰਾਹਟ"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"ਸੈਟਿੰਗਾਂ"</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> @@ -595,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"ਚਾਲੂ"</string> <string name="switch_bar_off" msgid="5669805115416379556">"ਬੰਦ"</string> <string name="tile_unavailable" msgid="3095879009136616920">"ਅਣਉਪਲਬਧ"</string> - <string name="tile_disabled" msgid="373212051546573069">"ਬੰਦ ਹੈ"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"ਨੈਵੀਗੇਸ਼ਨ ਵਾਲੀ ਪੱਟੀ"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"ਖਾਕਾ"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"ਵਧੇਰੇ ਖੱਬੇ ਬਟਨ ਕਿਸਮ"</string> @@ -668,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"ਫ਼ੋਨ ਦੇ ਠੰਡਾ ਹੋਣ ਦੇ ਦੌਰਾਨ ਕੁਝ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਸੀਮਤ ਹੁੰਦੀਆਂ ਹਨ।\nਵਧੇਰੇ ਜਾਣਕਾਰੀ ਲਈ ਟੈਪ ਕਰੋ"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"ਤੁਹਾਡਾ ਫ਼ੋਨ ਸਵੈਚਲਿਤ ਰੂਪ ਵਿੱਚ ਠੰਡਾ ਹੋਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੇਗਾ। ਤੁਸੀਂ ਹਾਲੇ ਵੀ ਆਪਣੇ ਫ਼ੋਨ ਨੂੰ ਵਰਤ ਸਕਦੇ ਹੋ, ਪਰੰਤੂ ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਇਹ ਵਧੇਰੇ ਹੌਲੀ ਚੱਲੇ।\n\nਇੱਕ ਵਾਰ ਠੰਡਾ ਹੋਣ ਤੋਂ ਬਾਅਦ ਤੁਹਾਡਾ ਫ਼ੋਨ ਸਧਾਰਨ ਤੌਰ \'ਤੇ ਚੱਲੇਗਾ।"</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"ਦੇਖਭਾਲ ਦੇ ਪੜਾਅ ਦੇਖੋ"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"ਚਾਰਜਰ ਨੂੰ ਕੱਢੋ"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"ਇਸ ਡੀਵਾਈਸ ਨੂੰ ਚਾਰਜ ਕਰਨ ਵਿੱਚ ਕੋਈ ਸਮੱਸਿਆ ਆ ਗਈ ਹੈ। ਪਾਵਰ ਅਡਾਪਟਰ ਨੂੰ ਕੱਢੋ ਅਤੇ ਧਿਆਨ ਰੱਖੋ ਸ਼ਾਇਦ ਕੇਬਲ ਗਰਮ ਹੋਵੇ।"</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"ਦੇਖਭਾਲ ਦੇ ਪੜਾਅ ਦੇਖੋ"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"ਖੱਬਾ ਸ਼ਾਰਟਕੱਟ"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"ਸੱਜਾ ਸ਼ਾਰਟਕੱਟ"</string> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index dafa699ef4ec..9449f267a2e0 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Nie rozpoznaję twarzy. Użyj odcisku palca."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Nie można rozpoznać twarzy"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Użyj odcisku palca"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth połączony."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Poziom naładowania baterii jest nieznany."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Połączono z <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> @@ -339,11 +341,9 @@ <string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Ładowanie • Pełne naładowanie za <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> <string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Szybkie ładowanie • Pełne naładowanie za <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> <string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Wolne ładowanie • Pełne naładowanie za <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> - <!-- no translation found for keyguard_indication_charging_time_dock (3149328898931741271) --> - <skip /> + <string name="keyguard_indication_charging_time_dock" msgid="3149328898931741271">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Ładowanie • Pełne naładowanie za <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Przełącz użytkownika"</string> - <!-- no translation found for accessibility_multi_user_list_switcher (8574105376229857407) --> - <skip /> + <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menu"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Wszystkie aplikacje i dane w tej sesji zostaną usunięte."</string> <string name="guest_wipe_session_title" msgid="7147965814683990944">"Witaj ponownie, Gościu!"</string> <string name="guest_wipe_session_message" msgid="3393823610257065457">"Chcesz kontynuować sesję?"</string> @@ -421,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Nakładka z napisami"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"włącz"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"wyłącz"</string> + <string name="sound_settings" msgid="8874581353127418308">"Dźwięk i wibracje"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Ustawienia"</string> <string name="screen_pinning_title" msgid="9058007390337841305">"Aplikacja jest przypięta"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Ekran będzie widoczny, dopóki go nie odepniesz. Aby to zrobić, kliknij i przytrzymaj Wstecz oraz Przegląd."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Ekran będzie widoczny, dopóki go nie odepniesz. Aby to zrobić, naciśnij i przytrzymaj Wstecz oraz Ekran główny."</string> @@ -596,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"Włączono"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Wyłączono"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Niedostępne"</string> - <string name="tile_disabled" msgid="373212051546573069">"Wyłączono"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"Pasek nawigacji"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Układ"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Typ dodatkowego lewego przycisku"</string> @@ -669,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Podczas obniżania temperatury telefonu niektóre funkcje są ograniczone\nKliknij, by dowiedzieć się więcej"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"Telefon automatycznie podejmie próbę obniżenia temperatury. Możesz go wciąż używać, ale telefon może działać wolniej.\n\nGdy temperatura się obniży, telefon będzie działał normalnie."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Zobacz instrukcję postępowania"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Odłącz ładowarkę"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"Podczas ładowania tego urządzenia wystąpił błąd. Odłącz zasilacz, zwracając uwagę na kabel, który może być gorący."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"Zobacz instrukcję postępowania"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Lewy skrót"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Prawy skrót"</string> diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index 59aee9b72587..2f9a36e64f29 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Não foi possível reconhecer o rosto Use a impressão digital."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Rosto não reconhecido"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Use a impressão digital"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth conectado."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Porcentagem da bateria desconhecida."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Conectado a <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> @@ -202,7 +204,7 @@ <string name="accessibility_sensors_off_active" msgid="2619725434618911551">"A opção \"Sensores desativados\" está ativa"</string> <string name="accessibility_clear_all" msgid="970525598287244592">"Limpar todas as notificações."</string> <string name="notification_group_overflow_indicator" msgid="7605120293801012648">"Mais <xliff:g id="NUMBER">%s</xliff:g>"</string> - <string name="notification_group_overflow_description" msgid="7176322877233433278">"{count,plural, =1{Mais # notificação no grupo.}one{Mais # notificação no grupo.}other{Mais # notificações no grupo.}}"</string> + <string name="notification_group_overflow_description" msgid="7176322877233433278">"{count,plural, =1{Mais # notificação no grupo.}one{Mais # notificação no grupo.}many{Mais # de notificações no grupo.}other{Mais # notificações no grupo.}}"</string> <string name="accessibility_rotation_lock_on_landscape" msgid="936972553861524360">"A tela está bloqueada na orientação paisagem."</string> <string name="accessibility_rotation_lock_on_portrait" msgid="2356633398683813837">"A tela está bloqueada na orientação retrato."</string> <string name="dessert_case" msgid="9104973640704357717">"Mostruário de sobremesas"</string> @@ -250,7 +252,7 @@ <string name="quick_settings_hotspot_label" msgid="1199196300038363424">"Ponto de acesso"</string> <string name="quick_settings_hotspot_secondary_label_transient" msgid="7585604088079160564">"Ativando…"</string> <string name="quick_settings_hotspot_secondary_label_data_saver_enabled" msgid="1280433136266439372">"Economia de dados ativada"</string> - <string name="quick_settings_hotspot_secondary_label_num_devices" msgid="7536823087501239457">"{count,plural, =1{# dispositivo}one{# dispositivo}other{# dispositivos}}"</string> + <string name="quick_settings_hotspot_secondary_label_num_devices" msgid="7536823087501239457">"{count,plural, =1{# dispositivo}one{# dispositivo}many{# de dispositivos}other{# dispositivos}}"</string> <string name="quick_settings_flashlight_label" msgid="4904634272006284185">"Lanterna"</string> <string name="quick_settings_flashlight_camera_in_use" msgid="4820591564526512571">"Câmera em uso"</string> <string name="quick_settings_cellular_detail_title" msgid="792977203299358893">"Dados móveis"</string> @@ -351,7 +353,7 @@ <string name="guest_notification_session_active" msgid="5567273684713471450">"Você está no modo visitante"</string> <string name="user_add_user_message_guest_remove" msgid="5589286604543355007">\n\n"Ao adicionar um novo usuário, o dispositivo vai sair do modo visitante e excluir todos os apps e dados da Sessão de visitante atual."</string> <string name="user_limit_reached_title" msgid="2429229448830346057">"Limite de usuários atingido"</string> - <string name="user_limit_reached_message" msgid="1070703858915935796">"{count,plural, =1{Você só pode criar 1 usuário.}one{Você pode adicionar até # usuário.}other{Você pode adicionar até # usuários.}}"</string> + <string name="user_limit_reached_message" msgid="1070703858915935796">"{count,plural, =1{Você só pode criar 1 usuário.}one{Você pode adicionar até # usuário.}many{Você pode adicionar até # de usuários.}other{Você pode adicionar até # usuários.}}"</string> <string name="user_remove_user_title" msgid="9124124694835811874">"Remover usuário?"</string> <string name="user_remove_user_message" msgid="6702834122128031833">"Todos os apps e dados deste usuário serão excluídos."</string> <string name="user_remove_user_remove" msgid="8387386066949061256">"Remover"</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Sobreposição de legendas"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"ativar"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"desativar"</string> + <string name="sound_settings" msgid="8874581353127418308">"Som e vibração"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Configurações"</string> <string name="screen_pinning_title" msgid="9058007390337841305">"O app está fixado"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Ela é mantida à vista até que seja liberada. Toque em Voltar e em Visão geral e mantenha essas opções pressionadas para liberar."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Ela é mantida à vista até que seja liberada. Toque em Voltar e em Início e mantenha essas opções pressionadas para liberar."</string> @@ -537,8 +541,8 @@ <string name="notification_menu_snooze_action" msgid="5415729610393475019">"Lembrete"</string> <string name="snooze_undo" msgid="2738844148845992103">"Desfazer"</string> <string name="snoozed_for_time" msgid="7586689374860469469">"Adiada para <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string> - <string name="snoozeHourOptions" msgid="2332819756222425558">"{count,plural, =1{# hora}=2{# horas}one{# hora}other{# horas}}"</string> - <string name="snoozeMinuteOptions" msgid="2222082405822030979">"{count,plural, =1{# minuto}one{# minuto}other{# minuto}}"</string> + <string name="snoozeHourOptions" msgid="2332819756222425558">"{count,plural, =1{# hora}=2{# horas}one{# hora}many{# de horas}other{# horas}}"</string> + <string name="snoozeMinuteOptions" msgid="2222082405822030979">"{count,plural, =1{# minuto}one{# minuto}many{# de minutos}other{# minuto}}"</string> <string name="battery_detail_switch_title" msgid="6940976502957380405">"Economia de bateria"</string> <string name="keyboard_key_button_template" msgid="8005673627272051429">"Botão <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string> @@ -594,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"Ativado"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Desativado"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Indisponível"</string> - <string name="tile_disabled" msgid="373212051546573069">"Desativado"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"Barra de navegação"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Layout"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Tipo de botão esquerdo extra"</string> @@ -667,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Alguns recursos ficam limitados enquanto o smartphone é resfriado.\nToque para saber mais"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"Seu smartphone tentará se resfriar automaticamente. Você ainda poderá usá-lo, mas talvez ele fique mais lento.\n\nQuando o smartphone estiver resfriado, ele voltará ao normal."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Ver etapas de cuidado"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Desconecte o carregador"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"Ocorreu um problema com o carregamento deste dispositivo. Desconecte o adaptador de energia com cuidado, já que o cabo pode estar quente."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"Ver etapas de cuidado"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Atalho à esquerda"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Atalho à direita"</string> @@ -778,7 +785,7 @@ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"alternar"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Controles do dispositivo"</string> <string name="controls_providers_title" msgid="6879775889857085056">"Escolha um app para adicionar controles"</string> - <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# controle adicionado.}one{# controle adicionado.}other{# controles adicionados.}}"</string> + <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# controle adicionado.}one{# controle adicionado.}many{# de controles adicionados.}other{# controles adicionados.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Removido"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Adicionado como favorito"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Adicionado como favorito (posição <xliff:g id="NUMBER">%d</xliff:g>)"</string> @@ -935,7 +942,7 @@ <string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Adicionar bloco"</string> <string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Não adicionar bloco"</string> <string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Selecionar usuário"</string> - <string name="fgs_manager_footer_label" msgid="8276763570622288231">"{count,plural, =1{# app está ativo}one{# apps está ativo}other{# apps estão ativos}}"</string> + <string name="fgs_manager_footer_label" msgid="8276763570622288231">"{count,plural, =1{# app está ativo}one{# apps está ativo}many{# de apps estão ativos}other{# apps estão ativos}}"</string> <string name="fgs_dot_content_description" msgid="2865071539464777240">"Nova informação"</string> <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Apps ativos"</string> <string name="fgs_manager_dialog_message" msgid="2670045017200730076">"Esses apps ficam ativos e em execução mesmo quando não estão em uso. Isso melhora a funcionalidade deles, mas também pode afetar a duração da bateria."</string> @@ -965,7 +972,7 @@ <string name="dream_overlay_status_bar_camera_off" msgid="5273073778969890823">"A câmera está desativada"</string> <string name="dream_overlay_status_bar_mic_off" msgid="8366534415013819396">"O microfone está desativado"</string> <string name="dream_overlay_status_bar_camera_mic_off" msgid="3199425257833773569">"A câmera e o microfone estão desativados"</string> - <string name="dream_overlay_status_bar_notification_indicator" msgid="8091389255691081711">"{count,plural, =1{# notificação}one{# notificação}other{# notificações}}"</string> + <string name="dream_overlay_status_bar_notification_indicator" msgid="8091389255691081711">"{count,plural, =1{# notificação}one{# notificação}many{# notificações}other{# notificações}}"</string> <string name="dream_overlay_weather_complication_desc" msgid="824503662089783824">"<xliff:g id="WEATHER_CONDITION">%1$s</xliff:g>, <xliff:g id="TEMPERATURE">%2$s</xliff:g>"</string> <string name="broadcasting_description_is_broadcasting" msgid="765627502786404290">"Transmitindo"</string> <string name="bt_le_audio_broadcast_dialog_title" msgid="3605428497924077811">"Interromper a transmissão do app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index 46d5d3a02b77..3251eecb1b47 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Impos. reconh. rosto. Utilize a impressão digital."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Imposs. reconhecer rosto"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Usar impressão digital"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth ligado."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Percentagem da bateria desconhecida."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Ligado a <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> @@ -202,7 +204,7 @@ <string name="accessibility_sensors_off_active" msgid="2619725434618911551">"Sensores desativados ativo"</string> <string name="accessibility_clear_all" msgid="970525598287244592">"Limpar todas as notificações."</string> <string name="notification_group_overflow_indicator" msgid="7605120293801012648">"+ <xliff:g id="NUMBER">%s</xliff:g>"</string> - <string name="notification_group_overflow_description" msgid="7176322877233433278">"{count,plural, =1{Mais # notificação no grupo.}other{Mais # notificações no grupo.}}"</string> + <string name="notification_group_overflow_description" msgid="7176322877233433278">"{count,plural, =1{Mais # notificação no grupo.}many{Mais # notificações no grupo.}other{Mais # notificações no grupo.}}"</string> <string name="accessibility_rotation_lock_on_landscape" msgid="936972553861524360">"O ecrã está bloqueado na orientação horizontal."</string> <string name="accessibility_rotation_lock_on_portrait" msgid="2356633398683813837">"O ecrã está bloqueado na orientação vertical."</string> <string name="dessert_case" msgid="9104973640704357717">"Vitrina de sobremesas"</string> @@ -250,7 +252,7 @@ <string name="quick_settings_hotspot_label" msgid="1199196300038363424">"Zona Wi-Fi"</string> <string name="quick_settings_hotspot_secondary_label_transient" msgid="7585604088079160564">"A ativar..."</string> <string name="quick_settings_hotspot_secondary_label_data_saver_enabled" msgid="1280433136266439372">"Poup. dados ativada"</string> - <string name="quick_settings_hotspot_secondary_label_num_devices" msgid="7536823087501239457">"{count,plural, =1{# dispositivo}other{# dispositivos}}"</string> + <string name="quick_settings_hotspot_secondary_label_num_devices" msgid="7536823087501239457">"{count,plural, =1{# dispositivo}many{# dispositivos}other{# dispositivos}}"</string> <string name="quick_settings_flashlight_label" msgid="4904634272006284185">"Lanterna"</string> <string name="quick_settings_flashlight_camera_in_use" msgid="4820591564526512571">"Câmara em utilização"</string> <string name="quick_settings_cellular_detail_title" msgid="792977203299358893">"Dados móveis"</string> @@ -351,7 +353,7 @@ <string name="guest_notification_session_active" msgid="5567273684713471450">"Está no modo convidado"</string> <string name="user_add_user_message_guest_remove" msgid="5589286604543355007">\n\n"Ao adicionar um novo utilizador, o modo convidado é fechado e todas as apps e dados da sessão de convidado atual são eliminados."</string> <string name="user_limit_reached_title" msgid="2429229448830346057">"Limite de utilizadores alcançado"</string> - <string name="user_limit_reached_message" msgid="1070703858915935796">"{count,plural, =1{Só é possível criar um utilizador.}other{É possível adicionar até # utilizadores.}}"</string> + <string name="user_limit_reached_message" msgid="1070703858915935796">"{count,plural, =1{Só é possível criar um utilizador.}many{É possível adicionar até # utilizadores.}other{É possível adicionar até # utilizadores.}}"</string> <string name="user_remove_user_title" msgid="9124124694835811874">"Remover o utilizador?"</string> <string name="user_remove_user_message" msgid="6702834122128031833">"Serão eliminados todos os dados e todas as aplicações deste utilizador."</string> <string name="user_remove_user_remove" msgid="8387386066949061256">"Remover"</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Sobreposição de legendas"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"ativar"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"desativar"</string> + <string name="sound_settings" msgid="8874581353127418308">"Som e vibração"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Definições"</string> <string name="screen_pinning_title" msgid="9058007390337841305">"A app está fixada"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Esta opção mantém o item visível até o soltar. Toque sem soltar em Anterior e em Vista geral para soltar."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Esta opção mantém o item visível até o soltar. Toque sem soltar em Anterior e em Página inicial para soltar."</string> @@ -537,8 +541,8 @@ <string name="notification_menu_snooze_action" msgid="5415729610393475019">"Lembrar-me"</string> <string name="snooze_undo" msgid="2738844148845992103">"Anular"</string> <string name="snoozed_for_time" msgid="7586689374860469469">"Suspensa por <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string> - <string name="snoozeHourOptions" msgid="2332819756222425558">"{count,plural, =1{# hora}=2{# horas}other{# horas}}"</string> - <string name="snoozeMinuteOptions" msgid="2222082405822030979">"{count,plural, =1{# minuto}other{# minutos}}"</string> + <string name="snoozeHourOptions" msgid="2332819756222425558">"{count,plural, =1{# hora}=2{# horas}many{# horas}other{# horas}}"</string> + <string name="snoozeMinuteOptions" msgid="2222082405822030979">"{count,plural, =1{# minuto}many{# minutos}other{# minutos}}"</string> <string name="battery_detail_switch_title" msgid="6940976502957380405">"Poupança de bateria"</string> <string name="keyboard_key_button_template" msgid="8005673627272051429">"Botão <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="3734400625170020657">"Início"</string> @@ -594,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"Ativado"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Desativado"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Indisponível"</string> - <string name="tile_disabled" msgid="373212051546573069">"Desativado"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"Barra de navegação"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Esquema"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Tipo de botão esquerdo adicional"</string> @@ -667,8 +672,8 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Algumas funcionalidades são limitadas enquanto o telemóvel arrefece.\nToque para obter mais informações."</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"O telemóvel tenta arrefecer automaticamente. Pode continuar a utilizá-lo, mas este poderá funcionar mais lentamente.\n\nAssim que o telemóvel tiver arrefecido, funcionará normalmente."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Veja os passos de manutenção"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Desligar o carregador"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"Ocorreu um problema ao carregar este dispositivo. Desligue o transformador e tenha cuidado porque o cabo pode estar quente."</string> + <string name="high_temp_alarm_title" msgid="8654754369605452169">"Desligue o dispositivo"</string> + <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"O dispositivo está a ficar quente perto da porta de carregamento. Se estiver ligado a um carregador ou um acessório USB, desligue-o e tenha cuidado, uma vez que o cabo também pode estar quente."</string> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"Ver os passos a ter em consideração"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Atalho esquerdo"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Atalho direito"</string> @@ -778,7 +783,7 @@ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"ativar/desativar"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Controlos de dispositivos"</string> <string name="controls_providers_title" msgid="6879775889857085056">"Escolha uma app para adicionar controlos"</string> - <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# controlo adicionado.}other{# controlos adicionados.}}"</string> + <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# controlo adicionado.}many{# controlos adicionados.}other{# controlos adicionados.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Removido"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Adicionado aos favoritos"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Adicionados aos favoritos, posição <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -935,7 +940,7 @@ <string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Adicionar mosaico"</string> <string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Não adicion. mosaico"</string> <string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Selecione utilizador"</string> - <string name="fgs_manager_footer_label" msgid="8276763570622288231">"{count,plural, =1{# app está ativa}other{# apps estão ativas}}"</string> + <string name="fgs_manager_footer_label" msgid="8276763570622288231">"{count,plural, =1{# app está ativa}many{# apps estão ativas}other{# apps estão ativas}}"</string> <string name="fgs_dot_content_description" msgid="2865071539464777240">"Novas informações"</string> <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Apps ativas"</string> <string name="fgs_manager_dialog_message" msgid="2670045017200730076">"Estas apps estão ativas e a funcionar, mesmo quando não as está a usar. Isto melhora a sua funcionalidade, mas também afeta a autonomia da bateria."</string> @@ -965,7 +970,7 @@ <string name="dream_overlay_status_bar_camera_off" msgid="5273073778969890823">"A câmara está desativada"</string> <string name="dream_overlay_status_bar_mic_off" msgid="8366534415013819396">"O microfone está desativado"</string> <string name="dream_overlay_status_bar_camera_mic_off" msgid="3199425257833773569">"A câmara e o microfone estão desativados"</string> - <string name="dream_overlay_status_bar_notification_indicator" msgid="8091389255691081711">"{count,plural, =1{# notificação}other{# notificações}}"</string> + <string name="dream_overlay_status_bar_notification_indicator" msgid="8091389255691081711">"{count,plural, =1{# notificação}many{# notificações}other{# notificações}}"</string> <string name="dream_overlay_weather_complication_desc" msgid="824503662089783824">"<xliff:g id="WEATHER_CONDITION">%1$s</xliff:g>, <xliff:g id="TEMPERATURE">%2$s</xliff:g>"</string> <string name="broadcasting_description_is_broadcasting" msgid="765627502786404290">"A transmitir"</string> <string name="bt_le_audio_broadcast_dialog_title" msgid="3605428497924077811">"Interromper a transmissão da app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index 59aee9b72587..2f9a36e64f29 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Não foi possível reconhecer o rosto Use a impressão digital."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Rosto não reconhecido"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Use a impressão digital"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth conectado."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Porcentagem da bateria desconhecida."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Conectado a <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> @@ -202,7 +204,7 @@ <string name="accessibility_sensors_off_active" msgid="2619725434618911551">"A opção \"Sensores desativados\" está ativa"</string> <string name="accessibility_clear_all" msgid="970525598287244592">"Limpar todas as notificações."</string> <string name="notification_group_overflow_indicator" msgid="7605120293801012648">"Mais <xliff:g id="NUMBER">%s</xliff:g>"</string> - <string name="notification_group_overflow_description" msgid="7176322877233433278">"{count,plural, =1{Mais # notificação no grupo.}one{Mais # notificação no grupo.}other{Mais # notificações no grupo.}}"</string> + <string name="notification_group_overflow_description" msgid="7176322877233433278">"{count,plural, =1{Mais # notificação no grupo.}one{Mais # notificação no grupo.}many{Mais # de notificações no grupo.}other{Mais # notificações no grupo.}}"</string> <string name="accessibility_rotation_lock_on_landscape" msgid="936972553861524360">"A tela está bloqueada na orientação paisagem."</string> <string name="accessibility_rotation_lock_on_portrait" msgid="2356633398683813837">"A tela está bloqueada na orientação retrato."</string> <string name="dessert_case" msgid="9104973640704357717">"Mostruário de sobremesas"</string> @@ -250,7 +252,7 @@ <string name="quick_settings_hotspot_label" msgid="1199196300038363424">"Ponto de acesso"</string> <string name="quick_settings_hotspot_secondary_label_transient" msgid="7585604088079160564">"Ativando…"</string> <string name="quick_settings_hotspot_secondary_label_data_saver_enabled" msgid="1280433136266439372">"Economia de dados ativada"</string> - <string name="quick_settings_hotspot_secondary_label_num_devices" msgid="7536823087501239457">"{count,plural, =1{# dispositivo}one{# dispositivo}other{# dispositivos}}"</string> + <string name="quick_settings_hotspot_secondary_label_num_devices" msgid="7536823087501239457">"{count,plural, =1{# dispositivo}one{# dispositivo}many{# de dispositivos}other{# dispositivos}}"</string> <string name="quick_settings_flashlight_label" msgid="4904634272006284185">"Lanterna"</string> <string name="quick_settings_flashlight_camera_in_use" msgid="4820591564526512571">"Câmera em uso"</string> <string name="quick_settings_cellular_detail_title" msgid="792977203299358893">"Dados móveis"</string> @@ -351,7 +353,7 @@ <string name="guest_notification_session_active" msgid="5567273684713471450">"Você está no modo visitante"</string> <string name="user_add_user_message_guest_remove" msgid="5589286604543355007">\n\n"Ao adicionar um novo usuário, o dispositivo vai sair do modo visitante e excluir todos os apps e dados da Sessão de visitante atual."</string> <string name="user_limit_reached_title" msgid="2429229448830346057">"Limite de usuários atingido"</string> - <string name="user_limit_reached_message" msgid="1070703858915935796">"{count,plural, =1{Você só pode criar 1 usuário.}one{Você pode adicionar até # usuário.}other{Você pode adicionar até # usuários.}}"</string> + <string name="user_limit_reached_message" msgid="1070703858915935796">"{count,plural, =1{Você só pode criar 1 usuário.}one{Você pode adicionar até # usuário.}many{Você pode adicionar até # de usuários.}other{Você pode adicionar até # usuários.}}"</string> <string name="user_remove_user_title" msgid="9124124694835811874">"Remover usuário?"</string> <string name="user_remove_user_message" msgid="6702834122128031833">"Todos os apps e dados deste usuário serão excluídos."</string> <string name="user_remove_user_remove" msgid="8387386066949061256">"Remover"</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Sobreposição de legendas"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"ativar"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"desativar"</string> + <string name="sound_settings" msgid="8874581353127418308">"Som e vibração"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Configurações"</string> <string name="screen_pinning_title" msgid="9058007390337841305">"O app está fixado"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Ela é mantida à vista até que seja liberada. Toque em Voltar e em Visão geral e mantenha essas opções pressionadas para liberar."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Ela é mantida à vista até que seja liberada. Toque em Voltar e em Início e mantenha essas opções pressionadas para liberar."</string> @@ -537,8 +541,8 @@ <string name="notification_menu_snooze_action" msgid="5415729610393475019">"Lembrete"</string> <string name="snooze_undo" msgid="2738844148845992103">"Desfazer"</string> <string name="snoozed_for_time" msgid="7586689374860469469">"Adiada para <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string> - <string name="snoozeHourOptions" msgid="2332819756222425558">"{count,plural, =1{# hora}=2{# horas}one{# hora}other{# horas}}"</string> - <string name="snoozeMinuteOptions" msgid="2222082405822030979">"{count,plural, =1{# minuto}one{# minuto}other{# minuto}}"</string> + <string name="snoozeHourOptions" msgid="2332819756222425558">"{count,plural, =1{# hora}=2{# horas}one{# hora}many{# de horas}other{# horas}}"</string> + <string name="snoozeMinuteOptions" msgid="2222082405822030979">"{count,plural, =1{# minuto}one{# minuto}many{# de minutos}other{# minuto}}"</string> <string name="battery_detail_switch_title" msgid="6940976502957380405">"Economia de bateria"</string> <string name="keyboard_key_button_template" msgid="8005673627272051429">"Botão <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string> @@ -594,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"Ativado"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Desativado"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Indisponível"</string> - <string name="tile_disabled" msgid="373212051546573069">"Desativado"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"Barra de navegação"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Layout"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Tipo de botão esquerdo extra"</string> @@ -667,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Alguns recursos ficam limitados enquanto o smartphone é resfriado.\nToque para saber mais"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"Seu smartphone tentará se resfriar automaticamente. Você ainda poderá usá-lo, mas talvez ele fique mais lento.\n\nQuando o smartphone estiver resfriado, ele voltará ao normal."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Ver etapas de cuidado"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Desconecte o carregador"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"Ocorreu um problema com o carregamento deste dispositivo. Desconecte o adaptador de energia com cuidado, já que o cabo pode estar quente."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"Ver etapas de cuidado"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Atalho à esquerda"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Atalho à direita"</string> @@ -778,7 +785,7 @@ <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"alternar"</string> <string name="quick_controls_title" msgid="6839108006171302273">"Controles do dispositivo"</string> <string name="controls_providers_title" msgid="6879775889857085056">"Escolha um app para adicionar controles"</string> - <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# controle adicionado.}one{# controle adicionado.}other{# controles adicionados.}}"</string> + <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# controle adicionado.}one{# controle adicionado.}many{# de controles adicionados.}other{# controles adicionados.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Removido"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Adicionado como favorito"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Adicionado como favorito (posição <xliff:g id="NUMBER">%d</xliff:g>)"</string> @@ -935,7 +942,7 @@ <string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Adicionar bloco"</string> <string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Não adicionar bloco"</string> <string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Selecionar usuário"</string> - <string name="fgs_manager_footer_label" msgid="8276763570622288231">"{count,plural, =1{# app está ativo}one{# apps está ativo}other{# apps estão ativos}}"</string> + <string name="fgs_manager_footer_label" msgid="8276763570622288231">"{count,plural, =1{# app está ativo}one{# apps está ativo}many{# de apps estão ativos}other{# apps estão ativos}}"</string> <string name="fgs_dot_content_description" msgid="2865071539464777240">"Nova informação"</string> <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Apps ativos"</string> <string name="fgs_manager_dialog_message" msgid="2670045017200730076">"Esses apps ficam ativos e em execução mesmo quando não estão em uso. Isso melhora a funcionalidade deles, mas também pode afetar a duração da bateria."</string> @@ -965,7 +972,7 @@ <string name="dream_overlay_status_bar_camera_off" msgid="5273073778969890823">"A câmera está desativada"</string> <string name="dream_overlay_status_bar_mic_off" msgid="8366534415013819396">"O microfone está desativado"</string> <string name="dream_overlay_status_bar_camera_mic_off" msgid="3199425257833773569">"A câmera e o microfone estão desativados"</string> - <string name="dream_overlay_status_bar_notification_indicator" msgid="8091389255691081711">"{count,plural, =1{# notificação}one{# notificação}other{# notificações}}"</string> + <string name="dream_overlay_status_bar_notification_indicator" msgid="8091389255691081711">"{count,plural, =1{# notificação}one{# notificação}many{# notificações}other{# notificações}}"</string> <string name="dream_overlay_weather_complication_desc" msgid="824503662089783824">"<xliff:g id="WEATHER_CONDITION">%1$s</xliff:g>, <xliff:g id="TEMPERATURE">%2$s</xliff:g>"</string> <string name="broadcasting_description_is_broadcasting" msgid="765627502786404290">"Transmitindo"</string> <string name="bt_le_audio_broadcast_dialog_title" msgid="3605428497924077811">"Interromper a transmissão do app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index c4ee3caf355b..683774c18f8e 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Chipul nu a fost recunoscut. Folosiți amprenta."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Chip nerecunoscut"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Folosește amprenta"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Conectat prin Bluetooth."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Procentajul bateriei este necunoscut."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Conectat la <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Suprapunere pe subtitrări"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"activați"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"dezactivați"</string> + <string name="sound_settings" msgid="8874581353127418308">"Sunete și vibrații"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Setări"</string> <string name="screen_pinning_title" msgid="9058007390337841305">"Aplicația este fixată"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Astfel rămâne afișat până anulați fixarea. Atingeți lung opțiunile Înapoi și Recente pentru a anula fixarea."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Astfel rămâne afișat până anulați fixarea. Atingeți lung opțiunile Înapoi și Acasă pentru a anula fixarea."</string> @@ -594,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"Activat"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Dezactivați"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Indisponibil"</string> - <string name="tile_disabled" msgid="373212051546573069">"Dezactivat"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"Bară de navigare"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Aspect"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Tip de buton din extrema stângă"</string> @@ -667,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Anumite funcții sunt limitate în timp ce telefonul se răcește.\nAtingeți pentru mai multe informații"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"Telefonul va încerca automat să se răcească. Puteți folosi telefonul în continuare, dar este posibil să funcționeze mai lent.\n\nDupă ce se răcește, telefonul va funcționa normal."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Vedeți pașii pentru îngrijire"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Deconectați încărcătorul"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"Există o problemă la încărcarea acestui dispozitiv. Deconectați adaptorul de curent și aveți grijă, deoarece cablul poate fi cald."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"Vedeți pașii pentru îngrijire"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Comanda rapidă din stânga"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Comanda rapidă din dreapta"</string> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index 682dcb730267..e848857f1ecc 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Не удалось распознать лицо. Используйте отпечаток."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Лицо не распознано."</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Используйте отпечаток."</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth-соединение установлено."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Уровень заряда батареи в процентах неизвестен."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g>: подключено."</string> @@ -339,8 +341,7 @@ <string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Зарядка • Осталось <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> <string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Быстрая зарядка • Осталось <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> <string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Медленная зарядка • Осталось <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> - <!-- no translation found for keyguard_indication_charging_time_dock (3149328898931741271) --> - <skip /> + <string name="keyguard_indication_charging_time_dock" msgid="3149328898931741271">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Зарядка • Осталось <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Сменить пользователя."</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"раскрывающееся меню"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Все приложения и данные этого профиля будут удалены."</string> @@ -420,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Наложение субтитров"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"включить"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"отключить"</string> + <string name="sound_settings" msgid="8874581353127418308">"Звук и вибрация"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Открыть настройки"</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> @@ -595,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"Вкл."</string> <string name="switch_bar_off" msgid="5669805115416379556">"Откл."</string> <string name="tile_unavailable" msgid="3095879009136616920">"Недоступно"</string> - <string name="tile_disabled" msgid="373212051546573069">"Отключено"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"Панель навигации"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Расположение кнопок"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Дополнительный тип кнопки \"Влево\""</string> @@ -668,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Пока телефон не остынет, некоторые функции могут быть недоступны.\nНажмите, чтобы получить дополнительную информацию"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"Ваш телефон остынет автоматически.\n\nОбратите внимание, что до тех пор он может работать медленнее, чем обычно."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Подробнее о действиях при перегреве…"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Отключите зарядное устройство"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"Во время зарядки возникла проблема. Отключите адаптер питания. Будьте осторожны, кабель может быть горячим."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"Подробнее о действиях при перегреве…"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Ярлык слева"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Ярлык справа"</string> diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml index ea89e2bee49c..fcff90dac09f 100644 --- a/packages/SystemUI/res/values-si/strings.xml +++ b/packages/SystemUI/res/values-si/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"මුහුණ හැඳිනිය නොහැක. ඒ වෙනුවට ඇඟිලි සලකුණ භාවිත ක."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"මුහුණ හඳුනා ගත නොහැක"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"ඒ වෙනුවට ඇඟිලි සලකුණ භාවිත කරන්න"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"බ්ලූටූත් සම්බන්ධිතයි."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"බැටරි ප්රතිශතය නොදනී."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> වෙත සම්බන්ධ කරන ලදි."</string> @@ -339,8 +341,7 @@ <string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • ආරෝපණය වෙමින් • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>කින් සම්පූර්ණ වේ"</string> <string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • වේගයෙන් ආරෝපණය වෙමින් • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>කින් සම්පූර්ණ වේ"</string> <string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • සෙමින් ආරෝපණය වෙමින් • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>කින් සම්පූර්ණ වේ"</string> - <!-- no translation found for keyguard_indication_charging_time_dock (3149328898931741271) --> - <skip /> + <string name="keyguard_indication_charging_time_dock" msgid="3149328898931741271">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • ආරෝපණය වෙමින් • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>කින් සම්පූර්ණ වේ"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"පරිශීලක මාරුව"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"නිපතන මෙනුව"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"මෙම සැසියේ සියළුම යෙදුම් සහ දත්ත මකාවී."</string> @@ -420,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"සිරස්තල උඩැතිරිය"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"සබල කරන්න"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"අබල කරන්න"</string> + <string name="sound_settings" msgid="8874581353127418308">"ශබ්ද සහ කම්පනය"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"සැකසීම්"</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> @@ -595,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"ක්රියාත්මකයි"</string> <string name="switch_bar_off" msgid="5669805115416379556">"ක්රියාවිරහිතයි"</string> <string name="tile_unavailable" msgid="3095879009136616920">"ලබා ගත නොහැකිය"</string> - <string name="tile_disabled" msgid="373212051546573069">"අබලයි"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"සංචලන තීරුව"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"පිරිසැලසුම"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"අමතර වම් බොත්තම් වර්ගය"</string> @@ -668,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"දුරකථනය සිසිල් වන අතරතුර සමහර විශේෂාංග සීමිත විය හැකිය.\nතව තතු සඳහා තට්ටු කරන්න"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"ඔබගේ දුරකථනය ස්වයංක්රියව සිසිල් වීමට උත්සාහ කරනු ඇත. ඔබට තවම ඔබේ දුරකථනය භාවිත කළ හැකිය, නමුත් එය සෙමින් ධාවනය විය හැකිය.\n\nඔබේ දුරකථනය සිසිල් වූ පසු, එය සාමාන්ය ලෙස ධාවනය වනු ඇත."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"රැකවරණ පියවර බලන්න"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"චාජරය පේනුවෙන් ඉවත් කරන්න"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"මෙම උපාංගය ආරෝපණ කිරීමේ ගැටලුවක් තිබේ බල ඇඩැප්ටරය ගලවා කේබලය උණුසුම් විය හැකි බැවින් පරෙස්සම් වන්න."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"රැකවරණ පියවර බලන්න"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"වම් කෙටි මග"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"දකුණු කෙටි මග"</string> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index 7961224c7439..eefb1de38701 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Tvár sa nedá rozpoznať. Použite odtlačok prsta."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Tvár sa nedá rozpoznať"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Používať radšej odtlačok"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth pripojené."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Percento batérie nie je známe."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Pripojené k zariadeniu <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Prekrytie titulkov"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"povoliť"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"zakázať"</string> + <string name="sound_settings" msgid="8874581353127418308">"Zvuk a vibrácie"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Nastavenia"</string> <string name="screen_pinning_title" msgid="9058007390337841305">"Aplikácia je pripnutá"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Obsah bude pripnutý v zobrazení, dokým ho neuvoľníte. Uvoľníte ho stlačením a podržaním tlačidiel Späť a Prehľad."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Obsah bude pripnutý v zobrazení, dokým ho neuvoľníte. Uvoľníte ho pridržaním tlačidiel Späť a Domov."</string> @@ -594,7 +598,7 @@ <string name="switch_bar_on" msgid="1770868129120096114">"Zapnuté"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Vypnuté"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Nedostupné"</string> - <string name="tile_disabled" msgid="373212051546573069">"Deaktivované"</string> + <string name="accessibility_tile_disabled_by_policy_action_description" msgid="6958422730461646926">"ďalšie informácie"</string> <string name="nav_bar" msgid="4642708685386136807">"Navigačný panel"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Rozloženie"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Dodatočný typ ľavého tlačidla"</string> @@ -667,8 +671,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Niektoré funkcie budú obmedzené, dokým neklesne teplota telefónu.\nViac sa dozviete po klepnutí."</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"Váš telefón sa automaticky pokúsi schladiť. Môžete ho naďalej používať, ale môže fungovať pomalšie.\n\nPo poklese teploty bude telefón fungovať ako normálne."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Zobraziť opatrenia"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Odpojte nabíjačku"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"Vyskytol sa problém s nabíjaním tohto zariadenia. Odpojte nabíjačku a postupujte opatrne, pretože kábel môže byť horúci."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"Zobraziť opatrenia"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Ľavá skratka"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Pravá skratka"</string> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index 89fdf32978cb..914036166684 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Obraza ni mogoče prepoznati. Uporabite prstni odtis."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Obraz ni bil prepoznan."</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Uporabite prstni odtis."</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Povezava Bluetooth vzpostavljena."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Neznan odstotek napolnjenosti baterije."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Povezava vzpostavljena z: <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> @@ -339,8 +341,7 @@ <string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Polnjenje • Napolnjeno čez <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> <string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Hitro polnjenje • Napolnjeno čez <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> <string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Počasno polnjenje • Napolnjeno čez <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> - <!-- no translation found for keyguard_indication_charging_time_dock (3149328898931741271) --> - <skip /> + <string name="keyguard_indication_charging_time_dock" msgid="3149328898931741271">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Polnjenje • Napolnjeno čez <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Preklop med uporabniki"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"spustni meni"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Vse aplikacije in podatki v tej seji bodo izbrisani."</string> @@ -420,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Prekrivni podnapisi"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"omogoči"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"onemogoči"</string> + <string name="sound_settings" msgid="8874581353127418308">"Zvok in vibriranje"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Nastavitve"</string> <string name="screen_pinning_title" msgid="9058007390337841305">"Aplikacija je pripeta"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"S tem ostane vidna, dokler je ne odpnete. Če jo želite odpeti, hkrati pridržite gumba za nazaj in pregled."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"S tem ostane vidna, dokler je ne odpnete. Če jo želite odpeti, hkrati pridržite gumba za nazaj in za začetni zaslon."</string> @@ -595,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"Vklopljeno"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Izklopljeno"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Ni na voljo"</string> - <string name="tile_disabled" msgid="373212051546573069">"Onemogočeno"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"Vrstica za krmarjenje"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Postavitev"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Vrsta dodatnega levega gumba"</string> @@ -668,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Nekatere funkcije bodo med ohlajanjem telefona omejene.\nDotaknite se za več informacij"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"Telefon se bo samodejno poskusil ohladiti. Še naprej ga lahko uporabljate, vendar bo morda deloval počasneje.\n\nKo se telefon ohladi, bo zopet deloval kot običajno."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Oglejte si navodila za ukrepanje"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Odklopite polnilnik"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"Pri polnjenju te naprave je prišlo do težave. Previdno odklopite napajalnik, ker se je kabel morda segrel."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"Oglejte si navodila za ukrepanje"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Leva bližnjica"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Desna bližnjica"</string> diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index dfdebd21383c..99536cb2e2bc 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Nuk mund ta dallojë fytyrën. Përdor më mirë gjurmën e gishtit."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Fytyra nuk mund të njihet"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Përdor më mirë gjurmën e gishtit"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Pajisja është lidhur me \"bluetooth\"."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Përqindja e baterisë e panjohur."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Lidhur me <xliff:g id="BLUETOOTH">%s</xliff:g>"</string> @@ -339,8 +341,7 @@ <string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Po karikohet • Plot për <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> <string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Po karikohet shpejt • Plot për <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> <string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Po karikohet ngadalë • Plot për <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> - <!-- no translation found for keyguard_indication_charging_time_dock (3149328898931741271) --> - <skip /> + <string name="keyguard_indication_charging_time_dock" msgid="3149328898931741271">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Po karikohet • Plot për <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Ndërro përdorues"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menyja me tërheqje poshtë"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Të gjitha aplikacionet dhe të dhënat në këtë sesion do të fshihen."</string> @@ -420,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Mbivendosja e titrave"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"aktivizo"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"çaktivizo"</string> + <string name="sound_settings" msgid="8874581353127418308">"Tingulli dhe dridhjet"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Cilësimet"</string> <string name="screen_pinning_title" msgid="9058007390337841305">"Aplikacioni është i gozhduar"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Kjo e ruan në pamje deri sa ta heqësh nga gozhdimi. Prek dhe mbaj të shtypur \"Prapa\" dhe \"Përmbledhje\" për ta hequr nga gozhdimi."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Kjo e ruan në pamje deri sa ta heqësh nga gozhdimi. Prek dhe mbaj të shtypur \"Prapa\" dhe \"Kreu\" për ta hequr nga gozhdimi."</string> @@ -595,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"Aktiv"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Joaktiv"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Nuk ofrohet"</string> - <string name="tile_disabled" msgid="373212051546573069">"Joaktiv"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"Shiriti i navigimit"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Struktura"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Lloji i butonit shtesë majtas"</string> @@ -668,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Disa veçori janë të kufizuara kur telefoni është duke u ftohur.\nTrokit për më shumë informacione"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"Telefoni yt do të përpiqet automatikisht që të ftohet. Mund ta përdorësh përsëri telefonin, por ai mund të punojë më ngadalë.\n\nPasi telefoni të jetë ftohur, ai do të punojë si normalisht."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Shiko hapat për kujdesin"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Shkëput karikuesin"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"Ka një problem me karikimin e kësaj pajisjeje. Hiqe spinën dhe trego kujdes pasi kablloja mund të jetë e ngrohtë."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"Shiko hapat për kujdesin"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Shkurtorja majtas"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Shkurtorja djathtas"</string> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index b1f9bb97280c..8b9822d7b7c6 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Лице није препознато. Користите отисак прста."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Лице није препознато"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Користите отисак прста"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth је прикључен."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Проценат напуњености батерије није познат."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Повезани сте са <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Преклапање титлова"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"омогућите"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"онемогућите"</string> + <string name="sound_settings" msgid="8874581353127418308">"Звук и вибрирање"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Подешавања"</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> @@ -594,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"Укључено"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Искључено"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Недоступно"</string> - <string name="tile_disabled" msgid="373212051546573069">"Онемогућено"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"Трака за навигацију"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Распоред"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Додатни тип левог дугмета"</string> @@ -667,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Неке функције су ограничене док се телефон не охлади.\nДодирните за више информација"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"Телефон ће аутоматски покушати да се охлади. И даље ћете моћи да користите телефон, али ће спорије реаговати.\n\nКада се телефон охлади, нормално ће радити."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Погледајте упозорења"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Искључите пуњач из струје"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"Дошло је до проблема са пуњењем овог уређаја. Искључите адаптер из напајања и будите пажљиви јер кабл може да буде топао."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"Погледајте упозорења"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Лева пречица"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Десна пречица"</string> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index 9c7534188c4f..374d5521fa83 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Ansiktet kändes inte igen. Använd fingeravtryck."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Ansiktet kändes inte igen"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Använd fingeravtryck"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth ansluten."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Okänd batterinivå."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Ansluten till <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> @@ -339,8 +341,7 @@ <string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Laddas • Fulladdat om <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> <string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Laddas snabbt • Fulladdat om <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> <string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Laddas långsamt • Fulladdat om <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> - <!-- no translation found for keyguard_indication_charging_time_dock (3149328898931741271) --> - <skip /> + <string name="keyguard_indication_charging_time_dock" msgid="3149328898931741271">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Laddas • Fulladdat om <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Byt användare"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"rullgardinsmeny"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Alla appar och data i denna session kommer att raderas."</string> @@ -420,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Överlagring av textning"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"aktivera"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"inaktivera"</string> + <string name="sound_settings" msgid="8874581353127418308">"Ljud och vibration"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Inställningar"</string> <string name="screen_pinning_title" msgid="9058007390337841305">"Appen har fästs"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Skärmen visas tills du lossar den. Tryck länge på Tillbaka och Översikt om du vill lossa skärmen."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Skärmen visas tills du lossar den. Tryck länge på Tillbaka och Startsida om du vill lossa skärmen."</string> @@ -595,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"På"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Av"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Inte tillgängligt"</string> - <string name="tile_disabled" msgid="373212051546573069">"Inaktiverat"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"Navigeringsfält"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Layout"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Knapptyp för extra vänster"</string> @@ -668,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Vissa funktioner är begränsade medan telefonen svalnar.\nTryck för mer information"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"Mobilen försöker svalna automatiskt. Du kan fortfarande använda mobilen, men den kan vara långsammare än vanligt.\n\nMobilen fungerar som vanligt när den har svalnat."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Visa alla skötselråd"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Koppla ur laddaren"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"Det går inte att ladda denna enhet. Koppla ur nätadaptern, men var försiktig eftersom kabeln kan vara varm."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"Visa alla skötselråd"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Vänster genväg"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Höger genväg"</string> diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index b9789354ffff..79e542ff626f 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Imeshindwa kutambua uso. Tumia alama ya kidole."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Imeshindwa kutambua uso"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Badala yake, tumia alama ya kidole"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth imeunganishwa."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Asilimia ya betri haijulikani."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Imeunganishwa kwenye <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> @@ -339,8 +341,7 @@ <string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Inachaji • Itajaa baada ya <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> <string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Inachaji kwa kasi • Itajaa baada ya <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> <string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Inachaji polepole • Itajaa baada ya <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> - <!-- no translation found for keyguard_indication_charging_time_dock (3149328898931741271) --> - <skip /> + <string name="keyguard_indication_charging_time_dock" msgid="3149328898931741271">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Inachaji • Itajaa baada ya <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Badili mtumiaji"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menyu ya kuvuta chini"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Data na programu zote katika kipindi hiki zitafutwa."</string> @@ -420,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Kuwekelea manukuu"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"washa"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"zima"</string> + <string name="sound_settings" msgid="8874581353127418308">"Sauti na mtetemo"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Mipangilio"</string> <string name="screen_pinning_title" msgid="9058007390337841305">"Programu imebandikwa"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Hali hii huifanya ionekane hadi utakapoibandua. Gusa na ushikilie kipengele cha Nyuma na Muhtasari ili ubandue."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Hali hii huifanya ionekane hadi utakapoibandua. Gusa na ushikilie kitufe cha kurudisha Nyuma na cha Mwanzo kwa pamoja ili ubandue."</string> @@ -595,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"Imewashwa"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Imezimwa"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Hakipatikani"</string> - <string name="tile_disabled" msgid="373212051546573069">"Imezimwa"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"Sehemu ya viungo muhimu"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Mpangilio"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Aina ya kitufe cha kushoto cha ziada"</string> @@ -668,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Baadhi ya vipengele havitatumika kwenye simu wakati inapoa.\nGusa ili upate maelezo zaidi"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"Simu yako itajaribu kupoa kiotomatiki. Bado unaweza kutumia simu yako, lakini huenda ikafanya kazi polepole. \n\nPindi simu yako itakapopoa, itaendelea kufanya kazi kama kawaida."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Angalia hatua za utunzaji"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Chomoa chaja"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"Kuna tatizo la kuchaji kifaa hiki. Chomoa adapta ya nishati na uwe mwangalifu, huenda kebo ni moto."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"Angalia hatua za ulinzi"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Njia ya mkato ya kushoto"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Njia ya mkato ya kulia"</string> diff --git a/packages/SystemUI/res/values-sw600dp-land/dimens.xml b/packages/SystemUI/res/values-sw600dp-land/dimens.xml index d638c9d5742e..f4d482406fa0 100644 --- a/packages/SystemUI/res/values-sw600dp-land/dimens.xml +++ b/packages/SystemUI/res/values-sw600dp-land/dimens.xml @@ -49,54 +49,29 @@ <dimen name="status_view_margin_horizontal">8dp</dimen> - <!-- Distance that the full shade transition takes in order to complete by tapping on a button - like "expand". --> + <!-- Lockscreen shade transition values --> <dimen name="lockscreen_shade_transition_by_tap_distance">200dp</dimen> - - <!-- Distance that the full shade transition takes in order to complete. --> <dimen name="lockscreen_shade_full_transition_distance">200dp</dimen> - - <!-- Distance that the full shade transition takes in order for media to fully transition to - the shade --> - <dimen name="lockscreen_shade_media_transition_distance">200dp</dimen> - - <!-- Distance that the full shade transition takes in order for scrim to fully transition to - the shade (in alpha) --> + <!-- Media transition distance = qs delay + qs distance --> + <dimen name="lockscreen_shade_media_transition_distance">129.28dp</dimen> <dimen name="lockscreen_shade_scrim_transition_distance">80dp</dimen> - <!-- The notifications scrim transition should start when the other scrims' transition is at 95%. --> <dimen name="lockscreen_shade_notifications_scrim_transition_delay">76dp</dimen> - <!-- The notifications scrim transition duration is 66.6% of the duration of the other scrims' - transition. --> + transition. --> <dimen name="lockscreen_shade_notifications_scrim_transition_distance">53.28dp</dimen> - - <!-- Distance that the full shade transition takes in order for the keyguard content on - NotificationPanelViewController to fully fade (e.g. Clock & Smartspace) --> <dimen name="lockscreen_shade_npvc_keyguard_content_alpha_transition_distance">80dp</dimen> - - <!-- Distance that the full shade transition takes in order for the notification shell to fully - expand. --> <dimen name="lockscreen_shade_notif_shelf_transition_distance">@dimen/lockscreen_shade_full_transition_distance</dimen> - - <!-- Distance that the full shade transition takes in order for the Quick Settings to fully - fade and expand. --> - <dimen name="lockscreen_shade_qs_transition_distance">@dimen/lockscreen_shade_full_transition_distance</dimen> - - <!-- Distance that the full shade transition takes in order for depth of the wallpaper to fully - change. - On split-shade, there should be no depth effect, so setting the value to 0. --> + <dimen name="lockscreen_shade_qs_transition_distance">@dimen/lockscreen_shade_notifications_scrim_transition_distance</dimen> + <dimen name="lockscreen_shade_qs_transition_delay">@dimen/lockscreen_shade_notifications_scrim_transition_delay</dimen> + <dimen name="lockscreen_shade_qs_squish_transition_distance">@dimen/lockscreen_shade_qs_transition_distance</dimen> + <!-- On split-shade, the QS squish transition should start from half height. --> + <item name="lockscreen_shade_qs_squish_start_fraction" type="dimen" format="float" >0.5</item> + <!-- On split-shade, there should be no depth effect, so setting the value to 0. --> <dimen name="lockscreen_shade_depth_controller_transition_distance">0dp</dimen> - - <!-- Distance that the full shade transition takes in order for the UDFPS Keyguard View to fully - fade. --> <dimen name="lockscreen_shade_udfps_keyguard_transition_distance">@dimen/lockscreen_shade_full_transition_distance</dimen> - - <!-- Used for StatusBar to know that a transition is in progress. At the moment it only checks - whether the progress is > 0, therefore this value is not very important. --> <dimen name="lockscreen_shade_status_bar_transition_distance">@dimen/lockscreen_shade_full_transition_distance</dimen> - <dimen name="lockscreen_shade_keyguard_transition_distance">@dimen/lockscreen_shade_media_transition_distance</dimen> <!-- Roughly the same distance as media on LS to media on QS. We will translate by this value diff --git a/packages/SystemUI/res/values-sw600dp/config.xml b/packages/SystemUI/res/values-sw600dp/config.xml index c0071cb45e21..80628f903e76 100644 --- a/packages/SystemUI/res/values-sw600dp/config.xml +++ b/packages/SystemUI/res/values-sw600dp/config.xml @@ -35,9 +35,6 @@ <!-- How many lines to show in the security footer --> <integer name="qs_security_footer_maxLines">1</integer> - <!-- Determines whether to allow the nav bar handle to be forced to be opaque. --> - <bool name="allow_force_nav_bar_handle_opaque">false</bool> - <bool name="config_use_large_screen_shade_header">true</bool> <!-- Whether to show the side fps hint while on bouncer --> diff --git a/packages/SystemUI/res/values-sw600dp/dimens.xml b/packages/SystemUI/res/values-sw600dp/dimens.xml index 008299bd9b1c..a587e5a806ca 100644 --- a/packages/SystemUI/res/values-sw600dp/dimens.xml +++ b/packages/SystemUI/res/values-sw600dp/dimens.xml @@ -73,4 +73,24 @@ <dimen name="large_dialog_width">472dp</dimen> <dimen name="large_screen_shade_header_height">42dp</dimen> + + <!-- Lockscreen shade transition values --> + <dimen name="lockscreen_shade_transition_by_tap_distance">200dp</dimen> + <dimen name="lockscreen_shade_full_transition_distance">80dp</dimen> + <dimen name="lockscreen_shade_media_transition_distance">120dp</dimen> + <dimen name="lockscreen_shade_scrim_transition_distance">@dimen/lockscreen_shade_full_transition_distance</dimen> + <dimen name="lockscreen_shade_notifications_scrim_transition_delay">@dimen/lockscreen_shade_scrim_transition_distance</dimen> + <dimen name="lockscreen_shade_notifications_scrim_transition_distance">@dimen/lockscreen_shade_scrim_transition_distance</dimen> + <dimen name="lockscreen_shade_npvc_keyguard_content_alpha_transition_distance">@dimen/lockscreen_shade_full_transition_distance</dimen> + <dimen name="lockscreen_shade_notif_shelf_transition_distance">@dimen/lockscreen_shade_full_transition_distance</dimen> + <dimen name="lockscreen_shade_qs_transition_distance">@dimen/lockscreen_shade_full_transition_distance</dimen> + <dimen name="lockscreen_shade_qs_transition_delay">@dimen/lockscreen_shade_scrim_transition_distance</dimen> + <dimen name="lockscreen_shade_qs_squish_transition_distance">@dimen/lockscreen_shade_qs_transition_distance</dimen> + <!-- On large screen portrait, the QS squish transition should start from half height. --> + <item name="lockscreen_shade_qs_squish_start_fraction" type="dimen" format="float" >0.5</item> + <dimen name="lockscreen_shade_depth_controller_transition_distance">@dimen/lockscreen_shade_full_transition_distance</dimen> + <dimen name="lockscreen_shade_udfps_keyguard_transition_distance">@dimen/lockscreen_shade_full_transition_distance</dimen> + <dimen name="lockscreen_shade_status_bar_transition_distance">@dimen/lockscreen_shade_full_transition_distance</dimen> + <dimen name="lockscreen_shade_keyguard_transition_distance">@dimen/lockscreen_shade_media_transition_distance</dimen> + </resources> diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index 0015fbc787f1..1c795bf6b6d8 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"முகத்தை அடையாளம் காண முடியவில்லை. கைரேகையைப் பயன்படுத்தவும்."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"முகத்தை கண்டறிய இயலவில்லை"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"கைரேகையை உபயோகிக்கவும்"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"புளூடூத் இணைக்கப்பட்டது."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"பேட்டரி சதவீதம் தெரியவில்லை."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g>க்கு இணைக்கப்பட்டது."</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"மேலடுக்கப்பட்ட வசனங்கள்"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"இயக்கும்"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"முடக்கும்"</string> + <string name="sound_settings" msgid="8874581353127418308">"ஒலி & அதிர்வு"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"அமைப்புகள்"</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> @@ -594,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"ஆன்"</string> <string name="switch_bar_off" msgid="5669805115416379556">"ஆஃப்"</string> <string name="tile_unavailable" msgid="3095879009136616920">"இல்லை"</string> - <string name="tile_disabled" msgid="373212051546573069">"முடக்கப்பட்டது"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"வழிசெலுத்தல் பட்டி"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"தளவமைப்பு"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"கூடுதல் இடப்புற பட்டன் வகை"</string> @@ -667,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"மொபைலின் வெப்ப அளவு குறையும் வரை சில அம்சங்களைப் பயன்படுத்த முடியாது.\nமேலும் தகவலுக்கு தட்டவும்"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"உங்கள் மொபைலின் வெப்ப அளவு தானாகவே குறையும். தொடர்ந்து நீங்கள் மொபைலைப் பயன்படுத்தலாம், ஆனால் அதன் வேகம் குறைவாக இருக்கக்கூடும்.\n\nமொபைலின் வெப்ப அளவு குறைந்தவுடன், அது இயல்பு நிலையில் இயங்கும்."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"மேலும் விவரங்களுக்கு இதைப் பார்க்கவும்"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"சார்ஜரைத் துண்டிக்கவும்"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"இந்தச் சாதனத்தைச் சார்ஜ் செய்வதில் சிக்கல் உள்ளது. பவர் அடாப்டரைத் துண்டிக்கவும், கேபிள் சூடாக இருக்கக்கூடும் என்பதால் கவனமாகக் கையாளவும்."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"மேலும் விவரங்களுக்கு இதைப் பார்க்கவும்"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"இடப்புற ஷார்ட்கட்"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"வலப்புற ஷார்ட்கட்"</string> diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index 228d89df9d84..b278f22cefcf 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"ముఖం గుర్తించలేము. బదులుగా వేలిముద్ర ఉపయోగించండి."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"ముఖం గుర్తించడం కుదరలేదు"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"బదులుగా వేలిముద్రను ఉపయోగించండి"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"బ్లూటూత్ కనెక్ట్ చేయబడింది."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"బ్యాటరీ శాతం తెలియదు."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g>కి కనెక్ట్ చేయబడింది."</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"క్యాప్షన్లు ఓవర్లే"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"ప్రారంభించు"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"నిలిపివేయండి"</string> + <string name="sound_settings" msgid="8874581353127418308">"సౌండ్ & వైబ్రేషన్"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"సెట్టింగ్లు"</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> @@ -594,7 +598,7 @@ <string name="switch_bar_on" msgid="1770868129120096114">"ఆన్"</string> <string name="switch_bar_off" msgid="5669805115416379556">"ఆఫ్ చేయి"</string> <string name="tile_unavailable" msgid="3095879009136616920">"అందుబాటులో లేదు"</string> - <string name="tile_disabled" msgid="373212051546573069">"డిజేబుల్ చేయబడింది"</string> + <string name="accessibility_tile_disabled_by_policy_action_description" msgid="6958422730461646926">"మరింత తెలుసుకోండి"</string> <string name="nav_bar" msgid="4642708685386136807">"నావిగేషన్ బార్"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"లేఅవుట్"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"అత్యంత ఎడమ వైపు ఉన్న బటన్ రకం"</string> @@ -667,8 +671,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"ఫోన్ను చల్లబరిచే క్రమంలో కొన్ని ఫీచర్లు పరిమితం చేయబడ్డాయి.\nమరింత సమాచారం కోసం ట్యాప్ చేయండి"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"మీ ఫోన్ ఆటోమేటిక్గా చల్లబడటానికి ప్రయత్నిస్తుంది. మీరు ఇప్పటికీ మీ ఫోన్ను ఉపయోగించవచ్చు, కానీ దాని పనితీరు నెమ్మదిగా ఉండవచ్చు.\n\nమీ ఫోన్ చల్లబడిన తర్వాత, అది సాధారణ రీతిలో పని చేస్తుంది."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"తీసుకోవాల్సిన జాగ్రత్తలు ఏమిటో చూడండి"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"ప్లగ్ నుండి ఛార్జర్ తీసివేయండి"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"ఈ పరికరాన్ని ఛార్జ్ చేయడంలో సమస్య ఉంది. పవర్ అడాప్టర్ను ప్లగ్ నుండి తీసివేసి, కేబుల్ ఏమైనా వేడిగా అయితే తగిన జాగ్రత్తలు తీసుకోండి."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"తీసుకోవాల్సిన జాగ్రత్తలు ఏమిటో చూడండి"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"ఎడమవైపు షార్ట్కట్"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"కుడివైపు షార్ట్కట్"</string> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index 42f8ae781c96..ec0e36595137 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"ไม่รู้จักใบหน้า ใช้ลายนิ้วมือแทน"</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"ไม่รู้จักใบหน้า"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"ใช้ลายนิ้วมือแทน"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"เชื่อมต่อบลูทูธแล้ว"</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"ไม่ทราบเปอร์เซ็นต์แบตเตอรี่"</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"เชื่อมต่อกับ <xliff:g id="BLUETOOTH">%s</xliff:g> แล้ว"</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"การวางซ้อนคำบรรยายภาพ"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"เปิดใช้"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"ปิดใช้"</string> + <string name="sound_settings" msgid="8874581353127418308">"เสียงและการสั่น"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"การตั้งค่า"</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> @@ -594,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"เปิด"</string> <string name="switch_bar_off" msgid="5669805115416379556">"ปิด"</string> <string name="tile_unavailable" msgid="3095879009136616920">"ไม่พร้อมใช้งาน"</string> - <string name="tile_disabled" msgid="373212051546573069">"ปิดใช้"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"แถบนำทาง"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"การจัดวาง"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"ประเภทปุ่มทางซ้ายเพิ่มเติม"</string> @@ -667,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"ฟีเจอร์บางอย่างจะใช้งานได้จำกัดขณะโทรศัพท์เย็นลง\nแตะเพื่อดูข้อมูลเพิ่มเติม"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"โทรศัพท์จะพยายามลดอุณหภูมิลงโดยอัตโนมัติ คุณยังสามารถใช้โทรศัพท์ได้ แต่โทรศัพท์อาจทำงานช้าลง\n\nโทรศัพท์จะทำงานตามปกติเมื่อเย็นลงแล้ว"</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"ดูขั้นตอนในการดูแลรักษา"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"ถอดปลั๊กที่ชาร์จ"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"พบปัญหาในการชาร์จอุปกรณ์นี้ ถอดปลั๊กอะแดปเตอร์ด้วยความระมัดระวังเพราะสายอาจร้อน"</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"ดูขั้นตอนในการดูแลรักษา"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"ทางลัดทางซ้าย"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"ทางลัดทางขวา"</string> diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index 8f79ec581caf..c0b358860022 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Hindi makilala ang mukha. Gumamit ng fingerprint."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Hindi makilala ang mukha"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Gumamit ng fingerprint"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Nakakonekta ang Bluetooth."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Hindi alam ang porsyento ng baterya."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Nakakonekta sa <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Overlay ng mga caption"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"i-enable"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"i-disable"</string> + <string name="sound_settings" msgid="8874581353127418308">"Tunog at pag-vibrate"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Mga Setting"</string> <string name="screen_pinning_title" msgid="9058007390337841305">"Naka-pin ang app"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Pinapanatili nitong nakikita ito hanggang sa mag-unpin ka. Pindutin nang matagal ang Bumalik at Overview upang mag-unpin."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Pinapanatili nitong nakikita ito hanggang sa mag-unpin ka. Pindutin nang matagal ang Bumalik at Home upang mag-unpin."</string> @@ -594,7 +598,7 @@ <string name="switch_bar_on" msgid="1770868129120096114">"I-on"</string> <string name="switch_bar_off" msgid="5669805115416379556">"I-off"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Hindi available"</string> - <string name="tile_disabled" msgid="373212051546573069">"Naka-disable"</string> + <string name="accessibility_tile_disabled_by_policy_action_description" msgid="6958422730461646926">"matuto pa"</string> <string name="nav_bar" msgid="4642708685386136807">"Navigation bar"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Layout"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Uri ng extra na button ng kaliwa"</string> @@ -667,8 +671,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Limitado ang ilang feature habang nagku-cool down ang telepono.\nMag-tap para sa higit pang impormasyon"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"Awtomatikong susubukan ng iyong telepono na mag-cool down. Magagamit mo pa rin ang iyong telepono, ngunit maaaring mas mabagal ang paggana nito.\n\nKapag nakapag-cool down na ang iyong telepono, gagana na ito nang normal."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Tingnan ang mga hakbang sa pangangalaga"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Hugutin ang charger"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"May isyu sa pag-charge ng device na ito. Hugutin ang power adapter at mag-ingat dahil maaaring mainit ang cable."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"Tingnan ang mga hakbang sa pangangalaga"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Kaliwang shortcut"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Kanang shortcut"</string> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index 687be0f390a5..389178a15322 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Yüz tanınamadı. Bunun yerine parmak izi kullanın."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Yüz tanınamadı"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Bunun yerine parmak izi kullanın"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth bağlandı."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Pil yüzdesi bilinmiyor."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> ile bağlı."</string> @@ -339,8 +341,7 @@ <string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Şarj oluyor • Dolmasına <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> kaldı"</string> <string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Hızlı şarj oluyor • Dolmasına <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> kaldı"</string> <string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Yavaş şarj oluyor • Dolmasına <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> kaldı"</string> - <!-- no translation found for keyguard_indication_charging_time_dock (3149328898931741271) --> - <skip /> + <string name="keyguard_indication_charging_time_dock" msgid="3149328898931741271">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Şarj oluyor • Dolmasına <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> kaldı"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Kullanıcı değiştirme"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"açılır menü"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Bu oturumdaki tüm uygulamalar ve veriler silinecek."</string> @@ -420,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Altyazı yer paylaşımı"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"etkinleştir"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"devre dışı bırak"</string> + <string name="sound_settings" msgid="8874581353127418308">"Ses ve titreşim"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Ayarlar"</string> <string name="screen_pinning_title" msgid="9058007390337841305">"Uygulama sabitlendi"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Bu işlem, siz sabitlemeyi kaldırana kadar ekranı görünür durumda tutar. Sabitlemeyi kaldırmak için Geri\'ye ve Genel Bakış\'a dokunup basılı tutun."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Bu işlem, siz sabitlemeyi kaldırana kadar ekranı görünür durumda tutar. Sabitlemeyi kaldırmak için Geri\'ye ve Ana sayfaya dokunup basılı tutun."</string> @@ -576,7 +579,7 @@ <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Klavye Kısayolları"</string> <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Klavye düzenini değiştir"</string> <string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Uygulamalar"</string> - <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Asist"</string> + <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Asistan"</string> <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Tarayıcı"</string> <string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Kişiler"</string> <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"E-posta"</string> @@ -595,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"Açık"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Kapalı"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Kullanılamıyor"</string> - <string name="tile_disabled" msgid="373212051546573069">"Devre dışı bırakıldı"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"Gezinme çubuğu"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Düzen"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Ekstra sol düğme türü"</string> @@ -668,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Telefon soğurken bazı özellikler sınırlı olarak kullanılabilir.\nDaha fazla bilgi için dokunun"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"Telefonunuz otomatik olarak soğumaya çalışacak. Bu sırada telefonunuzu kullanmaya devam edebilirsiniz ancak uygulamalar daha yavaş çalışabilir.\n\nTelefonunuz soğuduktan sonra normal şekilde çalışacaktır."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Bakımla ilgili adımlara bakın"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Şarj cihazını çıkarın"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"Bu cihaz şarj edilirken bir sorun oluştu. Güç adaptörünün fişini çekin. Kablo sıcak olabileceğinden fişi çekerken dikkatli olun."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"Bakımla ilgili adımlara bakın"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Sol kısayol"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Sağ kısayol"</string> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index bd5ec92f5f48..77966e8a7bb1 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Обличчя не розпізнано. Скористайтеся відбитком пальця."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Обличчя не розпізнано"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Скористайтеся відбитком"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth під’єднано."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Відсоток заряду акумулятора невідомий."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Підключено до <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> @@ -339,8 +341,7 @@ <string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Заряджання • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> до повного заряду"</string> <string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Швидке заряджання • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> до повного заряду"</string> <string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Повільне заряджання • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> до повного заряду"</string> - <!-- no translation found for keyguard_indication_charging_time_dock (3149328898931741271) --> - <skip /> + <string name="keyguard_indication_charging_time_dock" msgid="3149328898931741271">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Заряджання • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> до повного заряду"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Змінити користувача"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"спадне меню"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Усі додатки й дані з цього сеансу буде видалено."</string> @@ -420,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Накласти субтитри"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"увімкнути"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"вимкнути"</string> + <string name="sound_settings" msgid="8874581353127418308">"Звук і вібрація"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Налаштування"</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> @@ -595,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"Увімкнено"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Вимкнено"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Недоступно"</string> - <string name="tile_disabled" msgid="373212051546573069">"Вимкнено"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"Панель навігації"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Макет"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Додатковий тип кнопки ліворуч"</string> @@ -668,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Під час охолодження деякі функції обмежуються.\nНатисніть, щоб дізнатися більше"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"Ваш телефон охолоджуватиметься автоматично. Ви можете далі користуватися телефоном, але він може працювати повільніше.\n\nКоли телефон охолоне, він працюватиме належним чином."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Переглянути запобіжні заходи"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Відключіть зарядний пристрій"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"Виникла проблема із заряджанням пристрою. Відключіть адаптер живлення, однак будьте обережні, оскільки кабель може бути гарячим."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"Переглянути застереження"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Комбінація клавіш ліворуч"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Комбінація клавіш праворуч"</string> diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml index 0123d30731e4..4ebbc705d607 100644 --- a/packages/SystemUI/res/values-ur/strings.xml +++ b/packages/SystemUI/res/values-ur/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"چہرے کی شناخت نہیں ہو سکی۔ اس کے بجائے فنگر پرنٹ استعمال کریں۔"</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"چہرے کی پہچان نہیں ہو سکی"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"اس کے بجائے فنگر پرنٹ استعمال کریں"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"بلوٹوتھ مربوط ہے۔"</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"بیٹری کی فیصد نامعلوم ہے۔"</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> سے منسلک ہیں۔"</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"کیپشنز کا اوورلے"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"فعال کریں"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"غیر فعال کریں"</string> + <string name="sound_settings" msgid="8874581353127418308">"آواز اور وائبریشن"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"ترتیبات"</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> @@ -594,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"آن"</string> <string name="switch_bar_off" msgid="5669805115416379556">"آف"</string> <string name="tile_unavailable" msgid="3095879009136616920">"غیر دستیاب ہے"</string> - <string name="tile_disabled" msgid="373212051546573069">"غیر فعال ہے"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"نیویگیشن بار"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"لے آؤٹ"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"بائيں جانب کی اضافی بٹن کی قسم"</string> @@ -667,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"فون کے ٹھنڈے ہو جانے تک کچھ خصوصیات محدود ہیں۔\nمزید معلومات کیلئے تھپتھپائیں"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"آپ کا فون خودکار طور پر ٹھنڈا ہونے کی کوشش کرے گا۔ آپ ابھی بھی اپنا فون استعمال کر سکتے ہیں، مگر ہو سکتا ہے یہ سست چلے۔\n\nایک بار آپ کا فون ٹھنڈا ہوجائے تو یہ معمول کے مطابق چلے گا۔"</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"نگہداشت کے اقدامات ملاحظہ کریں"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"چارجر ان پلگ کریں"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"اس آلہ کو چارج کرنے میں ایک مسئلہ ہے۔ پاور ایڈاپٹر کو ان پلگ کریں اور دھیان دیں کیونکہ تار گرم ہو سکتا ہے۔"</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"نگہداشت کے اقدامات ملاحظہ کریں"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"بائيں جانب کا شارٹ کٹ"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"دائیں جانب کا شارٹ کٹ"</string> diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml index 0ec68f928feb..6432d75b2b2b 100644 --- a/packages/SystemUI/res/values-uz/strings.xml +++ b/packages/SystemUI/res/values-uz/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Bu yuz notanish. Barmoq izi orqali urining."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Yuz aniqlanmadi"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Barmoq izi orqali urining"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth ulandi."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Batareya quvvati foizi nomaʼlum."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Ulangan: <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Taglavhalarni chiqarish"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"faollashtirish"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"faolsizlantirish"</string> + <string name="sound_settings" msgid="8874581353127418308">"Tovush va tebranish"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Sozlamalar"</string> <string name="screen_pinning_title" msgid="9058007390337841305">"Ilova mahkamlandi"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Ekran yechilmaguncha u o‘zgarmas holatda qoladi. Uni yechish uchun “Orqaga” va “Umumiy ma’lumot” tugmalarini bosib turing."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Ekran yechib olinmagunicha u mahkamlangan holatda qoladi. Uni yechish uchun Orqaga va Asosiy tugmalarni birga bosib turing."</string> @@ -594,7 +598,7 @@ <string name="switch_bar_on" msgid="1770868129120096114">"Yoniq"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Yoqilmagan"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Mavjud emas"</string> - <string name="tile_disabled" msgid="373212051546573069">"Faolsizlantirilgan"</string> + <string name="accessibility_tile_disabled_by_policy_action_description" msgid="6958422730461646926">"batafsil"</string> <string name="nav_bar" msgid="4642708685386136807">"Navigatsiya paneli"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Tugmalar joylashuvi"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Qo‘shimcha Chapga tugmasi turi"</string> @@ -667,8 +671,8 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Telefon sovib qolganda ayrim funksiyalari ishlamasligi mumkin.\nBatafsil axborot uchun bosing"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"Telefon avtomatik ravishda o‘zini sovitadi. Telefoningizdan foydalanishda davom etishingiz mumkin, lekin u sekinroq ishlashi mumkin.\n\nTelefon sovishi bilan normal holatda ishlashni boshlaydi."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Batafsil axborot"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Quvvatlash moslamasini uzing"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"Bu qurilmani quvvatlashda muammo bor. Quvvat adapteri va kabelni tarmoqdan uzing, ular qizib ketgan boʻlishi mumkin."</string> + <string name="high_temp_alarm_title" msgid="8654754369605452169">"Qurilmani uzing"</string> + <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Qurilmangiz quvvatlash porti yaqinida qizib ketmoqda. Agar quvvatlagich yoki USB aksessuarga ulangan boʻlsa, kabel qizib ketmasidan uni darhol uzing."</string> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"Batafsil axborot"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Chapga yorlig‘i"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"O‘ngga yorlig‘i"</string> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 231a7d0e16a9..c0e7b2f82ea3 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Không thể nhận dạng khuôn mặt. Hãy dùng vân tay."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Không nhận ra khuôn mặt"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Hãy dùng vân tay"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Đã kết nối bluetooth."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Tỷ lệ phần trăm pin không xác định."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Đã kết nối với <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> @@ -339,8 +341,7 @@ <string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Đang sạc • Sẽ đầy sau <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> <string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Đang sạc nhanh • Sẽ đầy sau <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> <string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Đang sạc chậm • Sẽ đầy sau <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> - <!-- no translation found for keyguard_indication_charging_time_dock (3149328898931741271) --> - <skip /> + <string name="keyguard_indication_charging_time_dock" msgid="3149328898931741271">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Đang sạc • Sẽ đầy sau <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Chuyển đổi người dùng"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"trình đơn kéo xuống"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Tất cả ứng dụng và dữ liệu trong phiên này sẽ bị xóa."</string> @@ -420,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Lớp phủ phụ đề"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"bật"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"tắt"</string> + <string name="sound_settings" msgid="8874581353127418308">"Âm thanh và chế độ rung"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Cài đặt"</string> <string name="screen_pinning_title" msgid="9058007390337841305">"Đã ghim ứng dụng"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Ứng dụng này sẽ ở cố định trên màn hình cho đến khi bạn bỏ ghim. Hãy chạm và giữ Quay lại và Tổng quan để bỏ ghim."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Ứng dụng này sẽ ở cố định trên màn hình cho đến khi bạn bỏ ghim. Hãy chạm và giữ nút Quay lại và nút Màn hình chính để bỏ ghim."</string> @@ -595,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"Đang bật"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Đang tắt"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Không có sẵn"</string> - <string name="tile_disabled" msgid="373212051546573069">"Đã tắt"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"Thanh điều hướng"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Bố cục"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Loại nút bổ sung bên trái"</string> @@ -668,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Một số tính năng bị hạn chế trong khi điện thoại nguội dần.\nHãy nhấn để biết thêm thông tin"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"Điện thoại của bạn sẽ tự động nguội dần. Bạn vẫn có thể sử dụng điện thoại, nhưng điện thoại có thể chạy chậm hơn. \n\nSau khi đã nguội, điện thoại sẽ chạy bình thường."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Xem các bước chăm sóc"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Rút phích cắm bộ sạc"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"Đã xảy ra sự cố khi sạc thiết bị này. Hãy rút phích cắm bộ chuyển đổi điện và cẩn thận vì dây cáp có thể nóng."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"Xem các bước chăm sóc"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Lối tắt bên trái"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Lối tắt bên phải"</string> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index 17ed05db6030..df0b0e056cf0 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"无法识别人脸。请改用指纹。"</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"人脸识别失败"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"改用指纹"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"蓝牙已连接。"</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"电池电量百分比未知。"</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"已连接到<xliff:g id="BLUETOOTH">%s</xliff:g>。"</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"字幕重叠显示"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"启用"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"停用"</string> + <string name="sound_settings" msgid="8874581353127418308">"提示音和振动"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"设置"</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> @@ -594,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"开启"</string> <string name="switch_bar_off" msgid="5669805115416379556">"关闭"</string> <string name="tile_unavailable" msgid="3095879009136616920">"不可用"</string> - <string name="tile_disabled" msgid="373212051546573069">"已停用"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"导航栏"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"布局"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"其他向左按钮类型"</string> @@ -667,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"手机降温时,部分功能的使用会受限制。\n点按即可了解详情"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"您的手机将自动尝试降温。您依然可以使用您的手机,但是手机运行速度可能会更慢。\n\n手机降温后,就会恢复正常的运行速度。"</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"查看处理步骤"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"拔下充电器"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"为此设备充电时出现问题。这可能是由数据线太热所导致,请拔下电源适配器并采取相应的处理措施。"</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"查看处理步骤"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"向左快捷方式"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"向右快捷方式"</string> diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index 121e94304f56..67f94b766153 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"無法辨識面孔,請改用指紋完成驗證。"</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"無法辨識臉孔"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"請改用指紋"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"藍牙連線已建立。"</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"電量百分比不明。"</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"已連線至<xliff:g id="BLUETOOTH">%s</xliff:g>。"</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"字幕重疊"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"啟用"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"停用"</string> + <string name="sound_settings" msgid="8874581353127418308">"音效和震動"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"設定"</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> @@ -594,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"開啟"</string> <string name="switch_bar_off" msgid="5669805115416379556">"關閉"</string> <string name="tile_unavailable" msgid="3095879009136616920">"無法使用"</string> - <string name="tile_disabled" msgid="373212051546573069">"已停用"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"導覽列"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"配置"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"其他向左按鈕類型"</string> @@ -667,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"手機降溫時,部分功能會受限制。\n輕按即可瞭解詳情"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"手機會自動嘗試降溫。您仍可以使用手機,但手機的運作速度可能較慢。\n\n手機降溫後便會恢復正常。"</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"查看保養步驟"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"拔下充電器"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"為此裝置充電時發生問題。請拔除電源適配器並注意安全,因為連接線可能會發熱。"</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"查看保養步驟"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"向左捷徑"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"向右捷徑"</string> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index d4de3bdcd9b7..23189d09cdfb 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"無法辨識臉孔,請改用指紋完成驗證。"</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"無法辨識臉孔"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"請改用指紋"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"藍牙連線已建立。"</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"電池電量不明。"</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"已連線至<xliff:g id="BLUETOOTH">%s</xliff:g>。"</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"字幕重疊顯示"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"啟用"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"停用"</string> + <string name="sound_settings" msgid="8874581353127418308">"音效與震動"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"設定"</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> @@ -594,7 +598,8 @@ <string name="switch_bar_on" msgid="1770868129120096114">"開啟"</string> <string name="switch_bar_off" msgid="5669805115416379556">"關閉"</string> <string name="tile_unavailable" msgid="3095879009136616920">"無法使用"</string> - <string name="tile_disabled" msgid="373212051546573069">"已停用"</string> + <!-- no translation found for accessibility_tile_disabled_by_policy_action_description (6958422730461646926) --> + <skip /> <string name="nav_bar" msgid="4642708685386136807">"導覽列"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"配置"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"其他向左按鈕類型"</string> @@ -667,8 +672,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"手機降溫時,某些功能會受限。\n輕觸即可瞭解詳情"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"手機會自動嘗試降溫。你仍可繼續使用手機,但是手機的運作速度可能會較慢。\n\n手機降溫完畢後,就會恢復正常的運作速度。"</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"查看處理步驟"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"拔除充電器"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"為這個裝置充電時發生問題。這可能是因為傳輸線過熱所致,請拔除電源變壓器並採取處理措施。"</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"查看處理步驟"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"向左快速鍵"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"向右快速鍵"</string> diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index 69af44d4af99..08cd7fcde557 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -161,6 +161,8 @@ <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Ayibazi ubuso. Sebenzisa izigxivizo zeminwe kunalokho."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> + <string name="keyguard_face_failed" msgid="9044619102286917151">"Ayikwazi ukubona ubuso"</string> + <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Kunalokho sebenzisa isigxivizo somunwe"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth ixhunyiwe"</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Iphesenti lebhethri alaziwa."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Xhuma ku-<xliff:g id="BLUETOOTH">%s</xliff:g>."</string> @@ -419,6 +421,8 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Imbondela yamagama-ncazo"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"nika amandla"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"khubaza"</string> + <string name="sound_settings" msgid="8874581353127418308">"Umsindo nokudlidliza"</string> + <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Amasethingi"</string> <string name="screen_pinning_title" msgid="9058007390337841305">"I-app iphiniwe"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Lokhu kuyigcina ibukeka uze ususe ukuphina. Thinta uphinde ubambe okuthi Emuva Nokubuka konke ukuze ususe ukuphina."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Lokhu kuyigcina ibonakala uze uyisuse. Thinta uphinde ubambe okuthi Emuva nokuthi Ekhaya ukuze ususe ukuphina."</string> @@ -594,7 +598,7 @@ <string name="switch_bar_on" msgid="1770868129120096114">"Vuliwe"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Valiwe"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Akutholakali"</string> - <string name="tile_disabled" msgid="373212051546573069">"Kukhutshaziwe"</string> + <string name="accessibility_tile_disabled_by_policy_action_description" msgid="6958422730461646926">"funda kabanzi"</string> <string name="nav_bar" msgid="4642708685386136807">"Ibha yokuzula"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Isakhiwo"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Uhlobo lwenkinobho engakwesokunxele engeziwe"</string> @@ -667,8 +671,10 @@ <string name="high_temp_notif_message" msgid="1277346543068257549">"Ezinye izici zikhawulelwe ngenkathi ifoni iphola.\nThepha mayelana nolwazi olwengeziwe"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"Ifoni yakho izozama ngokuzenzakalela ukuphola. Ungasasebenzisa ifoni yakho, kodwa ingasebenza ngokungasheshi.\n\nUma ifoni yakho isipholile, izosebenza ngokuvamile."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Bona izinyathelo zokunakekelwa"</string> - <string name="high_temp_alarm_title" msgid="2359958549570161495">"Khipha ishaja"</string> - <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"Kukhona inkinga yokushaja le divayisi. Khipha i-adaptha yamandla, uphinde unakekele njengoba ikhebuli kungenzeka lifudumele."</string> + <!-- no translation found for high_temp_alarm_title (8654754369605452169) --> + <skip /> + <!-- no translation found for high_temp_alarm_notify_message (3917622943609118956) --> + <skip /> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"Bona izinyathelo zokunakekelwa"</string> <string name="lockscreen_shortcut_left" msgid="1238765178956067599">"Isinqamuleli sangakwesokunxele"</string> <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"Isinqamuleli sangakwesokudla"</string> diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index ad8113aed87c..a8027238a0bf 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -587,9 +587,6 @@ when the double-press power gesture is used. Ignored if empty. --> <string translatable="false" name="config_cameraGesturePackage"></string> - <!-- Determines whether to allow the nav bar handle to be forced to be opaque. --> - <bool name="allow_force_nav_bar_handle_opaque">true</bool> - <!-- Whether a transition of ACTIVITY_TYPE_DREAM to the home app should play a home sound effect --> <bool name="config_playHomeSoundAfterDream">false</bool> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 19a6aba1fa72..9cb4cc4c8e63 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -1223,6 +1223,17 @@ fade and expand. --> <dimen name="lockscreen_shade_qs_transition_distance">@dimen/lockscreen_shade_full_transition_distance</dimen> + <!-- Distance delay for the QS transition to start during the lockscreen shade expansion. --> + <dimen name="lockscreen_shade_qs_transition_delay">0dp</dimen> + + <!-- Distance that it takes to complete the QS "squish" transition during the lockscreen shade + expansion. --> + <dimen name="lockscreen_shade_qs_squish_transition_distance">@dimen/lockscreen_shade_qs_transition_distance</dimen> + + <!-- The fraction at which the QS "squish" transition should start during the lockscreen shade + expansion. 0 is fully collapsed, 1 is fully expanded. --> + <item type="dimen" format="float" name="lockscreen_shade_qs_squish_start_fraction">0</item> + <!-- Distance that the full shade transition takes in order for depth of the wallpaper to fully change. --> <dimen name="lockscreen_shade_depth_controller_transition_distance">@dimen/lockscreen_shade_full_transition_distance</dimen> diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl index a030bf629507..e77c65079456 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl @@ -42,13 +42,6 @@ interface ISystemUiProxy { void onOverviewShown(boolean fromHome) = 6; /** - * Control the {@param alpha} of the option nav bar button (back-button in 2 button mode - * and home handle & background in gestural mode). The {@param animate} is currently only - * supported for 2 button mode. - */ - void setNavBarButtonAlpha(float alpha, boolean animate) = 19; - - /** * Proxies motion events from the homescreen UI to the status bar. Only called when * swipe down is detected on WORKSPACE. The sender guarantees the following order of events on * the tracking pointer. diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index 1068c261b68e..1463840b4cde 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -26,6 +26,7 @@ import static android.hardware.biometrics.BiometricConstants.BIOMETRIC_LOCKOUT_N import static android.hardware.biometrics.BiometricConstants.BIOMETRIC_LOCKOUT_PERMANENT; import static android.hardware.biometrics.BiometricConstants.BIOMETRIC_LOCKOUT_TIMED; import static android.hardware.biometrics.BiometricConstants.LockoutMode; +import static android.hardware.biometrics.BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_START; import static android.os.BatteryManager.BATTERY_STATUS_UNKNOWN; import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_BOOT; @@ -104,8 +105,10 @@ import android.os.Handler; import android.os.IRemoteCallback; import android.os.Looper; import android.os.Message; +import android.os.PowerManager; import android.os.RemoteException; import android.os.ServiceManager; +import android.os.SystemClock; import android.os.Trace; import android.os.UserHandle; import android.os.UserManager; @@ -341,6 +344,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab private final Executor mBackgroundExecutor; private SensorPrivacyManager mSensorPrivacyManager; private final ActiveUnlockConfig mActiveUnlockConfig; + private final PowerManager mPowerManager; + private final boolean mWakeOnFingerprintAcquiredStart; /** * Short delay before restarting fingerprint authentication after a successful try. This should @@ -790,6 +795,11 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab private void handleFingerprintAcquired( @BiometricFingerprintConstants.FingerprintAcquired int acquireInfo) { Assert.isMainThread(); + if (mWakeOnFingerprintAcquiredStart && acquireInfo == FINGERPRINT_ACQUIRED_START) { + mPowerManager.wakeUp( + SystemClock.uptimeMillis(), PowerManager.WAKE_REASON_GESTURE, + "com.android.systemui.keyguard:FINGERPRINT_ACQUIRED_START"); + } for (int i = 0; i < mCallbacks.size(); i++) { KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); if (cb != null) { @@ -1880,7 +1890,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab KeyguardUpdateMonitorLogger logger, UiEventLogger uiEventLogger, // This has to be a provider because SessionTracker depends on KeyguardUpdateMonitor :( - Provider<SessionTracker> sessionTrackerProvider) { + Provider<SessionTracker> sessionTrackerProvider, + PowerManager powerManager) { mContext = context; mSubscriptionManager = SubscriptionManager.from(context); mTelephonyListenerManager = telephonyListenerManager; @@ -1901,7 +1912,10 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab mLogger = logger; mUiEventLogger = uiEventLogger; mSessionTrackerProvider = sessionTrackerProvider; + mPowerManager = powerManager; mActiveUnlockConfig.setKeyguardUpdateMonitor(this); + mWakeOnFingerprintAcquiredStart = context.getResources() + .getBoolean(com.android.internal.R.bool.kg_wake_on_acquire_start); mHandler = new Handler(mainLooper) { @Override @@ -3691,6 +3705,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab pw.println(" getUserHasTrust()=" + getUserHasTrust(getCurrentUser())); pw.println(" getUserUnlockedWithBiometric()=" + getUserUnlockedWithBiometric(getCurrentUser())); + pw.println(" mWakeOnFingerprintAcquiredStart=" + mWakeOnFingerprintAcquiredStart); pw.println(" SIM States:"); for (SimData data : mSimDatas.values()) { pw.println(" " + data.toString()); diff --git a/packages/SystemUI/src/com/android/systemui/dagger/DefaultServiceBinder.java b/packages/SystemUI/src/com/android/systemui/dagger/DefaultServiceBinder.java index e1cbdcdd86c1..92eeace648ad 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/DefaultServiceBinder.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/DefaultServiceBinder.java @@ -18,7 +18,6 @@ package com.android.systemui.dagger; import android.app.Service; -import com.android.systemui.ImageWallpaper; import com.android.systemui.SystemUIService; import com.android.systemui.doze.DozeService; import com.android.systemui.dreams.DreamOverlayService; @@ -26,6 +25,7 @@ import com.android.systemui.dump.SystemUIAuxiliaryDumpService; import com.android.systemui.keyguard.KeyguardService; import com.android.systemui.screenrecord.RecordingService; import com.android.systemui.statusbar.phone.NotificationListenerWithPlugins; +import com.android.systemui.wallpapers.ImageWallpaper; import dagger.Binds; import dagger.Module; diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt b/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt index 4c6aa7b4cad9..cc77ed15b5f0 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt @@ -458,6 +458,7 @@ class MediaCarouselController @Inject constructor( val existingPlayer = MediaPlayerData.getMediaPlayer(key) val curVisibleMediaKey = MediaPlayerData.playerKeys() .elementAtOrNull(mediaCarouselScrollHandler.visibleMediaIndex) + val isCurVisibleMediaPlaying = MediaPlayerData.getMediaData(curVisibleMediaKey)?.isPlaying if (existingPlayer == null) { val newPlayer = mediaControlPanelFactory.get() newPlayer.attachPlayer(MediaViewHolder.create( @@ -472,13 +473,23 @@ class MediaCarouselController @Inject constructor( key, data, newPlayer, systemClock, isSsReactivated, debugLogger ) updatePlayerToState(newPlayer, noAnimation = true) - reorderAllPlayers(curVisibleMediaKey) + if (data.active) { + reorderAllPlayers(curVisibleMediaKey) + } else { + needsReordering = true + } } else { existingPlayer.bindPlayer(data, key) MediaPlayerData.addMediaPlayer( key, data, existingPlayer, systemClock, isSsReactivated, debugLogger ) - if (isReorderingAllowed || shouldScrollToActivePlayer) { + // Check the playing status of both current visible and new media players + // To make sure we scroll to the active playing media card. + if (isReorderingAllowed || + shouldScrollToActivePlayer && + data.isPlaying == true && + isCurVisibleMediaPlaying == false + ) { reorderAllPlayers(curVisibleMediaKey) } else { needsReordering = true @@ -1035,6 +1046,15 @@ internal object MediaPlayerData { } } + fun getMediaData(mediaSortKey: MediaSortKey?): MediaData? { + mediaData.forEach { (key, value) -> + if (value == mediaSortKey) { + return mediaData[key]?.data + } + } + return null + } + fun getMediaPlayer(key: String): MediaControlPanel? { return mediaData.get(key)?.let { mediaPlayers.get(it) } } diff --git a/packages/SystemUI/src/com/android/systemui/media/RingtonePlayer.java b/packages/SystemUI/src/com/android/systemui/media/RingtonePlayer.java index 75fa2f181d7c..0b9b32b0d7d7 100644 --- a/packages/SystemUI/src/com/android/systemui/media/RingtonePlayer.java +++ b/packages/SystemUI/src/com/android/systemui/media/RingtonePlayer.java @@ -96,8 +96,9 @@ public class RingtonePlayer extends CoreStartable { mToken = token; mRingtone = new Ringtone(getContextForUser(user), false); - mRingtone.setAudioAttributes(aa); + mRingtone.setAudioAttributesField(aa); mRingtone.setUri(uri, volumeShaperConfig); + mRingtone.createLocalMediaPlayer(); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/media/dream/MediaDreamSentinel.java b/packages/SystemUI/src/com/android/systemui/media/dream/MediaDreamSentinel.java index acd04f216a98..dc1488eefc4e 100644 --- a/packages/SystemUI/src/com/android/systemui/media/dream/MediaDreamSentinel.java +++ b/packages/SystemUI/src/com/android/systemui/media/dream/MediaDreamSentinel.java @@ -19,6 +19,7 @@ package com.android.systemui.media.dream; import static com.android.systemui.flags.Flags.MEDIA_DREAM_COMPLICATION; import android.content.Context; +import android.util.Log; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -38,6 +39,9 @@ import javax.inject.Inject; * the media complication as appropriate */ public class MediaDreamSentinel extends CoreStartable { + private static final String TAG = "MediaDreamSentinel"; + private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); + private final MediaDataManager.Listener mListener = new MediaDataManager.Listener() { private boolean mAdded; @Override @@ -46,11 +50,17 @@ public class MediaDreamSentinel extends CoreStartable { @Override public void onMediaDataRemoved(@NonNull String key) { + final boolean hasActiveMedia = mMediaDataManager.hasActiveMedia(); + if (DEBUG) { + Log.d(TAG, "onMediaDataRemoved(" + key + "), mAdded=" + mAdded + ", hasActiveMedia=" + + hasActiveMedia); + } + if (!mAdded) { return; } - if (mMediaDataManager.hasActiveMedia()) { + if (hasActiveMedia) { return; } @@ -71,11 +81,24 @@ public class MediaDreamSentinel extends CoreStartable { return; } + final boolean hasActiveMedia = mMediaDataManager.hasActiveMedia(); + if (DEBUG) { + Log.d(TAG, "onMediaDataLoaded(" + key + "), mAdded=" + mAdded + ", hasActiveMedia=" + + hasActiveMedia); + } + + // Media data can become inactive without triggering onMediaDataRemoved. + if (mAdded && !hasActiveMedia) { + mAdded = false; + mDreamOverlayStateController.removeComplication(mMediaEntryComplication); + return; + } + if (mAdded) { return; } - if (!mMediaDataManager.hasActiveMedia()) { + if (!hasActiveMedia) { return; } diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java index 75e48d2220c8..30947e839f0a 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java @@ -35,7 +35,6 @@ import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL; import static com.android.internal.accessibility.common.ShortcutConstants.CHOOSER_PACKAGE_NAME; import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.HOME_BUTTON_LONG_PRESS_DURATION_MS; -import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.NAV_BAR_HANDLE_FORCE_OPAQUE; import static com.android.systemui.navigationbar.NavBarHelper.transitionMode; import static com.android.systemui.recents.OverviewProxyService.OverviewProxyListener; import static com.android.systemui.shared.recents.utilities.Utilities.isTablet; @@ -229,10 +228,7 @@ public class NavigationBar extends ViewController<NavigationBarView> implements private Locale mLocale; private int mLayoutDirection; - private boolean mAllowForceNavBarHandleOpaque; - private boolean mForceNavBarHandleOpaque; private Optional<Long> mHomeButtonLongPressDurationMs; - private boolean mIsCurrentUserSetup; /** @see android.view.WindowInsetsController#setSystemBarsAppearance(int, int) */ private @Appearance int mAppearance; @@ -379,37 +375,6 @@ public class NavigationBar extends ViewController<NavigationBarView> implements } @Override - public void onNavBarButtonAlphaChanged(float alpha, boolean animate) { - if (!mIsCurrentUserSetup) { - // If the current user is not yet setup, then don't update any button alphas - return; - } - if (QuickStepContract.isLegacyMode(mNavBarMode)) { - // Don't allow the bar buttons to be affected by the alpha - return; - } - - ButtonDispatcher buttonDispatcher = null; - boolean forceVisible = false; - if (QuickStepContract.isGesturalMode(mNavBarMode)) { - // Disallow home handle animations when in gestural - animate = false; - forceVisible = mAllowForceNavBarHandleOpaque && mForceNavBarHandleOpaque; - buttonDispatcher = mView.getHomeHandle(); - if (getBarTransitions() != null) { - getBarTransitions().setBackgroundOverrideAlpha(alpha); - } - } else if (QuickStepContract.isSwipeUpMode(mNavBarMode)) { - buttonDispatcher = mView.getBackButton(); - } - if (buttonDispatcher != null) { - buttonDispatcher.setVisibility( - (forceVisible || alpha > 0) ? View.VISIBLE : View.INVISIBLE); - buttonDispatcher.setAlpha(forceVisible ? 1f : alpha, animate); - } - } - - @Override public void onHomeRotationEnabled(boolean enabled) { mView.getRotationButtonController().setHomeRotationEnabled(enabled); } @@ -456,15 +421,10 @@ public class NavigationBar extends ViewController<NavigationBarView> implements new DeviceConfig.OnPropertiesChangedListener() { @Override public void onPropertiesChanged(DeviceConfig.Properties properties) { - if (properties.getKeyset().contains(NAV_BAR_HANDLE_FORCE_OPAQUE)) { - mForceNavBarHandleOpaque = properties.getBoolean( - NAV_BAR_HANDLE_FORCE_OPAQUE, /* defaultValue = */ true); - } - if (properties.getKeyset().contains(HOME_BUTTON_LONG_PRESS_DURATION_MS)) { mHomeButtonLongPressDurationMs = Optional.of( - properties.getLong(HOME_BUTTON_LONG_PRESS_DURATION_MS, 0) - ).filter(duration -> duration != 0); + properties.getLong(HOME_BUTTON_LONG_PRESS_DURATION_MS, 0)) + .filter(duration -> duration != 0); if (mView != null) { reconfigureHomeLongClick(); } @@ -472,14 +432,6 @@ public class NavigationBar extends ViewController<NavigationBarView> implements } }; - private final DeviceProvisionedController.DeviceProvisionedListener mUserSetupListener = - new DeviceProvisionedController.DeviceProvisionedListener() { - @Override - public void onUserSetupChanged() { - mIsCurrentUserSetup = mDeviceProvisionedController.isCurrentUserSetup(); - } - }; - private final NotificationShadeDepthController.DepthListener mDepthListener = new NotificationShadeDepthController.DepthListener() { boolean mHasBlurs; @@ -660,12 +612,6 @@ public class NavigationBar extends ViewController<NavigationBarView> implements mCommandQueue.addCallback(this); mLongPressHomeEnabled = mNavBarHelper.getLongPressHomeEnabled(); mNavBarHelper.init(); - mAllowForceNavBarHandleOpaque = mContext.getResources().getBoolean( - R.bool.allow_force_nav_bar_handle_opaque); - mForceNavBarHandleOpaque = mDeviceConfigProxy.getBoolean( - DeviceConfig.NAMESPACE_SYSTEMUI, - NAV_BAR_HANDLE_FORCE_OPAQUE, - /* defaultValue = */ true); mHomeButtonLongPressDurationMs = Optional.of(mDeviceConfigProxy.getLong( DeviceConfig.NAMESPACE_SYSTEMUI, HOME_BUTTON_LONG_PRESS_DURATION_MS, @@ -685,8 +631,6 @@ public class NavigationBar extends ViewController<NavigationBarView> implements // Respect the latest disabled-flags. mCommandQueue.recomputeDisableFlags(mDisplayId, false); - mIsCurrentUserSetup = mDeviceProvisionedController.isCurrentUserSetup(); - mDeviceProvisionedController.addCallback(mUserSetupListener); mNotificationShadeDepthController.addListener(mDepthListener); } @@ -698,7 +642,6 @@ public class NavigationBar extends ViewController<NavigationBarView> implements mNavBarHelper.removeNavTaskStateUpdater(mNavbarTaskbarStateUpdater); mNavBarHelper.destroy(); - mDeviceProvisionedController.removeCallback(mUserSetupListener); mNotificationShadeDepthController.removeListener(mDepthListener); mDeviceConfigProxy.removeOnPropertiesChangedListener(mOnPropertiesChangedListener); diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java index b31e4720fef6..072c32f693d9 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java @@ -34,6 +34,7 @@ import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; +import androidx.annotation.FloatRange; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import androidx.lifecycle.Lifecycle; @@ -166,6 +167,13 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca // visible; private boolean mQsVisible; + /** + * Whether the notification panel uses the full width of the screen. + * + * Usually {@code true} on small screens, and {@code false} on large screens. + */ + private boolean mIsNotificationPanelFullWidth; + @Inject public QSFragment(RemoteInputQuickSettingsDisabler remoteInputQsDisabler, QSTileHost qsTileHost, @@ -571,15 +579,17 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca } @Override - public void setTransitionToFullShadeAmount(float pxAmount, float progress) { - boolean isTransitioningToFullShade = pxAmount > 0; + public void setTransitionToFullShadeProgress( + boolean isTransitioningToFullShade, + @FloatRange(from = 0.0, to = 1.0) float qsTransitionFraction, + @FloatRange(from = 0.0, to = 1.0) float qsSquishinessFraction) { if (isTransitioningToFullShade != mTransitioningToFullShade) { mTransitioningToFullShade = isTransitioningToFullShade; updateShowCollapsedOnKeyguard(); } - mFullShadeProgress = progress; + mFullShadeProgress = qsTransitionFraction; setQsExpansion(mLastQSExpansion, mLastPanelFraction, mLastHeaderTranslation, - isTransitioningToFullShade ? progress : mSquishinessFraction); + isTransitioningToFullShade ? qsSquishinessFraction : mSquishinessFraction); } @Override @@ -598,12 +608,16 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca } @Override + public void setIsNotificationPanelFullWidth(boolean isFullWidth) { + mIsNotificationPanelFullWidth = isFullWidth; + } + + @Override public void setQsExpansion(float expansion, float panelExpansionFraction, float proposedTranslation, float squishinessFraction) { float headerTranslation = mTransitioningToFullShade ? 0 : proposedTranslation; - float alphaProgress = mTransitioningToFullShade || mState == StatusBarState.KEYGUARD - ? mFullShadeProgress : panelExpansionFraction; - setAlphaAnimationProgress(mInSplitShade ? alphaProgress : 1); + float alphaProgress = calculateAlphaProgress(panelExpansionFraction); + setAlphaAnimationProgress(alphaProgress); mContainer.setExpansion(expansion); final float translationScaleY = (mInSplitShade ? 1 : QSAnimator.SHORT_PARALLAX_AMOUNT) * (expansion - 1); @@ -684,10 +698,43 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca } else if (progress > 0 && view.getVisibility() != View.VISIBLE) { view.setVisibility((View.VISIBLE)); } - float alpha = mQSPanelController.isBouncerInTransit() - ? BouncerPanelExpansionCalculator.aboutToShowBouncerProgress(progress) - : ShadeInterpolation.getContentAlpha(progress); - view.setAlpha(alpha); + view.setAlpha(interpolateAlphaAnimationProgress(progress)); + } + + private float calculateAlphaProgress(float panelExpansionFraction) { + if (mIsNotificationPanelFullWidth) { + // Small screens. QS alpha is not animated. + return 1; + } + if (mInSplitShade) { + // Large screens in landscape. + if (mTransitioningToFullShade || isKeyguardState()) { + // Always use "mFullShadeProgress" on keyguard, because + // "panelExpansionFractions" is always 1 on keyguard split shade. + return mFullShadeProgress; + } else { + return panelExpansionFraction; + } + } + // Large screens in portrait. + if (mTransitioningToFullShade) { + // Only use this value during the standard lock screen shade expansion. During the + // "quick" expansion from top, this value is 0. + return mFullShadeProgress; + } else { + return panelExpansionFraction; + } + } + + private float interpolateAlphaAnimationProgress(float progress) { + if (mQSPanelController.isBouncerInTransit()) { + return BouncerPanelExpansionCalculator.aboutToShowBouncerProgress(progress); + } + if (isKeyguardState()) { + // Alpha progress should be linear on lockscreen shade expansion. + return progress; + } + return ShadeInterpolation.getContentAlpha(progress); } private void updateQsBounds() { diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java index 99a6a4d6c10f..3788ad98092f 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java +++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java @@ -175,7 +175,6 @@ public class OverviewProxyService extends CurrentUserTracker implements private boolean mBound; private boolean mIsEnabled; private int mCurrentBoundedUserId = -1; - private float mNavBarButtonAlpha; private boolean mInputFocusTransferStarted; private float mInputFocusTransferStartY; private long mInputFocusTransferStartMillis; @@ -297,12 +296,6 @@ public class OverviewProxyService extends CurrentUserTracker implements } @Override - public void setNavBarButtonAlpha(float alpha, boolean animate) { - verifyCallerAndClearCallingIdentityPostMain("setNavBarButtonAlpha", () -> - notifyNavBarButtonAlphaChanged(alpha, animate)); - } - - @Override public void onAssistantProgress(@FloatRange(from = 0.0, to = 1.0) float progress) { verifyCallerAndClearCallingIdentityPostMain("onAssistantProgress", () -> notifyAssistantProgress(progress)); @@ -610,9 +603,6 @@ public class OverviewProxyService extends CurrentUserTracker implements mBackAnimation = backAnimation; mUiEventLogger = uiEventLogger; - // Assumes device always starts with back button until launcher tells it that it does not - mNavBarButtonAlpha = 1.0f; - dumpManager.registerDumpable(getClass().getSimpleName(), this); // Listen for nav bar mode changes @@ -814,7 +804,6 @@ public class OverviewProxyService extends CurrentUserTracker implements mConnectionCallbacks.add(listener); } listener.onConnectionChanged(mOverviewProxy != null); - listener.onNavBarButtonAlphaChanged(mNavBarButtonAlpha, false); } @Override @@ -844,17 +833,10 @@ public class OverviewProxyService extends CurrentUserTracker implements if (mOverviewProxy != null) { mOverviewProxy.asBinder().unlinkToDeath(mOverviewServiceDeathRcpt, 0); mOverviewProxy = null; - notifyNavBarButtonAlphaChanged(1f, false /* animate */); notifyConnectionChanged(); } } - private void notifyNavBarButtonAlphaChanged(float alpha, boolean animate) { - for (int i = mConnectionCallbacks.size() - 1; i >= 0; --i) { - mConnectionCallbacks.get(i).onNavBarButtonAlphaChanged(alpha, animate); - } - } - private void notifyHomeRotationEnabled(boolean enabled) { for (int i = mConnectionCallbacks.size() - 1; i >= 0; --i) { mConnectionCallbacks.get(i).onHomeRotationEnabled(enabled); @@ -1083,7 +1065,6 @@ public class OverviewProxyService extends CurrentUserTracker implements pw.print(" mInputFocusTransferStartMillis="); pw.println(mInputFocusTransferStartMillis); pw.print(" mWindowCornerRadius="); pw.println(mWindowCornerRadius); pw.print(" mSupportsRoundedCornersOnWindows="); pw.println(mSupportsRoundedCornersOnWindows); - pw.print(" mNavBarButtonAlpha="); pw.println(mNavBarButtonAlpha); pw.print(" mActiveNavBarRegion="); pw.println(mActiveNavBarRegion); pw.print(" mNavBarMode="); pw.println(mNavBarMode); mSysUiState.dump(pw, args); @@ -1098,8 +1079,6 @@ public class OverviewProxyService extends CurrentUserTracker implements default void onQuickScrubStarted() {} /** Notify the recents app (overview) is started by 3-button navigation. */ default void onToggleRecentApps() {} - /** Notify changes in the nav bar button alpha */ - default void onNavBarButtonAlphaChanged(float alpha, boolean animate) {} default void onHomeRotationEnabled(boolean enabled) {} default void onTaskbarStatusUpdated(boolean visible, boolean stashed) {} default void onTaskbarAutohideSuspend(boolean suspend) {} diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java index c3b265fec36e..156b123cee8d 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java @@ -1320,6 +1320,9 @@ public final class NotificationPanelViewController extends PanelViewController { mIsFullWidth = isFullWidth; mScrimController.setClipsQsScrim(isFullWidth); mNotificationStackScrollLayoutController.setIsFullWidth(isFullWidth); + if (mQs != null) { + mQs.setIsNotificationPanelFullWidth(isFullWidth); + } } private void startQsSizeChangeAnimation(int oldHeight, final int newHeight) { @@ -2428,8 +2431,8 @@ public final class NotificationPanelViewController extends PanelViewController { final float squishiness; if ((mQsExpandImmediate || mQsExpanded) && !mSplitShadeEnabled) { squishiness = 1; - } else if (mLockscreenShadeTransitionController.getQSDragProgress() > 0) { - squishiness = mLockscreenShadeTransitionController.getQSDragProgress(); + } else if (mTransitioningToFullShadeProgress > 0.0f) { + squishiness = mLockscreenShadeTransitionController.getQsSquishTransitionFraction(); } else { squishiness = mNotificationStackScrollLayoutController .getNotificationSquishinessFraction(); @@ -3716,6 +3719,7 @@ public final class NotificationPanelViewController extends PanelViewController { mQs.setHeaderClickable(isQsExpansionEnabled()); mQs.setOverscrolling(mStackScrollerOverscrolling); mQs.setInSplitShade(mSplitShadeEnabled); + mQs.setIsNotificationPanelFullWidth(mIsFullWidth); // recompute internal state when qspanel height changes mQs.getView().addOnLayoutChangeListener( diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeQsTransitionController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeQsTransitionController.kt new file mode 100644 index 000000000000..62c225ba0b4e --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeQsTransitionController.kt @@ -0,0 +1,159 @@ +/* + * Copyright (C) 2022 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 + +import android.content.Context +import android.util.IndentingPrintWriter +import android.util.MathUtils +import androidx.annotation.FloatRange +import androidx.annotation.Px +import com.android.systemui.R +import com.android.systemui.dump.DumpManager +import com.android.systemui.plugins.qs.QS +import com.android.systemui.statusbar.policy.ConfigurationController +import dagger.assisted.Assisted +import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject +import kotlin.math.max + +/** Responsible for the QS components during the lockscreen shade transition. */ +class LockscreenShadeQsTransitionController +@AssistedInject +constructor( + context: Context, + configurationController: ConfigurationController, + dumpManager: DumpManager, + @Assisted private val qsProvider: () -> QS, +) : AbstractLockscreenShadeTransitionController(context, configurationController, dumpManager) { + + private val qs: QS + get() = qsProvider() + + /** + * The progress fraction of the QS transition during lockscreen shade expansion. + * + * Note that this value might be 0 for some time when the expansion is already in progress, + * since there is a transition start delay for QS on some device configurations. For this + * reason, don't use this value to check whether the shade expansion is in progress. + */ + @FloatRange(from = 0.0, to = 1.0) + var qsTransitionFraction = 0f + private set + + /** + * The fraction of the QS "squish" transition progress during lockscreen shade expansion. + * + * Note that in some device configurations (large screens) this value can start at a value + * greater than 0. For this reason don't use this value to check whether the QS transition has + * started or not. + */ + @FloatRange(from = 0.0, to = 1.0) + var qsSquishTransitionFraction = 0f + private set + + /** + * The drag down amount, in pixels __for the QS transition__, also taking into account the + * [qsTransitionStartDelay]. + * + * Since it takes into account the start delay, it is __not__ the same as the raw drag down + * amount from the shade expansion. + */ + @Px private var qsDragDownAmount = 0f + + /** + * Distance it takes for the QS transition to complete during the lockscreen shade expansion. + */ + @Px private var qsTransitionDistance = 0 + + /** Distance delay for the QS transition to start during the lockscreen shade expansion. */ + @Px private var qsTransitionStartDelay = 0 + + /** + * Distance that it takes to complete the QS "squish" transition during the lockscreen shade + * expansion. + */ + @Px private var qsSquishTransitionDistance = 0 + + /** + * Whether the transition to full shade is in progress. Might be `true` even though + * [qsTransitionFraction] is still 0, due to [qsTransitionStartDelay]. + */ + private var isTransitioningToFullShade = false + + /** + * The fraction at which the QS "squish" transition should start during the lockscreen shade + * expansion. + * + * 0 is fully collapsed, 1 is fully expanded. + */ + @FloatRange(from = 0.0, to = 1.0) private var qsSquishStartFraction = 0f + + override fun updateResources() { + qsTransitionDistance = + context.resources.getDimensionPixelSize(R.dimen.lockscreen_shade_qs_transition_distance) + qsTransitionStartDelay = + context.resources.getDimensionPixelSize(R.dimen.lockscreen_shade_qs_transition_delay) + qsSquishTransitionDistance = + context.resources.getDimensionPixelSize( + R.dimen.lockscreen_shade_qs_squish_transition_distance + ) + qsSquishStartFraction = + context.resources.getFloat(R.dimen.lockscreen_shade_qs_squish_start_fraction) + + qsSquishTransitionFraction = max(qsSquishTransitionFraction, qsSquishStartFraction) + } + + override fun onDragDownAmountChanged(dragDownAmount: Float) { + qsDragDownAmount = dragDownAmount - qsTransitionStartDelay + qsTransitionFraction = MathUtils.saturate(qsDragDownAmount / qsTransitionDistance) + qsSquishTransitionFraction = + MathUtils.lerp( + /* start= */ qsSquishStartFraction, + /* stop= */ 1f, + /* amount= */ MathUtils.saturate(qsDragDownAmount / qsSquishTransitionDistance) + ) + isTransitioningToFullShade = dragDownAmount > 0.0f + qs.setTransitionToFullShadeProgress( + isTransitioningToFullShade, + qsTransitionFraction, + qsSquishTransitionFraction + ) + } + + override fun dump(pw: IndentingPrintWriter) { + pw.println( + """ + Resources: + qsTransitionDistance: $qsTransitionDistance + qsTransitionStartDelay: $qsTransitionStartDelay + qsSquishTransitionDistance: $qsSquishTransitionDistance + qsSquishStartFraction: $qsSquishStartFraction + State: + dragDownAmount: $dragDownAmount + qsDragDownAmount: $qsDragDownAmount + qsDragFraction: $qsTransitionFraction + qsSquishFraction: $qsSquishTransitionFraction + isTransitioningToFullShade: $isTransitioningToFullShade + """.trimIndent() + ) + } + + @AssistedFactory + fun interface Factory { + fun create(qsProvider: () -> QS): LockscreenShadeQsTransitionController + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt index d3343dfdcd19..80069319601f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt @@ -11,6 +11,7 @@ import android.util.MathUtils import android.view.MotionEvent import android.view.View import android.view.ViewConfiguration +import androidx.annotation.FloatRange import androidx.annotation.VisibleForTesting import com.android.systemui.Dumpable import com.android.systemui.ExpandHelper @@ -68,7 +69,8 @@ class LockscreenShadeTransitionController @Inject constructor( wakefulnessLifecycle: WakefulnessLifecycle, configurationController: ConfigurationController, falsingManager: FalsingManager, - dumpManager: DumpManager + dumpManager: DumpManager, + qsTransitionControllerFactory: LockscreenShadeQsTransitionController.Factory, ) : Dumpable { private var pulseHeight: Float = 0f @get:VisibleForTesting @@ -120,12 +122,6 @@ class LockscreenShadeTransitionController @Inject constructor( private var notificationShelfTransitionDistance = 0 /** - * Distance that the full shade transition takes in order for the Quick Settings to fully fade - * and expand. - */ - private var qsTransitionDistance = 0 - - /** * Distance that the full shade transition takes in order for depth of the wallpaper to fully * change. */ @@ -188,6 +184,18 @@ class LockscreenShadeTransitionController @Inject constructor( keyguardTransitionControllerFactory.create(notificationPanelController) } + private val qsTransitionController = qsTransitionControllerFactory.create { qS } + + /** See [LockscreenShadeQsTransitionController.qsTransitionFraction].*/ + @get:FloatRange(from = 0.0, to = 1.0) + val qSDragProgress: Float + get() = qsTransitionController.qsTransitionFraction + + /** See [LockscreenShadeQsTransitionController.qsSquishTransitionFraction].*/ + @get:FloatRange(from = 0.0, to = 1.0) + val qsSquishTransitionFraction: Float + get() = qsTransitionController.qsSquishTransitionFraction + /** * [LockScreenShadeOverScroller] property that delegates to either * [SingleShadeLockScreenOverScroller] or [SplitShadeLockScreenOverScroller]. @@ -242,8 +250,6 @@ class LockscreenShadeTransitionController @Inject constructor( R.dimen.lockscreen_shade_transition_by_tap_distance) notificationShelfTransitionDistance = context.resources.getDimensionPixelSize( R.dimen.lockscreen_shade_notif_shelf_transition_distance) - qsTransitionDistance = context.resources.getDimensionPixelSize( - R.dimen.lockscreen_shade_qs_transition_distance) depthControllerTransitionDistance = context.resources.getDimensionPixelSize( R.dimen.lockscreen_shade_depth_controller_transition_distance) udfpsTransitionDistance = context.resources.getDimensionPixelSize( @@ -411,8 +417,7 @@ class LockscreenShadeTransitionController @Inject constructor( MathUtils.saturate(dragDownAmount / notificationShelfTransitionDistance) nsslController.setTransitionToFullShadeAmount(fractionToShade) - qSDragProgress = MathUtils.saturate(dragDownAmount / qsTransitionDistance) - qS.setTransitionToFullShadeAmount(field, qSDragProgress) + qsTransitionController.dragDownAmount = value notificationPanelController.setTransitionToFullShadeAmount(field, false /* animate */, 0 /* delay */) @@ -426,12 +431,6 @@ class LockscreenShadeTransitionController @Inject constructor( } } - /** - * The drag progress of the quick settings drag down amount - */ - var qSDragProgress = 0f - private set - private fun transitionToShadeAmountCommon(dragDownAmount: Float) { if (depthControllerTransitionDistance == 0) { // split shade depthController.transitionToFullShadeProgress = 0f @@ -704,7 +703,6 @@ class LockscreenShadeTransitionController @Inject constructor( it.println("pulseHeight: $pulseHeight") it.println("useSplitShade: $useSplitShade") it.println("dragDownAmount: $dragDownAmount") - it.println("qSDragProgress: $qSDragProgress") it.println("isDragDownAnywhereEnabled: $isDragDownAnywhereEnabled") it.println("isFalsingCheckNeeded: $isFalsingCheckNeeded") it.println("isWakingToShadeLocked: $isWakingToShadeLocked") diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java index 87d1d66462bd..0b2d443598d2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java @@ -52,14 +52,11 @@ import com.android.systemui.biometrics.AuthController; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dump.DumpManager; -import com.android.systemui.keyguard.KeyguardUnlockAnimationController; import com.android.systemui.keyguard.KeyguardViewMediator; import com.android.systemui.keyguard.ScreenLifecycle; import com.android.systemui.keyguard.WakefulnessLifecycle; import com.android.systemui.log.SessionTracker; import com.android.systemui.plugins.statusbar.StatusBarStateController; -import com.android.systemui.shade.ShadeController; -import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.NotificationMediaManager; import com.android.systemui.statusbar.NotificationShadeWindowController; import com.android.systemui.statusbar.VibratorHelper; @@ -153,7 +150,6 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp private final Handler mHandler; private final KeyguardBypassController mKeyguardBypassController; private PowerManager.WakeLock mWakeLock; - private final com.android.systemui.shade.ShadeController mShadeController; private final KeyguardUpdateMonitor mUpdateMonitor; private final DozeParameters mDozeParameters; private final KeyguardStateController mKeyguardStateController; @@ -167,7 +163,6 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp private KeyguardViewMediator mKeyguardViewMediator; private ScrimController mScrimController; private PendingAuthenticated mPendingAuthenticated = null; - private boolean mPendingShowBouncer; private boolean mHasScreenTurnedOnSinceAuthenticating; private boolean mFadedAwayAfterWakeAndUnlock; private BiometricModeListener mBiometricModeListener; @@ -259,13 +254,11 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp ); } - private KeyguardUnlockAnimationController mKeyguardUnlockAnimationController; private final ScreenOffAnimationController mScreenOffAnimationController; @Inject public BiometricUnlockController(DozeScrimController dozeScrimController, KeyguardViewMediator keyguardViewMediator, ScrimController scrimController, - ShadeController shadeController, NotificationShadeWindowController notificationShadeWindowController, KeyguardStateController keyguardStateController, Handler handler, KeyguardUpdateMonitor keyguardUpdateMonitor, @@ -278,13 +271,11 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp ScreenLifecycle screenLifecycle, AuthController authController, StatusBarStateController statusBarStateController, - KeyguardUnlockAnimationController keyguardUnlockAnimationController, SessionTracker sessionTracker, LatencyTracker latencyTracker, ScreenOffAnimationController screenOffAnimationController, VibratorHelper vibrator) { mPowerManager = powerManager; - mShadeController = shadeController; mUpdateMonitor = keyguardUpdateMonitor; mDozeParameters = dozeParameters; mUpdateMonitor.registerCallback(this); @@ -306,7 +297,6 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp mMetricsLogger = metricsLogger; mAuthController = authController; mStatusBarStateController = statusBarStateController; - mKeyguardUnlockAnimationController = keyguardUnlockAnimationController; mSessionTracker = sessionTracker; mScreenOffAnimationController = screenOffAnimationController; mVibratorHelper = vibrator; @@ -462,22 +452,13 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp break; case MODE_UNLOCK_COLLAPSING: Trace.beginSection("MODE_UNLOCK_COLLAPSING"); - if (!wasDeviceInteractive) { - mPendingShowBouncer = true; - } else { - mPendingShowBouncer = false; - mKeyguardViewController.notifyKeyguardAuthenticated( - false /* strongAuth */); - } + mKeyguardViewController.notifyKeyguardAuthenticated( + false /* strongAuth */); Trace.endSection(); break; case MODE_SHOW_BOUNCER: Trace.beginSection("MODE_SHOW_BOUNCER"); - if (!wasDeviceInteractive) { - mPendingShowBouncer = true; - } else { - showBouncer(); - } + mKeyguardViewController.showBouncer(true); Trace.endSection(); break; case MODE_WAKE_AND_UNLOCK_FROM_DREAM: @@ -515,15 +496,6 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp } } - private void showBouncer() { - if (mMode == MODE_SHOW_BOUNCER) { - mKeyguardViewController.showBouncer(true); - } - mShadeController.animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_NONE, true /* force */, - false /* delayed */, BIOMETRIC_COLLAPSE_SPEEDUP_FACTOR); - mPendingShowBouncer = false; - } - public boolean hasPendingAuthentication() { return mPendingAuthenticated != null && mUpdateMonitor @@ -742,13 +714,6 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp final WakefulnessLifecycle.Observer mWakefulnessObserver = new WakefulnessLifecycle.Observer() { @Override - public void onFinishedWakingUp() { - if (mPendingShowBouncer) { - BiometricUnlockController.this.showBouncer(); - } - } - - @Override public void onStartedGoingToSleep() { resetMode(); mFadedAwayAfterWakeAndUnlock = false; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java index cb0a1480c233..4d1c3617ac1a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java @@ -259,11 +259,17 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump private boolean mKeyguardOccluded; @Inject - public ScrimController(LightBarController lightBarController, DozeParameters dozeParameters, - AlarmManager alarmManager, KeyguardStateController keyguardStateController, - DelayedWakeLock.Builder delayedWakeLockBuilder, Handler handler, - KeyguardUpdateMonitor keyguardUpdateMonitor, DockManager dockManager, - ConfigurationController configurationController, @Main Executor mainExecutor, + public ScrimController( + LightBarController lightBarController, + DozeParameters dozeParameters, + AlarmManager alarmManager, + KeyguardStateController keyguardStateController, + DelayedWakeLock.Builder delayedWakeLockBuilder, + Handler handler, + KeyguardUpdateMonitor keyguardUpdateMonitor, + DockManager dockManager, + ConfigurationController configurationController, + @Main Executor mainExecutor, ScreenOffAnimationController screenOffAnimationController, KeyguardUnlockAnimationController keyguardUnlockAnimationController, StatusBarKeyguardViewManager statusBarKeyguardViewManager) { @@ -826,20 +832,15 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump mBehindTint = Color.BLACK; } else { mBehindAlpha = behindAlpha; - if (mState == ScrimState.SHADE_LOCKED) { + if (mState == ScrimState.KEYGUARD && mTransitionToFullShadeProgress > 0.0f) { + mNotificationsAlpha = MathUtils + .saturate(mTransitionToLockScreenFullShadeNotificationsProgress); + } else if (mState == ScrimState.SHADE_LOCKED) { // going from KEYGUARD to SHADE_LOCKED state mNotificationsAlpha = getInterpolatedFraction(); } else { mNotificationsAlpha = Math.max(1.0f - getInterpolatedFraction(), mQsExpansion); } - if (mState == ScrimState.KEYGUARD - && mTransitionToLockScreenFullShadeNotificationsProgress > 0.0f) { - // Interpolate the notification alpha when transitioning! - mNotificationsAlpha = MathUtils.lerp( - mNotificationsAlpha, - getInterpolatedFraction(), - mTransitionToLockScreenFullShadeNotificationsProgress); - } mNotificationsTint = mState.getNotifTint(); mBehindTint = behindTint; } @@ -1430,6 +1431,8 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump pw.print(mNotificationsAlpha); pw.print(" tint=0x"); pw.println(Integer.toHexString(mNotificationsScrim.getTint())); + pw.print(" expansionProgress="); + pw.println(mTransitionToLockScreenFullShadeNotificationsProgress); pw.print(" mTracking="); pw.println(mTracking); diff --git a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java b/packages/SystemUI/src/com/android/systemui/wallpapers/ImageWallpaper.java index 8ff90f780c99..2878ad90835b 100644 --- a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java +++ b/packages/SystemUI/src/com/android/systemui/wallpapers/ImageWallpaper.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.systemui; +package com.android.systemui.wallpapers; import android.app.WallpaperColors; import android.graphics.Bitmap; @@ -37,8 +37,8 @@ import android.view.WindowManager; import androidx.annotation.NonNull; import com.android.internal.annotations.VisibleForTesting; -import com.android.systemui.glwallpaper.EglHelper; -import com.android.systemui.glwallpaper.ImageWallpaperRenderer; +import com.android.systemui.wallpapers.gl.EglHelper; +import com.android.systemui.wallpapers.gl.ImageWallpaperRenderer; import java.io.FileDescriptor; import java.io.PrintWriter; diff --git a/packages/SystemUI/src/com/android/systemui/wallpapers/OWNERS b/packages/SystemUI/src/com/android/systemui/wallpapers/OWNERS new file mode 100644 index 000000000000..731c7984b9ea --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/wallpapers/OWNERS @@ -0,0 +1,6 @@ +set noparent + +cinek@google.com +dupin@google.com +pomini@google.com +santie@google.com diff --git a/packages/SystemUI/src/com/android/systemui/glwallpaper/EglHelper.java b/packages/SystemUI/src/com/android/systemui/wallpapers/gl/EglHelper.java index 11e215d0d358..f9ddce8e3b2e 100644 --- a/packages/SystemUI/src/com/android/systemui/glwallpaper/EglHelper.java +++ b/packages/SystemUI/src/com/android/systemui/wallpapers/gl/EglHelper.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.systemui.glwallpaper; +package com.android.systemui.wallpapers.gl; import static android.opengl.EGL14.EGL_ALPHA_SIZE; import static android.opengl.EGL14.EGL_BLUE_SIZE; diff --git a/packages/SystemUI/src/com/android/systemui/glwallpaper/GLWallpaperRenderer.java b/packages/SystemUI/src/com/android/systemui/wallpapers/gl/GLWallpaperRenderer.java index 61524900b89b..692ced08f613 100644 --- a/packages/SystemUI/src/com/android/systemui/glwallpaper/GLWallpaperRenderer.java +++ b/packages/SystemUI/src/com/android/systemui/wallpapers/gl/GLWallpaperRenderer.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.systemui.glwallpaper; +package com.android.systemui.wallpapers.gl; import android.util.Size; diff --git a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageGLProgram.java b/packages/SystemUI/src/com/android/systemui/wallpapers/gl/ImageGLProgram.java index d03b00bcfc85..d34eca4831db 100644 --- a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageGLProgram.java +++ b/packages/SystemUI/src/com/android/systemui/wallpapers/gl/ImageGLProgram.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.systemui.glwallpaper; +package com.android.systemui.wallpapers.gl; import static android.opengl.GLES20.GL_FRAGMENT_SHADER; import static android.opengl.GLES20.GL_VERTEX_SHADER; diff --git a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageGLWallpaper.java b/packages/SystemUI/src/com/android/systemui/wallpapers/gl/ImageGLWallpaper.java index 1a53c28c0fc5..f1659b9a8723 100644 --- a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageGLWallpaper.java +++ b/packages/SystemUI/src/com/android/systemui/wallpapers/gl/ImageGLWallpaper.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.systemui.glwallpaper; +package com.android.systemui.wallpapers.gl; import static android.opengl.GLES20.GL_FLOAT; import static android.opengl.GLES20.GL_LINEAR; diff --git a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageWallpaperRenderer.java b/packages/SystemUI/src/com/android/systemui/wallpapers/gl/ImageWallpaperRenderer.java index 7c0b93b7eebc..e393786e29d9 100644 --- a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageWallpaperRenderer.java +++ b/packages/SystemUI/src/com/android/systemui/wallpapers/gl/ImageWallpaperRenderer.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.systemui.glwallpaper; +package com.android.systemui.wallpapers.gl; import static android.opengl.GLES20.GL_COLOR_BUFFER_BIT; import static android.opengl.GLES20.glClear; diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java index fde288fd20ba..093e59255f65 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java @@ -18,6 +18,7 @@ package com.android.keyguard; import static android.app.StatusBarManager.SESSION_KEYGUARD; import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FINGERPRINT; +import static android.hardware.biometrics.BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_START; import static android.hardware.biometrics.BiometricFingerprintConstants.FINGERPRINT_ERROR_LOCKOUT; import static android.telephony.SubscriptionManager.DATA_ROAMING_DISABLE; import static android.telephony.SubscriptionManager.NAME_SOURCE_CARRIER_ID; @@ -31,6 +32,7 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.atLeastOnce; @@ -73,6 +75,7 @@ import android.os.Bundle; import android.os.CancellationSignal; import android.os.Handler; import android.os.IRemoteCallback; +import android.os.PowerManager; import android.os.RemoteException; import android.os.UserHandle; import android.os.UserManager; @@ -198,6 +201,8 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { private SessionTracker mSessionTracker; @Mock private UiEventLogger mUiEventLogger; + @Mock + private PowerManager mPowerManager; private final int mCurrentUserId = 100; private final UserInfo mCurrentUserInfo = new UserInfo(mCurrentUserId, "Test user", 0); @@ -1560,6 +1565,28 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { assertThat(mKeyguardUpdateMonitor.shouldListenForFingerprint(anyBoolean())).isEqualTo(true); } + @Test + public void testFingerAcquired_wakesUpPowerManager() { + mContext.getOrCreateTestableResources().addOverride( + com.android.internal.R.bool.kg_wake_on_acquire_start, true); + mSpiedContext = spy(mContext); + mKeyguardUpdateMonitor = new TestableKeyguardUpdateMonitor(mSpiedContext); + fingerprintAcquireStart(); + + verify(mPowerManager).wakeUp(anyLong(), anyInt(), anyString()); + } + + @Test + public void testFingerAcquired_doesNotWakeUpPowerManager() { + mContext.getOrCreateTestableResources().addOverride( + com.android.internal.R.bool.kg_wake_on_acquire_start, false); + mSpiedContext = spy(mContext); + mKeyguardUpdateMonitor = new TestableKeyguardUpdateMonitor(mSpiedContext); + fingerprintAcquireStart(); + + verify(mPowerManager, never()).wakeUp(anyLong(), anyInt(), anyString()); + } + private void faceAuthEnabled() { // this ensures KeyguardUpdateMonitor updates the cached mIsFaceEnrolled flag using the // face manager mock wire-up in setup() @@ -1608,6 +1635,11 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { .onAuthenticationError(FINGERPRINT_ERROR_LOCKOUT, "Fingerprint locked out"); } + private void fingerprintAcquireStart() { + mKeyguardUpdateMonitor.mFingerprintAuthenticationCallback + .onAuthenticationAcquired(FINGERPRINT_ACQUIRED_START); + } + private void triggerSuccessfulFaceAuth() { mKeyguardUpdateMonitor.requestFaceAuth(true, FaceAuthApiRequestReason.UDFPS_POINTER_DOWN); verify(mFaceManager).authenticate(any(), @@ -1729,7 +1761,8 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { mStatusBarStateController, mLockPatternUtils, mAuthController, mTelephonyListenerManager, mInteractionJankMonitor, mLatencyTracker, mActiveUnlockConfig, - mKeyguardUpdateMonitorLogger, mUiEventLogger, () -> mSessionTracker); + mKeyguardUpdateMonitorLogger, mUiEventLogger, () -> mSessionTracker, + mPowerManager); setStrongAuthTracker(KeyguardUpdateMonitorTest.this.mStrongAuthTracker); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaCarouselControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaCarouselControllerTest.kt index 1bc197232da6..5a50a9f64487 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaCarouselControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaCarouselControllerTest.kt @@ -30,6 +30,7 @@ import com.android.systemui.statusbar.notification.collection.provider.VisualSta import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.util.animation.TransitionLayout import com.android.systemui.util.concurrency.DelayableExecutor +import com.android.systemui.util.mockito.capture import com.android.systemui.util.mockito.eq import com.android.systemui.util.time.FakeSystemClock import javax.inject.Provider @@ -38,6 +39,8 @@ import junit.framework.Assert.assertTrue import org.junit.Before import org.junit.Test import org.junit.runner.RunWith +import org.mockito.ArgumentCaptor +import org.mockito.Captor import org.mockito.Mock import org.mockito.Mockito.verify import org.mockito.Mockito.verifyNoMoreInteractions @@ -71,6 +74,10 @@ class MediaCarouselControllerTest : SysuiTestCase() { @Mock lateinit var player: TransitionLayout @Mock lateinit var recommendationViewHolder: RecommendationViewHolder @Mock lateinit var recommendations: TransitionLayout + @Mock lateinit var mediaPlayer: MediaControlPanel + @Mock lateinit var mediaViewController: MediaViewController + @Mock lateinit var smartspaceMediaData: SmartspaceMediaData + @Captor lateinit var listener: ArgumentCaptor<MediaDataManager.Listener> private val clock = FakeSystemClock() private lateinit var mediaCarouselController: MediaCarouselController @@ -94,7 +101,10 @@ class MediaCarouselControllerTest : SysuiTestCase() { logger, debugLogger ) - + verify(mediaDataManager).addListener(capture(listener)) + whenever(mediaControlPanelFactory.get()).thenReturn(mediaPlayer) + whenever(mediaPlayer.mediaViewController).thenReturn(mediaViewController) + whenever(mediaDataManager.smartspaceMediaData).thenReturn(smartspaceMediaData) MediaPlayerData.clear() } @@ -305,4 +315,63 @@ class MediaCarouselControllerTest : SysuiTestCase() { verifyNoMoreInteractions(mediaViewHolder) verify(recommendationViewHolder.recommendations).bottom = 75 } + + fun testMediaLoaded_ScrollToActivePlayer() { + listener.value.onMediaDataLoaded("playing local", + null, + DATA.copy(active = true, isPlaying = true, + playbackLocation = MediaData.PLAYBACK_LOCAL, resumption = false) + ) + listener.value.onMediaDataLoaded("paused local", + null, + DATA.copy(active = true, isPlaying = false, + playbackLocation = MediaData.PLAYBACK_LOCAL, resumption = false)) + // adding a media recommendation card. + MediaPlayerData.addMediaRecommendation(SMARTSPACE_KEY, EMPTY_SMARTSPACE_MEDIA_DATA, panel, + false, clock) + mediaCarouselController.shouldScrollToActivePlayer = true + // switching between media players. + listener.value.onMediaDataLoaded("playing local", + "playing local", + DATA.copy(active = true, isPlaying = false, + playbackLocation = MediaData.PLAYBACK_LOCAL, resumption = true) + ) + listener.value.onMediaDataLoaded("paused local", + "paused local", + DATA.copy(active = true, isPlaying = true, + playbackLocation = MediaData.PLAYBACK_LOCAL, resumption = false)) + + assertEquals( + MediaPlayerData.getMediaPlayerIndex("paused local"), + mediaCarouselController.mediaCarouselScrollHandler.visibleMediaIndex + ) + } + + @Test + fun testMediaLoadedFromRecommendationCard_ScrollToActivePlayer() { + MediaPlayerData.addMediaRecommendation(SMARTSPACE_KEY, EMPTY_SMARTSPACE_MEDIA_DATA, panel, + false, clock) + listener.value.onMediaDataLoaded("playing local", + null, + DATA.copy(active = true, isPlaying = true, + playbackLocation = MediaData.PLAYBACK_LOCAL, resumption = false) + ) + + var playerIndex = MediaPlayerData.getMediaPlayerIndex("playing local") + assertEquals( + playerIndex, + mediaCarouselController.mediaCarouselScrollHandler.visibleMediaIndex + ) + assertEquals( playerIndex, 0) + + // Replaying the same media player one more time. + // And check that the card stays in its position. + listener.value.onMediaDataLoaded("playing local", + null, + DATA.copy(active = true, isPlaying = true, + playbackLocation = MediaData.PLAYBACK_LOCAL, resumption = false) + ) + playerIndex = MediaPlayerData.getMediaPlayerIndex("playing local") + assertEquals(playerIndex, 0) + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/dream/MediaDreamSentinelTest.java b/packages/SystemUI/tests/src/com/android/systemui/media/dream/MediaDreamSentinelTest.java index 2e864dc2cda8..0bfc0344b521 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/dream/MediaDreamSentinelTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/media/dream/MediaDreamSentinelTest.java @@ -72,13 +72,13 @@ public class MediaDreamSentinelTest extends SysuiTestCase { } @Test - public void testComplicationAddition() { + public void testOnMediaDataLoaded_complicationAddition() { final MediaDreamSentinel sentinel = new MediaDreamSentinel(mContext, mMediaDataManager, mDreamOverlayStateController, mMediaEntryComplication, mFeatureFlags); - sentinel.start(); final MediaDataManager.Listener listener = captureMediaDataListener(); + when(mMediaDataManager.hasActiveMedia()).thenReturn(false); listener.onMediaDataLoaded(mKey, mOldKey, mData, /* immediately= */ true, /* receivedSmartspaceCardLatency= */ 0, /* isSsReactived= */ false); @@ -90,6 +90,19 @@ public class MediaDreamSentinelTest extends SysuiTestCase { verify(mDreamOverlayStateController).addComplication(eq(mMediaEntryComplication)); verify(mDreamOverlayStateController, never()).addComplication( not(eq(mMediaEntryComplication))); + } + + @Test + public void testOnMediaDataRemoved_complicationRemoval() { + final MediaDreamSentinel sentinel = new MediaDreamSentinel(mContext, mMediaDataManager, + mDreamOverlayStateController, mMediaEntryComplication, mFeatureFlags); + sentinel.start(); + + final MediaDataManager.Listener listener = captureMediaDataListener(); + + when(mMediaDataManager.hasActiveMedia()).thenReturn(true); + listener.onMediaDataLoaded(mKey, mOldKey, mData, /* immediately= */true, + /* receivedSmartspaceCardLatency= */0, /* isSsReactived= */ false); listener.onMediaDataRemoved(mKey); verify(mDreamOverlayStateController, never()).removeComplication(any()); @@ -100,7 +113,30 @@ public class MediaDreamSentinelTest extends SysuiTestCase { } @Test - public void testMediaDreamSentinel_mediaComplicationDisabled_doNotAddComplication() { + public void testOnMediaDataLoaded_complicationRemoval() { + final MediaDreamSentinel sentinel = new MediaDreamSentinel(mContext, mMediaDataManager, + mDreamOverlayStateController, mMediaEntryComplication, mFeatureFlags); + sentinel.start(); + + final MediaDataManager.Listener listener = captureMediaDataListener(); + + when(mMediaDataManager.hasActiveMedia()).thenReturn(true); + listener.onMediaDataLoaded(mKey, mOldKey, mData, /* immediately= */true, + /* receivedSmartspaceCardLatency= */0, /* isSsReactived= */ false); + verify(mDreamOverlayStateController, never()).removeComplication(any()); + + listener.onMediaDataLoaded(mKey, mOldKey, mData, /* immediately= */true, + /* receivedSmartspaceCardLatency= */0, /* isSsReactived= */ false); + verify(mDreamOverlayStateController, never()).removeComplication(any()); + + when(mMediaDataManager.hasActiveMedia()).thenReturn(false); + listener.onMediaDataLoaded(mKey, mOldKey, mData, /* immediately= */true, + /* receivedSmartspaceCardLatency= */0, /* isSsReactived= */ false); + verify(mDreamOverlayStateController).removeComplication(eq(mMediaEntryComplication)); + } + + @Test + public void testOnMediaDataLoaded_mediaComplicationDisabled_doesNotAddComplication() { when(mFeatureFlags.isEnabled(MEDIA_DREAM_COMPLICATION)).thenReturn(false); final MediaDreamSentinel sentinel = new MediaDreamSentinel(mContext, mMediaDataManager, diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java index f08ad2453c5f..5d5918de3d9e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java @@ -94,6 +94,7 @@ public class QSFragmentTest extends SysuiBaseFragmentTest { @Mock private QSPanel.QSTileLayout mQQsTileLayout; @Mock private QSAnimator mQSAnimator; @Mock private StatusBarStateController mStatusBarStateController; + @Mock private QSSquishinessController mSquishinessController; private View mQsFragmentView; public QSFragmentTest() { @@ -139,13 +140,15 @@ public class QSFragmentTest extends SysuiBaseFragmentTest { } @Test - public void transitionToFullShade_inSplitShade_setsAlphaBasedOnProgress() { + public void transitionToFullShade_setsAlphaUsingShadeInterpolator() { QSFragment fragment = resumeAndGetFragment(); - enableSplitShade(); - int transitionPxAmount = 123; + setStatusBarState(StatusBarState.SHADE); + boolean isTransitioningToFullShade = true; float transitionProgress = 0.5f; + float squishinessFraction = 0.5f; - fragment.setTransitionToFullShadeAmount(transitionPxAmount, transitionProgress); + fragment.setTransitionToFullShadeProgress(isTransitioningToFullShade, transitionProgress, + squishinessFraction); assertThat(mQsFragmentView.getAlpha()) .isEqualTo(ShadeInterpolation.getContentAlpha(transitionProgress)); @@ -153,31 +156,32 @@ public class QSFragmentTest extends SysuiBaseFragmentTest { @Test public void - transitionToFullShade_inSplitShade_onKeyguard_bouncerNotActive_usesShadeInterpolator() { + transitionToFullShade_onKeyguard_noBouncer_setsAlphaUsingLinearInterpolator() { QSFragment fragment = resumeAndGetFragment(); - enableSplitShade(); setStatusBarState(StatusBarState.KEYGUARD); when(mQSPanelController.isBouncerInTransit()).thenReturn(false); - int transitionPxAmount = 123; + boolean isTransitioningToFullShade = true; float transitionProgress = 0.5f; + float squishinessFraction = 0.5f; - fragment.setTransitionToFullShadeAmount(transitionPxAmount, transitionProgress); + fragment.setTransitionToFullShadeProgress(isTransitioningToFullShade, transitionProgress, + squishinessFraction); - assertThat(mQsFragmentView.getAlpha()) - .isEqualTo(ShadeInterpolation.getContentAlpha(transitionProgress)); + assertThat(mQsFragmentView.getAlpha()).isEqualTo(transitionProgress); } @Test public void - transitionToFullShade_inSplitShade_onKeyguard_bouncerActive_usesBouncerInterpolator() { + transitionToFullShade_onKeyguard_bouncerActive_setsAlphaUsingBouncerInterpolator() { QSFragment fragment = resumeAndGetFragment(); - enableSplitShade(); setStatusBarState(StatusBarState.KEYGUARD); when(mQSPanelController.isBouncerInTransit()).thenReturn(true); - int transitionPxAmount = 123; + boolean isTransitioningToFullShade = true; float transitionProgress = 0.5f; + float squishinessFraction = 0.5f; - fragment.setTransitionToFullShadeAmount(transitionPxAmount, transitionProgress); + fragment.setTransitionToFullShadeProgress(isTransitioningToFullShade, transitionProgress, + squishinessFraction); assertThat(mQsFragmentView.getAlpha()) .isEqualTo( @@ -186,28 +190,44 @@ public class QSFragmentTest extends SysuiBaseFragmentTest { } @Test - public void transitionToFullShade_notInSplitShade_alwaysSetsAlphaTo1() { + public void transitionToFullShade_inFullWidth_alwaysSetsAlphaTo1() { QSFragment fragment = resumeAndGetFragment(); - disableSplitShade(); + fragment.setIsNotificationPanelFullWidth(true); - int transitionPxAmount = 12; + boolean isTransitioningToFullShade = true; float transitionProgress = 0.1f; - fragment.setTransitionToFullShadeAmount(transitionPxAmount, transitionProgress); + float squishinessFraction = 0.5f; + fragment.setTransitionToFullShadeProgress(isTransitioningToFullShade, transitionProgress, + squishinessFraction); assertThat(mQsFragmentView.getAlpha()).isEqualTo(1); - transitionPxAmount = 123; transitionProgress = 0.5f; - fragment.setTransitionToFullShadeAmount(transitionPxAmount, transitionProgress); + fragment.setTransitionToFullShadeProgress(isTransitioningToFullShade, transitionProgress, + squishinessFraction); assertThat(mQsFragmentView.getAlpha()).isEqualTo(1); assertThat(mQsFragmentView.getAlpha()).isEqualTo(1); - transitionPxAmount = 234; transitionProgress = 0.7f; - fragment.setTransitionToFullShadeAmount(transitionPxAmount, transitionProgress); + fragment.setTransitionToFullShadeProgress(isTransitioningToFullShade, transitionProgress, + squishinessFraction); assertThat(mQsFragmentView.getAlpha()).isEqualTo(1); } @Test + public void transitionToFullShade_setsSquishinessOnController() { + QSFragment fragment = resumeAndGetFragment(); + boolean isTransitioningToFullShade = true; + float transitionProgress = 0.123f; + float squishinessFraction = 0.456f; + + fragment.setTransitionToFullShadeProgress(isTransitioningToFullShade, transitionProgress, + squishinessFraction); + + verify(mQsFragmentComponent.getQSSquishinessController()) + .setSquishiness(squishinessFraction); + } + + @Test public void setQsExpansion_inSplitShade_setsFooterActionsExpansion_basedOnPanelExpFraction() { // Random test values without any meaning. They just have to be different from each other. float expansion = 0.123f; @@ -453,6 +473,7 @@ public class QSFragmentTest extends SysuiBaseFragmentTest { when(mQsFragmentComponent.getQSFooterActionController()) .thenReturn(mQSFooterActionController); when(mQsFragmentComponent.getQSAnimator()).thenReturn(mQSAnimator); + when(mQsFragmentComponent.getQSSquishinessController()).thenReturn(mSquishinessController); } private QSFragment getFragment() { diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java index 3224a6f970be..f1c54ef8d6f7 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java @@ -42,7 +42,6 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.annotation.IdRes; -import android.app.ActivityManager; import android.content.ContentResolver; import android.content.res.Configuration; import android.content.res.Resources; @@ -57,6 +56,7 @@ import android.util.DisplayMetrics; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; +import android.view.ViewGroup; import android.view.ViewParent; import android.view.ViewPropertyAnimator; import android.view.ViewStub; @@ -107,6 +107,7 @@ import com.android.systemui.navigationbar.NavigationModeController; import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.qs.QS; import com.android.systemui.qrcodescanner.controller.QRCodeScannerController; +import com.android.systemui.qs.QSFragment; import com.android.systemui.screenrecord.RecordingController; import com.android.systemui.shade.transition.ShadeTransitionController; import com.android.systemui.statusbar.CommandQueue; @@ -160,8 +161,6 @@ import com.android.systemui.statusbar.policy.KeyguardUserSwitcherController; import com.android.systemui.statusbar.policy.KeyguardUserSwitcherView; import com.android.systemui.statusbar.window.StatusBarWindowStateController; import com.android.systemui.unfold.SysUIUnfoldComponent; -import com.android.systemui.util.concurrency.FakeExecutor; -import com.android.systemui.util.settings.SecureSettings; import com.android.systemui.util.time.FakeSystemClock; import com.android.systemui.util.time.SystemClock; import com.android.systemui.wallet.controller.QuickAccessWalletController; @@ -185,225 +184,134 @@ import java.util.Optional; public class NotificationPanelViewControllerTest extends SysuiTestCase { private static final int NOTIFICATION_SCRIM_TOP_PADDING_IN_SPLIT_SHADE = 50; + private static final int PANEL_WIDTH = 500; // Random value just for the test. + + @Mock private CentralSurfaces mCentralSurfaces; + @Mock private NotificationStackScrollLayout mNotificationStackScrollLayout; + @Mock private KeyguardBottomAreaView mKeyguardBottomArea; + @Mock private KeyguardBottomAreaViewController mKeyguardBottomAreaViewController; + @Mock private KeyguardBottomAreaView mQsFrame; + @Mock private NotificationIconAreaController mNotificationAreaController; + @Mock private HeadsUpManagerPhone mHeadsUpManager; + @Mock private NotificationShelfController mNotificationShelfController; + @Mock private KeyguardStatusBarView mKeyguardStatusBar; + @Mock private KeyguardUserSwitcherView mUserSwitcherView; + @Mock private ViewStub mUserSwitcherStubView; + @Mock private HeadsUpTouchHelper.Callback mHeadsUpCallback; + @Mock private KeyguardUpdateMonitor mUpdateMonitor; + @Mock private KeyguardBypassController mKeyguardBypassController; + @Mock private DozeParameters mDozeParameters; + @Mock private ScreenOffAnimationController mScreenOffAnimationController; + @Mock private NotificationPanelView mView; + @Mock private LayoutInflater mLayoutInflater; + @Mock private FeatureFlags mFeatureFlags; + @Mock private DynamicPrivacyController mDynamicPrivacyController; + @Mock private StatusBarTouchableRegionManager mStatusBarTouchableRegionManager; + @Mock private KeyguardStateController mKeyguardStateController; + @Mock private DozeLog mDozeLog; + @Mock private ShadeLogger mShadeLog; + @Mock private CommandQueue mCommandQueue; + @Mock private VibratorHelper mVibratorHelper; + @Mock private LatencyTracker mLatencyTracker; + @Mock private PowerManager mPowerManager; + @Mock private AccessibilityManager mAccessibilityManager; + @Mock private MetricsLogger mMetricsLogger; + @Mock private Resources mResources; + @Mock private Configuration mConfiguration; + @Mock private KeyguardClockSwitch mKeyguardClockSwitch; + @Mock private MediaHierarchyManager mMediaHiearchyManager; + @Mock private ConversationNotificationManager mConversationNotificationManager; + @Mock private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager; + @Mock private KeyguardStatusViewComponent.Factory mKeyguardStatusViewComponentFactory; + @Mock private KeyguardQsUserSwitchComponent.Factory mKeyguardQsUserSwitchComponentFactory; + @Mock private KeyguardQsUserSwitchComponent mKeyguardQsUserSwitchComponent; + @Mock private KeyguardQsUserSwitchController mKeyguardQsUserSwitchController; + @Mock private KeyguardUserSwitcherComponent.Factory mKeyguardUserSwitcherComponentFactory; + @Mock private KeyguardUserSwitcherComponent mKeyguardUserSwitcherComponent; + @Mock private KeyguardUserSwitcherController mKeyguardUserSwitcherController; + @Mock private KeyguardStatusViewComponent mKeyguardStatusViewComponent; + @Mock private KeyguardStatusBarViewComponent.Factory mKeyguardStatusBarViewComponentFactory; + @Mock private KeyguardStatusBarViewComponent mKeyguardStatusBarViewComponent; + @Mock private KeyguardClockSwitchController mKeyguardClockSwitchController; + @Mock private KeyguardStatusViewController mKeyguardStatusViewController; + @Mock private KeyguardStatusBarViewController mKeyguardStatusBarViewController; + @Mock private NotificationStackScrollLayoutController mNotificationStackScrollLayoutController; + @Mock private NotificationShadeDepthController mNotificationShadeDepthController; + @Mock private LockscreenShadeTransitionController mLockscreenShadeTransitionController; + @Mock private AuthController mAuthController; + @Mock private ScrimController mScrimController; + @Mock private MediaDataManager mMediaDataManager; + @Mock private AmbientState mAmbientState; + @Mock private UserManager mUserManager; + @Mock private UiEventLogger mUiEventLogger; + @Mock private LockIconViewController mLockIconViewController; + @Mock private KeyguardMediaController mKeyguardMediaController; + @Mock private PrivacyDotViewController mPrivacyDotViewController; + @Mock private NavigationModeController mNavigationModeController; + @Mock private LargeScreenShadeHeaderController mLargeScreenShadeHeaderController; + @Mock private ContentResolver mContentResolver; + @Mock private TapAgainViewController mTapAgainViewController; + @Mock private KeyguardIndicationController mKeyguardIndicationController; + @Mock private FragmentService mFragmentService; + @Mock private FragmentHostManager mFragmentHostManager; + @Mock private QuickAccessWalletController mQuickAccessWalletController; + @Mock private QRCodeScannerController mQrCodeScannerController; + @Mock private NotificationRemoteInputManager mNotificationRemoteInputManager; + @Mock private RecordingController mRecordingController; + @Mock private ControlsComponent mControlsComponent; + @Mock private LockscreenGestureLogger mLockscreenGestureLogger; + @Mock private DumpManager mDumpManager; + @Mock private InteractionJankMonitor mInteractionJankMonitor; + @Mock private NotificationsQSContainerController mNotificationsQSContainerController; + @Mock private QsFrameTranslateController mQsFrameTranslateController; + @Mock private StatusBarWindowStateController mStatusBarWindowStateController; + @Mock private KeyguardUnlockAnimationController mKeyguardUnlockAnimationController; + @Mock private NotificationShadeWindowController mNotificationShadeWindowController; + @Mock private SysUiState mSysUiState; + @Mock private NotificationListContainer mNotificationListContainer; + @Mock private NotificationStackSizeCalculator mNotificationStackSizeCalculator; + @Mock private UnlockedScreenOffAnimationController mUnlockedScreenOffAnimationController; + @Mock private ShadeTransitionController mShadeTransitionController; + @Mock private QS mQs; + @Mock private QSFragment mQSFragment; + @Mock private ViewGroup mQsHeader; + @Mock private ViewParent mViewParent; + @Mock private ViewTreeObserver mViewTreeObserver; + @Mock private KeyguardBottomAreaViewModel mKeyguardBottomAreaViewModel; + @Mock private KeyguardBottomAreaInteractor mKeyguardBottomAreaInteractor; - @Mock - private CentralSurfaces mCentralSurfaces; - @Mock - private NotificationStackScrollLayout mNotificationStackScrollLayout; - @Mock - private KeyguardBottomAreaView mKeyguardBottomArea; - @Mock - private KeyguardBottomAreaViewController mKeyguardBottomAreaViewController; - @Mock - private KeyguardBottomAreaView mQsFrame; - private KeyguardStatusView mKeyguardStatusView; - @Mock - private NotificationIconAreaController mNotificationAreaController; - @Mock - private HeadsUpManagerPhone mHeadsUpManager; - @Mock - private NotificationShelfController mNotificationShelfController; - @Mock - private KeyguardStatusBarView mKeyguardStatusBar; - @Mock - private KeyguardUserSwitcherView mUserSwitcherView; - @Mock - private ViewStub mUserSwitcherStubView; - @Mock - private HeadsUpTouchHelper.Callback mHeadsUpCallback; - @Mock - private KeyguardUpdateMonitor mUpdateMonitor; - @Mock - private KeyguardBypassController mKeyguardBypassController; - @Mock - private DozeParameters mDozeParameters; - @Mock - private ScreenOffAnimationController mScreenOffAnimationController; - @Mock - private NotificationPanelView mView; - @Mock - private LayoutInflater mLayoutInflater; - @Mock - private FeatureFlags mFeatureFlags; - @Mock - private DynamicPrivacyController mDynamicPrivacyController; - @Mock - private StatusBarTouchableRegionManager mStatusBarTouchableRegionManager; - @Mock - private KeyguardStateController mKeyguardStateController; - @Mock - private DozeLog mDozeLog; - @Mock - private ShadeLogger mShadeLog; - @Mock - private CommandQueue mCommandQueue; - @Mock - private VibratorHelper mVibratorHelper; - @Mock - private LatencyTracker mLatencyTracker; - @Mock - private PowerManager mPowerManager; - @Mock - private AccessibilityManager mAccessibilityManager; - @Mock - private MetricsLogger mMetricsLogger; - @Mock - private ActivityManager mActivityManager; - @Mock - private Resources mResources; - @Mock - private Configuration mConfiguration; - private DisplayMetrics mDisplayMetrics = new DisplayMetrics(); - @Mock - private KeyguardClockSwitch mKeyguardClockSwitch; private NotificationPanelViewController.TouchHandler mTouchHandler; private ConfigurationController mConfigurationController; - @Mock - private MediaHierarchyManager mMediaHiearchyManager; - @Mock - private ConversationNotificationManager mConversationNotificationManager; - @Mock - private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager; - @Mock - private KeyguardStatusViewComponent.Factory mKeyguardStatusViewComponentFactory; - @Mock - private KeyguardQsUserSwitchComponent.Factory mKeyguardQsUserSwitchComponentFactory; - @Mock - private KeyguardQsUserSwitchComponent mKeyguardQsUserSwitchComponent; - @Mock - private KeyguardQsUserSwitchController mKeyguardQsUserSwitchController; - @Mock - private KeyguardUserSwitcherComponent.Factory mKeyguardUserSwitcherComponentFactory; - @Mock - private KeyguardUserSwitcherComponent mKeyguardUserSwitcherComponent; - @Mock - private KeyguardUserSwitcherController mKeyguardUserSwitcherController; - @Mock - private KeyguardStatusViewComponent mKeyguardStatusViewComponent; - @Mock - private KeyguardStatusBarViewComponent.Factory mKeyguardStatusBarViewComponentFactory; - @Mock - private KeyguardStatusBarViewComponent mKeyguardStatusBarViewComponent; - @Mock - private KeyguardClockSwitchController mKeyguardClockSwitchController; - @Mock - private KeyguardStatusViewController mKeyguardStatusViewController; - @Mock - private KeyguardStatusBarViewController mKeyguardStatusBarViewController; - @Mock - private NotificationStackScrollLayoutController mNotificationStackScrollLayoutController; - @Mock - private NotificationShadeDepthController mNotificationShadeDepthController; - @Mock - private LockscreenShadeTransitionController mLockscreenShadeTransitionController; - @Mock - private AuthController mAuthController; - @Mock - private ScrimController mScrimController; - @Mock - private MediaDataManager mMediaDataManager; - @Mock - private AmbientState mAmbientState; - @Mock - private UserManager mUserManager; - @Mock - private UiEventLogger mUiEventLogger; - @Mock - private LockIconViewController mLockIconViewController; - @Mock - private KeyguardMediaController mKeyguardMediaController; - @Mock - private PrivacyDotViewController mPrivacyDotViewController; - @Mock - private NavigationModeController mNavigationModeController; - @Mock - private SecureSettings mSecureSettings; - @Mock - private LargeScreenShadeHeaderController mLargeScreenShadeHeaderController; - @Mock - private ContentResolver mContentResolver; - @Mock - private TapAgainViewController mTapAgainViewController; - @Mock - private KeyguardIndicationController mKeyguardIndicationController; - @Mock - private FragmentService mFragmentService; - @Mock - private FragmentHostManager mFragmentHostManager; - @Mock - private QuickAccessWalletController mQuickAccessWalletController; - @Mock - private QRCodeScannerController mQrCodeScannerController; - @Mock - private NotificationRemoteInputManager mNotificationRemoteInputManager; - @Mock - private RecordingController mRecordingController; - @Mock - private ControlsComponent mControlsComponent; - @Mock - private LockscreenGestureLogger mLockscreenGestureLogger; - @Mock - private DumpManager mDumpManager; - @Mock - private InteractionJankMonitor mInteractionJankMonitor; - @Mock - private NotificationsQSContainerController mNotificationsQSContainerController; - @Mock - private QsFrameTranslateController mQsFrameTranslateController; - @Mock - private StatusBarWindowStateController mStatusBarWindowStateController; - @Mock - private KeyguardUnlockAnimationController mKeyguardUnlockAnimationController; - @Mock - private NotificationShadeWindowController mNotificationShadeWindowController; - @Mock - private SysUiState mSysUiState; - @Mock - private NotificationListContainer mNotificationListContainer; - @Mock - private NotificationStackSizeCalculator mNotificationStackSizeCalculator; - @Mock - private UnlockedScreenOffAnimationController mUnlockedScreenOffAnimationController; - @Mock - private ShadeTransitionController mShadeTransitionController; - @Mock - private QS mQs; - @Mock - private View mQsHeader; - @Mock - private ViewParent mViewParent; - @Mock - private ViewTreeObserver mViewTreeObserver; - @Mock private KeyguardBottomAreaViewModel mKeyguardBottomAreaViewModel; - @Mock private KeyguardBottomAreaInteractor mKeyguardBottomAreaInteractor; - private NotificationPanelViewController.PanelEventsEmitter mPanelEventsEmitter; - private Optional<SysUIUnfoldComponent> mSysUIUnfoldComponent = Optional.empty(); private SysuiStatusBarStateController mStatusBarStateController; private NotificationPanelViewController mNotificationPanelViewController; private View.AccessibilityDelegate mAccessibiltyDelegate; private NotificationsQuickSettingsContainer mNotificationContainerParent; private List<View.OnAttachStateChangeListener> mOnAttachStateChangeListeners; - private FalsingManagerFake mFalsingManager = new FalsingManagerFake(); - private FakeExecutor mExecutor = new FakeExecutor(new FakeSystemClock()); private Handler mMainHandler; + private View.OnLayoutChangeListener mLayoutChangeListener; + + private final FalsingManagerFake mFalsingManager = new FalsingManagerFake(); + private final Optional<SysUIUnfoldComponent> mSysUIUnfoldComponent = Optional.empty(); + private final DisplayMetrics mDisplayMetrics = new DisplayMetrics(); private final PanelExpansionStateManager mPanelExpansionStateManager = new PanelExpansionStateManager(); - private SystemClock mSystemClock; + private FragmentHostManager.FragmentListener mFragmentListener; @Before public void setup() { MockitoAnnotations.initMocks(this); - mSystemClock = new FakeSystemClock(); + SystemClock systemClock = new FakeSystemClock(); mStatusBarStateController = new StatusBarStateControllerImpl(mUiEventLogger, mDumpManager, mInteractionJankMonitor); - mKeyguardStatusView = new KeyguardStatusView(mContext); - mKeyguardStatusView.setId(R.id.keyguard_status_view); + KeyguardStatusView keyguardStatusView = new KeyguardStatusView(mContext); + keyguardStatusView.setId(R.id.keyguard_status_view); DejankUtils.setImmediate(true); when(mAuthController.isUdfpsEnrolled(anyInt())).thenReturn(false); when(mHeadsUpCallback.getContext()).thenReturn(mContext); when(mView.getResources()).thenReturn(mResources); + when(mView.getWidth()).thenReturn(PANEL_WIDTH); when(mResources.getConfiguration()).thenReturn(mConfiguration); mConfiguration.orientation = ORIENTATION_PORTRAIT; when(mResources.getDisplayMetrics()).thenReturn(mDisplayMetrics); @@ -431,7 +339,7 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { when(mView.findViewById(R.id.keyguard_status_view)) .thenReturn(mock(KeyguardStatusView.class)); mNotificationContainerParent = new NotificationsQuickSettingsContainer(getContext(), null); - mNotificationContainerParent.addView(mKeyguardStatusView); + mNotificationContainerParent.addView(keyguardStatusView); mNotificationContainerParent.onFinishInflate(); when(mView.findViewById(R.id.notification_container_parent)) .thenReturn(mNotificationContainerParent); @@ -447,7 +355,12 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { when(mKeyguardUserSwitcherComponent.getKeyguardUserSwitcherController()) .thenReturn(mKeyguardUserSwitcherController); when(mScreenOffAnimationController.shouldAnimateClockChange()).thenReturn(true); - + when(mQs.getView()).thenReturn(mView); + when(mQSFragment.getView()).thenReturn(mView); + doAnswer(invocation -> { + mFragmentListener = invocation.getArgument(1); + return null; + }).when(mFragmentHostManager).addTagListener(eq(QS.TAG), any()); doAnswer((Answer<Void>) invocation -> { mTouchHandler = invocation.getArgument(0); return null; @@ -484,7 +397,7 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { when(mKeyguardStatusBarViewComponent.getKeyguardStatusBarViewController()) .thenReturn(mKeyguardStatusBarViewController); when(mLayoutInflater.inflate(eq(R.layout.keyguard_status_view), any(), anyBoolean())) - .thenReturn(mKeyguardStatusView); + .thenReturn(keyguardStatusView); when(mLayoutInflater.inflate(eq(R.layout.keyguard_user_switcher), any(), anyBoolean())) .thenReturn(mUserSwitcherView); when(mLayoutInflater.inflate(eq(R.layout.keyguard_bottom_area), any(), anyBoolean())) @@ -499,13 +412,18 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { ((Runnable) invocation.getArgument(0)).run(); return null; }).when(mNotificationShadeWindowController).batchApplyWindowLayoutParams(any()); + doAnswer(invocation -> { + mLayoutChangeListener = invocation.getArgument(0); + return null; + }).when(mView).addOnLayoutChangeListener(any()); when(mView.getViewTreeObserver()).thenReturn(mViewTreeObserver); when(mView.getParent()).thenReturn(mViewParent); when(mQs.getHeader()).thenReturn(mQsHeader); mMainHandler = new Handler(Looper.getMainLooper()); - mPanelEventsEmitter = new NotificationPanelViewController.PanelEventsEmitter(); + NotificationPanelViewController.PanelEventsEmitter panelEventsEmitter = + new NotificationPanelViewController.PanelEventsEmitter(); mNotificationPanelViewController = new NotificationPanelViewController( mView, @@ -560,11 +478,11 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { () -> mKeyguardBottomAreaViewController, mKeyguardUnlockAnimationController, mNotificationListContainer, - mPanelEventsEmitter, + panelEventsEmitter, mNotificationStackSizeCalculator, mUnlockedScreenOffAnimationController, mShadeTransitionController, - mSystemClock, + systemClock, mock(CameraGestureHelper.class), mKeyguardBottomAreaViewModel, mKeyguardBottomAreaInteractor); @@ -1481,6 +1399,96 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { assertThat(maxPanelHeight).isNotEqualTo(splitShadeFullTransitionDistance); } + @Test + public void onLayoutChange_fullWidth_updatesQSWithFullWithTrue() { + mNotificationPanelViewController.mQs = mQs; + + setIsFullWidth(true); + + verify(mQs).setIsNotificationPanelFullWidth(true); + } + + @Test + public void onLayoutChange_notFullWidth_updatesQSWithFullWithFalse() { + mNotificationPanelViewController.mQs = mQs; + + setIsFullWidth(false); + + verify(mQs).setIsNotificationPanelFullWidth(false); + } + + @Test + public void onLayoutChange_qsNotSet_doesNotCrash() { + mNotificationPanelViewController.mQs = null; + + triggerLayoutChange(); + } + + @Test + public void onQsFragmentAttached_fullWidth_setsFullWidthTrueOnQS() { + setIsFullWidth(true); + givenViewAttached(); + mFragmentListener.onFragmentViewCreated(QS.TAG, mQSFragment); + + verify(mQSFragment).setIsNotificationPanelFullWidth(true); + } + + @Test + public void onQsFragmentAttached_notFullWidth_setsFullWidthFalseOnQS() { + setIsFullWidth(false); + givenViewAttached(); + mFragmentListener.onFragmentViewCreated(QS.TAG, mQSFragment); + + verify(mQSFragment).setIsNotificationPanelFullWidth(false); + } + + @Test + public void setQsExpansion_lockscreenShadeTransitionInProgress_usesLockscreenSquishiness() { + float squishinessFraction = 0.456f; + mNotificationPanelViewController.mQs = mQs; + when(mLockscreenShadeTransitionController.getQsSquishTransitionFraction()) + .thenReturn(squishinessFraction); + when(mNotificationStackScrollLayoutController.getNotificationSquishinessFraction()) + .thenReturn(0.987f); + // Call setTransitionToFullShadeAmount to get into the full shade transition in progress + // state. + mNotificationPanelViewController.setTransitionToFullShadeAmount( + /* pxAmount= */ 234, + /* animate= */ false, + /* delay= */ 0 + ); + + mNotificationPanelViewController.setQsExpansion(/* height= */ 123); + + // First for setTransitionToFullShadeAmount and then setQsExpansion + verify(mQs, times(2)).setQsExpansion( + /* expansion= */ anyFloat(), + /* panelExpansionFraction= */ anyFloat(), + /* proposedTranslation= */ anyFloat(), + eq(squishinessFraction) + ); + } + + @Test + public void setQsExpansion_lockscreenShadeTransitionNotInProgress_usesStandardSquishiness() { + float lsSquishinessFraction = 0.456f; + float nsslSquishinessFraction = 0.987f; + mNotificationPanelViewController.mQs = mQs; + when(mLockscreenShadeTransitionController.getQsSquishTransitionFraction()) + .thenReturn(lsSquishinessFraction); + when(mNotificationStackScrollLayoutController.getNotificationSquishinessFraction()) + .thenReturn(nsslSquishinessFraction); + + mNotificationPanelViewController.setQsExpansion(/* height= */ 123); + + verify(mQs).setQsExpansion( + /* expansion= */ anyFloat(), + /* panelExpansionFraction= */ anyFloat(), + /* proposedTranslation= */ anyFloat(), + eq(nsslSquishinessFraction) + ); + } + private static MotionEvent createMotionEvent(int x, int y, int action) { return MotionEvent.obtain( /* downTime= */ 0, /* eventTime= */ 0, action, x, y, /* metaState= */ 0); @@ -1504,12 +1512,6 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { } } - private void givenViewDetached() { - for (View.OnAttachStateChangeListener listener : mOnAttachStateChangeListeners) { - listener.onViewDetachedFromWindow(mView); - } - } - private ConstraintSet.Layout getConstraintSetLayout(@IdRes int id) { ConstraintSet constraintSet = new ConstraintSet(); constraintSet.clone(mNotificationContainerParent); @@ -1566,4 +1568,24 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { assertThat(getConstraintSetLayout(R.id.keyguard_status_view).endToEnd).isEqualTo( R.id.qs_edge_guideline); } + + private void setIsFullWidth(boolean fullWidth) { + float nsslWidth = fullWidth ? PANEL_WIDTH : PANEL_WIDTH / 2f; + when(mNotificationStackScrollLayoutController.getWidth()).thenReturn(nsslWidth); + triggerLayoutChange(); + } + + private void triggerLayoutChange() { + mLayoutChangeListener.onLayoutChange( + mView, + /* left= */ 0, + /* top= */ 0, + /* right= */ 0, + /* bottom= */ 0, + /* oldLeft= */ 0, + /* oldTop= */ 0, + /* oldRight= */ 0, + /* oldBottom= */ 0 + ); + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeQsTransitionControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeQsTransitionControllerTest.kt new file mode 100644 index 000000000000..70412626420d --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeQsTransitionControllerTest.kt @@ -0,0 +1,255 @@ +/* + * Copyright (C) 2022 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 + +import android.testing.AndroidTestingRunner +import androidx.test.filters.SmallTest +import com.android.systemui.R +import com.android.systemui.SysuiTestCase +import com.android.systemui.dump.DumpManager +import com.android.systemui.plugins.qs.QS +import com.android.systemui.statusbar.policy.FakeConfigurationController +import com.google.common.truth.Expect +import com.google.common.truth.Truth.assertThat +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.Mockito.verify +import org.mockito.MockitoAnnotations + +@SmallTest +@RunWith(AndroidTestingRunner::class) +class LockscreenShadeQsTransitionControllerTest : SysuiTestCase() { + + private val configurationController = FakeConfigurationController() + + @get:Rule val expect: Expect = Expect.create() + + @Mock private lateinit var dumpManager: DumpManager + @Mock private lateinit var qS: QS + + private lateinit var controller: LockscreenShadeQsTransitionController + + @Before + fun setUp() { + MockitoAnnotations.initMocks(this) + setTransitionDistance(TRANSITION_DISTANCE) + setTransitionDelay(TRANSITION_DELAY) + setSquishTransitionDistance(SQUISH_TRANSITION_DISTANCE) + setSquishStartFraction(SQUISH_START_FRACTION) + + controller = + LockscreenShadeQsTransitionController( + context, + configurationController, + dumpManager, + qsProvider = { qS } + ) + } + + @Test + fun qsTransitionFraction_byDefault_returns0() { + assertThat(controller.qsTransitionFraction).isZero() + } + + @Test + fun qsTransitionFraction_noStartDelay_returnsBasedOnTransitionDistance() { + setTransitionDelay(0) + setTransitionDistance(100) + + controller.dragDownAmount = 25f + expect.that(controller.qsTransitionFraction).isEqualTo(0.25f) + + controller.dragDownAmount = 50f + expect.that(controller.qsTransitionFraction).isEqualTo(0.5f) + + controller.dragDownAmount = 75f + expect.that(controller.qsTransitionFraction).isEqualTo(0.75f) + + controller.dragDownAmount = 100f + expect.that(controller.qsTransitionFraction).isEqualTo(1f) + } + + @Test + fun qsTransitionFraction_noStartDelay_returnsValuesBetween0and1() { + setTransitionDelay(0) + setTransitionDistance(100) + + controller.dragDownAmount = -500f + expect.that(controller.qsTransitionFraction).isEqualTo(0f) + + controller.dragDownAmount = 500f + expect.that(controller.qsTransitionFraction).isEqualTo(1f) + } + + @Test + fun qsTransitionFraction_withStartDelay_returnsBasedOnTransitionDistanceAndDelay() { + setTransitionDelay(10) + setTransitionDistance(100) + + controller.dragDownAmount = 0f + expect.that(controller.qsTransitionFraction).isEqualTo(0f) + + controller.dragDownAmount = 10f + expect.that(controller.qsTransitionFraction).isEqualTo(0f) + + controller.dragDownAmount = 25f + expect.that(controller.qsTransitionFraction).isEqualTo(0.15f) + + controller.dragDownAmount = 100f + expect.that(controller.qsTransitionFraction).isEqualTo(0.9f) + + controller.dragDownAmount = 110f + expect.that(controller.qsTransitionFraction).isEqualTo(1f) + } + + @Test + fun qsTransitionFraction_withStartDelay_returnsValuesBetween0and1() { + setTransitionDelay(10) + setTransitionDistance(100) + + controller.dragDownAmount = -500f + expect.that(controller.qsTransitionFraction).isEqualTo(0f) + + controller.dragDownAmount = 500f + expect.that(controller.qsTransitionFraction).isEqualTo(1f) + } + + @Test + fun qsSquishTransitionFraction_byDefault_returnsValueSetFromResource() { + assertThat(controller.qsSquishTransitionFraction).isEqualTo(SQUISH_START_FRACTION) + } + + @Test + fun qsSquishTransitionFraction_noStartDelay_startFraction0_returnsBasedOnTransitionDistance() { + setTransitionDelay(0) + setSquishStartFraction(0f) + setSquishTransitionDistance(1000) + + controller.dragDownAmount = 250f + expect.that(controller.qsSquishTransitionFraction).isEqualTo(0.25f) + + controller.dragDownAmount = 500f + expect.that(controller.qsSquishTransitionFraction).isEqualTo(0.5f) + + controller.dragDownAmount = 750f + expect.that(controller.qsSquishTransitionFraction).isEqualTo(0.75f) + + controller.dragDownAmount = 1000f + expect.that(controller.qsSquishTransitionFraction).isEqualTo(1f) + } + + @Test + fun qsSquishTransitionFraction_startDelay_startFraction0_basedOnTransitionDistanceAndDelay() { + setTransitionDelay(100) + setSquishStartFraction(0f) + setSquishTransitionDistance(1000) + + controller.dragDownAmount = 250f + expect.that(controller.qsSquishTransitionFraction).isEqualTo(0.15f) + + controller.dragDownAmount = 500f + expect.that(controller.qsSquishTransitionFraction).isEqualTo(0.4f) + + controller.dragDownAmount = 750f + expect.that(controller.qsSquishTransitionFraction).isEqualTo(0.65f) + + controller.dragDownAmount = 1000f + expect.that(controller.qsSquishTransitionFraction).isEqualTo(0.9f) + + controller.dragDownAmount = 1100f + expect.that(controller.qsSquishTransitionFraction).isEqualTo(1f) + } + + @Test + fun qsSquishTransitionFraction_noStartDelay_startFractionSet_returnsBasedOnStartAndDistance() { + setTransitionDelay(0) + setSquishStartFraction(0.5f) + setSquishTransitionDistance(1000) + + controller.dragDownAmount = 0f + expect.that(controller.qsSquishTransitionFraction).isEqualTo(0.5f) + + controller.dragDownAmount = 500f + expect.that(controller.qsSquishTransitionFraction).isEqualTo(0.75f) + + controller.dragDownAmount = 1000f + expect.that(controller.qsSquishTransitionFraction).isEqualTo(1f) + } + + @Test + fun qsSquishTransitionFraction_startDelay_startFractionSet_basedOnStartAndDistanceAndDelay() { + setTransitionDelay(10) + setSquishStartFraction(0.5f) + setSquishTransitionDistance(100) + + controller.dragDownAmount = 0f + expect.that(controller.qsSquishTransitionFraction).isEqualTo(0.5f) + + controller.dragDownAmount = 50f + expect.that(controller.qsSquishTransitionFraction).isEqualTo(0.7f) + + controller.dragDownAmount = 100f + expect.that(controller.qsSquishTransitionFraction).isEqualTo(0.95f) + + controller.dragDownAmount = 110f + expect.that(controller.qsSquishTransitionFraction).isEqualTo(1f) + } + + @Test + fun onDragDownAmountChanged_setsValuesOnQS() { + val rawDragAmount = 200f + + controller.dragDownAmount = rawDragAmount + + verify(qS) + .setTransitionToFullShadeProgress( + /* isTransitioningToFullShade= */ true, + /* transitionFraction= */ controller.qsTransitionFraction, + /* squishinessFraction= */ controller.qsSquishTransitionFraction + ) + } + + private fun setTransitionDistance(value: Int) { + overrideResource(R.dimen.lockscreen_shade_qs_transition_distance, value) + configurationController.notifyConfigurationChanged() + } + + private fun setTransitionDelay(value: Int) { + overrideResource(R.dimen.lockscreen_shade_qs_transition_delay, value) + configurationController.notifyConfigurationChanged() + } + + private fun setSquishTransitionDistance(value: Int) { + overrideResource(R.dimen.lockscreen_shade_qs_squish_transition_distance, value) + configurationController.notifyConfigurationChanged() + } + + private fun setSquishStartFraction(value: Float) { + overrideResource(R.dimen.lockscreen_shade_qs_squish_start_fraction, value) + configurationController.notifyConfigurationChanged() + } + + companion object { + private const val TRANSITION_DELAY = 123 + private const val TRANSITION_DISTANCE = 321 + private const val SQUISH_START_FRACTION = 0.123f + private const val SQUISH_TRANSITION_DISTANCE = 456 + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt index fe1cd978ef91..8643e86acef2 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt @@ -1,9 +1,9 @@ package com.android.systemui.statusbar -import android.test.suitebuilder.annotation.SmallTest import android.testing.AndroidTestingRunner import android.testing.TestableLooper import android.testing.TestableLooper.RunWithLooper +import androidx.test.filters.SmallTest import com.android.systemui.ExpandHelper import com.android.systemui.R import com.android.systemui.SysuiTestCase @@ -78,6 +78,7 @@ class LockscreenShadeTransitionControllerTest : SysuiTestCase() { @Mock lateinit var qS: QS @Mock lateinit var singleShadeOverScroller: SingleShadeLockScreenOverScroller @Mock lateinit var splitShadeOverScroller: SplitShadeLockScreenOverScroller + @Mock lateinit var qsTransitionController: LockscreenShadeQsTransitionController @JvmField @Rule val mockito = MockitoJUnit.rule() private val configurationController = FakeConfigurationController() @@ -120,7 +121,9 @@ class LockscreenShadeTransitionControllerTest : SysuiTestCase() { context, configurationController, dumpManager) - }) + }, + qsTransitionControllerFactory = { qsTransitionController }, + ) whenever(nsslController.view).thenReturn(stackscroller) whenever(nsslController.expandHelperCallback).thenReturn(expandHelperCallback) transitionController.notificationPanelController = notificationPanelController @@ -249,7 +252,7 @@ class LockscreenShadeTransitionControllerTest : SysuiTestCase() { verify(scrimController, never()).setTransitionToFullShadeProgress(anyFloat(), anyFloat()) verify(notificationPanelController, never()).setTransitionToFullShadeAmount(anyFloat(), anyBoolean(), anyLong()) - verify(qS, never()).setTransitionToFullShadeAmount(anyFloat(), anyFloat()) + verify(qsTransitionController, never()).dragDownAmount = anyFloat() } @Test @@ -260,7 +263,7 @@ class LockscreenShadeTransitionControllerTest : SysuiTestCase() { verify(scrimController).setTransitionToFullShadeProgress(anyFloat(), anyFloat()) verify(notificationPanelController).setTransitionToFullShadeAmount(anyFloat(), anyBoolean(), anyLong()) - verify(qS).setTransitionToFullShadeAmount(anyFloat(), anyFloat()) + verify(qsTransitionController).dragDownAmount = 10f verify(depthController).transitionToFullShadeProgress = anyFloat() } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java index cce2e8994a0c..365e60868b42 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java @@ -20,7 +20,6 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; -import static org.mockito.ArgumentMatchers.anyFloat; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyString; @@ -45,13 +44,11 @@ import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.SysuiTestCase; import com.android.systemui.biometrics.AuthController; import com.android.systemui.dump.DumpManager; -import com.android.systemui.keyguard.KeyguardUnlockAnimationController; import com.android.systemui.keyguard.KeyguardViewMediator; import com.android.systemui.keyguard.ScreenLifecycle; import com.android.systemui.keyguard.WakefulnessLifecycle; import com.android.systemui.log.SessionTracker; import com.android.systemui.plugins.statusbar.StatusBarStateController; -import com.android.systemui.shade.ShadeController; import com.android.systemui.statusbar.NotificationMediaManager; import com.android.systemui.statusbar.NotificationShadeWindowController; import com.android.systemui.statusbar.VibratorHelper; @@ -90,8 +87,6 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase { @Mock private BiometricUnlockController.BiometricModeListener mBiometricModeListener; @Mock - private ShadeController mShadeController; - @Mock private KeyguardStateController mKeyguardStateController; @Mock private Handler mHandler; @@ -112,8 +107,6 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase { @Mock private StatusBarStateController mStatusBarStateController; @Mock - private KeyguardUnlockAnimationController mKeyguardUnlockAnimationController; - @Mock private SessionTracker mSessionTracker; @Mock private LatencyTracker mLatencyTracker; @@ -137,12 +130,12 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase { when(mVibratorHelper.hasVibrator()).thenReturn(true); mDependency.injectTestDependency(NotificationMediaManager.class, mMediaManager); mBiometricUnlockController = new BiometricUnlockController(mDozeScrimController, - mKeyguardViewMediator, mScrimController, mShadeController, + mKeyguardViewMediator, mScrimController, mNotificationShadeWindowController, mKeyguardStateController, mHandler, mUpdateMonitor, res.getResources(), mKeyguardBypassController, mDozeParameters, mMetricsLogger, mDumpManager, mPowerManager, mNotificationMediaManager, mWakefulnessLifecycle, mScreenLifecycle, - mAuthController, mStatusBarStateController, mKeyguardUnlockAnimationController, + mAuthController, mStatusBarStateController, mSessionTracker, mLatencyTracker, mScreenOffAnimationController, mVibratorHelper); mBiometricUnlockController.setKeyguardViewController(mStatusBarKeyguardViewManager); mBiometricUnlockController.setBiometricModeListener(mBiometricModeListener); @@ -167,8 +160,6 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase { mBiometricUnlockController.onBiometricAuthenticated(UserHandle.USER_CURRENT, BiometricSourceType.FINGERPRINT, false /* isStrongBiometric */); verify(mStatusBarKeyguardViewManager).showBouncer(anyBoolean()); - verify(mShadeController).animateCollapsePanels(anyInt(), anyBoolean(), anyBoolean(), - anyFloat()); assertThat(mBiometricUnlockController.getMode()) .isEqualTo(BiometricUnlockController.MODE_SHOW_BOUNCER); assertThat(mBiometricUnlockController.getBiometricType()) @@ -246,8 +237,6 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase { mBiometricUnlockController.onBiometricAuthenticated(UserHandle.USER_CURRENT, BiometricSourceType.FACE, true /* isStrongBiometric */); - verify(mShadeController, never()).animateCollapsePanels(anyInt(), anyBoolean(), - anyBoolean(), anyFloat()); verify(mStatusBarKeyguardViewManager, never()).notifyKeyguardAuthenticated(anyBoolean()); assertThat(mBiometricUnlockController.getMode()) .isEqualTo(BiometricUnlockController.MODE_NONE); @@ -298,10 +287,6 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase { mBiometricUnlockController.onBiometricAuthenticated(UserHandle.USER_CURRENT, BiometricSourceType.FACE, true /* isStrongBiometric */); - // Wake up before showing the bouncer - verify(mStatusBarKeyguardViewManager, never()).showBouncer(anyBoolean()); - mBiometricUnlockController.mWakefulnessObserver.onFinishedWakingUp(); - verify(mStatusBarKeyguardViewManager).showBouncer(anyBoolean()); assertThat(mBiometricUnlockController.getMode()) .isEqualTo(BiometricUnlockController.MODE_SHOW_BOUNCER); @@ -332,8 +317,6 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase { BiometricSourceType.FACE, true /* isStrongBiometric */); verify(mStatusBarKeyguardViewManager, never()).showBouncer(anyBoolean()); - verify(mShadeController, never()).animateCollapsePanels(anyInt(), anyBoolean(), - anyBoolean(), anyFloat()); assertThat(mBiometricUnlockController.getMode()) .isEqualTo(BiometricUnlockController.MODE_NONE); } @@ -383,8 +366,6 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase { mBiometricUnlockController.onBiometricAuthenticated(UserHandle.USER_CURRENT, BiometricSourceType.FACE, true /* isStrongBiometric */); - verify(mShadeController, never()).animateCollapsePanels(anyInt(), anyBoolean(), - anyBoolean(), anyFloat()); assertThat(mBiometricUnlockController.getMode()) .isEqualTo(BiometricUnlockController.MODE_ONLY_WAKE); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java index 7cd275db1ed6..4d1a52c494ab 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java @@ -59,16 +59,19 @@ import com.android.systemui.animation.ShadeInterpolation; import com.android.systemui.dock.DockManager; import com.android.systemui.keyguard.KeyguardUnlockAnimationController; import com.android.systemui.scrim.ScrimView; -import com.android.systemui.statusbar.policy.ConfigurationController; +import com.android.systemui.statusbar.policy.FakeConfigurationController; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.util.concurrency.FakeExecutor; import com.android.systemui.util.time.FakeSystemClock; import com.android.systemui.util.wakelock.DelayedWakeLock; import com.android.systemui.utils.os.FakeHandler; +import com.google.common.truth.Expect; + import org.junit.After; import org.junit.Assert; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; @@ -86,6 +89,11 @@ import java.util.Map; @SmallTest public class ScrimControllerTest extends SysuiTestCase { + @Rule public Expect mExpect = Expect.create(); + + private final FakeConfigurationController mConfigurationController = + new FakeConfigurationController(); + private ScrimController mScrimController; private ScrimView mScrimBehind; private ScrimView mNotificationsScrim; @@ -96,32 +104,19 @@ public class ScrimControllerTest extends SysuiTestCase { private int mScrimVisibility; private boolean mAlwaysOnEnabled; private TestableLooper mLooper; - @Mock - private AlarmManager mAlarmManager; - @Mock - private DozeParameters mDozeParameters; - @Mock - LightBarController mLightBarController; - @Mock - DelayedWakeLock.Builder mDelayedWakeLockBuilder; - @Mock - private DelayedWakeLock mWakeLock; - @Mock - KeyguardStateController mKeyguardStateController; - @Mock - KeyguardUpdateMonitor mKeyguardUpdateMonitor; - @Mock - private DockManager mDockManager; - @Mock - private ConfigurationController mConfigurationController; - @Mock - private ScreenOffAnimationController mScreenOffAnimationController; - @Mock - private KeyguardUnlockAnimationController mKeyguardUnlockAnimationController; + @Mock private AlarmManager mAlarmManager; + @Mock private DozeParameters mDozeParameters; + @Mock private LightBarController mLightBarController; + @Mock private DelayedWakeLock.Builder mDelayedWakeLockBuilder; + @Mock private DelayedWakeLock mWakeLock; + @Mock private KeyguardStateController mKeyguardStateController; + @Mock private KeyguardUpdateMonitor mKeyguardUpdateMonitor; + @Mock private DockManager mDockManager; + @Mock private ScreenOffAnimationController mScreenOffAnimationController; + @Mock private KeyguardUnlockAnimationController mKeyguardUnlockAnimationController; // TODO(b/204991468): Use a real PanelExpansionStateManager object once this bug is fixed. (The // event-dispatch-on-registration pattern caused some of these unit tests to fail.) - @Mock - private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager; + @Mock private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager; private static class AnimatorListener implements Animator.AnimatorListener { private int mNumStarts; @@ -1450,6 +1445,41 @@ public class ScrimControllerTest extends SysuiTestCase { } @Test + public void notificationAlpha_qsNotClipped_alphaMatchesNotificationExpansionProgress() { + mScrimController.setClipsQsScrim(false); + mScrimController.transitionTo(ScrimState.KEYGUARD); + // RawPanelExpansion and QsExpansion are usually used for the notification alpha + // calculation. + // Here we set them to non-zero values explicitly to make sure that in not clipped mode, + // they are not being used even when set. + mScrimController.setRawPanelExpansionFraction(0.5f); + mScrimController.setQsPosition(/* expansionFraction= */ 0.5f, /* qsPanelBottomY= */ 500); + finishAnimationsImmediately(); + + float progress = 0.5f; + + float notificationExpansionProgress = 0f; + mScrimController.setTransitionToFullShadeProgress(progress, notificationExpansionProgress); + mExpect.that(mNotificationsScrim.getViewAlpha()).isEqualTo(notificationExpansionProgress); + + notificationExpansionProgress = 0.25f; + mScrimController.setTransitionToFullShadeProgress(progress, notificationExpansionProgress); + mExpect.that(mNotificationsScrim.getViewAlpha()).isEqualTo(notificationExpansionProgress); + + notificationExpansionProgress = 0.5f; + mScrimController.setTransitionToFullShadeProgress(progress, notificationExpansionProgress); + mExpect.that(mNotificationsScrim.getViewAlpha()).isEqualTo(notificationExpansionProgress); + + notificationExpansionProgress = 0.75f; + mScrimController.setTransitionToFullShadeProgress(progress, notificationExpansionProgress); + mExpect.that(mNotificationsScrim.getViewAlpha()).isEqualTo(notificationExpansionProgress); + + notificationExpansionProgress = 1f; + mScrimController.setTransitionToFullShadeProgress(progress, notificationExpansionProgress); + mExpect.that(mNotificationsScrim.getViewAlpha()).isEqualTo(notificationExpansionProgress); + } + + @Test public void setNotificationsOverScrollAmount_setsTranslationYOnNotificationsScrim() { int overScrollAmount = 10; diff --git a/packages/SystemUI/tests/src/com/android/systemui/ImageWallpaperTest.java b/packages/SystemUI/tests/src/com/android/systemui/wallpapers/ImageWallpaperTest.java index e1ddaada44cf..e47acd8d3834 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/ImageWallpaperTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/wallpapers/ImageWallpaperTest.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.systemui; +package com.android.systemui.wallpapers; import static com.google.common.truth.Truth.assertWithMessage; @@ -40,7 +40,8 @@ import android.view.Display; import android.view.DisplayInfo; import android.view.SurfaceHolder; -import com.android.systemui.glwallpaper.ImageWallpaperRenderer; +import com.android.systemui.SysuiTestCase; +import com.android.systemui.wallpapers.gl.ImageWallpaperRenderer; import org.junit.Before; import org.junit.Ignore; diff --git a/packages/SystemUI/tests/src/com/android/systemui/glwallpaper/EglHelperTest.java b/packages/SystemUI/tests/src/com/android/systemui/wallpapers/gl/EglHelperTest.java index a3221b58e937..a42badeb228f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/glwallpaper/EglHelperTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/wallpapers/gl/EglHelperTest.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.systemui.glwallpaper; +package com.android.systemui.wallpapers.gl; import static com.google.common.truth.Truth.assertThat; diff --git a/packages/SystemUI/tests/src/com/android/systemui/glwallpaper/ImageWallpaperRendererTest.java b/packages/SystemUI/tests/src/com/android/systemui/wallpapers/gl/ImageWallpaperRendererTest.java index 510b90722650..89b2222df69e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/glwallpaper/ImageWallpaperRendererTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/wallpapers/gl/ImageWallpaperRendererTest.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.systemui.glwallpaper; +package com.android.systemui.wallpapers.gl; import static com.google.common.truth.Truth.assertThat; diff --git a/services/core/java/android/content/pm/PackageManagerInternal.java b/services/core/java/android/content/pm/PackageManagerInternal.java index bd1ecb23611e..7ca62542aaca 100644 --- a/services/core/java/android/content/pm/PackageManagerInternal.java +++ b/services/core/java/android/content/pm/PackageManagerInternal.java @@ -48,8 +48,7 @@ import com.android.server.pm.KnownPackages; import com.android.server.pm.PackageList; import com.android.server.pm.PackageSetting; import com.android.server.pm.dex.DynamicCodeLogger; -import com.android.server.pm.parsing.pkg.AndroidPackage; -import com.android.server.pm.pkg.AndroidPackageApi; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageStateInternal; import com.android.server.pm.pkg.SharedUserApi; import com.android.server.pm.pkg.component.ParsedMainComponent; @@ -644,7 +643,7 @@ public abstract class PackageManagerInternal { * Returns the {@link SystemApi} variant of a package for use with mainline. */ @Nullable - public abstract AndroidPackageApi getAndroidPackage(@NonNull String packageName); + public abstract AndroidPackage getAndroidPackage(@NonNull String packageName); @Nullable public abstract PackageStateInternal getPackageStateInternal(@NonNull String packageName); diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 26899f196126..6e52d21e6b43 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -407,8 +407,8 @@ import com.android.server.os.NativeTombstoneManager; import com.android.server.pm.Computer; import com.android.server.pm.Installer; import com.android.server.pm.UserManagerInternal; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.permission.PermissionManagerServiceInternal; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.SELinuxUtil; import com.android.server.pm.pkg.parsing.ParsingPackageUtils; import com.android.server.pm.snapshot.PackageDataSnapshot; @@ -16145,8 +16145,7 @@ public class ActivityManagerService extends IActivityManager.Stub @Override public boolean startUserInBackgroundOnSecondaryDisplay(int userId, int displayId) { // Permission check done inside UserController. - return mUserController.startUserOnSecondaryDisplay(userId, displayId, - /* unlockListener= */ null); + return mUserController.startUserOnSecondaryDisplay(userId, displayId); } /** diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java index cc2b693d36f7..a41a311bd643 100644 --- a/services/core/java/com/android/server/am/BatteryStatsService.java +++ b/services/core/java/com/android/server/am/BatteryStatsService.java @@ -44,6 +44,7 @@ import android.net.ConnectivityManager; import android.net.INetworkManagementEventObserver; import android.net.Network; import android.net.NetworkCapabilities; +import android.os.BatteryConsumer; import android.os.BatteryManagerInternal; import android.os.BatteryStats; import android.os.BatteryStatsInternal; @@ -2292,6 +2293,10 @@ public final class BatteryStatsService extends IBatteryStats.Stub pw.println(" --settings: dump the settings key/values related to batterystats"); pw.println(" --cpu: dump cpu stats for debugging purpose"); pw.println(" --power-profile: dump the power profile constants"); + pw.println(" --usage: write battery usage stats. Optional arguments:"); + pw.println(" --proto: output as a binary protobuffer"); + pw.println(" --model power-profile: use the power profile model" + + " even if measured energy is available"); pw.println(" <package.name>: optional name of package to filter output by."); pw.println(" -h: print this help text."); pw.println("Battery stats (batterystats) commands:"); @@ -2335,6 +2340,31 @@ public final class BatteryStatsService extends IBatteryStats.Stub } } + private void dumpUsageStatsToProto(FileDescriptor fd, PrintWriter pw, int model, + boolean proto) { + awaitCompletion(); + syncStats("dump", BatteryExternalStatsWorker.UPDATE_ALL); + + BatteryUsageStatsQuery.Builder builder = new BatteryUsageStatsQuery.Builder() + .setMaxStatsAgeMs(0) + .includeProcessStateData() + .includePowerModels(); + if (model == BatteryConsumer.POWER_MODEL_POWER_PROFILE) { + builder.powerProfileModeledOnly(); + } + BatteryUsageStatsQuery query = builder.build(); + synchronized (mStats) { + mStats.prepareForDumpLocked(); + BatteryUsageStats batteryUsageStats = + mBatteryUsageStatsProvider.getBatteryUsageStats(query); + if (proto) { + batteryUsageStats.dumpToProto(fd); + } else { + batteryUsageStats.dump(pw, ""); + } + } + } + private int doEnableOrDisable(PrintWriter pw, int i, String[] args, boolean enable) { i++; if (i >= args.length) { @@ -2488,6 +2518,35 @@ public final class BatteryStatsService extends IBatteryStats.Stub } else if ("--power-profile".equals(arg)) { dumpPowerProfile(pw); return; + } else if ("--usage".equals(arg)) { + int model = BatteryConsumer.POWER_MODEL_UNDEFINED; + boolean proto = false; + for (int j = i + 1; j < args.length; j++) { + switch (args[j]) { + case "--proto": + proto = true; + break; + case "--model": { + if (j + 1 < args.length) { + j++; + if ("power-profile".equals(args[j])) { + model = BatteryConsumer.POWER_MODEL_POWER_PROFILE; + } else { + pw.println("Unknown power model: " + args[j]); + dumpHelp(pw); + return; + } + } else { + pw.println("--model without a value"); + dumpHelp(pw); + return; + } + break; + } + } + } + dumpUsageStatsToProto(fd, pw, model, proto); + return; } else if ("-a".equals(arg)) { flags |= BatteryStats.DUMP_VERBOSE; } else if (arg.length() > 0 && arg.charAt(0) == '-'){ diff --git a/services/core/java/com/android/server/am/ContentProviderHelper.java b/services/core/java/com/android/server/am/ContentProviderHelper.java index a36c298c9848..86c97707362a 100644 --- a/services/core/java/com/android/server/am/ContentProviderHelper.java +++ b/services/core/java/com/android/server/am/ContentProviderHelper.java @@ -81,7 +81,7 @@ import com.android.internal.util.FrameworkStatsLog; import com.android.server.LocalServices; import com.android.server.RescueParty; import com.android.server.pm.UserManagerInternal; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import java.io.FileDescriptor; import java.io.PrintWriter; diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java index affb084708eb..992d41637f3f 100644 --- a/services/core/java/com/android/server/am/ProcessList.java +++ b/services/core/java/com/android/server/am/ProcessList.java @@ -133,7 +133,7 @@ import com.android.server.SystemConfig; import com.android.server.Watchdog; import com.android.server.am.ActivityManagerService.ProcessChangeItem; import com.android.server.compat.PlatformCompat; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageStateInternal; import com.android.server.wm.ActivityServiceConnectionsHolder; import com.android.server.wm.WindowManagerService; @@ -2200,16 +2200,25 @@ public final class ProcessList { Map<String, Pair<String, Long>> allowlistedAppDataInfoMap; boolean bindMountAppStorageDirs = false; boolean bindMountAppsData = mAppDataIsolationEnabled - && (UserHandle.isApp(app.uid) || UserHandle.isIsolated(app.uid)) + && (UserHandle.isApp(app.uid) || UserHandle.isIsolated(app.uid) + || app.isSdkSandbox) && mPlatformCompat.isChangeEnabled(APP_DATA_DIRECTORY_ISOLATION, app.info); // Get all packages belongs to the same shared uid. sharedPackages is empty array // if it doesn't have shared uid. final PackageManagerInternal pmInt = mService.getPackageManagerInternal(); - final String[] sharedPackages = pmInt.getSharedUserPackagesForPackage( - app.info.packageName, app.userId); - final String[] targetPackagesList = sharedPackages.length == 0 - ? new String[]{app.info.packageName} : sharedPackages; + + // In the case of sdk sandbox, the pkgDataInfoMap of only the client app associated with + // the sandbox is required to handle app visibility restrictions for the sandbox. + final String[] targetPackagesList; + if (app.isSdkSandbox) { + targetPackagesList = new String[]{app.sdkSandboxClientAppPackage}; + } else { + final String[] sharedPackages = pmInt.getSharedUserPackagesForPackage( + app.info.packageName, app.userId); + targetPackagesList = sharedPackages.length == 0 + ? new String[]{app.info.packageName} : sharedPackages; + } final boolean hasAppStorage = hasAppStorage(pmInt, app.info.packageName); @@ -2235,7 +2244,7 @@ public final class ProcessList { bindMountAppsData = false; } - if (!hasAppStorage) { + if (!hasAppStorage && !app.isSdkSandbox) { bindMountAppsData = false; pkgDataInfoMap = null; allowlistedAppDataInfoMap = null; diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java index 043da55b55cb..1954f76825cd 100644 --- a/services/core/java/com/android/server/am/UserController.java +++ b/services/core/java/com/android/server/am/UserController.java @@ -1375,8 +1375,9 @@ class UserController implements Handler.Callback { } final int profilesToStartSize = profilesToStart.size(); int i = 0; - // TODO(b/239982558): pass displayId for (; i < profilesToStartSize && i < (getMaxRunningUsers() - 1); ++i) { + // NOTE: this method is setting the profiles of the current user - which is always + // assigned to the default display - so there's no need to pass PARENT_DISPLAY startUser(profilesToStart.get(i).id, /* foreground= */ false); } if (i < profilesToStartSize) { @@ -1419,8 +1420,10 @@ class UserController implements Handler.Callback { return false; } - // TODO(b/239982558): pass proper displayId - return startUserNoChecks(userId, Display.DEFAULT_DISPLAY, /* foreground= */ false, + int displayId = mInjector.isUsersOnSecondaryDisplaysEnabled() + ? UserManagerInternal.PARENT_DISPLAY + : Display.DEFAULT_DISPLAY; + return startUserNoChecks(userId, displayId, /* foreground= */ false, /* unlockListener= */ null); } @@ -1472,8 +1475,7 @@ class UserController implements Handler.Callback { // TODO(b/239982558): add javadoc (need to wait until the intents / SystemService callbacks are // defined - boolean startUserOnSecondaryDisplay(@UserIdInt int userId, int displayId, - @Nullable IProgressListener unlockListener) { + boolean startUserOnSecondaryDisplay(@UserIdInt int userId, int displayId) { checkCallingHasOneOfThosePermissions("startUserOnSecondaryDisplay", MANAGE_USERS, CREATE_USERS); @@ -1482,7 +1484,8 @@ class UserController implements Handler.Callback { "Cannot use DEFAULT_DISPLAY"); try { - return startUserNoChecks(userId, displayId, /* foreground= */ false, unlockListener); + return startUserNoChecks(userId, displayId, /* foreground= */ false, + /* unlockListener= */ null); } catch (RuntimeException e) { Slogf.w(TAG, "startUserOnSecondaryDisplay(%d, %d) failed: %s", userId, displayId, e); return false; @@ -1514,8 +1517,6 @@ class UserController implements Handler.Callback { Preconditions.checkArgument(!foreground, "Cannot start user %d in foreground AND " + "on secondary display (%d)", userId, displayId); } - mInjector.getUserManagerInternal().assignUserToDisplay(userId, displayId); - // TODO(b/239982558): log display id (or use a new event) EventLog.writeEvent(EventLogTags.UC_START_USER_INTERNAL, userId); @@ -1571,6 +1572,8 @@ class UserController implements Handler.Callback { return false; } + mInjector.getUserManagerInternal().assignUserToDisplay(userId, displayId); + // TODO(b/239982558): might need something similar for bg users on secondary display if (foreground && isUserSwitchUiEnabled()) { t.traceBegin("startFreezingScreen"); @@ -3484,5 +3487,9 @@ class UserController implements Handler.Callback { } }, reason); } + + boolean isUsersOnSecondaryDisplaysEnabled() { + return UserManager.isUsersOnSecondaryDisplaysEnabled(); + } } } diff --git a/services/core/java/com/android/server/am/UserState.java b/services/core/java/com/android/server/am/UserState.java index 71a551113f12..4741849c8267 100644 --- a/services/core/java/com/android/server/am/UserState.java +++ b/services/core/java/com/android/server/am/UserState.java @@ -35,18 +35,20 @@ import java.util.ArrayList; public final class UserState { private static final String TAG = TAG_WITH_CLASS_NAME ? "UserState" : TAG_AM; + // user doesn't exist. + public static final int STATE_NONE = -1; // User is first coming up. - public final static int STATE_BOOTING = 0; + public static final int STATE_BOOTING = 0; // User is in the locked state. - public final static int STATE_RUNNING_LOCKED = 1; + public static final int STATE_RUNNING_LOCKED = 1; // User is in the unlocking state. - public final static int STATE_RUNNING_UNLOCKING = 2; + public static final int STATE_RUNNING_UNLOCKING = 2; // User is in the running state. - public final static int STATE_RUNNING_UNLOCKED = 3; + public static final int STATE_RUNNING_UNLOCKED = 3; // User is in the initial process of being stopped. - public final static int STATE_STOPPING = 4; + public static final int STATE_STOPPING = 4; // User is in the final phase of stopping, sending Intent.ACTION_SHUTDOWN. - public final static int STATE_SHUTDOWN = 5; + public static final int STATE_SHUTDOWN = 5; public final UserHandle mHandle; public final ArrayList<IStopUserCallback> mStopCallbacks = new ArrayList<>(); diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java index 7bdcfdbd8ed7..62ae9b8a9789 100644 --- a/services/core/java/com/android/server/appop/AppOpsService.java +++ b/services/core/java/com/android/server/appop/AppOpsService.java @@ -177,7 +177,7 @@ import com.android.server.LockGuard; import com.android.server.SystemServerInitThreadPool; import com.android.server.SystemServiceManager; import com.android.server.pm.PackageList; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.component.ParsedAttribution; import com.android.server.policy.AppOpsPolicy; diff --git a/services/core/java/com/android/server/broadcastradio/BroadcastRadioService.java b/services/core/java/com/android/server/broadcastradio/BroadcastRadioService.java index 23183f9011e6..ab553a864ad6 100644 --- a/services/core/java/com/android/server/broadcastradio/BroadcastRadioService.java +++ b/services/core/java/com/android/server/broadcastradio/BroadcastRadioService.java @@ -17,122 +17,33 @@ package com.android.server.broadcastradio; import android.Manifest; +import android.annotation.SuppressLint; import android.content.Context; import android.content.pm.PackageManager; -import android.hardware.radio.IAnnouncementListener; -import android.hardware.radio.ICloseHandle; import android.hardware.radio.IRadioService; -import android.hardware.radio.ITuner; -import android.hardware.radio.ITunerCallback; -import android.hardware.radio.RadioManager; -import android.os.RemoteException; -import android.util.IndentingPrintWriter; import android.util.Slog; import com.android.server.SystemService; -import com.android.server.broadcastradio.hal2.AnnouncementAggregator; - -import java.io.FileDescriptor; -import java.io.PrintWriter; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; -import java.util.OptionalInt; public class BroadcastRadioService extends SystemService { private static final String TAG = "BcRadioSrv"; - - private final ServiceImpl mServiceImpl = new ServiceImpl(); - - private final com.android.server.broadcastradio.hal1.BroadcastRadioService mHal1; - private final com.android.server.broadcastradio.hal2.BroadcastRadioService mHal2; - - private final Object mLock = new Object(); - private final List<RadioManager.ModuleProperties> mV1Modules; - + private final IRadioService mServiceImpl; public BroadcastRadioService(Context context) { super(context); - - mHal1 = new com.android.server.broadcastradio.hal1.BroadcastRadioService(mLock); - mV1Modules = mHal1.loadModules(); - OptionalInt max = mV1Modules.stream().mapToInt(RadioManager.ModuleProperties::getId).max(); - mHal2 = new com.android.server.broadcastradio.hal2.BroadcastRadioService( - max.isPresent() ? max.getAsInt() + 1 : 0, mLock); + mServiceImpl = new BroadcastRadioServiceHidl(this); } @Override public void onStart() { - publishBinderService(Context.RADIO_SERVICE, mServiceImpl); + Slog.v(TAG, "BroadcastRadioService onStart()"); + publishBinderService(Context.RADIO_SERVICE, mServiceImpl.asBinder()); } - private class ServiceImpl extends IRadioService.Stub { - private void enforcePolicyAccess() { - if (PackageManager.PERMISSION_GRANTED != getContext().checkCallingPermission( - Manifest.permission.ACCESS_BROADCAST_RADIO)) { - throw new SecurityException("ACCESS_BROADCAST_RADIO permission not granted"); - } - } - - @Override - public List<RadioManager.ModuleProperties> listModules() { - Slog.v(TAG, "Listing HIDL modules"); - enforcePolicyAccess(); - List<RadioManager.ModuleProperties> modules = new ArrayList<>(); - modules.addAll(mV1Modules); - modules.addAll(mHal2.listModules()); - return modules; - } - - @Override - public ITuner openTuner(int moduleId, RadioManager.BandConfig bandConfig, - boolean withAudio, ITunerCallback callback) throws RemoteException { - Slog.v(TAG, "Opening module " + moduleId); - enforcePolicyAccess(); - if (callback == null) { - throw new IllegalArgumentException("Callback must not be empty"); - } - synchronized (mLock) { - if (mHal2.hasModule(moduleId)) { - return mHal2.openSession(moduleId, bandConfig, withAudio, callback); - } else { - return mHal1.openTuner(moduleId, bandConfig, withAudio, callback); - } - } - } - - @Override - public ICloseHandle addAnnouncementListener(int[] enabledTypes, - IAnnouncementListener listener) { - Slog.v(TAG, "Adding announcement listener for " + Arrays.toString(enabledTypes)); - Objects.requireNonNull(enabledTypes); - Objects.requireNonNull(listener); - enforcePolicyAccess(); - - synchronized (mLock) { - if (!mHal2.hasAnyModules()) { - Slog.i(TAG, "There are no HAL 2.0 modules registered"); - return new AnnouncementAggregator(listener, mLock); - } - - return mHal2.addAnnouncementListener(enabledTypes, listener); - } - } - - @Override - protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { - IndentingPrintWriter radioPw = new IndentingPrintWriter(pw); - radioPw.printf("BroadcastRadioService\n"); - radioPw.increaseIndent(); - radioPw.printf("HAL1: %s\n", mHal1); - radioPw.increaseIndent(); - radioPw.printf("Modules of HAL1: %s\n", mV1Modules); - radioPw.decreaseIndent(); - radioPw.printf("HAL2:\n"); - radioPw.increaseIndent(); - mHal2.dumpInfo(radioPw); - radioPw.decreaseIndent(); - radioPw.decreaseIndent(); + @SuppressLint("AndroidFrameworkRequiresPermission") + void enforcePolicyAccess() { + if (getContext().checkCallingPermission(Manifest.permission.ACCESS_BROADCAST_RADIO) + != PackageManager.PERMISSION_GRANTED) { + throw new SecurityException("ACCESS_BROADCAST_RADIO permission not granted"); } } } diff --git a/services/core/java/com/android/server/broadcastradio/BroadcastRadioServiceHidl.java b/services/core/java/com/android/server/broadcastradio/BroadcastRadioServiceHidl.java new file mode 100644 index 000000000000..5cb6770e7909 --- /dev/null +++ b/services/core/java/com/android/server/broadcastradio/BroadcastRadioServiceHidl.java @@ -0,0 +1,137 @@ +/** + * Copyright (C) 2022 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.broadcastradio; + +import android.hardware.radio.IAnnouncementListener; +import android.hardware.radio.ICloseHandle; +import android.hardware.radio.IRadioService; +import android.hardware.radio.ITuner; +import android.hardware.radio.ITunerCallback; +import android.hardware.radio.RadioManager; +import android.os.RemoteException; +import android.util.IndentingPrintWriter; +import android.util.Log; +import android.util.Slog; + +import com.android.server.broadcastradio.hal2.AnnouncementAggregator; + +import java.io.FileDescriptor; +import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.Objects; +import java.util.OptionalInt; + +/** + * Wrapper for HIDL interface for BroadcastRadio HAL + */ +final class BroadcastRadioServiceHidl extends IRadioService.Stub { + private static final String TAG = "BcRadioSrvHidl"; + + private final com.android.server.broadcastradio.hal1.BroadcastRadioService mHal1; + private final com.android.server.broadcastradio.hal2.BroadcastRadioService mHal2; + + private final Object mLock = new Object(); + + private final BroadcastRadioService mService; + private final List<RadioManager.ModuleProperties> mV1Modules; + + BroadcastRadioServiceHidl(BroadcastRadioService service) { + mService = Objects.requireNonNull(service); + mHal1 = new com.android.server.broadcastradio.hal1.BroadcastRadioService(mLock); + mV1Modules = mHal1.loadModules(); + OptionalInt max = mV1Modules.stream().mapToInt(RadioManager.ModuleProperties::getId).max(); + mHal2 = new com.android.server.broadcastradio.hal2.BroadcastRadioService( + max.isPresent() ? max.getAsInt() + 1 : 0, mLock); + } + + @Override + public List<RadioManager.ModuleProperties> listModules() { + mService.enforcePolicyAccess(); + Collection<RadioManager.ModuleProperties> v2Modules = mHal2.listModules(); + List<RadioManager.ModuleProperties> modules = new ArrayList<>( + mV1Modules.size() + v2Modules.size()); + modules.addAll(mV1Modules); + modules.addAll(v2Modules); + return modules; + } + + @Override + public ITuner openTuner(int moduleId, RadioManager.BandConfig bandConfig, + boolean withAudio, ITunerCallback callback) throws RemoteException { + if (isDebugEnabled()) { + Slog.d(TAG, "Opening module " + moduleId); + } + mService.enforcePolicyAccess(); + Objects.requireNonNull(callback, "Callback must not be null"); + synchronized (mLock) { + if (mHal2.hasModule(moduleId)) { + return mHal2.openSession(moduleId, bandConfig, withAudio, callback); + } else { + return mHal1.openTuner(moduleId, bandConfig, withAudio, callback); + } + } + } + + @Override + public ICloseHandle addAnnouncementListener(int[] enabledTypes, + IAnnouncementListener listener) { + if (isDebugEnabled()) { + Slog.d(TAG, "Adding announcement listener for " + Arrays.toString(enabledTypes)); + } + Objects.requireNonNull(enabledTypes); + Objects.requireNonNull(listener); + mService.enforcePolicyAccess(); + + synchronized (mLock) { + if (!mHal2.hasAnyModules()) { + Slog.w(TAG, "There are no HAL 2.0 modules registered"); + return new AnnouncementAggregator(listener, mLock); + } + + return mHal2.addAnnouncementListener(enabledTypes, listener); + } + } + + @Override + protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { + IndentingPrintWriter radioPw = new IndentingPrintWriter(pw); + radioPw.printf("BroadcastRadioService\n"); + + radioPw.increaseIndent(); + radioPw.printf("HAL1: %s\n", mHal1); + + radioPw.increaseIndent(); + radioPw.printf("Modules of HAL1: %s\n", mV1Modules); + radioPw.decreaseIndent(); + + radioPw.printf("HAL2:\n"); + + radioPw.increaseIndent(); + mHal2.dumpInfo(radioPw); + radioPw.decreaseIndent(); + + radioPw.decreaseIndent(); + } + + + private static boolean isDebugEnabled() { + return Log.isLoggable(TAG, Log.DEBUG); + } +} diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java index 9cb1f1dafed8..431be88bd892 100644 --- a/services/core/java/com/android/server/connectivity/Vpn.java +++ b/services/core/java/com/android/server/connectivity/Vpn.java @@ -1198,7 +1198,7 @@ public class Vpn { mContext.unbindService(mConnection); cleanupVpnStateLocked(); } else if (mVpnRunner != null) { - stopVpnRunnerAndNotifyAppLocked(mPackage); + stopVpnRunnerAndNotifyAppLocked(); } try { @@ -4061,7 +4061,7 @@ public class Vpn { } @GuardedBy("this") - private void stopVpnRunnerAndNotifyAppLocked(@NonNull String packageName) { + private void stopVpnRunnerAndNotifyAppLocked() { // Build intent first because the sessionKey will be reset after performing // VpnRunner.exit(). Also, cache mOwnerUID even if ownerUID will not be changed in // VpnRunner.exit() to prevent design being changed in the future. @@ -4069,17 +4069,17 @@ public class Vpn { // ConnectivityServiceTest. final int ownerUid = mOwnerUID; Intent intent = null; - if (SdkLevel.isAtLeastT() && isVpnApp(packageName)) { + if (SdkLevel.isAtLeastT() && isVpnApp(mPackage)) { intent = buildVpnManagerEventIntent( VpnManager.CATEGORY_EVENT_DEACTIVATED_BY_USER, - -1 /* errorClass */, -1 /* errorCode*/, packageName, + -1 /* errorClass */, -1 /* errorCode*/, mPackage, getSessionKeyLocked(), makeVpnProfileStateLocked(), null /* underlyingNetwork */, null /* nc */, null /* lp */); } // cleanupVpnStateLocked() is called from mVpnRunner.exit() mVpnRunner.exit(); - if (intent != null && isVpnApp(packageName)) { - notifyVpnManagerVpnStopped(packageName, ownerUid, intent); + if (intent != null && isVpnApp(mPackage)) { + notifyVpnManagerVpnStopped(mPackage, ownerUid, intent); } } @@ -4099,7 +4099,7 @@ public class Vpn { // To stop the VPN profile, the caller must be the current prepared package and must be // running an Ikev2VpnProfile. if (isCurrentIkev2VpnLocked(packageName)) { - stopVpnRunnerAndNotifyAppLocked(packageName); + stopVpnRunnerAndNotifyAppLocked(); } } diff --git a/services/core/java/com/android/server/input/NativeInputManagerService.java b/services/core/java/com/android/server/input/NativeInputManagerService.java index 325c3089f89a..6b568b74c405 100644 --- a/services/core/java/com/android/server/input/NativeInputManagerService.java +++ b/services/core/java/com/android/server/input/NativeInputManagerService.java @@ -16,6 +16,7 @@ package com.android.server.input; +import android.annotation.Nullable; import android.hardware.display.DisplayViewport; import android.hardware.input.InputSensorInfo; import android.hardware.lights.Light; @@ -141,6 +142,13 @@ public interface NativeInputManagerService { int getBatteryStatus(int deviceId); + /** + * Get the device path of the battery for an input device. + * @return the path for the input device battery, or null if there is none. + */ + @Nullable + String getBatteryDevicePath(int deviceId); + List<Light> getLights(int deviceId); int getLightPlayerId(int deviceId, int lightId); @@ -327,6 +335,9 @@ public interface NativeInputManagerService { public native int getBatteryStatus(int deviceId); @Override + public native String getBatteryDevicePath(int deviceId); + + @Override public native List<Light> getLights(int deviceId); @Override diff --git a/services/core/java/com/android/server/inputmethod/InputMethodDeviceConfigs.java b/services/core/java/com/android/server/inputmethod/InputMethodDeviceConfigs.java new file mode 100644 index 000000000000..9d5393f38dba --- /dev/null +++ b/services/core/java/com/android/server/inputmethod/InputMethodDeviceConfigs.java @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2022 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.inputmethod; + +import static android.provider.InputMethodManagerDeviceConfig.KEY_HIDE_IME_WHEN_NO_EDITOR_FOCUS; + +import android.app.ActivityThread; +import android.provider.DeviceConfig; + +/** + * Class for the device-level configuration related to the input method manager + * platform features in {@link DeviceConfig}. + */ +public final class InputMethodDeviceConfigs { + private boolean mHideImeWhenNoEditorFocus; + private final DeviceConfig.OnPropertiesChangedListener mDeviceConfigChangedListener; + + public InputMethodDeviceConfigs() { + mDeviceConfigChangedListener = properties -> { + if (!DeviceConfig.NAMESPACE_INPUT_METHOD_MANAGER.equals(properties.getNamespace())) { + return; + } + for (String name : properties.getKeyset()) { + if (KEY_HIDE_IME_WHEN_NO_EDITOR_FOCUS.equals(name)) { + mHideImeWhenNoEditorFocus = properties.getBoolean(name, + true /* defaultValue */); + } + } + }; + mHideImeWhenNoEditorFocus = DeviceConfig.getBoolean( + DeviceConfig.NAMESPACE_INPUT_METHOD_MANAGER, + KEY_HIDE_IME_WHEN_NO_EDITOR_FOCUS, true); + DeviceConfig.addOnPropertiesChangedListener( + DeviceConfig.NAMESPACE_INPUT_METHOD_MANAGER, + ActivityThread.currentApplication().getMainExecutor(), + mDeviceConfigChangedListener); + } + + /** + * Whether the IME should be hidden when the window gained focus without an editor focused. + */ + public boolean shouldHideImeWhenNoEditorFocus() { + return mHideImeWhenNoEditorFocus; + } +} diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java index 7bd835c73749..729de41dcbcd 100644 --- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java +++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java @@ -303,6 +303,7 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub final PackageManagerInternal mPackageManagerInternal; final InputManagerInternal mInputManagerInternal; final ImePlatformCompatUtils mImePlatformCompatUtils; + final InputMethodDeviceConfigs mInputMethodDeviceConfigs; private final DisplayManagerInternal mDisplayManagerInternal; final boolean mHasFeature; private final ArrayMap<String, List<InputMethodSubtype>> mAdditionalSubtypeMap = @@ -1732,6 +1733,7 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub mPackageManagerInternal = LocalServices.getService(PackageManagerInternal.class); mInputManagerInternal = LocalServices.getService(InputManagerInternal.class); mImePlatformCompatUtils = new ImePlatformCompatUtils(); + mInputMethodDeviceConfigs = new InputMethodDeviceConfigs(); mImeDisplayValidator = mWindowManagerInternal::getDisplayImePolicy; mDisplayManagerInternal = LocalServices.getService(DisplayManagerInternal.class); mAppOpsManager = mContext.getSystemService(AppOpsManager.class); @@ -3889,6 +3891,18 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub SoftInputShowHideReason.HIDE_SAME_WINDOW_FOCUSED_WITHOUT_EDITOR); } } + if (!isTextEditor && mInputShown && startInputByWinGainedFocus + && mInputMethodDeviceConfigs.shouldHideImeWhenNoEditorFocus()) { + // Hide the soft-keyboard when the system do nothing for softInputModeState + // of the window being gained focus without an editor. This behavior benefits + // to resolve some unexpected IME visible cases while that window with following + // configurations being switched from an IME shown window: + // 1) SOFT_INPUT_STATE_UNCHANGED state without an editor + // 2) SOFT_INPUT_STATE_VISIBLE state without an editor + // 3) SOFT_INPUT_STATE_ALWAYS_VISIBLE state without an editor + hideCurrentInputLocked(mCurFocusedWindow, 0, null, + SoftInputShowHideReason.HIDE_WINDOW_GAINED_FOCUS_WITHOUT_EDITOR); + } res = startInputUncheckedLocked(cs, inputContext, remoteAccessibilityInputConnection, editorInfo, startInputFlags, startInputReason, unverifiedTargetSdkVersion, diff --git a/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java b/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java index d91bf8c00044..9466a6f5615f 100644 --- a/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java +++ b/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java @@ -287,7 +287,7 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider { name = com.android.internal.R.string.default_audio_route_name_dock_speakers; } else if ((newRoutes.mainType & AudioRoutesInfo.MAIN_HDMI) != 0) { type = TYPE_HDMI; - name = com.android.internal.R.string.default_audio_route_name_hdmi; + name = com.android.internal.R.string.default_audio_route_name_external_device; } else if ((newRoutes.mainType & AudioRoutesInfo.MAIN_USB) != 0) { type = TYPE_USB_DEVICE; name = com.android.internal.R.string.default_audio_route_name_usb; diff --git a/services/core/java/com/android/server/om/IdmapManager.java b/services/core/java/com/android/server/om/IdmapManager.java index f3cb7fb6107c..b611b5dc260b 100644 --- a/services/core/java/com/android/server/om/IdmapManager.java +++ b/services/core/java/com/android/server/om/IdmapManager.java @@ -31,7 +31,7 @@ import android.os.SystemProperties; import android.text.TextUtils; import android.util.Slog; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import java.io.IOException; import java.lang.annotation.Retention; diff --git a/services/core/java/com/android/server/om/OverlayActorEnforcer.java b/services/core/java/com/android/server/om/OverlayActorEnforcer.java index c4b6485d2a2f..c35d8631f310 100644 --- a/services/core/java/com/android/server/om/OverlayActorEnforcer.java +++ b/services/core/java/com/android/server/om/OverlayActorEnforcer.java @@ -28,7 +28,7 @@ import android.util.Slog; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ArrayUtils; import com.android.internal.util.CollectionUtils; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import java.io.IOException; import java.util.List; diff --git a/services/core/java/com/android/server/om/OverlayManagerService.java b/services/core/java/com/android/server/om/OverlayManagerService.java index 715967369ffb..ba7143876917 100644 --- a/services/core/java/com/android/server/om/OverlayManagerService.java +++ b/services/core/java/com/android/server/om/OverlayManagerService.java @@ -84,7 +84,7 @@ import com.android.server.SystemConfig; import com.android.server.SystemService; import com.android.server.pm.KnownPackages; import com.android.server.pm.UserManagerService; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import libcore.util.EmptyArray; diff --git a/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java b/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java index dade7aa09283..ae305cacd2c4 100644 --- a/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java +++ b/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java @@ -47,7 +47,7 @@ import android.util.Slog; import com.android.internal.content.om.OverlayConfig; import com.android.internal.util.CollectionUtils; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import java.io.PrintWriter; import java.util.ArrayList; diff --git a/services/core/java/com/android/server/om/OverlayReferenceMapper.java b/services/core/java/com/android/server/om/OverlayReferenceMapper.java index 539fecf099fc..fdceabe74dd8 100644 --- a/services/core/java/com/android/server/om/OverlayReferenceMapper.java +++ b/services/core/java/com/android/server/om/OverlayReferenceMapper.java @@ -28,7 +28,7 @@ import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.CollectionUtils; import com.android.server.SystemConfig; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import java.util.Collection; import java.util.Collections; diff --git a/services/core/java/com/android/server/om/PackageManagerHelper.java b/services/core/java/com/android/server/om/PackageManagerHelper.java index 750f5c3ec06b..cbdabdde8585 100644 --- a/services/core/java/com/android/server/om/PackageManagerHelper.java +++ b/services/core/java/com/android/server/om/PackageManagerHelper.java @@ -19,19 +19,14 @@ package com.android.server.om; import android.annotation.NonNull; import android.annotation.Nullable; import android.content.om.OverlayableInfo; -import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManagerInternal; -import android.os.RemoteException; import android.util.ArrayMap; -import android.util.Slog; import com.android.server.pm.PackageManagerServiceUtils; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import java.io.IOException; -import java.util.HashMap; -import java.util.List; import java.util.Map; /** diff --git a/services/core/java/com/android/server/pm/ApexManager.java b/services/core/java/com/android/server/pm/ApexManager.java index 01ddc482c123..71593e10d45b 100644 --- a/services/core/java/com/android/server/pm/ApexManager.java +++ b/services/core/java/com/android/server/pm/ApexManager.java @@ -49,7 +49,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.Preconditions; import com.android.modules.utils.build.UnboundedSdkLevel; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.component.ParsedApexSystemService; import com.android.server.utils.TimingsTraceAndSlog; diff --git a/services/core/java/com/android/server/pm/ApexPackageInfo.java b/services/core/java/com/android/server/pm/ApexPackageInfo.java index 73cb0ada6b87..4dd9c49321b2 100644 --- a/services/core/java/com/android/server/pm/ApexPackageInfo.java +++ b/services/core/java/com/android/server/pm/ApexPackageInfo.java @@ -31,9 +31,9 @@ import com.android.internal.annotations.GuardedBy; import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.Preconditions; import com.android.server.pm.parsing.PackageParser2; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.AndroidPackageUtils; import com.android.server.pm.parsing.pkg.ParsedPackage; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageStateInternal; import com.android.server.pm.pkg.parsing.ParsingPackageUtils; diff --git a/services/core/java/com/android/server/pm/ApkChecksums.java b/services/core/java/com/android/server/pm/ApkChecksums.java index c2f2b0af997a..a2861604caa3 100644 --- a/services/core/java/com/android/server/pm/ApkChecksums.java +++ b/services/core/java/com/android/server/pm/ApkChecksums.java @@ -64,7 +64,7 @@ import android.util.apk.VerityBuilder; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.security.VerityUtils; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; diff --git a/services/core/java/com/android/server/pm/AppDataHelper.java b/services/core/java/com/android/server/pm/AppDataHelper.java index da8992ae77f8..0f5d8fd6fefa 100644 --- a/services/core/java/com/android/server/pm/AppDataHelper.java +++ b/services/core/java/com/android/server/pm/AppDataHelper.java @@ -45,8 +45,8 @@ import com.android.internal.annotations.GuardedBy; import com.android.internal.util.Preconditions; import com.android.server.SystemServerInitThreadPool; import com.android.server.pm.dex.ArtManagerService; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.AndroidPackageUtils; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageStateInternal; import com.android.server.pm.pkg.SELinuxUtil; diff --git a/services/core/java/com/android/server/pm/AppsFilterBase.java b/services/core/java/com/android/server/pm/AppsFilterBase.java index 5b3eff9c41f3..14140b5fe264 100644 --- a/services/core/java/com/android/server/pm/AppsFilterBase.java +++ b/services/core/java/com/android/server/pm/AppsFilterBase.java @@ -40,7 +40,7 @@ import android.util.SparseArray; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.function.QuadFunction; import com.android.server.om.OverlayReferenceMapper; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageStateInternal; import com.android.server.pm.snapshot.PackageDataSnapshot; import com.android.server.utils.SnapshotCache; diff --git a/services/core/java/com/android/server/pm/AppsFilterImpl.java b/services/core/java/com/android/server/pm/AppsFilterImpl.java index 5e0b47a98756..79d72a3ad7f0 100644 --- a/services/core/java/com/android/server/pm/AppsFilterImpl.java +++ b/services/core/java/com/android/server/pm/AppsFilterImpl.java @@ -51,8 +51,8 @@ import com.android.internal.util.ArrayUtils; import com.android.server.FgThread; import com.android.server.compat.CompatChange; import com.android.server.om.OverlayReferenceMapper; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.AndroidPackageUtils; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageStateInternal; import com.android.server.pm.pkg.component.ParsedInstrumentation; import com.android.server.pm.pkg.component.ParsedPermission; diff --git a/services/core/java/com/android/server/pm/AppsFilterSnapshot.java b/services/core/java/com/android/server/pm/AppsFilterSnapshot.java index de037f3ba889..dd84e061d1fb 100644 --- a/services/core/java/com/android/server/pm/AppsFilterSnapshot.java +++ b/services/core/java/com/android/server/pm/AppsFilterSnapshot.java @@ -23,7 +23,7 @@ import android.util.ArrayMap; import android.util.SparseArray; import com.android.internal.util.function.QuadFunction; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageStateInternal; import com.android.server.pm.snapshot.PackageDataSnapshot; diff --git a/services/core/java/com/android/server/pm/AppsFilterUtils.java b/services/core/java/com/android/server/pm/AppsFilterUtils.java index 3a105c09d92a..7daa0b94000c 100644 --- a/services/core/java/com/android/server/pm/AppsFilterUtils.java +++ b/services/core/java/com/android/server/pm/AppsFilterUtils.java @@ -23,7 +23,7 @@ import android.content.Intent; import android.content.IntentFilter; import com.android.internal.util.ArrayUtils; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageStateInternal; import com.android.server.pm.pkg.component.ParsedComponent; import com.android.server.pm.pkg.component.ParsedIntentInfo; diff --git a/services/core/java/com/android/server/pm/Computer.java b/services/core/java/com/android/server/pm/Computer.java index ab998608f66d..591619698295 100644 --- a/services/core/java/com/android/server/pm/Computer.java +++ b/services/core/java/com/android/server/pm/Computer.java @@ -48,7 +48,7 @@ import android.util.SparseArray; import android.util.proto.ProtoOutputStream; import com.android.internal.annotations.VisibleForTesting; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageState; import com.android.server.pm.pkg.PackageStateInternal; import com.android.server.pm.pkg.SharedUserApi; diff --git a/services/core/java/com/android/server/pm/ComputerEngine.java b/services/core/java/com/android/server/pm/ComputerEngine.java index d442fb28b648..3211ca14753d 100644 --- a/services/core/java/com/android/server/pm/ComputerEngine.java +++ b/services/core/java/com/android/server/pm/ComputerEngine.java @@ -129,9 +129,9 @@ import com.android.internal.util.Preconditions; import com.android.server.pm.dex.DexManager; import com.android.server.pm.dex.PackageDexUsage; import com.android.server.pm.parsing.PackageInfoUtils; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.AndroidPackageUtils; import com.android.server.pm.permission.PermissionManagerServiceInternal; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageStateInternal; import com.android.server.pm.pkg.PackageStateUtils; import com.android.server.pm.pkg.PackageUserStateInternal; diff --git a/services/core/java/com/android/server/pm/DeletePackageHelper.java b/services/core/java/com/android/server/pm/DeletePackageHelper.java index bda7b823adc3..9f6aa633c3b2 100644 --- a/services/core/java/com/android/server/pm/DeletePackageHelper.java +++ b/services/core/java/com/android/server/pm/DeletePackageHelper.java @@ -60,8 +60,8 @@ import android.util.SparseBooleanArray; import com.android.internal.annotations.GuardedBy; import com.android.internal.util.ArrayUtils; import com.android.internal.util.Preconditions; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.permission.PermissionManagerServiceInternal; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageStateInternal; import com.android.server.pm.pkg.PackageUserState; import com.android.server.wm.ActivityTaskManagerInternal; @@ -572,7 +572,7 @@ final class DeletePackageHelper { if (deleteCodeAndResources && (outInfo != null)) { outInfo.mArgs = new InstallArgs( ps.getPathString(), getAppDexInstructionSets( - ps.getPrimaryCpuAbi(), ps.getSecondaryCpuAbi()), mPm); + ps.getPrimaryCpuAbi(), ps.getSecondaryCpuAbi())); if (DEBUG_SD_INSTALL) Slog.i(TAG, "args=" + outInfo.mArgs); } } @@ -673,6 +673,18 @@ final class DeletePackageHelper { final String packageName = versionedPackage.getPackageName(); final long versionCode = versionedPackage.getLongVersionCode(); + if (mPm.mProtectedPackages.isPackageDataProtected(userId, packageName)) { + mPm.mHandler.post(() -> { + try { + Slog.w(TAG, "Attempted to delete protected package: " + packageName); + observer.onPackageDeleted(packageName, + PackageManager.DELETE_FAILED_INTERNAL_ERROR, null); + } catch (RemoteException re) { + } + }); + return; + } + try { if (mPm.mInjector.getLocalService(ActivityTaskManagerInternal.class) .isBaseOfLockedTask(packageName)) { diff --git a/services/core/java/com/android/server/pm/DexOptHelper.java b/services/core/java/com/android/server/pm/DexOptHelper.java index d5013867b4b0..2b8a196ba528 100644 --- a/services/core/java/com/android/server/pm/DexOptHelper.java +++ b/services/core/java/com/android/server/pm/DexOptHelper.java @@ -58,8 +58,8 @@ import com.android.internal.annotations.GuardedBy; import com.android.internal.logging.MetricsLogger; import com.android.server.pm.dex.DexManager; import com.android.server.pm.dex.DexoptOptions; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.AndroidPackageUtils; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageStateInternal; import dalvik.system.DexFile; diff --git a/services/core/java/com/android/server/pm/DomainVerificationConnection.java b/services/core/java/com/android/server/pm/DomainVerificationConnection.java index 41346717b261..624d005ac90c 100644 --- a/services/core/java/com/android/server/pm/DomainVerificationConnection.java +++ b/services/core/java/com/android/server/pm/DomainVerificationConnection.java @@ -26,7 +26,7 @@ import android.os.Message; import android.os.UserHandle; import com.android.server.DeviceIdleInternal; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.verify.domain.DomainVerificationService; import com.android.server.pm.verify.domain.proxy.DomainVerificationProxyV1; import com.android.server.pm.verify.domain.proxy.DomainVerificationProxyV2; diff --git a/services/core/java/com/android/server/pm/FeatureConfig.java b/services/core/java/com/android/server/pm/FeatureConfig.java index 6e356de5083e..1a577432fe8b 100644 --- a/services/core/java/com/android/server/pm/FeatureConfig.java +++ b/services/core/java/com/android/server/pm/FeatureConfig.java @@ -19,7 +19,7 @@ package com.android.server.pm; import static com.android.internal.annotations.VisibleForTesting.Visibility.PRIVATE; import com.android.internal.annotations.VisibleForTesting; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageStateInternal; @VisibleForTesting(visibility = PRIVATE) diff --git a/services/core/java/com/android/server/pm/InitAppsHelper.java b/services/core/java/com/android/server/pm/InitAppsHelper.java index 52e3fd910a7f..797d4c3cfed3 100644 --- a/services/core/java/com/android/server/pm/InitAppsHelper.java +++ b/services/core/java/com/android/server/pm/InitAppsHelper.java @@ -52,7 +52,7 @@ import com.android.internal.util.FrameworkStatsLog; import com.android.server.EventLogTags; import com.android.server.pm.parsing.PackageCacher; import com.android.server.pm.parsing.PackageParser2; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.parsing.ParsingPackageUtils; import com.android.server.utils.WatchedArrayMap; @@ -227,7 +227,7 @@ final class InitAppsHelper { } } final OverlayConfig overlayConfig = OverlayConfig.initializeSystemInstance( - consumer -> mPm.forEachPackage(mPm.snapshotComputer(), + consumer -> mPm.forEachPackageInternal(mPm.snapshotComputer(), pkg -> consumer.accept(pkg, pkg.isSystem(), apkInApexPreInstalledPaths.get(pkg.getPackageName())))); diff --git a/services/core/java/com/android/server/pm/InstallArgs.java b/services/core/java/com/android/server/pm/InstallArgs.java index 616bb8f419dd..65c237804d39 100644 --- a/services/core/java/com/android/server/pm/InstallArgs.java +++ b/services/core/java/com/android/server/pm/InstallArgs.java @@ -65,9 +65,6 @@ final class InstallArgs { // if we move dex files under the common app path. @Nullable String[] mInstructionSets; - @NonNull final PackageManagerService mPm; - @NonNull final RemovePackageHelper mRemovePackageHelper; - InstallArgs(OriginInfo originInfo, MoveInfo moveInfo, IPackageInstallObserver2 observer, int installFlags, InstallSource installSource, String volumeUuid, UserHandle user, String[] instructionSets, @@ -76,7 +73,7 @@ final class InstallArgs { int autoRevokePermissionsMode, String traceMethod, int traceCookie, SigningDetails signingDetails, int installReason, int installScenario, boolean forceQueryableOverride, - int dataLoaderType, int packageSource, PackageManagerService pm) { + int dataLoaderType, int packageSource) { mOriginInfo = originInfo; mMoveInfo = moveInfo; mInstallFlags = installFlags; @@ -97,8 +94,6 @@ final class InstallArgs { mForceQueryableOverride = forceQueryableOverride; mDataLoaderType = dataLoaderType; mPackageSource = packageSource; - mPm = pm; - mRemovePackageHelper = new RemovePackageHelper(mPm); } /** New install */ @@ -110,19 +105,19 @@ final class InstallArgs { params.mAutoRevokePermissionsMode, params.mTraceMethod, params.mTraceCookie, params.mSigningDetails, params.mInstallReason, params.mInstallScenario, params.mForceQueryableOverride, - params.mDataLoaderType, params.mPackageSource, params.mPm); + params.mDataLoaderType, params.mPackageSource); } /** * Create args that describe an existing installed package. Typically used * when cleaning up old installs, or used as a move source. */ - InstallArgs(String codePath, String[] instructionSets, PackageManagerService pm) { + InstallArgs(String codePath, String[] instructionSets) { this(OriginInfo.fromNothing(), null, null, 0, InstallSource.EMPTY, null, null, instructionSets, null, null, null, MODE_DEFAULT, null, 0, SigningDetails.UNKNOWN, PackageManager.INSTALL_REASON_UNKNOWN, PackageManager.INSTALL_SCENARIO_DEFAULT, false, DataLoaderType.NONE, - PackageInstaller.PACKAGE_SOURCE_UNSPECIFIED, pm); + PackageInstaller.PACKAGE_SOURCE_UNSPECIFIED); mCodeFile = (codePath != null) ? new File(codePath) : null; } diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java index 8024d41db90d..d20171024cd3 100644 --- a/services/core/java/com/android/server/pm/InstallPackageHelper.java +++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java @@ -162,11 +162,11 @@ import com.android.server.pm.dex.DexoptOptions; import com.android.server.pm.dex.ViewCompiler; import com.android.server.pm.parsing.PackageCacher; import com.android.server.pm.parsing.PackageParser2; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.AndroidPackageUtils; import com.android.server.pm.parsing.pkg.ParsedPackage; import com.android.server.pm.permission.Permission; import com.android.server.pm.permission.PermissionManagerServiceInternal; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageStateInternal; import com.android.server.pm.pkg.component.ComponentMutateUtils; import com.android.server.pm.pkg.component.ParsedInstrumentation; @@ -1937,7 +1937,7 @@ final class InstallPackageHelper { AndroidPackageUtils.getPrimaryCpuAbi(oldPackage, deletedPkgSetting), AndroidPackageUtils.getSecondaryCpuAbi(oldPackage, - deletedPkgSetting)), mPm); + deletedPkgSetting))); } else { res.mRemovedInfo.mArgs = null; } @@ -3311,7 +3311,8 @@ final class InstallPackageHelper { if (disabledPs == null) { logCriticalInfo(Log.WARN, "System package " + packageName + " no longer exists; its data will be wiped"); - mRemovePackageHelper.removePackageData(ps, userIds, null, 0, false); + mInjector.getHandler().post( + () -> mRemovePackageHelper.removePackageData(ps, userIds, null, 0, false)); } else { // we still have a disabled system package, but, it still might have // been removed. check the code path still exists and check there's @@ -3937,7 +3938,7 @@ final class InstallPackageHelper { final InstallArgs args = new InstallArgs( pkgSetting.getPathString(), getAppDexInstructionSets( - pkgSetting.getPrimaryCpuAbi(), pkgSetting.getSecondaryCpuAbi()), mPm); + pkgSetting.getPrimaryCpuAbi(), pkgSetting.getSecondaryCpuAbi())); mRemovePackageHelper.cleanUpResources(args); synchronized (mPm.mLock) { mPm.mSettings.enableSystemPackageLPw(pkgSetting.getPackageName()); @@ -4022,8 +4023,7 @@ final class InstallPackageHelper { + parsedPackage.getPath()); InstallArgs args = new InstallArgs( pkgSetting.getPathString(), getAppDexInstructionSets( - pkgSetting.getPrimaryCpuAbi(), pkgSetting.getSecondaryCpuAbi()), - mPm); + pkgSetting.getPrimaryCpuAbi(), pkgSetting.getSecondaryCpuAbi())); mRemovePackageHelper.cleanUpResources(args); } else { // The application on /system is older than the application on /data. Hide diff --git a/services/core/java/com/android/server/pm/InstallingSession.java b/services/core/java/com/android/server/pm/InstallingSession.java index 0630ccdbf6e3..a7f1727dfa61 100644 --- a/services/core/java/com/android/server/pm/InstallingSession.java +++ b/services/core/java/com/android/server/pm/InstallingSession.java @@ -51,7 +51,7 @@ import com.android.internal.content.InstallLocationUtils; import com.android.internal.content.NativeLibraryHelper; import com.android.internal.util.Preconditions; import com.android.server.pm.parsing.PackageParser2; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import libcore.io.IoUtils; diff --git a/services/core/java/com/android/server/pm/InstantAppRegistry.java b/services/core/java/com/android/server/pm/InstantAppRegistry.java index 39a28396608b..71bd2d7be964 100644 --- a/services/core/java/com/android/server/pm/InstantAppRegistry.java +++ b/services/core/java/com/android/server/pm/InstantAppRegistry.java @@ -56,9 +56,9 @@ import com.android.internal.os.SomeArgs; import com.android.internal.util.ArrayUtils; import com.android.internal.util.XmlUtils; import com.android.server.pm.parsing.PackageInfoUtils; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.AndroidPackageUtils; import com.android.server.pm.permission.PermissionManagerServiceInternal; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageStateInternal; import com.android.server.pm.pkg.PackageStateUtils; import com.android.server.pm.pkg.PackageUserStateInternal; diff --git a/services/core/java/com/android/server/pm/InstructionSets.java b/services/core/java/com/android/server/pm/InstructionSets.java index 2d42107bdd63..f1cfc5bc3bec 100644 --- a/services/core/java/com/android/server/pm/InstructionSets.java +++ b/services/core/java/com/android/server/pm/InstructionSets.java @@ -21,9 +21,6 @@ import android.os.SystemProperties; import android.text.TextUtils; import android.util.ArraySet; -import com.android.server.pm.parsing.pkg.AndroidPackage; -import com.android.server.pm.parsing.pkg.AndroidPackageUtils; - import dalvik.system.VMRuntime; import java.util.ArrayList; diff --git a/services/core/java/com/android/server/pm/KeySetManagerService.java b/services/core/java/com/android/server/pm/KeySetManagerService.java index 5c298330cd5c..7774b6a22d37 100644 --- a/services/core/java/com/android/server/pm/KeySetManagerService.java +++ b/services/core/java/com/android/server/pm/KeySetManagerService.java @@ -30,7 +30,7 @@ import android.util.Slog; import android.util.TypedXmlPullParser; import android.util.TypedXmlSerializer; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageStateInternal; import com.android.server.pm.pkg.SharedUserApi; import com.android.server.utils.WatchedArrayMap; diff --git a/services/core/java/com/android/server/pm/LauncherAppsService.java b/services/core/java/com/android/server/pm/LauncherAppsService.java index 59bd427996fe..c38b822a07a1 100644 --- a/services/core/java/com/android/server/pm/LauncherAppsService.java +++ b/services/core/java/com/android/server/pm/LauncherAppsService.java @@ -96,7 +96,7 @@ import com.android.internal.util.CollectionUtils; import com.android.internal.util.Preconditions; import com.android.server.LocalServices; import com.android.server.SystemService; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.wm.ActivityTaskManagerInternal; import java.util.ArrayList; diff --git a/services/core/java/com/android/server/pm/MovePackageHelper.java b/services/core/java/com/android/server/pm/MovePackageHelper.java index df0222315449..b27373e1d9f1 100644 --- a/services/core/java/com/android/server/pm/MovePackageHelper.java +++ b/services/core/java/com/android/server/pm/MovePackageHelper.java @@ -55,8 +55,8 @@ import android.util.SparseIntArray; import com.android.internal.annotations.GuardedBy; import com.android.internal.os.SomeArgs; import com.android.internal.util.FrameworkStatsLog; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.AndroidPackageUtils; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageStateInternal; import com.android.server.pm.pkg.PackageStateUtils; diff --git a/services/core/java/com/android/server/pm/OtaDexoptService.java b/services/core/java/com/android/server/pm/OtaDexoptService.java index e4dcf1aca623..5507b447fe7f 100644 --- a/services/core/java/com/android/server/pm/OtaDexoptService.java +++ b/services/core/java/com/android/server/pm/OtaDexoptService.java @@ -38,8 +38,8 @@ import com.android.internal.logging.MetricsLogger; import com.android.server.LocalServices; import com.android.server.pm.Installer.InstallerException; import com.android.server.pm.dex.DexoptOptions; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.AndroidPackageUtils; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageStateInternal; import java.io.File; diff --git a/services/core/java/com/android/server/pm/PackageAbiHelper.java b/services/core/java/com/android/server/pm/PackageAbiHelper.java index 1dbab90d753f..9bea599fa36a 100644 --- a/services/core/java/com/android/server/pm/PackageAbiHelper.java +++ b/services/core/java/com/android/server/pm/PackageAbiHelper.java @@ -22,9 +22,9 @@ import android.util.ArraySet; import android.util.Pair; import com.android.internal.annotations.VisibleForTesting; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.AndroidPackageUtils; import com.android.server.pm.parsing.pkg.ParsedPackage; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageStateInternal; import java.io.File; diff --git a/services/core/java/com/android/server/pm/PackageAbiHelperImpl.java b/services/core/java/com/android/server/pm/PackageAbiHelperImpl.java index 73d81bae015e..75f5f93b1237 100644 --- a/services/core/java/com/android/server/pm/PackageAbiHelperImpl.java +++ b/services/core/java/com/android/server/pm/PackageAbiHelperImpl.java @@ -40,8 +40,8 @@ import android.util.Slog; import com.android.internal.content.NativeLibraryHelper; import com.android.internal.util.ArrayUtils; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.AndroidPackageUtils; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageStateInternal; import dalvik.system.VMRuntime; diff --git a/services/core/java/com/android/server/pm/PackageDexOptimizer.java b/services/core/java/com/android/server/pm/PackageDexOptimizer.java index 4b6543b54f2f..3fb4066c965a 100644 --- a/services/core/java/com/android/server/pm/PackageDexOptimizer.java +++ b/services/core/java/com/android/server/pm/PackageDexOptimizer.java @@ -77,8 +77,8 @@ import com.android.server.pm.dex.ArtStatsLogUtils.ArtStatsLogger; import com.android.server.pm.dex.DexoptOptions; import com.android.server.pm.dex.DexoptUtils; import com.android.server.pm.dex.PackageDexUsage; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.AndroidPackageUtils; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageStateInternal; import dalvik.system.DexFile; diff --git a/services/core/java/com/android/server/pm/PackageInstalledInfo.java b/services/core/java/com/android/server/pm/PackageInstalledInfo.java index 1c25dbbfa313..247abf3b6685 100644 --- a/services/core/java/com/android/server/pm/PackageInstalledInfo.java +++ b/services/core/java/com/android/server/pm/PackageInstalledInfo.java @@ -22,7 +22,7 @@ import android.apex.ApexInfo; import android.util.ExceptionUtils; import android.util.Slog; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import java.util.ArrayList; diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java index df02fe17f47b..e9f26e99cb4e 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -152,7 +152,7 @@ import com.android.internal.util.Preconditions; import com.android.server.LocalServices; import com.android.server.pm.Installer.InstallerException; import com.android.server.pm.dex.DexManager; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageStateInternal; import com.android.server.pm.pkg.parsing.ParsingPackageUtils; diff --git a/services/core/java/com/android/server/pm/PackageManagerInternalBase.java b/services/core/java/com/android/server/pm/PackageManagerInternalBase.java index 330e3313883c..34d6d292dd19 100644 --- a/services/core/java/com/android/server/pm/PackageManagerInternalBase.java +++ b/services/core/java/com/android/server/pm/PackageManagerInternalBase.java @@ -49,9 +49,8 @@ import android.util.SparseArray; import com.android.server.pm.dex.DexManager; import com.android.server.pm.dex.DynamicCodeLogger; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.permission.PermissionManagerServiceInternal; -import com.android.server.pm.pkg.AndroidPackageApi; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageStateInternal; import com.android.server.pm.pkg.PackageStateUtils; import com.android.server.pm.pkg.SharedUserApi; @@ -155,7 +154,7 @@ abstract class PackageManagerInternalBase extends PackageManagerInternal { @Nullable @Override @Deprecated - public final AndroidPackageApi getAndroidPackage(@NonNull String packageName) { + public final AndroidPackage getAndroidPackage(@NonNull String packageName) { return snapshot().getPackage(packageName); } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 752ebf330abe..259202f86bc9 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -203,13 +203,14 @@ import com.android.server.pm.dex.DexManager; import com.android.server.pm.dex.ViewCompiler; import com.android.server.pm.parsing.PackageInfoUtils; import com.android.server.pm.parsing.PackageParser2; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.parsing.pkg.AndroidPackageInternal; import com.android.server.pm.parsing.pkg.AndroidPackageUtils; import com.android.server.pm.parsing.pkg.ParsedPackage; import com.android.server.pm.permission.LegacyPermissionManagerInternal; import com.android.server.pm.permission.LegacyPermissionManagerService; import com.android.server.pm.permission.PermissionManagerService; import com.android.server.pm.permission.PermissionManagerServiceInternal; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageStateInternal; import com.android.server.pm.pkg.PackageUserState; import com.android.server.pm.pkg.PackageUserStateInternal; @@ -6716,6 +6717,19 @@ public class PackageManagerService implements PackageSender, TestUtilityService } } + void forEachPackageInternal(@NonNull Computer snapshot, + @NonNull Consumer<AndroidPackageInternal> consumer) { + final ArrayMap<String, ? extends PackageStateInternal> packageStates = + snapshot.getPackageStates(); + int size = packageStates.size(); + for (int index = 0; index < size; index++) { + PackageStateInternal packageState = packageStates.valueAt(index); + if (packageState.getPkg() != null) { + consumer.accept(packageState.getPkg()); + } + } + } + private void forEachPackageState( @NonNull ArrayMap<String, ? extends PackageStateInternal> packageStates, @NonNull Consumer<PackageStateInternal> consumer) { diff --git a/services/core/java/com/android/server/pm/PackageManagerServiceTestParams.java b/services/core/java/com/android/server/pm/PackageManagerServiceTestParams.java index ec1b29eda69e..4391fdd51c5a 100644 --- a/services/core/java/com/android/server/pm/PackageManagerServiceTestParams.java +++ b/services/core/java/com/android/server/pm/PackageManagerServiceTestParams.java @@ -34,8 +34,8 @@ import com.android.server.pm.dex.ArtManagerService; import com.android.server.pm.dex.DexManager; import com.android.server.pm.dex.ViewCompiler; import com.android.server.pm.parsing.PackageParser2; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.permission.LegacyPermissionManagerInternal; +import com.android.server.pm.pkg.AndroidPackage; import java.io.File; import java.util.List; diff --git a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java index f466655914c8..77334e520a91 100644 --- a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java +++ b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java @@ -93,7 +93,7 @@ import com.android.server.IntentResolver; import com.android.server.Watchdog; import com.android.server.compat.PlatformCompat; import com.android.server.pm.dex.PackageDexUsage; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageStateInternal; import com.android.server.pm.pkg.component.ParsedMainComponent; import com.android.server.pm.resolution.ComponentResolverApi; diff --git a/services/core/java/com/android/server/pm/PackageProperty.java b/services/core/java/com/android/server/pm/PackageProperty.java index 2055537b4cc8..241f14390d5e 100644 --- a/services/core/java/com/android/server/pm/PackageProperty.java +++ b/services/core/java/com/android/server/pm/PackageProperty.java @@ -27,12 +27,12 @@ import android.annotation.Nullable; import android.content.pm.PackageManager; import android.content.pm.PackageManager.Property; import android.content.pm.PackageManager.PropertyLocation; -import com.android.server.pm.pkg.component.ParsedComponent; import android.os.Binder; import android.os.UserHandle; import android.util.ArrayMap; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; +import com.android.server.pm.pkg.component.ParsedComponent; import java.util.ArrayList; import java.util.Iterator; diff --git a/services/core/java/com/android/server/pm/PackageSetting.java b/services/core/java/com/android/server/pm/PackageSetting.java index f84db1f7abbe..4764a5c41db4 100644 --- a/services/core/java/com/android/server/pm/PackageSetting.java +++ b/services/core/java/com/android/server/pm/PackageSetting.java @@ -41,10 +41,11 @@ import android.util.proto.ProtoOutputStream; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.CollectionUtils; import com.android.internal.util.DataClass; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.parsing.pkg.AndroidPackageInternal; +import com.android.server.pm.parsing.pkg.ParsedPackage; import com.android.server.pm.permission.LegacyPermissionDataProvider; import com.android.server.pm.permission.LegacyPermissionState; -import com.android.server.pm.pkg.AndroidPackageApi; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageState; import com.android.server.pm.pkg.PackageStateInternal; import com.android.server.pm.pkg.PackageStateUnserialized; @@ -126,7 +127,7 @@ public class PackageSetting extends SettingBase implements PackageStateInternal * @see PackageState#getAndroidPackage() */ @Nullable - private AndroidPackage pkg; + private AndroidPackageInternal pkg; /** @see AndroidPackage#getPath() */ @NonNull @@ -418,8 +419,9 @@ public class PackageSetting extends SettingBase implements PackageStateInternal return hasChanges; } + // TODO: Remove, only commit package when it's actually finalized public PackageSetting setPkg(AndroidPackage pkg) { - this.pkg = pkg; + this.pkg = (AndroidPackageInternal) pkg; onChanged(); return this; } @@ -1165,7 +1167,7 @@ public class PackageSetting extends SettingBase implements PackageStateInternal @Nullable @Override - public AndroidPackageApi getAndroidPackage() { + public AndroidPackage getAndroidPackage() { return getPkg(); } @@ -1366,7 +1368,7 @@ public class PackageSetting extends SettingBase implements PackageStateInternal * @see PackageState#getAndroidPackage() */ @DataClass.Generated.Member - public @Nullable AndroidPackage getPkg() { + public @Nullable AndroidPackageInternal getPkg() { return pkg; } @@ -1473,10 +1475,10 @@ public class PackageSetting extends SettingBase implements PackageStateInternal } @DataClass.Generated( - time = 1644270960923L, + time = 1659546705292L, codegenVersion = "1.0.23", sourceFile = "frameworks/base/services/core/java/com/android/server/pm/PackageSetting.java", - inputSignatures = "private int mSharedUserAppId\nprivate @android.annotation.Nullable java.util.Map<java.lang.String,java.util.Set<java.lang.String>> mimeGroups\nprivate @java.lang.Deprecated @android.annotation.Nullable java.util.Set<java.lang.String> mOldCodePaths\nprivate @android.annotation.Nullable java.lang.String[] usesSdkLibraries\nprivate @android.annotation.Nullable long[] usesSdkLibrariesVersionsMajor\nprivate @android.annotation.Nullable java.lang.String[] usesStaticLibraries\nprivate @android.annotation.Nullable long[] usesStaticLibrariesVersions\nprivate @android.annotation.Nullable @java.lang.Deprecated java.lang.String legacyNativeLibraryPath\nprivate @android.annotation.NonNull java.lang.String mName\nprivate @android.annotation.Nullable java.lang.String mRealName\nprivate int mAppId\nprivate @android.annotation.Nullable com.android.server.pm.parsing.pkg.AndroidPackage pkg\nprivate @android.annotation.NonNull java.io.File mPath\nprivate @android.annotation.NonNull java.lang.String mPathString\nprivate float mLoadingProgress\nprivate @android.annotation.Nullable java.lang.String mPrimaryCpuAbi\nprivate @android.annotation.Nullable java.lang.String mSecondaryCpuAbi\nprivate @android.annotation.Nullable java.lang.String mCpuAbiOverride\nprivate long mLastModifiedTime\nprivate long lastUpdateTime\nprivate long versionCode\nprivate @android.annotation.NonNull com.android.server.pm.PackageSignatures signatures\nprivate boolean installPermissionsFixed\nprivate @android.annotation.NonNull com.android.server.pm.PackageKeySetData keySetData\nprivate final @android.annotation.NonNull android.util.SparseArray<com.android.server.pm.pkg.PackageUserStateImpl> mUserStates\nprivate @android.annotation.NonNull com.android.server.pm.InstallSource installSource\nprivate @android.annotation.Nullable java.lang.String volumeUuid\nprivate int categoryOverride\nprivate boolean updateAvailable\nprivate boolean forceQueryableOverride\nprivate final @android.annotation.NonNull com.android.server.pm.pkg.PackageStateUnserialized pkgState\nprivate @android.annotation.NonNull java.util.UUID mDomainSetId\nprivate final @android.annotation.NonNull com.android.server.utils.SnapshotCache<com.android.server.pm.PackageSetting> mSnapshot\nprivate com.android.server.utils.SnapshotCache<com.android.server.pm.PackageSetting> makeCache()\npublic com.android.server.pm.PackageSetting snapshot()\npublic void dumpDebug(android.util.proto.ProtoOutputStream,long,java.util.List<android.content.pm.UserInfo>,com.android.server.pm.permission.LegacyPermissionDataProvider)\npublic com.android.server.pm.PackageSetting setAppId(int)\npublic com.android.server.pm.PackageSetting setCpuAbiOverride(java.lang.String)\npublic com.android.server.pm.PackageSetting setFirstInstallTimeFromReplaced(com.android.server.pm.pkg.PackageStateInternal,int[])\npublic com.android.server.pm.PackageSetting setFirstInstallTime(long,int)\npublic com.android.server.pm.PackageSetting setForceQueryableOverride(boolean)\npublic com.android.server.pm.PackageSetting setInstallerPackageName(java.lang.String)\npublic com.android.server.pm.PackageSetting setInstallSource(com.android.server.pm.InstallSource)\n com.android.server.pm.PackageSetting removeInstallerPackage(java.lang.String)\npublic com.android.server.pm.PackageSetting setIsOrphaned(boolean)\npublic com.android.server.pm.PackageSetting setKeySetData(com.android.server.pm.PackageKeySetData)\npublic com.android.server.pm.PackageSetting setLastModifiedTime(long)\npublic com.android.server.pm.PackageSetting setLastUpdateTime(long)\npublic com.android.server.pm.PackageSetting setLongVersionCode(long)\npublic boolean setMimeGroup(java.lang.String,android.util.ArraySet<java.lang.String>)\npublic com.android.server.pm.PackageSetting setPkg(com.android.server.pm.parsing.pkg.AndroidPackage)\npublic com.android.server.pm.PackageSetting setPkgStateLibraryFiles(java.util.Collection<java.lang.String>)\npublic com.android.server.pm.PackageSetting setPrimaryCpuAbi(java.lang.String)\npublic com.android.server.pm.PackageSetting setSecondaryCpuAbi(java.lang.String)\npublic com.android.server.pm.PackageSetting setSignatures(com.android.server.pm.PackageSignatures)\npublic com.android.server.pm.PackageSetting setVolumeUuid(java.lang.String)\npublic @java.lang.Override boolean isExternalStorage()\npublic com.android.server.pm.PackageSetting setUpdateAvailable(boolean)\npublic void setSharedUserAppId(int)\npublic @java.lang.Override int getSharedUserAppId()\npublic @java.lang.Override boolean hasSharedUser()\npublic @java.lang.Override java.lang.String toString()\nprotected void copyMimeGroups(java.util.Map<java.lang.String,java.util.Set<java.lang.String>>)\npublic void updateFrom(com.android.server.pm.PackageSetting)\n com.android.server.pm.PackageSetting updateMimeGroups(java.util.Set<java.lang.String>)\npublic @java.lang.Deprecated @java.lang.Override com.android.server.pm.permission.LegacyPermissionState getLegacyPermissionState()\npublic com.android.server.pm.PackageSetting setInstallPermissionsFixed(boolean)\npublic boolean isPrivileged()\npublic boolean isOem()\npublic boolean isVendor()\npublic boolean isProduct()\npublic @java.lang.Override boolean isRequiredForSystemUser()\npublic boolean isSystemExt()\npublic boolean isOdm()\npublic boolean isSystem()\npublic android.content.pm.SigningDetails getSigningDetails()\npublic com.android.server.pm.PackageSetting setSigningDetails(android.content.pm.SigningDetails)\npublic void copyPackageSetting(com.android.server.pm.PackageSetting)\n @com.android.internal.annotations.VisibleForTesting com.android.server.pm.pkg.PackageUserStateImpl modifyUserState(int)\npublic com.android.server.pm.pkg.PackageUserStateImpl getOrCreateUserState(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateInternal readUserState(int)\n void setEnabled(int,int,java.lang.String)\n int getEnabled(int)\n void setInstalled(boolean,int)\n boolean getInstalled(int)\n int getInstallReason(int)\n void setInstallReason(int,int)\n int getUninstallReason(int)\n void setUninstallReason(int,int)\n @android.annotation.NonNull android.content.pm.overlay.OverlayPaths getOverlayPaths(int)\n boolean setOverlayPathsForLibrary(java.lang.String,android.content.pm.overlay.OverlayPaths,int)\n boolean isAnyInstalled(int[])\n int[] queryInstalledUsers(int[],boolean)\n long getCeDataInode(int)\n void setCeDataInode(long,int)\n boolean getStopped(int)\n void setStopped(boolean,int)\n boolean getNotLaunched(int)\n void setNotLaunched(boolean,int)\n boolean getHidden(int)\n void setHidden(boolean,int)\n int getDistractionFlags(int)\n void setDistractionFlags(int,int)\npublic boolean getInstantApp(int)\n void setInstantApp(boolean,int)\n boolean getVirtualPreload(int)\n void setVirtualPreload(boolean,int)\n void setUserState(int,long,int,boolean,boolean,boolean,boolean,int,android.util.ArrayMap<java.lang.String,com.android.server.pm.pkg.SuspendParams>,boolean,boolean,java.lang.String,android.util.ArraySet<java.lang.String>,android.util.ArraySet<java.lang.String>,int,int,java.lang.String,java.lang.String,long)\n void setUserState(int,com.android.server.pm.pkg.PackageUserStateInternal)\n android.util.ArraySet<java.lang.String> getEnabledComponents(int)\n android.util.ArraySet<java.lang.String> getDisabledComponents(int)\n void setEnabledComponents(android.util.ArraySet<java.lang.String>,int)\n void setDisabledComponents(android.util.ArraySet<java.lang.String>,int)\n void setEnabledComponentsCopy(android.util.ArraySet<java.lang.String>,int)\n void setDisabledComponentsCopy(android.util.ArraySet<java.lang.String>,int)\n com.android.server.pm.pkg.PackageUserStateImpl modifyUserStateComponents(int,boolean,boolean)\n void addDisabledComponent(java.lang.String,int)\n void addEnabledComponent(java.lang.String,int)\n boolean enableComponentLPw(java.lang.String,int)\n boolean disableComponentLPw(java.lang.String,int)\n boolean restoreComponentLPw(java.lang.String,int)\n int getCurrentEnabledStateLPr(java.lang.String,int)\n void removeUser(int)\npublic int[] getNotInstalledUserIds()\n void writePackageUserPermissionsProto(android.util.proto.ProtoOutputStream,long,java.util.List<android.content.pm.UserInfo>,com.android.server.pm.permission.LegacyPermissionDataProvider)\nprotected void writeUsersInfoToProto(android.util.proto.ProtoOutputStream,long)\n com.android.server.pm.PackageSetting setPath(java.io.File)\npublic @com.android.internal.annotations.VisibleForTesting boolean overrideNonLocalizedLabelAndIcon(android.content.ComponentName,java.lang.String,java.lang.Integer,int)\npublic void resetOverrideComponentLabelIcon(int)\npublic @android.annotation.Nullable java.lang.String getSplashScreenTheme(int)\npublic boolean isLoading()\npublic com.android.server.pm.PackageSetting setLoadingProgress(float)\npublic @android.annotation.NonNull @java.lang.Override long getVersionCode()\npublic @android.annotation.Nullable @java.lang.Override java.util.Map<java.lang.String,java.util.Set<java.lang.String>> getMimeGroups()\npublic @android.annotation.NonNull @java.lang.Override java.lang.String getPackageName()\npublic @android.annotation.Nullable @java.lang.Override com.android.server.pm.pkg.AndroidPackageApi getAndroidPackage()\npublic @android.annotation.NonNull android.content.pm.SigningInfo getSigningInfo()\npublic @android.annotation.NonNull @java.lang.Override java.lang.String[] getUsesSdkLibraries()\npublic @android.annotation.NonNull @java.lang.Override long[] getUsesSdkLibrariesVersionsMajor()\npublic @android.annotation.NonNull @java.lang.Override java.lang.String[] getUsesStaticLibraries()\npublic @android.annotation.NonNull @java.lang.Override long[] getUsesStaticLibrariesVersions()\npublic @android.annotation.NonNull @java.lang.Override java.util.List<android.content.pm.SharedLibraryInfo> getUsesLibraryInfos()\npublic @android.annotation.NonNull @java.lang.Override java.util.List<java.lang.String> getUsesLibraryFiles()\npublic @java.lang.Override boolean isHiddenUntilInstalled()\npublic @android.annotation.NonNull @java.lang.Override long[] getLastPackageUsageTime()\npublic @java.lang.Override boolean isUpdatedSystemApp()\npublic com.android.server.pm.PackageSetting setDomainSetId(java.util.UUID)\npublic com.android.server.pm.PackageSetting setCategoryOverride(int)\npublic com.android.server.pm.PackageSetting setLegacyNativeLibraryPath(java.lang.String)\npublic com.android.server.pm.PackageSetting setMimeGroups(java.util.Map<java.lang.String,java.util.Set<java.lang.String>>)\npublic com.android.server.pm.PackageSetting setOldCodePaths(java.util.Set<java.lang.String>)\npublic com.android.server.pm.PackageSetting setUsesSdkLibraries(java.lang.String[])\npublic com.android.server.pm.PackageSetting setUsesSdkLibrariesVersionsMajor(long[])\npublic com.android.server.pm.PackageSetting setUsesStaticLibraries(java.lang.String[])\npublic com.android.server.pm.PackageSetting setUsesStaticLibrariesVersions(long[])\npublic @android.annotation.NonNull @java.lang.Override com.android.server.pm.pkg.PackageStateUnserialized getTransientState()\npublic @android.annotation.NonNull android.util.SparseArray<? extends PackageUserStateInternal> getUserStates()\npublic com.android.server.pm.PackageSetting addMimeTypes(java.lang.String,java.util.Set<java.lang.String>)\nclass PackageSetting extends com.android.server.pm.SettingBase implements [com.android.server.pm.pkg.PackageStateInternal]\n@com.android.internal.util.DataClass(genGetters=true, genConstructor=false, genSetters=false, genBuilder=false)") + inputSignatures = "private int mSharedUserAppId\nprivate @android.annotation.Nullable java.util.Map<java.lang.String,java.util.Set<java.lang.String>> mimeGroups\nprivate @java.lang.Deprecated @android.annotation.Nullable java.util.Set<java.lang.String> mOldCodePaths\nprivate @android.annotation.Nullable java.lang.String[] usesSdkLibraries\nprivate @android.annotation.Nullable long[] usesSdkLibrariesVersionsMajor\nprivate @android.annotation.Nullable java.lang.String[] usesStaticLibraries\nprivate @android.annotation.Nullable long[] usesStaticLibrariesVersions\nprivate @android.annotation.Nullable @java.lang.Deprecated java.lang.String legacyNativeLibraryPath\nprivate @android.annotation.NonNull java.lang.String mName\nprivate @android.annotation.Nullable java.lang.String mRealName\nprivate int mAppId\nprivate @android.annotation.Nullable com.android.server.pm.parsing.pkg.AndroidPackageInternal pkg\nprivate @android.annotation.NonNull java.io.File mPath\nprivate @android.annotation.NonNull java.lang.String mPathString\nprivate float mLoadingProgress\nprivate @android.annotation.Nullable java.lang.String mPrimaryCpuAbi\nprivate @android.annotation.Nullable java.lang.String mSecondaryCpuAbi\nprivate @android.annotation.Nullable java.lang.String mCpuAbiOverride\nprivate long mLastModifiedTime\nprivate long lastUpdateTime\nprivate long versionCode\nprivate @android.annotation.NonNull com.android.server.pm.PackageSignatures signatures\nprivate boolean installPermissionsFixed\nprivate @android.annotation.NonNull com.android.server.pm.PackageKeySetData keySetData\nprivate final @android.annotation.NonNull android.util.SparseArray<com.android.server.pm.pkg.PackageUserStateImpl> mUserStates\nprivate @android.annotation.NonNull com.android.server.pm.InstallSource installSource\nprivate @android.annotation.Nullable java.lang.String volumeUuid\nprivate int categoryOverride\nprivate boolean updateAvailable\nprivate boolean forceQueryableOverride\nprivate final @android.annotation.NonNull com.android.server.pm.pkg.PackageStateUnserialized pkgState\nprivate @android.annotation.NonNull java.util.UUID mDomainSetId\nprivate final @android.annotation.NonNull com.android.server.utils.SnapshotCache<com.android.server.pm.PackageSetting> mSnapshot\nprivate com.android.server.utils.SnapshotCache<com.android.server.pm.PackageSetting> makeCache()\npublic com.android.server.pm.PackageSetting snapshot()\npublic void dumpDebug(android.util.proto.ProtoOutputStream,long,java.util.List<android.content.pm.UserInfo>,com.android.server.pm.permission.LegacyPermissionDataProvider)\npublic com.android.server.pm.PackageSetting setAppId(int)\npublic com.android.server.pm.PackageSetting setCpuAbiOverride(java.lang.String)\npublic com.android.server.pm.PackageSetting setFirstInstallTimeFromReplaced(com.android.server.pm.pkg.PackageStateInternal,int[])\npublic com.android.server.pm.PackageSetting setFirstInstallTime(long,int)\npublic com.android.server.pm.PackageSetting setForceQueryableOverride(boolean)\npublic com.android.server.pm.PackageSetting setInstallerPackageName(java.lang.String)\npublic com.android.server.pm.PackageSetting setInstallSource(com.android.server.pm.InstallSource)\n com.android.server.pm.PackageSetting removeInstallerPackage(java.lang.String)\npublic com.android.server.pm.PackageSetting setIsOrphaned(boolean)\npublic com.android.server.pm.PackageSetting setKeySetData(com.android.server.pm.PackageKeySetData)\npublic com.android.server.pm.PackageSetting setLastModifiedTime(long)\npublic com.android.server.pm.PackageSetting setLastUpdateTime(long)\npublic com.android.server.pm.PackageSetting setLongVersionCode(long)\npublic boolean setMimeGroup(java.lang.String,android.util.ArraySet<java.lang.String>)\npublic com.android.server.pm.PackageSetting setPkg(com.android.server.pm.parsing.pkg.AndroidPackageInternal)\npublic com.android.server.pm.PackageSetting setPkgStateLibraryFiles(java.util.Collection<java.lang.String>)\npublic com.android.server.pm.PackageSetting setPrimaryCpuAbi(java.lang.String)\npublic com.android.server.pm.PackageSetting setSecondaryCpuAbi(java.lang.String)\npublic com.android.server.pm.PackageSetting setSignatures(com.android.server.pm.PackageSignatures)\npublic com.android.server.pm.PackageSetting setVolumeUuid(java.lang.String)\npublic @java.lang.Override boolean isExternalStorage()\npublic com.android.server.pm.PackageSetting setUpdateAvailable(boolean)\npublic void setSharedUserAppId(int)\npublic @java.lang.Override int getSharedUserAppId()\npublic @java.lang.Override boolean hasSharedUser()\npublic @java.lang.Override java.lang.String toString()\nprotected void copyMimeGroups(java.util.Map<java.lang.String,java.util.Set<java.lang.String>>)\npublic void updateFrom(com.android.server.pm.PackageSetting)\n com.android.server.pm.PackageSetting updateMimeGroups(java.util.Set<java.lang.String>)\npublic @java.lang.Deprecated @java.lang.Override com.android.server.pm.permission.LegacyPermissionState getLegacyPermissionState()\npublic com.android.server.pm.PackageSetting setInstallPermissionsFixed(boolean)\npublic boolean isPrivileged()\npublic boolean isOem()\npublic boolean isVendor()\npublic boolean isProduct()\npublic @java.lang.Override boolean isRequiredForSystemUser()\npublic boolean isSystemExt()\npublic boolean isOdm()\npublic boolean isSystem()\npublic android.content.pm.SigningDetails getSigningDetails()\npublic com.android.server.pm.PackageSetting setSigningDetails(android.content.pm.SigningDetails)\npublic void copyPackageSetting(com.android.server.pm.PackageSetting,boolean)\n @com.android.internal.annotations.VisibleForTesting com.android.server.pm.pkg.PackageUserStateImpl modifyUserState(int)\npublic com.android.server.pm.pkg.PackageUserStateImpl getOrCreateUserState(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateInternal readUserState(int)\n void setEnabled(int,int,java.lang.String)\n int getEnabled(int)\n void setInstalled(boolean,int)\n boolean getInstalled(int)\n int getInstallReason(int)\n void setInstallReason(int,int)\n int getUninstallReason(int)\n void setUninstallReason(int,int)\n @android.annotation.NonNull android.content.pm.overlay.OverlayPaths getOverlayPaths(int)\n boolean setOverlayPathsForLibrary(java.lang.String,android.content.pm.overlay.OverlayPaths,int)\n boolean isAnyInstalled(int[])\n int[] queryInstalledUsers(int[],boolean)\n long getCeDataInode(int)\n void setCeDataInode(long,int)\n boolean getStopped(int)\n void setStopped(boolean,int)\n boolean getNotLaunched(int)\n void setNotLaunched(boolean,int)\n boolean getHidden(int)\n void setHidden(boolean,int)\n int getDistractionFlags(int)\n void setDistractionFlags(int,int)\npublic boolean getInstantApp(int)\n void setInstantApp(boolean,int)\n boolean getVirtualPreload(int)\n void setVirtualPreload(boolean,int)\n void setUserState(int,long,int,boolean,boolean,boolean,boolean,int,android.util.ArrayMap<java.lang.String,com.android.server.pm.pkg.SuspendParams>,boolean,boolean,java.lang.String,android.util.ArraySet<java.lang.String>,android.util.ArraySet<java.lang.String>,int,int,java.lang.String,java.lang.String,long)\n void setUserState(int,com.android.server.pm.pkg.PackageUserStateInternal)\n com.android.server.utils.WatchedArraySet<java.lang.String> getEnabledComponents(int)\n com.android.server.utils.WatchedArraySet<java.lang.String> getDisabledComponents(int)\n void setEnabledComponents(com.android.server.utils.WatchedArraySet<java.lang.String>,int)\n void setDisabledComponents(com.android.server.utils.WatchedArraySet<java.lang.String>,int)\n void setEnabledComponentsCopy(com.android.server.utils.WatchedArraySet<java.lang.String>,int)\n void setDisabledComponentsCopy(com.android.server.utils.WatchedArraySet<java.lang.String>,int)\n com.android.server.pm.pkg.PackageUserStateImpl modifyUserStateComponents(int,boolean,boolean)\n void addDisabledComponent(java.lang.String,int)\n void addEnabledComponent(java.lang.String,int)\n boolean enableComponentLPw(java.lang.String,int)\n boolean disableComponentLPw(java.lang.String,int)\n boolean restoreComponentLPw(java.lang.String,int)\n int getCurrentEnabledStateLPr(java.lang.String,int)\n void removeUser(int)\npublic int[] getNotInstalledUserIds()\n void writePackageUserPermissionsProto(android.util.proto.ProtoOutputStream,long,java.util.List<android.content.pm.UserInfo>,com.android.server.pm.permission.LegacyPermissionDataProvider)\nprotected void writeUsersInfoToProto(android.util.proto.ProtoOutputStream,long)\n com.android.server.pm.PackageSetting setPath(java.io.File)\npublic @com.android.internal.annotations.VisibleForTesting boolean overrideNonLocalizedLabelAndIcon(android.content.ComponentName,java.lang.String,java.lang.Integer,int)\npublic void resetOverrideComponentLabelIcon(int)\npublic @android.annotation.Nullable java.lang.String getSplashScreenTheme(int)\npublic boolean isLoading()\npublic com.android.server.pm.PackageSetting setLoadingProgress(float)\npublic @android.annotation.NonNull @java.lang.Override long getVersionCode()\npublic @android.annotation.Nullable @java.lang.Override java.util.Map<java.lang.String,java.util.Set<java.lang.String>> getMimeGroups()\npublic @android.annotation.NonNull @java.lang.Override java.lang.String getPackageName()\npublic @android.annotation.Nullable @java.lang.Override com.android.server.pm.pkg.AndroidPackage getAndroidPackage()\npublic @android.annotation.NonNull android.content.pm.SigningInfo getSigningInfo()\npublic @android.annotation.NonNull @java.lang.Override java.lang.String[] getUsesSdkLibraries()\npublic @android.annotation.NonNull @java.lang.Override long[] getUsesSdkLibrariesVersionsMajor()\npublic @android.annotation.NonNull @java.lang.Override java.lang.String[] getUsesStaticLibraries()\npublic @android.annotation.NonNull @java.lang.Override long[] getUsesStaticLibrariesVersions()\npublic @android.annotation.NonNull @java.lang.Override java.util.List<android.content.pm.SharedLibraryInfo> getUsesLibraryInfos()\npublic @android.annotation.NonNull @java.lang.Override java.util.List<java.lang.String> getUsesLibraryFiles()\npublic @java.lang.Override boolean isHiddenUntilInstalled()\npublic @android.annotation.NonNull @java.lang.Override long[] getLastPackageUsageTime()\npublic @java.lang.Override boolean isUpdatedSystemApp()\npublic @java.lang.Override boolean isApkInUpdatedApex()\npublic com.android.server.pm.PackageSetting setDomainSetId(java.util.UUID)\npublic com.android.server.pm.PackageSetting setCategoryOverride(int)\npublic com.android.server.pm.PackageSetting setLegacyNativeLibraryPath(java.lang.String)\npublic com.android.server.pm.PackageSetting setMimeGroups(java.util.Map<java.lang.String,java.util.Set<java.lang.String>>)\npublic com.android.server.pm.PackageSetting setOldCodePaths(java.util.Set<java.lang.String>)\npublic com.android.server.pm.PackageSetting setUsesSdkLibraries(java.lang.String[])\npublic com.android.server.pm.PackageSetting setUsesSdkLibrariesVersionsMajor(long[])\npublic com.android.server.pm.PackageSetting setUsesStaticLibraries(java.lang.String[])\npublic com.android.server.pm.PackageSetting setUsesStaticLibrariesVersions(long[])\npublic @android.annotation.NonNull @java.lang.Override com.android.server.pm.pkg.PackageStateUnserialized getTransientState()\npublic @android.annotation.NonNull android.util.SparseArray<? extends PackageUserStateInternal> getUserStates()\npublic com.android.server.pm.PackageSetting addMimeTypes(java.lang.String,java.util.Set<java.lang.String>)\nclass PackageSetting extends com.android.server.pm.SettingBase implements [com.android.server.pm.pkg.PackageStateInternal]\n@com.android.internal.util.DataClass(genGetters=true, genConstructor=false, genSetters=false, genBuilder=false)") @Deprecated private void __metadata() {} diff --git a/services/core/java/com/android/server/pm/PrepareResult.java b/services/core/java/com/android/server/pm/PrepareResult.java index 4e08e166ff0b..e074f44afff5 100644 --- a/services/core/java/com/android/server/pm/PrepareResult.java +++ b/services/core/java/com/android/server/pm/PrepareResult.java @@ -18,8 +18,8 @@ package com.android.server.pm; import android.annotation.Nullable; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.ParsedPackage; +import com.android.server.pm.pkg.AndroidPackage; /** * The set of data needed to successfully install the prepared package. This includes data that diff --git a/services/core/java/com/android/server/pm/ReconcilePackageUtils.java b/services/core/java/com/android/server/pm/ReconcilePackageUtils.java index d6a133e43789..0f7c6526da17 100644 --- a/services/core/java/com/android/server/pm/ReconcilePackageUtils.java +++ b/services/core/java/com/android/server/pm/ReconcilePackageUtils.java @@ -30,8 +30,8 @@ import android.os.SystemProperties; import android.util.ArrayMap; import android.util.Log; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.ParsedPackage; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.parsing.ParsingPackageUtils; import com.android.server.utils.WatchedLongSparseArray; diff --git a/services/core/java/com/android/server/pm/ReconcileRequest.java b/services/core/java/com/android/server/pm/ReconcileRequest.java index 9e4e986d1fb5..84b292ff4068 100644 --- a/services/core/java/com/android/server/pm/ReconcileRequest.java +++ b/services/core/java/com/android/server/pm/ReconcileRequest.java @@ -16,7 +16,7 @@ package com.android.server.pm; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import java.util.Collections; import java.util.Map; diff --git a/services/core/java/com/android/server/pm/ReconciledPackage.java b/services/core/java/com/android/server/pm/ReconciledPackage.java index 1bfe3576225f..3bb5a1b66338 100644 --- a/services/core/java/com/android/server/pm/ReconciledPackage.java +++ b/services/core/java/com/android/server/pm/ReconciledPackage.java @@ -22,7 +22,7 @@ import android.content.pm.SharedLibraryInfo; import android.content.pm.SigningDetails; import android.util.ArrayMap; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import java.util.ArrayList; import java.util.List; diff --git a/services/core/java/com/android/server/pm/RemovePackageHelper.java b/services/core/java/com/android/server/pm/RemovePackageHelper.java index f083b67a0402..a02596538627 100644 --- a/services/core/java/com/android/server/pm/RemovePackageHelper.java +++ b/services/core/java/com/android/server/pm/RemovePackageHelper.java @@ -46,9 +46,9 @@ import android.util.SparseBooleanArray; import com.android.internal.annotations.GuardedBy; import com.android.internal.util.ArrayUtils; import com.android.server.pm.parsing.PackageCacher; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.PackageImpl; import com.android.server.pm.permission.PermissionManagerServiceInternal; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageStateInternal; import com.android.server.pm.pkg.component.ParsedInstrumentation; diff --git a/services/core/java/com/android/server/pm/ResolveIntentHelper.java b/services/core/java/com/android/server/pm/ResolveIntentHelper.java index 24ed6216f7fe..c2fd637cfbd0 100644 --- a/services/core/java/com/android/server/pm/ResolveIntentHelper.java +++ b/services/core/java/com/android/server/pm/ResolveIntentHelper.java @@ -53,7 +53,7 @@ import android.util.Slog; import com.android.internal.app.ResolverActivity; import com.android.internal.util.ArrayUtils; import com.android.server.compat.PlatformCompat; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageStateInternal; import com.android.server.pm.resolution.ComponentResolverApi; import com.android.server.pm.verify.domain.DomainVerificationManagerInternal; diff --git a/services/core/java/com/android/server/pm/SELinuxMMAC.java b/services/core/java/com/android/server/pm/SELinuxMMAC.java index c0e191fd1194..f7e04d435f56 100644 --- a/services/core/java/com/android/server/pm/SELinuxMMAC.java +++ b/services/core/java/com/android/server/pm/SELinuxMMAC.java @@ -27,8 +27,8 @@ import android.util.Slog; import android.util.Xml; import com.android.server.compat.PlatformCompat; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.AndroidPackageUtils; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.SharedUserApi; import libcore.io.IoUtils; diff --git a/services/core/java/com/android/server/pm/ScanPackageUtils.java b/services/core/java/com/android/server/pm/ScanPackageUtils.java index 86affdd75481..9bd8e12c4d92 100644 --- a/services/core/java/com/android/server/pm/ScanPackageUtils.java +++ b/services/core/java/com/android/server/pm/ScanPackageUtils.java @@ -76,9 +76,9 @@ import com.android.internal.util.ArrayUtils; import com.android.server.SystemConfig; import com.android.server.pm.parsing.PackageInfoUtils; import com.android.server.pm.parsing.library.PackageBackwardCompatibility; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.AndroidPackageUtils; import com.android.server.pm.parsing.pkg.ParsedPackage; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageStateUtils; import com.android.server.pm.pkg.component.ComponentMutateUtils; import com.android.server.pm.pkg.component.ParsedActivity; diff --git a/services/core/java/com/android/server/pm/ScanRequest.java b/services/core/java/com/android/server/pm/ScanRequest.java index 98d11bd42495..e66a72f0fccb 100644 --- a/services/core/java/com/android/server/pm/ScanRequest.java +++ b/services/core/java/com/android/server/pm/ScanRequest.java @@ -21,8 +21,8 @@ import android.annotation.Nullable; import android.os.UserHandle; import com.android.internal.annotations.VisibleForTesting; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.ParsedPackage; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.parsing.ParsingPackageUtils; /** A package to be scanned */ diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index 10e9b5480875..9037f042641f 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -102,12 +102,12 @@ import com.android.server.LocalServices; import com.android.server.backup.PreferredActivityBackupHelper; import com.android.server.pm.Installer.InstallerException; import com.android.server.pm.parsing.PackageInfoUtils; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.AndroidPackageUtils; import com.android.server.pm.permission.LegacyPermissionDataProvider; import com.android.server.pm.permission.LegacyPermissionSettings; import com.android.server.pm.permission.LegacyPermissionState; import com.android.server.pm.permission.LegacyPermissionState.PermissionState; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageStateInternal; import com.android.server.pm.pkg.PackageUserState; import com.android.server.pm.pkg.PackageUserStateInternal; diff --git a/services/core/java/com/android/server/pm/SharedLibrariesImpl.java b/services/core/java/com/android/server/pm/SharedLibrariesImpl.java index 7432b8446f35..5905741d5db2 100644 --- a/services/core/java/com/android/server/pm/SharedLibrariesImpl.java +++ b/services/core/java/com/android/server/pm/SharedLibrariesImpl.java @@ -47,9 +47,9 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ArrayUtils; import com.android.server.SystemConfig; import com.android.server.compat.PlatformCompat; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.AndroidPackageUtils; import com.android.server.pm.parsing.pkg.ParsedPackage; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageStateInternal; import com.android.server.utils.Snappable; import com.android.server.utils.SnapshotCache; diff --git a/services/core/java/com/android/server/pm/SharedUserSetting.java b/services/core/java/com/android/server/pm/SharedUserSetting.java index 58be87852026..fb2ba32921ae 100644 --- a/services/core/java/com/android/server/pm/SharedUserSetting.java +++ b/services/core/java/com/android/server/pm/SharedUserSetting.java @@ -26,8 +26,8 @@ import android.util.ArraySet; import android.util.proto.ProtoOutputStream; import com.android.internal.util.ArrayUtils; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.permission.LegacyPermissionState; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageStateInternal; import com.android.server.pm.pkg.SharedUserApi; import com.android.server.pm.pkg.component.ComponentMutateUtils; diff --git a/services/core/java/com/android/server/pm/StagingManager.java b/services/core/java/com/android/server/pm/StagingManager.java index 43dde5cce2d6..1da442b3dc20 100644 --- a/services/core/java/com/android/server/pm/StagingManager.java +++ b/services/core/java/com/android/server/pm/StagingManager.java @@ -53,8 +53,8 @@ import com.android.internal.util.Preconditions; import com.android.server.LocalServices; import com.android.server.SystemService; import com.android.server.SystemServiceManager; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.AndroidPackageUtils; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageStateInternal; import com.android.server.pm.pkg.PackageStateUtils; import com.android.server.rollback.RollbackManagerInternal; diff --git a/services/core/java/com/android/server/pm/StorageEventHelper.java b/services/core/java/com/android/server/pm/StorageEventHelper.java index 41c6c0fc4c7f..477e260a4818 100644 --- a/services/core/java/com/android/server/pm/StorageEventHelper.java +++ b/services/core/java/com/android/server/pm/StorageEventHelper.java @@ -48,7 +48,7 @@ import android.util.Slog; import com.android.internal.annotations.GuardedBy; import com.android.internal.policy.AttributeCache; import com.android.internal.util.IndentingPrintWriter; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageStateInternal; import com.android.server.pm.pkg.parsing.ParsingPackageUtils; diff --git a/services/core/java/com/android/server/pm/SuspendPackageHelper.java b/services/core/java/com/android/server/pm/SuspendPackageHelper.java index 6847b7083967..df7e3755e463 100644 --- a/services/core/java/com/android/server/pm/SuspendPackageHelper.java +++ b/services/core/java/com/android/server/pm/SuspendPackageHelper.java @@ -42,7 +42,7 @@ import android.util.Slog; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ArrayUtils; import com.android.internal.util.CollectionUtils; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageStateInternal; import com.android.server.pm.pkg.PackageUserStateInternal; import com.android.server.pm.pkg.SuspendParams; @@ -157,9 +157,11 @@ public final class SuspendPackageHelper { } } - // If size one, the package will be unsuspended from this call - boolean packageUnsuspended = - !suspended && CollectionUtils.size(suspendParamsMap) <= 1; + // If only the callingPackage is suspending this package, + // it will be unsuspended when this change is committed + boolean packageUnsuspended = !suspended + && CollectionUtils.size(suspendParamsMap) == 1 + && suspendParamsMap.containsKey(callingPackage); if (suspended || packageUnsuspended) { changedPackagesList.add(packageName); changedUids.add(UserHandle.getUid(userId, packageState.getAppId())); diff --git a/services/core/java/com/android/server/pm/UserManagerInternal.java b/services/core/java/com/android/server/pm/UserManagerInternal.java index b9a119504d1f..4f5fd023d470 100644 --- a/services/core/java/com/android/server/pm/UserManagerInternal.java +++ b/services/core/java/com/android/server/pm/UserManagerInternal.java @@ -46,6 +46,15 @@ public abstract class UserManagerInternal { public @interface OwnerType { } + // TODO(b/245963156): move to Display.java (and @hide) if we decide to support profiles on MUMD + /** + * Used only when starting a profile (on systems that + * {@link android.os.UserManager#isUsersOnSecondaryDisplaysSupported() support users running on + * secondary displays}), to indicate the profile should be started in the same display as its + * parent user. + */ + public static final int PARENT_DISPLAY = -2; + public interface UserRestrictionsListener { /** * Called when a user restriction changes. diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index 6749cebc3652..07ec80bcd603 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -1862,22 +1862,48 @@ public class UserManagerService extends IUserManager.Stub { } // TODO(b/239982558): try to merge with isUserVisibleUnchecked() (once both are unit tested) + /** + * See {@link UserManagerInternal#isUserVisible(int, int)}. + */ boolean isUserVisibleOnDisplay(@UserIdInt int userId, int displayId) { - // TODO(b/244644281): temporary workaround to let WM use this API without breaking current - // behavior (otherwise current user / profiles wouldn't be able to launch activities on - // other non-passenger displays, like cluster, display, or virtual displays) - if (isCurrentUserOrRunningProfileOfCurrentUser(userId)) { - return true; + if (displayId == Display.INVALID_DISPLAY) { + return false; } - - if (displayId == Display.DEFAULT_DISPLAY) { + if (!mUsersOnSecondaryDisplaysEnabled) { return isCurrentUserOrRunningProfileOfCurrentUser(userId); } - // Device doesn't support multiple users on multiple displays, so only users checked above - // can be visible - if (!mUsersOnSecondaryDisplaysEnabled) { - return false; + // TODO(b/244644281): temporary workaround to let WM use this API without breaking current + // behavior - return true for current user / profile for any display (other than those + // explicitly assigned to another users), otherwise they wouldn't be able to launch + // activities on other non-passenger displays, like cluster, display, or virtual displays). + // In the long-term, it should rely just on mUsersOnSecondaryDisplays, which + // would be updated by DisplayManagerService when displays are created / initialized. + if (isCurrentUserOrRunningProfileOfCurrentUser(userId)) { + synchronized (mUsersOnSecondaryDisplays) { + boolean assignedToUser = false; + boolean assignedToAnotherUser = false; + for (int i = 0; i < mUsersOnSecondaryDisplays.size(); i++) { + if (mUsersOnSecondaryDisplays.valueAt(i) == displayId) { + if (mUsersOnSecondaryDisplays.keyAt(i) == userId) { + assignedToUser = true; + break; + } else { + assignedToAnotherUser = true; + // Cannot break because it could be assigned to a profile of the user + // (and we better not assume that the iteration will check for the + // parent user before its profiles) + } + } + } + if (DBG_MUMD) { + Slogf.d(LOG_TAG, "isUserVisibleOnDisplay(%d, %d): assignedToUser=%b, " + + "assignedToAnotherUser=%b, mUsersOnSecondaryDisplays=%s", + userId, displayId, assignedToUser, assignedToAnotherUser, + mUsersOnSecondaryDisplays); + } + return assignedToUser || !assignedToAnotherUser; + } } synchronized (mUsersOnSecondaryDisplays) { @@ -6578,9 +6604,14 @@ public class UserManagerService extends IUserManager.Stub { @Override public boolean isUserRunning(@UserIdInt int userId) { + int state; synchronized (mUserStates) { - return mUserStates.get(userId, -1) >= 0; + state = mUserStates.get(userId, UserState.STATE_NONE); } + + return state != UserState.STATE_NONE + && state != UserState.STATE_STOPPING + && state != UserState.STATE_SHUTDOWN; } @Override @@ -6794,53 +6825,44 @@ public class UserManagerService extends IUserManager.Stub { int currentUserId = getCurrentUserId(); Preconditions.checkArgument(userId != currentUserId, - "Cannot assign current user to other displays"); - - boolean isProfile = isProfileUnchecked(userId); - - Preconditions.checkArgument(userId != currentUserId, - "Cannot assign current user to other displays"); - - Preconditions.checkArgument( - !isProfile || getProfileParentIdUnchecked(userId) != currentUserId, - "Cannot assign profile user %d to display %d when its parent is the current " - + "user (%d)", userId, displayId, currentUserId); + "Cannot assign current user (%d) to other displays", currentUserId); synchronized (mUsersOnSecondaryDisplays) { - if (DBG_MUMD) { - Slogf.d(LOG_TAG, "Adding %d->%d to mUsersOnSecondaryDisplays", - userId, displayId); - } - - if (isProfile) { + if (isProfileUnchecked(userId)) { // Profile can only start in the same display as parent + Preconditions.checkArgument(displayId == UserManagerInternal.PARENT_DISPLAY, + "Profile user can only be started in the same display as parent"); int parentUserId = getProfileParentId(userId); int parentDisplayId = mUsersOnSecondaryDisplays.get(parentUserId); - if (displayId != parentDisplayId) { - throw new IllegalStateException("Cannot assign profile " + userId + " to " - + "display " + displayId + " as its parent (user " + parentUserId - + ") is assigned to display " + parentDisplayId); + if (DBG_MUMD) { + Slogf.d(LOG_TAG, "Adding profile user %d -> display %d", userId, + parentDisplayId); } - } else { - // Check if display is available - for (int i = 0; i < mUsersOnSecondaryDisplays.size(); i++) { - // Make sure display is not used by other users... - // TODO(b/240736142); currently, if a user was started in a display, it - // would need to be stopped first, so "switching" a user on secondary - // diplay requires 2 non-atomic operations (stop and start). Once this logic - // is refactored, it should be atomic. - if (mUsersOnSecondaryDisplays.valueAt(i) == displayId) { - throw new IllegalStateException("Cannot assign " + userId + " to " - + "display " + displayId + " as it's already assigned to " - + "user " + mUsersOnSecondaryDisplays.keyAt(i)); - } - // TODO(b/239982558) also check that user is not already assigned to other - // display (including 0). That would be harder to tested under CTS though - // (for example, would need to add a new AM method to start user in bg on - // main display), so it's better to test on unit tests + mUsersOnSecondaryDisplays.put(userId, parentDisplayId); + return; + } + + // Check if display is available + for (int i = 0; i < mUsersOnSecondaryDisplays.size(); i++) { + // Make sure display is not used by other users... + // TODO(b/240736142); currently, if a user was started in a display, it + // would need to be stopped first, so "switching" a user on secondary + // diplay requires 2 non-atomic operations (stop and start). Once this logic + // is refactored, it should be atomic. + if (mUsersOnSecondaryDisplays.valueAt(i) == displayId) { + throw new IllegalStateException("Cannot assign " + userId + " to " + + "display " + displayId + " as it's already assigned to " + + "user " + mUsersOnSecondaryDisplays.keyAt(i)); } + // TODO(b/239982558) also check that user is not already assigned to other + // display (including 0). That would be harder to tested under CTS though + // (for example, would need to add a new AM method to start user in bg on + // main display), so it's better to test on unit tests } + if (DBG_MUMD) { + Slogf.d(LOG_TAG, "Adding full user %d -> display %d", userId, displayId); + } mUsersOnSecondaryDisplays.put(userId, displayId); } } diff --git a/services/core/java/com/android/server/pm/UserManagerServiceShellCommand.java b/services/core/java/com/android/server/pm/UserManagerServiceShellCommand.java index 8f13f7aed50a..6e861232262e 100644 --- a/services/core/java/com/android/server/pm/UserManagerServiceShellCommand.java +++ b/services/core/java/com/android/server/pm/UserManagerServiceShellCommand.java @@ -35,7 +35,6 @@ import android.os.UserHandle; import android.os.UserManager; import android.util.IndentingPrintWriter; import android.util.Slog; -import android.view.Display; import com.android.internal.widget.LockPatternUtils; import com.android.server.LocalServices; @@ -374,21 +373,16 @@ public class UserManagerServiceShellCommand extends ShellCommand { }) private int runIsUserVisible() { PrintWriter pw = getOutPrintWriter(); - int displayId = Display.INVALID_DISPLAY; + Integer displayId = null; String opt; while ((opt = getNextOption()) != null) { - boolean invalidOption = false; switch (opt) { case "--display": displayId = Integer.parseInt(getNextArgRequired()); - invalidOption = displayId == Display.INVALID_DISPLAY; break; default: - invalidOption = true; - } - if (invalidOption) { - pw.println("Invalid option: " + opt); - return -1; + pw.println("Invalid option: " + opt); + return -1; } } int userId = UserHandle.parseUserArg(getNextArgRequired()); @@ -404,7 +398,7 @@ public class UserManagerServiceShellCommand extends ShellCommand { } boolean isVisible; - if (displayId != Display.INVALID_DISPLAY) { + if (displayId != null) { isVisible = mService.isUserVisibleOnDisplay(userId, displayId); } else { isVisible = getUserManagerForUser(userId).isUserVisible(); diff --git a/services/core/java/com/android/server/pm/UserSystemPackageInstaller.java b/services/core/java/com/android/server/pm/UserSystemPackageInstaller.java index b57d4d55b6eb..2d876ed94f27 100644 --- a/services/core/java/com/android/server/pm/UserSystemPackageInstaller.java +++ b/services/core/java/com/android/server/pm/UserSystemPackageInstaller.java @@ -35,7 +35,7 @@ import android.util.SparseArrayMap; import com.android.internal.annotations.VisibleForTesting; import com.android.server.LocalServices; import com.android.server.SystemConfig; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageStateInternal; import java.lang.annotation.Retention; diff --git a/services/core/java/com/android/server/pm/dex/ArtManagerService.java b/services/core/java/com/android/server/pm/dex/ArtManagerService.java index cca3b3518901..6bc323e4444e 100644 --- a/services/core/java/com/android/server/pm/dex/ArtManagerService.java +++ b/services/core/java/com/android/server/pm/dex/ArtManagerService.java @@ -54,7 +54,7 @@ import com.android.server.pm.Installer; import com.android.server.pm.Installer.InstallerException; import com.android.server.pm.PackageManagerServiceCompilerMapping; import com.android.server.pm.parsing.PackageInfoUtils; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import dalvik.system.DexFile; import dalvik.system.VMRuntime; diff --git a/services/core/java/com/android/server/pm/dex/ArtUtils.java b/services/core/java/com/android/server/pm/dex/ArtUtils.java index 068a064cb0e2..77aefc5cf910 100644 --- a/services/core/java/com/android/server/pm/dex/ArtUtils.java +++ b/services/core/java/com/android/server/pm/dex/ArtUtils.java @@ -21,8 +21,8 @@ import static com.android.server.pm.InstructionSets.getAppDexInstructionSets; import android.annotation.NonNull; import com.android.server.pm.PackageDexOptimizer; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.AndroidPackageUtils; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageStateInternal; import java.io.File; diff --git a/services/core/java/com/android/server/pm/dex/DexoptUtils.java b/services/core/java/com/android/server/pm/dex/DexoptUtils.java index beea86d1b0df..5ba209d14933 100644 --- a/services/core/java/com/android/server/pm/dex/DexoptUtils.java +++ b/services/core/java/com/android/server/pm/dex/DexoptUtils.java @@ -23,7 +23,7 @@ import android.util.SparseArray; import com.android.internal.os.ClassLoaderFactory; import com.android.internal.util.ArrayUtils; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import java.io.File; import java.util.List; diff --git a/services/core/java/com/android/server/pm/dex/ViewCompiler.java b/services/core/java/com/android/server/pm/dex/ViewCompiler.java index ee66a558670a..9ce648f12ffe 100644 --- a/services/core/java/com/android/server/pm/dex/ViewCompiler.java +++ b/services/core/java/com/android/server/pm/dex/ViewCompiler.java @@ -23,7 +23,7 @@ import android.util.Log; import com.android.internal.annotations.GuardedBy; import com.android.server.pm.Installer; import com.android.server.pm.parsing.PackageInfoUtils; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import java.io.File; diff --git a/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java b/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java index 5be81d5700e0..108414528199 100644 --- a/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java +++ b/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java @@ -54,9 +54,9 @@ import android.util.Slog; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ArrayUtils; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.AndroidPackageUtils; import com.android.server.pm.parsing.pkg.PackageImpl; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageStateInternal; import com.android.server.pm.pkg.PackageStateUnserialized; import com.android.server.pm.pkg.PackageUserState; diff --git a/services/core/java/com/android/server/pm/parsing/library/AndroidTestBaseUpdater.java b/services/core/java/com/android/server/pm/parsing/library/AndroidTestBaseUpdater.java index c67d0d223355..7031dc35512e 100644 --- a/services/core/java/com/android/server/pm/parsing/library/AndroidTestBaseUpdater.java +++ b/services/core/java/com/android/server/pm/parsing/library/AndroidTestBaseUpdater.java @@ -28,9 +28,9 @@ import android.util.Log; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.compat.IPlatformCompat; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.AndroidPackageUtils; import com.android.server.pm.parsing.pkg.ParsedPackage; +import com.android.server.pm.pkg.AndroidPackage; /** * Updates a package to ensure that if it targets <= Q that the android.test.base library is diff --git a/services/core/java/com/android/server/pm/parsing/library/OrgApacheHttpLegacyUpdater.java b/services/core/java/com/android/server/pm/parsing/library/OrgApacheHttpLegacyUpdater.java index 7de457e9374b..96fead283290 100644 --- a/services/core/java/com/android/server/pm/parsing/library/OrgApacheHttpLegacyUpdater.java +++ b/services/core/java/com/android/server/pm/parsing/library/OrgApacheHttpLegacyUpdater.java @@ -20,8 +20,8 @@ import static com.android.server.pm.parsing.library.SharedLibraryNames.ORG_APACH import android.os.Build; import com.android.internal.annotations.VisibleForTesting; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.ParsedPackage; +import com.android.server.pm.pkg.AndroidPackage; /** * Updates a package to ensure that if it targets < P that the org.apache.http.legacy library is diff --git a/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackage.java b/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackageInternal.java index b314fe28431c..8d43fe7b5f27 100644 --- a/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackage.java +++ b/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackageInternal.java @@ -17,7 +17,7 @@ package com.android.server.pm.parsing.pkg; import com.android.internal.content.om.OverlayConfig; -import com.android.server.pm.pkg.AndroidPackageApi; +import com.android.server.pm.pkg.AndroidPackage; /** * The last state of a package during parsing/install before it is available in {@link @@ -29,6 +29,7 @@ import com.android.server.pm.pkg.AndroidPackageApi; * * @hide */ -public interface AndroidPackage extends AndroidPackageApi, OverlayConfig.PackageProvider.Package { +public interface AndroidPackageInternal extends AndroidPackage, + OverlayConfig.PackageProvider.Package { } diff --git a/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackageUtils.java b/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackageUtils.java index 76bae37b1e40..f6585f64c07f 100644 --- a/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackageUtils.java +++ b/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackageUtils.java @@ -33,7 +33,7 @@ import com.android.internal.content.NativeLibraryHelper; import com.android.internal.util.ArrayUtils; import com.android.server.SystemConfig; import com.android.server.pm.PackageManagerException; -import com.android.server.pm.pkg.AndroidPackageApi; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageStateInternal; import com.android.server.pm.pkg.component.ParsedActivity; import com.android.server.pm.pkg.component.ParsedInstrumentation; @@ -340,7 +340,7 @@ public class AndroidPackageUtils { info.versionCodeMajor = ((ParsingPackageHidden) pkg).getVersionCodeMajor(); } - public static ApplicationInfo toAppInfoWithoutState(AndroidPackageApi pkg) { + public static ApplicationInfo toAppInfoWithoutState(AndroidPackage pkg) { return ((ParsingPackageHidden) pkg).toAppInfoWithoutState(); } } diff --git a/services/core/java/com/android/server/pm/parsing/pkg/PackageImpl.java b/services/core/java/com/android/server/pm/parsing/pkg/PackageImpl.java index 11fb78f39c78..70aca99f04e5 100644 --- a/services/core/java/com/android/server/pm/parsing/pkg/PackageImpl.java +++ b/services/core/java/com/android/server/pm/parsing/pkg/PackageImpl.java @@ -56,6 +56,7 @@ import com.android.internal.util.DataClass; import com.android.internal.util.Parcelling; import com.android.internal.util.Parcelling.BuiltIn.ForInternedString; import com.android.server.pm.parsing.PackageInfoUtils; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.SELinuxUtil; import com.android.server.pm.pkg.component.ComponentMutateUtils; import com.android.server.pm.pkg.component.ParsedActivity; @@ -102,7 +103,7 @@ import java.util.UUID; * * @hide */ -public class PackageImpl implements ParsedPackage, AndroidPackage, +public class PackageImpl implements ParsedPackage, AndroidPackageInternal, AndroidPackageHidden, ParsingPackage, ParsingPackageHidden, Parcelable { private static final SparseArray<int[]> EMPTY_INT_ARRAY_SPARSE_ARRAY = new SparseArray<>(); @@ -2591,7 +2592,7 @@ public class PackageImpl implements ParsedPackage, AndroidPackage, } @Override - public AndroidPackage hideAsFinal() { + public AndroidPackageInternal hideAsFinal() { // TODO(b/135203078): Lock as immutable if (mStorageUuid == null) { assignDerivedFields(); diff --git a/services/core/java/com/android/server/pm/parsing/pkg/ParsedPackage.java b/services/core/java/com/android/server/pm/parsing/pkg/ParsedPackage.java index 38d87e2eef3c..d3063419bca0 100644 --- a/services/core/java/com/android/server/pm/parsing/pkg/ParsedPackage.java +++ b/services/core/java/com/android/server/pm/parsing/pkg/ParsedPackage.java @@ -18,17 +18,22 @@ package com.android.server.pm.parsing.pkg; import android.content.pm.SigningDetails; +import com.android.server.pm.pkg.AndroidPackage; + /** * Methods used for mutation after direct package parsing, mostly done inside * {@link com.android.server.pm.PackageManagerService}. * * Java disallows defining this as an inner interface, so this must be a separate file. * + * TODO: Remove extending AndroidPackage, should be an isolated interface with only the methods + * necessary to parse and install + * * @hide */ public interface ParsedPackage extends AndroidPackage { - AndroidPackage hideAsFinal(); + AndroidPackageInternal hideAsFinal(); ParsedPackage addUsesLibrary(int index, String libraryName); diff --git a/services/core/java/com/android/server/pm/permission/LegacyPermissionManagerService.java b/services/core/java/com/android/server/pm/permission/LegacyPermissionManagerService.java index 88b4a94f7027..23872d4fe634 100644 --- a/services/core/java/com/android/server/pm/permission/LegacyPermissionManagerService.java +++ b/services/core/java/com/android/server/pm/permission/LegacyPermissionManagerService.java @@ -46,7 +46,7 @@ import com.android.server.pm.UserManagerService; * Legacy permission manager service. */ public class LegacyPermissionManagerService extends ILegacyPermissionManager.Stub { - private static final String TAG = "PackageManager"; + private static final String TAG = "PermissionManager"; /** Injector that can be used to facilitate testing. */ private final Injector mInjector; diff --git a/services/core/java/com/android/server/pm/permission/Permission.java b/services/core/java/com/android/server/pm/permission/Permission.java index d5456e3c8dc3..69e7bf119304 100644 --- a/services/core/java/com/android/server/pm/permission/Permission.java +++ b/services/core/java/com/android/server/pm/permission/Permission.java @@ -23,14 +23,14 @@ import android.annotation.UserIdInt; import android.content.pm.PackageManager; import android.content.pm.PackageManagerInternal; import android.content.pm.PermissionInfo; -import com.android.server.pm.pkg.component.ParsedPermission; import android.os.Build; import android.os.UserHandle; import android.util.Log; import android.util.Slog; import com.android.server.pm.PackageManagerService; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; +import com.android.server.pm.pkg.component.ParsedPermission; import libcore.util.EmptyArray; diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java index 3df412da4ac6..3b9f0ba06b2c 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java @@ -72,8 +72,8 @@ import com.android.internal.util.function.TriFunction; import com.android.server.LocalServices; import com.android.server.pm.UserManagerInternal; import com.android.server.pm.UserManagerService; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.permission.PermissionManagerServiceInternal.HotwordDetectionServiceProvider; +import com.android.server.pm.pkg.AndroidPackage; import java.util.ArrayList; import java.util.Collections; diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java index c05d5cea0bed..4a80c4aad68d 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java @@ -131,9 +131,8 @@ import com.android.server.pm.KnownPackages; import com.android.server.pm.UserManagerInternal; import com.android.server.pm.UserManagerService; import com.android.server.pm.parsing.PackageInfoUtils; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.AndroidPackageUtils; -import com.android.server.pm.pkg.AndroidPackageApi; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageStateInternal; import com.android.server.pm.pkg.component.ComponentMutateUtils; import com.android.server.pm.pkg.component.ParsedPermission; @@ -168,7 +167,7 @@ import java.util.concurrent.TimeoutException; */ public class PermissionManagerServiceImpl implements PermissionManagerServiceInterface { - private static final String TAG = "PackageManager"; + private static final String TAG = "PermissionManager"; private static final String LOG_TAG = PermissionManagerServiceImpl.class.getSimpleName(); private static final String SKIP_KILL_APP_REASON_NOTIFICATION_TEST = "skip permission revoke " @@ -2612,7 +2611,7 @@ public class PermissionManagerServiceImpl implements PermissionManagerServiceInt mPackageManagerInt.getSharedUserPackages(ps.getSharedUserAppId()); int packagesSize = packages.size(); for (int i = 0; i < packagesSize; i++) { - AndroidPackageApi sharedUserPackage = + AndroidPackage sharedUserPackage = packages.valueAt(i).getAndroidPackage(); if (sharedUserPackage == null) { continue; diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInterface.java b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInterface.java index 02d184e2b1e0..930936be9ec6 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInterface.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInterface.java @@ -25,9 +25,10 @@ import android.content.pm.PermissionGroupInfo; import android.content.pm.PermissionInfo; import android.content.pm.permission.SplitPermissionInfoParcelable; import android.permission.IOnPermissionsChangeListener; +import android.permission.PermissionManager; import android.permission.PermissionManagerInternal; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import java.io.FileDescriptor; import java.io.PrintWriter; diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java index 2d5ec39b63e7..f20620ed6eec 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java @@ -23,7 +23,7 @@ import android.app.AppOpsManager; import android.content.pm.PermissionInfo; import android.permission.PermissionManagerInternal; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import java.util.ArrayList; import java.util.Collections; diff --git a/services/core/java/com/android/server/pm/pkg/AndroidPackageApi.java b/services/core/java/com/android/server/pm/pkg/AndroidPackage.java index a454bcd5620c..6078d4a3a348 100644 --- a/services/core/java/com/android/server/pm/pkg/AndroidPackageApi.java +++ b/services/core/java/com/android/server/pm/pkg/AndroidPackage.java @@ -40,7 +40,6 @@ import android.util.SparseArray; import android.util.SparseIntArray; import com.android.internal.R; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.pkg.component.ParsedActivity; import com.android.server.pm.pkg.component.ParsedApexSystemService; import com.android.server.pm.pkg.component.ParsedAttribution; @@ -66,7 +65,7 @@ import java.util.Set; * @hide */ //@SystemApi(client = SystemApi.Client.SYSTEM_SERVER) -public interface AndroidPackageApi { +public interface AndroidPackage { /** * @see ApplicationInfo#areAttributionsUserVisible() diff --git a/services/core/java/com/android/server/pm/pkg/PackageState.java b/services/core/java/com/android/server/pm/pkg/PackageState.java index b5e0e4416fe4..f0e386ce1d29 100644 --- a/services/core/java/com/android/server/pm/pkg/PackageState.java +++ b/services/core/java/com/android/server/pm/pkg/PackageState.java @@ -74,7 +74,7 @@ public interface PackageState { * app once the device reboots or otherwise re-scans it. */ @Nullable - AndroidPackageApi getAndroidPackage(); + AndroidPackage getAndroidPackage(); /** * The non-user-specific UID, or the UID if the user ID is @@ -86,7 +86,7 @@ public interface PackageState { * Value set through {@link PackageManager#setApplicationCategoryHint(String, int)}. Only * applied if the application itself does not declare a category. * - * @see AndroidPackageApi#getCategory() + * @see AndroidPackage#getCategory() */ int getCategoryOverride(); @@ -121,7 +121,7 @@ public interface PackageState { /** * Cached here in case the physical code directory on device is unmounted. - * @see AndroidPackageApi#getLongVersionCode() + * @see AndroidPackage#getLongVersionCode() */ long getVersionCode(); @@ -134,14 +134,14 @@ public interface PackageState { Map<String, Set<String>> getMimeGroups(); /** - * @see AndroidPackageApi#getPackageName() + * @see AndroidPackage#getPackageName() */ @NonNull String getPackageName(); /** * TODO: Rename this to getCodePath - * @see AndroidPackageApi#getPath() + * @see AndroidPackage#getPath() */ @NonNull File getPath(); @@ -227,13 +227,13 @@ public interface PackageState { long[] getUsesStaticLibrariesVersions(); /** - * @see AndroidPackageApi#getVolumeUuid() + * @see AndroidPackage#getVolumeUuid() */ @Nullable String getVolumeUuid(); /** - * @see AndroidPackageApi#isExternalStorage() + * @see AndroidPackage#isExternalStorage() */ boolean isExternalStorage(); @@ -257,22 +257,22 @@ public interface PackageState { boolean isInstallPermissionsFixed(); /** - * @see AndroidPackageApi#isOdm() + * @see AndroidPackage#isOdm() */ boolean isOdm(); /** - * @see AndroidPackageApi#isOem() + * @see AndroidPackage#isOem() */ boolean isOem(); /** - * @see AndroidPackageApi#isPrivileged() + * @see AndroidPackage#isPrivileged() */ boolean isPrivileged(); /** - * @see AndroidPackageApi#isProduct() + * @see AndroidPackage#isProduct() */ boolean isProduct(); @@ -282,12 +282,12 @@ public interface PackageState { boolean isRequiredForSystemUser(); /** - * @see AndroidPackageApi#isSystem() + * @see AndroidPackage#isSystem() */ boolean isSystem(); /** - * @see AndroidPackageApi#isSystemExt() + * @see AndroidPackage#isSystemExt() */ boolean isSystemExt(); @@ -308,7 +308,7 @@ public interface PackageState { boolean isApkInUpdatedApex(); /** - * @see AndroidPackageApi#isVendor() + * @see AndroidPackage#isVendor() */ boolean isVendor(); } diff --git a/services/core/java/com/android/server/pm/pkg/PackageStateImpl.java b/services/core/java/com/android/server/pm/pkg/PackageStateImpl.java index 878a837585ca..eac084228b81 100644 --- a/services/core/java/com/android/server/pm/pkg/PackageStateImpl.java +++ b/services/core/java/com/android/server/pm/pkg/PackageStateImpl.java @@ -31,7 +31,6 @@ import com.android.internal.util.DataClass; import com.android.server.pm.PackageManagerService; import com.android.server.pm.PackageSetting; import com.android.server.pm.Settings; -import com.android.server.pm.parsing.pkg.AndroidPackage; import java.io.File; import java.util.List; @@ -108,7 +107,7 @@ public class PackageStateImpl implements PackageState { } @Nullable - private final AndroidPackageApi mAndroidPackage; + private final AndroidPackage mAndroidPackage; @NonNull private final String mPackageName; @@ -570,7 +569,7 @@ public class PackageStateImpl implements PackageState { } @DataClass.Generated.Member - public @Nullable AndroidPackageApi getAndroidPackage() { + public @Nullable AndroidPackage getAndroidPackage() { return mAndroidPackage; } @@ -694,7 +693,7 @@ public class PackageStateImpl implements PackageState { time = 1644270981543L, codegenVersion = "1.0.23", sourceFile = "frameworks/base/services/core/java/com/android/server/pm/pkg/PackageStateImpl.java", - inputSignatures = "private int mBooleans\nprivate final @android.annotation.Nullable com.android.server.pm.pkg.AndroidPackageApi mAndroidPackage\nprivate final @android.annotation.NonNull java.lang.String mPackageName\nprivate final @android.annotation.Nullable java.lang.String mVolumeUuid\nprivate final int mAppId\nprivate final int mCategoryOverride\nprivate final @android.annotation.Nullable java.lang.String mCpuAbiOverride\nprivate final long mLastModifiedTime\nprivate final long mLastUpdateTime\nprivate final long mLongVersionCode\nprivate final @android.annotation.NonNull java.util.Map<java.lang.String,java.util.Set<java.lang.String>> mMimeGroups\nprivate final @android.annotation.NonNull java.io.File mPath\nprivate final @android.annotation.Nullable java.lang.String mPrimaryCpuAbi\nprivate final @android.annotation.Nullable java.lang.String mSecondaryCpuAbi\nprivate final boolean mHasSharedUser\nprivate final int mSharedUserAppId\nprivate final @android.annotation.NonNull java.lang.String[] mUsesSdkLibraries\nprivate final @android.annotation.NonNull long[] mUsesSdkLibrariesVersionsMajor\nprivate final @android.annotation.NonNull java.lang.String[] mUsesStaticLibraries\nprivate final @android.annotation.NonNull long[] mUsesStaticLibrariesVersions\nprivate final @android.annotation.NonNull java.util.List<android.content.pm.SharedLibraryInfo> mUsesLibraryInfos\nprivate final @android.annotation.NonNull java.util.List<java.lang.String> mUsesLibraryFiles\nprivate final @android.annotation.NonNull long[] mLastPackageUsageTime\nprivate final @android.annotation.NonNull android.content.pm.SigningInfo mSigningInfo\nprivate final @android.annotation.NonNull android.util.SparseArray<com.android.server.pm.pkg.PackageUserState> mUserStates\npublic static com.android.server.pm.pkg.PackageState copy(com.android.server.pm.pkg.PackageStateInternal)\nprivate void setBoolean(int,boolean)\nprivate boolean getBoolean(int)\npublic @java.lang.Override boolean isExternalStorage()\npublic @java.lang.Override boolean isForceQueryableOverride()\npublic @java.lang.Override boolean isHiddenUntilInstalled()\npublic @java.lang.Override boolean isInstallPermissionsFixed()\npublic @java.lang.Override boolean isOdm()\npublic @java.lang.Override boolean isOem()\npublic @java.lang.Override boolean isPrivileged()\npublic @java.lang.Override boolean isProduct()\npublic @java.lang.Override boolean isRequiredForSystemUser()\npublic @java.lang.Override boolean isSystem()\npublic @java.lang.Override boolean isSystemExt()\npublic @java.lang.Override boolean isUpdateAvailable()\npublic @java.lang.Override boolean isUpdatedSystemApp()\npublic @java.lang.Override boolean isVendor()\npublic @java.lang.Override long getVersionCode()\npublic @java.lang.Override boolean hasSharedUser()\npublic @java.lang.Override int getSharedUserAppId()\nclass PackageStateImpl extends java.lang.Object implements [com.android.server.pm.pkg.PackageState]\nprivate static final int SYSTEM\nprivate static final int EXTERNAL_STORAGE\nprivate static final int PRIVILEGED\nprivate static final int OEM\nprivate static final int VENDOR\nprivate static final int PRODUCT\nprivate static final int SYSTEM_EXT\nprivate static final int REQUIRED_FOR_SYSTEM_USER\nprivate static final int ODM\nprivate static final int FORCE_QUERYABLE_OVERRIDE\nprivate static final int HIDDEN_UNTIL_INSTALLED\nprivate static final int INSTALL_PERMISSIONS_FIXED\nprivate static final int UPDATE_AVAILABLE\nprivate static final int UPDATED_SYSTEM_APP\nclass Booleans extends java.lang.Object implements []\n@com.android.internal.util.DataClass(genConstructor=false)") + inputSignatures = "private int mBooleans\nprivate final @android.annotation.Nullable com.android.server.pm.pkg.AndroidPackage mAndroidPackage\nprivate final @android.annotation.NonNull java.lang.String mPackageName\nprivate final @android.annotation.Nullable java.lang.String mVolumeUuid\nprivate final int mAppId\nprivate final int mCategoryOverride\nprivate final @android.annotation.Nullable java.lang.String mCpuAbiOverride\nprivate final long mLastModifiedTime\nprivate final long mLastUpdateTime\nprivate final long mLongVersionCode\nprivate final @android.annotation.NonNull java.util.Map<java.lang.String,java.util.Set<java.lang.String>> mMimeGroups\nprivate final @android.annotation.NonNull java.io.File mPath\nprivate final @android.annotation.Nullable java.lang.String mPrimaryCpuAbi\nprivate final @android.annotation.Nullable java.lang.String mSecondaryCpuAbi\nprivate final boolean mHasSharedUser\nprivate final int mSharedUserAppId\nprivate final @android.annotation.NonNull java.lang.String[] mUsesSdkLibraries\nprivate final @android.annotation.NonNull long[] mUsesSdkLibrariesVersionsMajor\nprivate final @android.annotation.NonNull java.lang.String[] mUsesStaticLibraries\nprivate final @android.annotation.NonNull long[] mUsesStaticLibrariesVersions\nprivate final @android.annotation.NonNull java.util.List<android.content.pm.SharedLibraryInfo> mUsesLibraryInfos\nprivate final @android.annotation.NonNull java.util.List<java.lang.String> mUsesLibraryFiles\nprivate final @android.annotation.NonNull long[] mLastPackageUsageTime\nprivate final @android.annotation.NonNull android.content.pm.SigningInfo mSigningInfo\nprivate final @android.annotation.NonNull android.util.SparseArray<com.android.server.pm.pkg.PackageUserState> mUserStates\npublic static com.android.server.pm.pkg.PackageState copy(com.android.server.pm.pkg.PackageStateInternal)\nprivate void setBoolean(int,boolean)\nprivate boolean getBoolean(int)\npublic @java.lang.Override boolean isExternalStorage()\npublic @java.lang.Override boolean isForceQueryableOverride()\npublic @java.lang.Override boolean isHiddenUntilInstalled()\npublic @java.lang.Override boolean isInstallPermissionsFixed()\npublic @java.lang.Override boolean isOdm()\npublic @java.lang.Override boolean isOem()\npublic @java.lang.Override boolean isPrivileged()\npublic @java.lang.Override boolean isProduct()\npublic @java.lang.Override boolean isRequiredForSystemUser()\npublic @java.lang.Override boolean isSystem()\npublic @java.lang.Override boolean isSystemExt()\npublic @java.lang.Override boolean isUpdateAvailable()\npublic @java.lang.Override boolean isUpdatedSystemApp()\npublic @java.lang.Override boolean isVendor()\npublic @java.lang.Override long getVersionCode()\npublic @java.lang.Override boolean hasSharedUser()\npublic @java.lang.Override int getSharedUserAppId()\nclass PackageStateImpl extends java.lang.Object implements [com.android.server.pm.pkg.PackageState]\nprivate static final int SYSTEM\nprivate static final int EXTERNAL_STORAGE\nprivate static final int PRIVILEGED\nprivate static final int OEM\nprivate static final int VENDOR\nprivate static final int PRODUCT\nprivate static final int SYSTEM_EXT\nprivate static final int REQUIRED_FOR_SYSTEM_USER\nprivate static final int ODM\nprivate static final int FORCE_QUERYABLE_OVERRIDE\nprivate static final int HIDDEN_UNTIL_INSTALLED\nprivate static final int INSTALL_PERMISSIONS_FIXED\nprivate static final int UPDATE_AVAILABLE\nprivate static final int UPDATED_SYSTEM_APP\nclass Booleans extends java.lang.Object implements []\n@com.android.internal.util.DataClass(genConstructor=false)") @Deprecated private void __metadata() {} diff --git a/services/core/java/com/android/server/pm/pkg/PackageStateInternal.java b/services/core/java/com/android/server/pm/pkg/PackageStateInternal.java index 68a00a9c8eae..84799ea29423 100644 --- a/services/core/java/com/android/server/pm/pkg/PackageStateInternal.java +++ b/services/core/java/com/android/server/pm/pkg/PackageStateInternal.java @@ -24,7 +24,7 @@ import android.util.SparseArray; import com.android.server.pm.InstallSource; import com.android.server.pm.PackageKeySetData; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.parsing.pkg.AndroidPackageInternal; import com.android.server.pm.permission.LegacyPermissionState; import java.util.UUID; @@ -35,7 +35,7 @@ import java.util.UUID; public interface PackageStateInternal extends PackageState { @NonNull - AndroidPackage getPkg(); + AndroidPackageInternal getPkg(); // TODO: Remove in favor of exposing APIs directly? @NonNull diff --git a/services/core/java/com/android/server/pm/pkg/PackageStateUtils.java b/services/core/java/com/android/server/pm/pkg/PackageStateUtils.java index 91e9b2f9573c..a883a059de0a 100644 --- a/services/core/java/com/android/server/pm/pkg/PackageStateUtils.java +++ b/services/core/java/com/android/server/pm/pkg/PackageStateUtils.java @@ -20,11 +20,9 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.content.pm.ComponentInfo; import android.content.pm.PackageManager; -import com.android.server.pm.pkg.component.ParsedMainComponent; - import android.util.SparseArray; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.component.ParsedMainComponent; public class PackageStateUtils { diff --git a/services/core/java/com/android/server/pm/pkg/PackageUserStateUtils.java b/services/core/java/com/android/server/pm/pkg/PackageUserStateUtils.java index 3bdebd1e9e52..15e3d0c7c432 100644 --- a/services/core/java/com/android/server/pm/pkg/PackageUserStateUtils.java +++ b/services/core/java/com/android/server/pm/pkg/PackageUserStateUtils.java @@ -26,7 +26,6 @@ import android.os.Debug; import android.util.DebugUtils; import android.util.Slog; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.pkg.component.ParsedMainComponent; /** @hide */ diff --git a/services/core/java/com/android/server/pm/pkg/SharedUserApi.java b/services/core/java/com/android/server/pm/pkg/SharedUserApi.java index 94a87f3c1289..55c305ce812f 100644 --- a/services/core/java/com/android/server/pm/pkg/SharedUserApi.java +++ b/services/core/java/com/android/server/pm/pkg/SharedUserApi.java @@ -22,7 +22,6 @@ import android.content.pm.SigningDetails; import android.util.ArrayMap; import android.util.ArraySet; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.permission.LegacyPermissionState; import com.android.server.pm.pkg.component.ParsedProcess; diff --git a/services/core/java/com/android/server/pm/resolution/ComponentResolver.java b/services/core/java/com/android/server/pm/resolution/ComponentResolver.java index 1d95e8744c47..a19beea8d446 100644 --- a/services/core/java/com/android/server/pm/resolution/ComponentResolver.java +++ b/services/core/java/com/android/server/pm/resolution/ComponentResolver.java @@ -51,7 +51,7 @@ import com.android.server.pm.PackageManagerException; import com.android.server.pm.UserManagerService; import com.android.server.pm.UserNeedsBadgingCache; import com.android.server.pm.parsing.PackageInfoUtils; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageStateInternal; import com.android.server.pm.pkg.PackageStateUtils; import com.android.server.pm.pkg.PackageUserStateInternal; diff --git a/services/core/java/com/android/server/pm/resolution/ComponentResolverBase.java b/services/core/java/com/android/server/pm/resolution/ComponentResolverBase.java index c01cecff9f61..75d7162c47de 100644 --- a/services/core/java/com/android/server/pm/resolution/ComponentResolverBase.java +++ b/services/core/java/com/android/server/pm/resolution/ComponentResolverBase.java @@ -32,8 +32,8 @@ import com.android.server.pm.Computer; import com.android.server.pm.DumpState; import com.android.server.pm.UserManagerService; import com.android.server.pm.parsing.PackageInfoUtils; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.AndroidPackageUtils; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageStateInternal; import com.android.server.pm.pkg.PackageUserStateInternal; import com.android.server.pm.pkg.component.ParsedActivity; diff --git a/services/core/java/com/android/server/pm/verify/domain/DomainVerificationCollector.java b/services/core/java/com/android/server/pm/verify/domain/DomainVerificationCollector.java index e07812036a0c..adef808bd712 100644 --- a/services/core/java/com/android/server/pm/verify/domain/DomainVerificationCollector.java +++ b/services/core/java/com/android/server/pm/verify/domain/DomainVerificationCollector.java @@ -22,8 +22,6 @@ import android.compat.annotation.ChangeId; import android.compat.annotation.EnabledSince; import android.content.Intent; import android.content.IntentFilter; -import com.android.server.pm.pkg.component.ParsedActivity; -import com.android.server.pm.pkg.component.ParsedIntentInfo; import android.os.Build; import android.text.TextUtils; import android.util.ArraySet; @@ -31,7 +29,9 @@ import android.util.Patterns; import com.android.server.SystemConfig; import com.android.server.compat.PlatformCompat; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; +import com.android.server.pm.pkg.component.ParsedActivity; +import com.android.server.pm.pkg.component.ParsedIntentInfo; import java.util.List; import java.util.Objects; diff --git a/services/core/java/com/android/server/pm/verify/domain/DomainVerificationDebug.java b/services/core/java/com/android/server/pm/verify/domain/DomainVerificationDebug.java index e06b6081fd1b..d67613cb68d7 100644 --- a/services/core/java/com/android/server/pm/verify/domain/DomainVerificationDebug.java +++ b/services/core/java/com/android/server/pm/verify/domain/DomainVerificationDebug.java @@ -31,7 +31,7 @@ import android.util.SparseArray; import com.android.internal.util.CollectionUtils; import com.android.server.pm.Computer; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageStateInternal; import com.android.server.pm.verify.domain.models.DomainVerificationInternalUserState; import com.android.server.pm.verify.domain.models.DomainVerificationPkgState; diff --git a/services/core/java/com/android/server/pm/verify/domain/DomainVerificationService.java b/services/core/java/com/android/server/pm/verify/domain/DomainVerificationService.java index 3cd7795005a7..400af366b0d6 100644 --- a/services/core/java/com/android/server/pm/verify/domain/DomainVerificationService.java +++ b/services/core/java/com/android/server/pm/verify/domain/DomainVerificationService.java @@ -55,7 +55,7 @@ import com.android.server.SystemConfig; import com.android.server.SystemService; import com.android.server.compat.PlatformCompat; import com.android.server.pm.Computer; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageStateInternal; import com.android.server.pm.pkg.PackageStateUtils; import com.android.server.pm.pkg.PackageUserStateInternal; diff --git a/services/core/java/com/android/server/pm/verify/domain/DomainVerificationSettings.java b/services/core/java/com/android/server/pm/verify/domain/DomainVerificationSettings.java index 8d1ae0bc20b0..cde72cd81a7d 100644 --- a/services/core/java/com/android/server/pm/verify/domain/DomainVerificationSettings.java +++ b/services/core/java/com/android/server/pm/verify/domain/DomainVerificationSettings.java @@ -29,7 +29,7 @@ import android.util.TypedXmlSerializer; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.server.pm.Computer; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageStateInternal; import com.android.server.pm.verify.domain.models.DomainVerificationInternalUserState; import com.android.server.pm.verify.domain.models.DomainVerificationPkgState; diff --git a/services/core/java/com/android/server/pm/verify/domain/DomainVerificationUtils.java b/services/core/java/com/android/server/pm/verify/domain/DomainVerificationUtils.java index 058b6057bc34..3fd00c6993cf 100644 --- a/services/core/java/com/android/server/pm/verify/domain/DomainVerificationUtils.java +++ b/services/core/java/com/android/server/pm/verify/domain/DomainVerificationUtils.java @@ -28,7 +28,7 @@ import android.util.Patterns; import com.android.internal.util.CollectionUtils; import com.android.server.compat.PlatformCompat; import com.android.server.pm.PackageManagerService; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import java.util.Set; import java.util.regex.Matcher; diff --git a/services/core/java/com/android/server/pm/verify/domain/proxy/DomainVerificationProxyV1.java b/services/core/java/com/android/server/pm/verify/domain/proxy/DomainVerificationProxyV1.java index c8e46b62f6b0..752eb5315cc1 100644 --- a/services/core/java/com/android/server/pm/verify/domain/proxy/DomainVerificationProxyV1.java +++ b/services/core/java/com/android/server/pm/verify/domain/proxy/DomainVerificationProxyV1.java @@ -39,7 +39,7 @@ import android.util.Pair; import android.util.Slog; import com.android.internal.annotations.GuardedBy; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.verify.domain.DomainVerificationCollector; import com.android.server.pm.verify.domain.DomainVerificationDebug; import com.android.server.pm.verify.domain.DomainVerificationManagerInternal; diff --git a/services/core/java/com/android/server/policy/PermissionPolicyService.java b/services/core/java/com/android/server/policy/PermissionPolicyService.java index 7602d3303d90..ffb652e34750 100644 --- a/services/core/java/com/android/server/policy/PermissionPolicyService.java +++ b/services/core/java/com/android/server/policy/PermissionPolicyService.java @@ -96,8 +96,8 @@ import com.android.server.PermissionThread; import com.android.server.SystemService; import com.android.server.notification.NotificationManagerInternal; import com.android.server.pm.UserManagerInternal; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.permission.PermissionManagerServiceInternal; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.policy.PermissionPolicyInternal.OnInitializedCallback; import com.android.server.utils.TimingsTraceAndSlog; import com.android.server.wm.ActivityInterceptorCallback; diff --git a/services/core/java/com/android/server/policy/SoftRestrictedPermissionPolicy.java b/services/core/java/com/android/server/policy/SoftRestrictedPermissionPolicy.java index ab7135526746..33fc6fbf1de7 100644 --- a/services/core/java/com/android/server/policy/SoftRestrictedPermissionPolicy.java +++ b/services/core/java/com/android/server/policy/SoftRestrictedPermissionPolicy.java @@ -42,7 +42,7 @@ import android.os.storage.StorageManagerInternal; import android.provider.DeviceConfig; import com.android.server.LocalServices; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import java.util.Arrays; import java.util.HashSet; diff --git a/services/core/java/com/android/server/power/Notifier.java b/services/core/java/com/android/server/power/Notifier.java index 5a2fb18673ac..dad9584c6722 100644 --- a/services/core/java/com/android/server/power/Notifier.java +++ b/services/core/java/com/android/server/power/Notifier.java @@ -571,7 +571,8 @@ public class Notifier { /** * Called when there has been user activity. */ - public void onUserActivity(int displayGroupId, int event, int uid) { + public void onUserActivity(int displayGroupId, @PowerManager.UserActivityEvent int event, + int uid) { if (DEBUG) { Slog.d(TAG, "onUserActivity: event=" + event + ", uid=" + uid); } diff --git a/services/core/java/com/android/server/power/PowerGroup.java b/services/core/java/com/android/server/power/PowerGroup.java index fec61ac8f2cf..9fe53fbfaf25 100644 --- a/services/core/java/com/android/server/power/PowerGroup.java +++ b/services/core/java/com/android/server/power/PowerGroup.java @@ -74,6 +74,8 @@ public class PowerGroup { private long mLastPowerOnTime; private long mLastUserActivityTime; private long mLastUserActivityTimeNoChangeLights; + @PowerManager.UserActivityEvent + private int mLastUserActivityEvent; /** Timestamp (milliseconds since boot) of the last time the power group was awoken.*/ private long mLastWakeTime; /** Timestamp (milliseconds since boot) of the last time the power group was put to sleep. */ @@ -244,7 +246,7 @@ public class PowerGroup { return true; } - boolean dozeLocked(long eventTime, int uid, int reason) { + boolean dozeLocked(long eventTime, int uid, @PowerManager.GoToSleepReason int reason) { if (eventTime < getLastWakeTimeLocked() || !isInteractive(mWakefulness)) { return false; } @@ -253,9 +255,14 @@ public class PowerGroup { try { reason = Math.min(PowerManager.GO_TO_SLEEP_REASON_MAX, Math.max(reason, PowerManager.GO_TO_SLEEP_REASON_MIN)); + long millisSinceLastUserActivity = eventTime - Math.max( + mLastUserActivityTimeNoChangeLights, mLastUserActivityTime); Slog.i(TAG, "Powering off display group due to " - + PowerManager.sleepReasonToString(reason) + " (groupId= " + getGroupId() - + ", uid= " + uid + ")..."); + + PowerManager.sleepReasonToString(reason) + + " (groupId= " + getGroupId() + ", uid= " + uid + + ", millisSinceLastUserActivity=" + millisSinceLastUserActivity + + ", lastUserActivityEvent=" + PowerManager.userActivityEventToString( + mLastUserActivityEvent) + ")..."); setSandmanSummonedLocked(/* isSandmanSummoned= */ true); setWakefulnessLocked(WAKEFULNESS_DOZING, eventTime, uid, reason, /* opUid= */ 0, @@ -266,14 +273,16 @@ public class PowerGroup { return true; } - boolean sleepLocked(long eventTime, int uid, int reason) { + boolean sleepLocked(long eventTime, int uid, @PowerManager.GoToSleepReason int reason) { if (eventTime < mLastWakeTime || getWakefulnessLocked() == WAKEFULNESS_ASLEEP) { return false; } Trace.traceBegin(Trace.TRACE_TAG_POWER, "sleepPowerGroup"); try { - Slog.i(TAG, "Sleeping power group (groupId=" + getGroupId() + ", uid=" + uid + ")..."); + Slog.i(TAG, + "Sleeping power group (groupId=" + getGroupId() + ", uid=" + uid + ", reason=" + + PowerManager.sleepReasonToString(reason) + ")..."); setSandmanSummonedLocked(/* isSandmanSummoned= */ true); setWakefulnessLocked(WAKEFULNESS_ASLEEP, eventTime, uid, reason, /* opUid= */0, /* opPackageName= */ null, /* details= */ null); @@ -287,16 +296,20 @@ public class PowerGroup { return mLastUserActivityTime; } - void setLastUserActivityTimeLocked(long lastUserActivityTime) { + void setLastUserActivityTimeLocked(long lastUserActivityTime, + @PowerManager.UserActivityEvent int event) { mLastUserActivityTime = lastUserActivityTime; + mLastUserActivityEvent = event; } public long getLastUserActivityTimeNoChangeLightsLocked() { return mLastUserActivityTimeNoChangeLights; } - public void setLastUserActivityTimeNoChangeLightsLocked(long time) { + public void setLastUserActivityTimeNoChangeLightsLocked(long time, + @PowerManager.UserActivityEvent int event) { mLastUserActivityTimeNoChangeLights = time; + mLastUserActivityEvent = event; } public int getUserActivitySummaryLocked() { diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java index 9ee0df918d0b..2d22b8fc3272 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -1216,6 +1216,7 @@ public final class PowerManagerService extends SystemService return; } + Slog.i(TAG, "onFlip(): Face " + (isFaceDown ? "down." : "up.")); mIsFaceDown = isFaceDown; if (isFaceDown) { final long currentTime = mClock.uptimeMillis(); @@ -1937,12 +1938,13 @@ public final class PowerManagerService extends SystemService // Called from native code. @SuppressWarnings("unused") - private void userActivityFromNative(long eventTime, int event, int displayId, int flags) { + private void userActivityFromNative(long eventTime, @PowerManager.UserActivityEvent int event, + int displayId, int flags) { userActivityInternal(displayId, eventTime, event, flags, Process.SYSTEM_UID); } - private void userActivityInternal(int displayId, long eventTime, int event, int flags, - int uid) { + private void userActivityInternal(int displayId, long eventTime, + @PowerManager.UserActivityEvent int event, int flags, int uid) { synchronized (mLock) { if (displayId == Display.INVALID_DISPLAY) { if (userActivityNoUpdateLocked(eventTime, event, flags, uid)) { @@ -1993,11 +1995,12 @@ public final class PowerManagerService extends SystemService @GuardedBy("mLock") private boolean userActivityNoUpdateLocked(final PowerGroup powerGroup, long eventTime, - int event, int flags, int uid) { + @PowerManager.UserActivityEvent int event, int flags, int uid) { final int groupId = powerGroup.getGroupId(); if (DEBUG_SPEW) { Slog.d(TAG, "userActivityNoUpdateLocked: groupId=" + groupId - + ", eventTime=" + eventTime + ", event=" + event + + ", eventTime=" + eventTime + + ", event=" + PowerManager.userActivityEventToString(event) + ", flags=0x" + Integer.toHexString(flags) + ", uid=" + uid); } @@ -2032,7 +2035,7 @@ public final class PowerManagerService extends SystemService if ((flags & PowerManager.USER_ACTIVITY_FLAG_NO_CHANGE_LIGHTS) != 0) { if (eventTime > powerGroup.getLastUserActivityTimeNoChangeLightsLocked() && eventTime > powerGroup.getLastUserActivityTimeLocked()) { - powerGroup.setLastUserActivityTimeNoChangeLightsLocked(eventTime); + powerGroup.setLastUserActivityTimeNoChangeLightsLocked(eventTime, event); mDirty |= DIRTY_USER_ACTIVITY; if (event == PowerManager.USER_ACTIVITY_EVENT_BUTTON) { mDirty |= DIRTY_QUIESCENT; @@ -2042,7 +2045,7 @@ public final class PowerManagerService extends SystemService } } else { if (eventTime > powerGroup.getLastUserActivityTimeLocked()) { - powerGroup.setLastUserActivityTimeLocked(eventTime); + powerGroup.setLastUserActivityTimeLocked(eventTime, event); mDirty |= DIRTY_USER_ACTIVITY; if (event == PowerManager.USER_ACTIVITY_EVENT_BUTTON) { mDirty |= DIRTY_QUIESCENT; @@ -2069,7 +2072,8 @@ public final class PowerManagerService extends SystemService @WakeReason int reason, String details, int uid, String opPackageName, int opUid) { if (DEBUG_SPEW) { Slog.d(TAG, "wakePowerGroupLocked: eventTime=" + eventTime - + ", groupId=" + powerGroup.getGroupId() + ", uid=" + uid); + + ", groupId=" + powerGroup.getGroupId() + + ", reason=" + PowerManager.wakeReasonToString(reason) + ", uid=" + uid); } if (mForceSuspendActive || !mSystemReady) { return; @@ -2092,11 +2096,11 @@ public final class PowerManagerService extends SystemService @GuardedBy("mLock") private boolean dozePowerGroupLocked(final PowerGroup powerGroup, long eventTime, - int reason, int uid) { + @GoToSleepReason int reason, int uid) { if (DEBUG_SPEW) { Slog.d(TAG, "dozePowerGroup: eventTime=" + eventTime - + ", groupId=" + powerGroup.getGroupId() + ", reason=" + reason - + ", uid=" + uid); + + ", groupId=" + powerGroup.getGroupId() + + ", reason=" + PowerManager.sleepReasonToString(reason) + ", uid=" + uid); } if (!mSystemReady || !mBootCompleted) { @@ -2107,10 +2111,12 @@ public final class PowerManagerService extends SystemService } @GuardedBy("mLock") - private boolean sleepPowerGroupLocked(final PowerGroup powerGroup, long eventTime, int reason, - int uid) { + private boolean sleepPowerGroupLocked(final PowerGroup powerGroup, long eventTime, + @GoToSleepReason int reason, int uid) { if (DEBUG_SPEW) { - Slog.d(TAG, "sleepPowerGroup: eventTime=" + eventTime + ", uid=" + uid); + Slog.d(TAG, "sleepPowerGroup: eventTime=" + eventTime + + ", groupId=" + powerGroup.getGroupId() + + ", reason=" + PowerManager.sleepReasonToString(reason) + ", uid=" + uid); } if (!mBootCompleted || !mSystemReady) { return false; @@ -2172,7 +2178,10 @@ public final class PowerManagerService extends SystemService case WAKEFULNESS_DOZING: traceMethodName = "goToSleep"; Slog.i(TAG, "Going to sleep due to " + PowerManager.sleepReasonToString(reason) - + " (uid " + uid + ")..."); + + " (uid " + uid + ", screenOffTimeout=" + mScreenOffTimeoutSetting + + ", activityTimeoutWM=" + mUserActivityTimeoutOverrideFromWindowManager + + ", maxDimRatio=" + mMaximumScreenDimRatioConfig + + ", maxDimDur=" + mMaximumScreenDimDurationConfig + ")..."); mLastGlobalSleepTime = eventTime; mLastGlobalSleepReason = reason; mLastGlobalSleepTimeRealtime = mClock.elapsedRealtime(); @@ -4258,7 +4267,7 @@ public final class PowerManagerService extends SystemService void onUserActivity() { synchronized (mLock) { mPowerGroups.get(Display.DEFAULT_DISPLAY_GROUP).setLastUserActivityTimeLocked( - mClock.uptimeMillis()); + mClock.uptimeMillis(), PowerManager.USER_ACTIVITY_EVENT_OTHER); } } @@ -5646,7 +5655,8 @@ public final class PowerManagerService extends SystemService } @Override // Binder call - public void userActivity(int displayId, long eventTime, int event, int flags) { + public void userActivity(int displayId, long eventTime, + @PowerManager.UserActivityEvent int event, int flags) { final long now = mClock.uptimeMillis(); if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER) != PackageManager.PERMISSION_GRANTED diff --git a/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java b/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java index 5fdd006933ee..c6128f9f6cef 100644 --- a/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java +++ b/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java @@ -178,7 +178,7 @@ public class BatteryStatsImpl extends BatteryStats { // TODO: remove "tcp" from network methods, since we measure total stats. // Current on-disk Parcel version. Must be updated when the format of the parcelable changes - public static final int VERSION = 209; + public static final int VERSION = 210; // The maximum number of names wakelocks we will keep track of // per uid; once the limit is reached, we batch the remaining wakelocks @@ -5413,7 +5413,8 @@ public class BatteryStatsImpl extends BatteryStats { } @GuardedBy("this") - public void noteUserActivityLocked(int uid, int event, long elapsedRealtimeMs, long uptimeMs) { + public void noteUserActivityLocked(int uid, @PowerManager.UserActivityEvent int event, + long elapsedRealtimeMs, long uptimeMs) { if (mOnBatteryInternal) { uid = mapUid(uid); getUidStatsLocked(uid, elapsedRealtimeMs, uptimeMs).noteUserActivityLocked(event); @@ -8846,14 +8847,14 @@ public class BatteryStatsImpl extends BatteryStats { } @Override - public void noteUserActivityLocked(int type) { + public void noteUserActivityLocked(@PowerManager.UserActivityEvent int event) { if (mUserActivityCounters == null) { initUserActivityLocked(); } - if (type >= 0 && type < NUM_USER_ACTIVITY_TYPES) { - mUserActivityCounters[type].stepAtomic(); + if (event >= 0 && event < NUM_USER_ACTIVITY_TYPES) { + mUserActivityCounters[event].stepAtomic(); } else { - Slog.w(TAG, "Unknown user activity type " + type + " was specified.", + Slog.w(TAG, "Unknown user activity type " + event + " was specified.", new Throwable()); } } @@ -14965,6 +14966,18 @@ public class BatteryStatsImpl extends BatteryStats { } } + @GuardedBy("this") + private void dumpCpuPowerBracketsLocked(PrintWriter pw) { + pw.println("CPU power brackets; cluster/freq in MHz(avg current in mA):"); + final int bracketCount = mPowerProfile.getCpuPowerBracketCount(); + for (int bracket = 0; bracket < bracketCount; bracket++) { + pw.print(" "); + pw.print(bracket); + pw.print(": "); + pw.println(mPowerProfile.getCpuPowerBracketDescription(bracket)); + } + } + /** * Dump measured charge stats */ @@ -16297,6 +16310,9 @@ public class BatteryStatsImpl extends BatteryStats { dumpConstantsLocked(pw); pw.println(); + dumpCpuPowerBracketsLocked(pw); + + pw.println(); dumpMeasuredEnergyStatsLocked(pw); } diff --git a/services/core/java/com/android/server/rollback/Rollback.java b/services/core/java/com/android/server/rollback/Rollback.java index 38e6b2820ad8..85d93f4f76c4 100644 --- a/services/core/java/com/android/server/rollback/Rollback.java +++ b/services/core/java/com/android/server/rollback/Rollback.java @@ -52,7 +52,7 @@ import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.Preconditions; import com.android.server.LocalServices; import com.android.server.RescueParty; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import java.io.File; import java.io.IOException; diff --git a/services/core/java/com/android/server/timedetector/GnssTimeUpdateService.java b/services/core/java/com/android/server/timedetector/GnssTimeUpdateService.java index 88e9fa52fb1b..1fb7cf5249cc 100644 --- a/services/core/java/com/android/server/timedetector/GnssTimeUpdateService.java +++ b/services/core/java/com/android/server/timedetector/GnssTimeUpdateService.java @@ -18,19 +18,24 @@ package com.android.server.timedetector; import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.RequiresPermission; import android.app.AlarmManager; import android.content.Context; -import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.location.LocationManagerInternal; import android.location.LocationRequest; import android.location.LocationTime; import android.os.Binder; +import android.os.Handler; +import android.os.ResultReceiver; +import android.os.ShellCallback; import android.os.SystemClock; import android.os.TimestampedValue; +import android.util.LocalLog; import android.util.Log; +import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.DumpUtils; import com.android.server.FgThread; @@ -41,6 +46,7 @@ import java.io.FileDescriptor; import java.io.PrintWriter; import java.time.Duration; import java.util.Objects; +import java.util.concurrent.Executor; /** * Monitors the GNSS time. @@ -87,7 +93,7 @@ public final class GnssTimeUpdateService extends Binder { // Instead of polling GNSS time periodically, passive location updates are enabled. // Once an update is received, the gnss time will be queried and suggested to // TimeDetectorService. - mService.requestGnssTimeUpdates(); + mService.startGnssListeningInternal(); } } } @@ -95,15 +101,28 @@ public final class GnssTimeUpdateService extends Binder { private static final Duration GNSS_TIME_UPDATE_ALARM_INTERVAL = Duration.ofHours(4); private static final String ATTRIBUTION_TAG = "GnssTimeUpdateService"; + /** + * A log that records the decisions to fetch a GNSS time update. + * This is logged in bug reports to assist with debugging issues with GNSS time suggestions. + */ + private final LocalLog mLocalLog = new LocalLog(10, false /* useLocalTimestamps */); + /** The executor used for async operations */ + private final Executor mExecutor = FgThread.getExecutor(); + /** The handler used for async operations */ + private final Handler mHandler = FgThread.getHandler(); + private final Context mContext; private final TimeDetectorInternal mTimeDetectorInternal; private final AlarmManager mAlarmManager; private final LocationManager mLocationManager; private final LocationManagerInternal mLocationManagerInternal; - @Nullable private AlarmManager.OnAlarmListener mAlarmListener; - @Nullable private LocationListener mLocationListener; - @Nullable private TimestampedValue<Long> mLastSuggestedGnssTime; + + private final Object mLock = new Object(); + @GuardedBy("mLock") @Nullable private AlarmManager.OnAlarmListener mAlarmListener; + @GuardedBy("mLock") @Nullable private LocationListener mLocationListener; + + @Nullable private volatile TimestampedValue<Long> mLastSuggestedGnssTime; @VisibleForTesting GnssTimeUpdateService(@NonNull Context context, @NonNull AlarmManager alarmManager, @@ -118,87 +137,133 @@ public final class GnssTimeUpdateService extends Binder { } /** - * Request passive location updates. Such a request will not trigger any active locations or - * power usage itself. + * Used by {@link com.android.server.timedetector.GnssTimeUpdateServiceShellCommand} to force + * the service into GNSS listening mode. */ - @VisibleForTesting - void requestGnssTimeUpdates() { - if (D) { - Log.d(TAG, "requestGnssTimeUpdates()"); + @RequiresPermission(android.Manifest.permission.SET_TIME) + boolean startGnssListening() { + mContext.enforceCallingPermission( + android.Manifest.permission.SET_TIME, "Start GNSS listening"); + mLocalLog.log("startGnssListening() called"); + + final long token = Binder.clearCallingIdentity(); + try { + return startGnssListeningInternal(); + } finally { + Binder.restoreCallingIdentity(token); } + } + /** + * Starts listening for passive location updates. Such a request will not trigger any active + * locations or power usage itself. Returns {@code true} if the service is listening after the + * method returns and {@code false} otherwise. At present this method only returns {@code false} + * if there is no GPS provider on the device. + * + * <p>If the service is already listening for locations this is a no-op. If the device is in a + * "sleeping" state between listening periods then it will return to listening. + */ + @VisibleForTesting + boolean startGnssListeningInternal() { if (!mLocationManager.hasProvider(LocationManager.GPS_PROVIDER)) { - Log.e(TAG, "GPS provider does not exist on this device"); - return; + logError("GPS provider does not exist on this device"); + return false; } - // Location Listener triggers onLocationChanged() when GNSS data is available, so - // that the getGnssTimeMillis() function doesn't need to be continuously polled. - mLocationListener = new LocationListener() { - @Override - public void onLocationChanged(Location location) { - if (D) { - Log.d(TAG, "onLocationChanged()"); - } - - // getGnssTimeMillis() can return null when the Master Location Switch for the - // foreground user is disabled. - LocationTime locationTime = mLocationManagerInternal.getGnssTimeMillis(); - if (locationTime != null) { - suggestGnssTime(locationTime); - } else { - if (D) { - Log.d(TAG, "getGnssTimeMillis() returned null"); - } - } - - mLocationManager.removeUpdates(mLocationListener); - mLocationListener = null; + synchronized (mLock) { + if (mLocationListener != null) { + logDebug("Already listening for GNSS updates"); + return true; + } - mAlarmListener = new AlarmManager.OnAlarmListener() { - @Override - public void onAlarm() { - if (D) { - Log.d(TAG, "onAlarm()"); - } - mAlarmListener = null; - requestGnssTimeUpdates(); - } - }; - - // Set next alarm to re-enable location updates. - long next = SystemClock.elapsedRealtime() - + GNSS_TIME_UPDATE_ALARM_INTERVAL.toMillis(); - mAlarmManager.set( - AlarmManager.ELAPSED_REALTIME_WAKEUP, - next, - TAG, - mAlarmListener, - FgThread.getHandler()); + // If startGnssListening() is called during manual tests to jump back into location + // listening then there will usually be an alarm set. + if (mAlarmListener != null) { + mAlarmManager.cancel(mAlarmListener); + mAlarmListener = null; } - }; + startGnssListeningLocked(); + return true; + } + } + + @GuardedBy("mLock") + private void startGnssListeningLocked() { + logDebug("startGnssListeningLocked()"); + + // Location Listener triggers onLocationChanged() when GNSS data is available, so + // that the getGnssTimeMillis() function doesn't need to be continuously polled. + mLocationListener = location -> handleLocationAvailable(); mLocationManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, new LocationRequest.Builder(LocationRequest.PASSIVE_INTERVAL) .setMinUpdateIntervalMillis(0) .build(), - FgThread.getExecutor(), + mExecutor, mLocationListener); } + private void handleLocationAvailable() { + logDebug("handleLocationAvailable()"); + + // getGnssTimeMillis() can return null when the Master Location Switch for the + // foreground user is disabled. + LocationTime locationTime = mLocationManagerInternal.getGnssTimeMillis(); + if (locationTime != null) { + String msg = "Passive location time received: " + locationTime; + logDebug(msg); + mLocalLog.log(msg); + suggestGnssTime(locationTime); + } else { + logDebug("getGnssTimeMillis() returned null"); + } + + synchronized (mLock) { + if (mLocationListener == null) { + logWarning("mLocationListener unexpectedly null"); + } else { + mLocationManager.removeUpdates(mLocationListener); + mLocationListener = null; + } + + if (mAlarmListener != null) { + logWarning("mAlarmListener was unexpectedly non-null"); + mAlarmManager.cancel(mAlarmListener); + } + + // Set next alarm to re-enable location updates. + long next = SystemClock.elapsedRealtime() + + GNSS_TIME_UPDATE_ALARM_INTERVAL.toMillis(); + mAlarmListener = this::handleAlarmFired; + mAlarmManager.set( + AlarmManager.ELAPSED_REALTIME_WAKEUP, + next, + TAG, + mAlarmListener, + mHandler); + } + } + + private void handleAlarmFired() { + logDebug("handleAlarmFired()"); + + synchronized (mLock) { + mAlarmListener = null; + startGnssListeningLocked(); + } + } + /** * Convert LocationTime to TimestampedValue. Then suggest TimestampedValue to Time Detector. */ private void suggestGnssTime(LocationTime locationTime) { - if (D) { - Log.d(TAG, "suggestGnssTime()"); - } + logDebug("suggestGnssTime()"); + long gnssTime = locationTime.getTime(); long elapsedRealtimeMs = locationTime.getElapsedRealtimeNanos() / 1_000_000L; - TimestampedValue<Long> timeSignal = new TimestampedValue<>( - elapsedRealtimeMs, gnssTime); + TimestampedValue<Long> timeSignal = new TimestampedValue<>(elapsedRealtimeMs, gnssTime); mLastSuggestedGnssTime = timeSignal; GnssTimeSuggestion timeSuggestion = new GnssTimeSuggestion(timeSignal); @@ -209,11 +274,38 @@ public final class GnssTimeUpdateService extends Binder { protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return; pw.println("mLastSuggestedGnssTime: " + mLastSuggestedGnssTime); - pw.print("state: "); - if (mLocationListener != null) { - pw.println("time updates enabled"); - } else { - pw.println("alarm enabled"); + synchronized (mLock) { + pw.print("state: "); + if (mLocationListener != null) { + pw.println("time updates enabled"); + } else { + pw.println("alarm enabled"); + } + } + pw.println("Log:"); + mLocalLog.dump(pw); + } + + @Override + public void onShellCommand(FileDescriptor in, FileDescriptor out, FileDescriptor err, + String[] args, ShellCallback callback, ResultReceiver resultReceiver) { + new GnssTimeUpdateServiceShellCommand(this).exec( + this, in, out, err, args, callback, resultReceiver); + } + + private void logError(String msg) { + Log.e(TAG, msg); + mLocalLog.log(msg); + } + + private void logWarning(String msg) { + Log.w(TAG, msg); + mLocalLog.log(msg); + } + + private void logDebug(String msg) { + if (D) { + Log.d(TAG, msg); } } } diff --git a/services/core/java/com/android/server/timedetector/GnssTimeUpdateServiceShellCommand.java b/services/core/java/com/android/server/timedetector/GnssTimeUpdateServiceShellCommand.java new file mode 100644 index 000000000000..e757578be9e5 --- /dev/null +++ b/services/core/java/com/android/server/timedetector/GnssTimeUpdateServiceShellCommand.java @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2022 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.timedetector; + +import android.annotation.NonNull; +import android.os.ShellCommand; + +import java.io.PrintWriter; +import java.util.Objects; + +/** Implements the shell command interface for {@link GnssTimeUpdateService}. */ +class GnssTimeUpdateServiceShellCommand extends ShellCommand { + + /** + * The name of the service. + */ + private static final String SHELL_COMMAND_SERVICE_NAME = "gnss_time_update_service"; + + /** + * A shell command that forces the service in to GNSS listening mode if it isn't already. + */ + private static final String SHELL_COMMAND_START_GNSS_LISTENING = "start_gnss_listening"; + + @NonNull + private final GnssTimeUpdateService mGnssTimeUpdateService; + + GnssTimeUpdateServiceShellCommand(GnssTimeUpdateService gnssTimeUpdateService) { + mGnssTimeUpdateService = Objects.requireNonNull(gnssTimeUpdateService); + } + + @Override + public int onCommand(String cmd) { + if (cmd == null) { + return handleDefaultCommands(cmd); + } + + switch (cmd) { + case SHELL_COMMAND_START_GNSS_LISTENING: + return runStartGnssListening(); + default: { + return handleDefaultCommands(cmd); + } + } + } + + private int runStartGnssListening() { + boolean success = mGnssTimeUpdateService.startGnssListening(); + getOutPrintWriter().println(success); + return 0; + } + + @Override + public void onHelp() { + final PrintWriter pw = getOutPrintWriter(); + pw.printf("Network Time Update Service (%s) commands:\n", SHELL_COMMAND_SERVICE_NAME); + pw.printf(" help\n"); + pw.printf(" Print this help text.\n"); + pw.printf(" %s\n", SHELL_COMMAND_START_GNSS_LISTENING); + pw.printf(" Forces the service in to GNSS listening mode (if it isn't already).\n"); + pw.printf(" Prints true if the service is listening after this command.\n"); + pw.println(); + } +} diff --git a/services/core/java/com/android/server/wm/ActivityClientController.java b/services/core/java/com/android/server/wm/ActivityClientController.java index cceb58d74562..ffe24c07f1d3 100644 --- a/services/core/java/com/android/server/wm/ActivityClientController.java +++ b/services/core/java/com/android/server/wm/ActivityClientController.java @@ -87,7 +87,7 @@ import com.android.internal.protolog.common.ProtoLog; import com.android.server.LocalServices; import com.android.server.Watchdog; import com.android.server.pm.KnownPackages; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.uri.NeededUriGrants; import com.android.server.vr.VrManagerInternal; diff --git a/services/core/java/com/android/server/wm/ActivityStartController.java b/services/core/java/com/android/server/wm/ActivityStartController.java index 037cd8edfa39..d131457cb9a2 100644 --- a/services/core/java/com/android/server/wm/ActivityStartController.java +++ b/services/core/java/com/android/server/wm/ActivityStartController.java @@ -387,6 +387,14 @@ public class ActivityStartController { callingUid, realCallingUid, UserHandle.USER_NULL); final SparseArray<String> startingUidPkgs = new SparseArray<>(); final long origId = Binder.clearCallingIdentity(); + + SafeActivityOptions bottomOptions = null; + if (options != null) { + // To ensure the first N-1 activities (N == total # of activities) are also launched + // into the correct display, use a copy of the passed-in options (keeping only + // display-related info) for these activities. + bottomOptions = options.selectiveCloneDisplayOptions(); + } try { intents = ArrayUtils.filterNotNull(intents, Intent[]::new); final ActivityStarter[] starters = new ActivityStarter[intents.length]; @@ -435,7 +443,7 @@ public class ActivityStartController { final boolean top = i == intents.length - 1; final SafeActivityOptions checkedOptions = top ? options - : null; + : bottomOptions; starters[i] = obtainStarter(intent, reason) .setIntentGrants(intentGrants) .setCaller(caller) diff --git a/services/core/java/com/android/server/wm/AnrController.java b/services/core/java/com/android/server/wm/AnrController.java index e0ac37ae0fe4..01098dedea6e 100644 --- a/services/core/java/com/android/server/wm/AnrController.java +++ b/services/core/java/com/android/server/wm/AnrController.java @@ -19,6 +19,7 @@ package com.android.server.wm; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; import static com.android.server.wm.ActivityRecord.INVALID_PID; +import static com.android.server.wm.ActivityTaskManagerService.getInputDispatchingTimeoutMillisLocked; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import android.annotation.NonNull; @@ -72,6 +73,33 @@ class AnrController { + ". Dropping notifyNoFocusedWindowAnr request"); return; } + + // App is unresponsive, but we are actively trying to give focus to a window. + // Blame the window if possible since the window may not belong to the app. + DisplayContent display = mService.mRoot.getDisplayContent(activity.getDisplayId()); + IBinder focusToken = display == null ? null : display.getInputMonitor().mInputFocus; + InputTarget focusTarget = mService.getInputTargetFromToken(focusToken); + + if (focusTarget != null) { + // Check if we have a recent focus request, newer than the dispatch timeout, then + // ignore the focus request. + WindowState targetWindowState = focusTarget.getWindowState(); + boolean requestIsValid = SystemClock.uptimeMillis() + - display.getInputMonitor().mInputFocusRequestTimeMillis + >= getInputDispatchingTimeoutMillisLocked( + targetWindowState.getActivityRecord()); + + if (requestIsValid) { + if (notifyWindowUnresponsive(focusToken, timeoutRecord)) { + Slog.i(TAG_WM, "Blamed " + focusTarget.getWindowState().getName() + + " using pending focus request. Focused activity: " + + activity.getName()); + return; + } + } + } + + Slog.i(TAG_WM, "ANR in " + activity.getName() + ". Reason: " + timeoutRecord.mReason); dumpAnrStateLocked(activity, null /* windowState */, timeoutRecord.mReason); mUnresponsiveAppByDisplay.put(activity.getDisplayId(), activity); @@ -208,6 +236,7 @@ class AnrController { } } mService.mAmInternal.inputDispatchingResumed(unresponsiveApp.getPid()); + mUnresponsiveAppByDisplay.remove(newFocus.getDisplayId()); } /** diff --git a/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java b/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java index 3e6e06a27fdc..14a1cd011ad6 100644 --- a/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java +++ b/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java @@ -218,6 +218,12 @@ final class ImeInsetsSourceProvider extends WindowContainerInsetsSourceProvider if (dcTarget == null || mImeRequester == null) { return false; } + // Not ready to show if there is no IME control target. + final InsetsControlTarget controlTarget = mDisplayContent.getImeTarget(IME_TARGET_CONTROL); + if (controlTarget == null) { + return false; + } + ProtoLog.d(WM_DEBUG_IME, "dcTarget: %s mImeRequester: %s", dcTarget.getWindow().getName(), mImeRequester.getWindow() == null ? mImeRequester : mImeRequester.getWindow().getName()); diff --git a/services/core/java/com/android/server/wm/InputMonitor.java b/services/core/java/com/android/server/wm/InputMonitor.java index 610ce3540858..7860b1530e92 100644 --- a/services/core/java/com/android/server/wm/InputMonitor.java +++ b/services/core/java/com/android/server/wm/InputMonitor.java @@ -52,6 +52,7 @@ import android.graphics.Region; import android.os.Handler; import android.os.IBinder; import android.os.InputConfig; +import android.os.SystemClock; import android.os.Trace; import android.os.UserHandle; import android.util.ArrayMap; @@ -77,7 +78,8 @@ final class InputMonitor { private final WindowManagerService mService; // Current input focus token for keys and other non-touch events. May be null. - private IBinder mInputFocus = null; + IBinder mInputFocus = null; + long mInputFocusRequestTimeMillis = 0; // When true, need to call updateInputWindowsLw(). private boolean mUpdateInputWindowsNeeded = true; @@ -479,6 +481,7 @@ final class InputMonitor { } mInputFocus = focusToken; + mInputFocusRequestTimeMillis = SystemClock.uptimeMillis(); mInputTransaction.setFocusedWindow(mInputFocus, windowName, mDisplayId); EventLog.writeEvent(LOGTAG_INPUT_FOCUS, "Focus request " + windowName, "reason=UpdateInputWindows"); diff --git a/services/core/java/com/android/server/wm/SafeActivityOptions.java b/services/core/java/com/android/server/wm/SafeActivityOptions.java index d92a1f495917..a638784390b6 100644 --- a/services/core/java/com/android/server/wm/SafeActivityOptions.java +++ b/services/core/java/com/android/server/wm/SafeActivityOptions.java @@ -118,6 +118,34 @@ public class SafeActivityOptions { } /** + * To ensure that two activities, one using this object, and the other using the + * SafeActivityOptions returned from this function, are launched into the same display through + * ActivityStartController#startActivities, all display-related information, i.e. + * displayAreaToken, launchDisplayId and callerDisplayId, are cloned. + */ + @Nullable SafeActivityOptions selectiveCloneDisplayOptions() { + final ActivityOptions options = cloneLaunchingDisplayOptions(mOriginalOptions); + final ActivityOptions callerOptions = cloneLaunchingDisplayOptions(mCallerOptions); + if (options == null && callerOptions == null) { + return null; + } + + final SafeActivityOptions safeOptions = new SafeActivityOptions(options, + mOriginalCallingPid, mOriginalCallingUid); + safeOptions.mCallerOptions = callerOptions; + safeOptions.mRealCallingPid = mRealCallingPid; + safeOptions.mRealCallingUid = mRealCallingUid; + return safeOptions; + } + + private ActivityOptions cloneLaunchingDisplayOptions(ActivityOptions options) { + return options == null ? null : ActivityOptions.makeBasic() + .setLaunchTaskDisplayArea(options.getLaunchTaskDisplayArea()) + .setLaunchDisplayId(options.getLaunchDisplayId()) + .setCallerDisplayId((options.getCallerDisplayId())); + } + + /** * Overrides options with options from a caller and records {@link Binder#getCallingPid}/ * {@link Binder#getCallingUid}. Thus, calling identity MUST NOT be cleared when calling this * method. diff --git a/services/core/java/com/android/server/wm/TaskFragment.java b/services/core/java/com/android/server/wm/TaskFragment.java index 1f6690ac5c51..f784f7105bfe 100644 --- a/services/core/java/com/android/server/wm/TaskFragment.java +++ b/services/core/java/com/android/server/wm/TaskFragment.java @@ -97,7 +97,7 @@ import com.android.internal.protolog.common.ProtoLog; import com.android.internal.util.function.pooled.PooledLambda; import com.android.internal.util.function.pooled.PooledPredicate; import com.android.server.am.HostingRecord; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import java.io.FileDescriptor; import java.io.PrintWriter; diff --git a/services/core/java/com/android/server/wm/Transition.java b/services/core/java/com/android/server/wm/Transition.java index 75d6647982bd..32b753241cab 100644 --- a/services/core/java/com/android/server/wm/Transition.java +++ b/services/core/java/com/android/server/wm/Transition.java @@ -2120,8 +2120,12 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe Slog.w(TAG, "Failed to capture screenshot for " + wc); return false; } + final boolean isDisplayRotation = wc.asDisplayContent() != null + && wc.asDisplayContent().isRotationChanging(); + // Some tests may check the name "RotationLayer" to detect display rotation. + final String name = isDisplayRotation ? "RotationLayer" : "transition snapshot: " + wc; SurfaceControl snapshotSurface = wc.makeAnimationLeash() - .setName("transition snapshot: " + wc.toString()) + .setName(name) .setOpaque(true) .setParent(wc.getSurfaceControl()) .setSecure(screenshotBuffer.containsSecureLayers()) @@ -2131,9 +2135,8 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe mFrozen.add(wc); final ChangeInfo changeInfo = Objects.requireNonNull(mChanges.get(wc)); changeInfo.mSnapshot = snapshotSurface; - if (wc.asDisplayContent() != null) { - // This isn't cheap, so only do it for rotations: assume display-level is rotate - // since most of the time it is. + if (isDisplayRotation) { + // This isn't cheap, so only do it for display rotations. changeInfo.mSnapshotLuma = RotationAnimationUtils.getMedianBorderLuma( screenshotBuffer.getHardwareBuffer(), screenshotBuffer.getColorSpace()); } diff --git a/services/core/jni/com_android_server_companion_virtual_InputController.cpp b/services/core/jni/com_android_server_companion_virtual_InputController.cpp index 8197b67355d4..daca1531d41f 100644 --- a/services/core/jni/com_android_server_companion_virtual_InputController.cpp +++ b/services/core/jni/com_android_server_companion_virtual_InputController.cpp @@ -21,6 +21,7 @@ #include <android/keycodes.h> #include <errno.h> #include <fcntl.h> +#include <input/Input.h> #include <linux/uinput.h> #include <math.h> #include <nativehelper/JNIHelp.h> @@ -271,6 +272,14 @@ static int openUinput(const char* readableName, jint vendorId, jint productId, c ALOGE("Error creating touchscreen uinput pressure axis: %s", strerror(errno)); return -errno; } + uinput_abs_setup slotAbsSetup; + slotAbsSetup.code = ABS_MT_SLOT; + slotAbsSetup.absinfo.maximum = MAX_POINTERS; + slotAbsSetup.absinfo.minimum = 0; + if (ioctl(fd, UI_ABS_SETUP, &slotAbsSetup) != 0) { + ALOGE("Error creating touchscreen uinput slots: %s", strerror(errno)); + return -errno; + } } if (ioctl(fd, UI_DEV_SETUP, &setup) != 0) { ALOGE("Error creating uinput device: %s", strerror(errno)); diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp index 891bc0f06f2c..78b4ce222dd3 100644 --- a/services/core/jni/com_android_server_input_InputManagerService.cpp +++ b/services/core/jni/com_android_server_input_InputManagerService.cpp @@ -2090,6 +2090,14 @@ static jint nativeGetBatteryStatus(JNIEnv* env, jobject nativeImplObj, jint devi return static_cast<jint>(ret.value_or(BATTERY_STATUS_UNKNOWN)); } +static jstring nativeGetBatteryDevicePath(JNIEnv* env, jobject nativeImplObj, jint deviceId) { + NativeInputManager* im = getNativeInputManager(env, nativeImplObj); + + const std::optional<std::string> batteryPath = + im->getInputManager()->getReader().getBatteryDevicePath(deviceId); + return batteryPath ? env->NewStringUTF(batteryPath->c_str()) : nullptr; +} + static void nativeReloadKeyboardLayouts(JNIEnv* env, jobject nativeImplObj) { NativeInputManager* im = getNativeInputManager(env, nativeImplObj); @@ -2371,6 +2379,7 @@ static const JNINativeMethod gInputManagerMethods[] = { {"setLightColor", "(III)V", (void*)nativeSetLightColor}, {"getBatteryCapacity", "(I)I", (void*)nativeGetBatteryCapacity}, {"getBatteryStatus", "(I)I", (void*)nativeGetBatteryStatus}, + {"getBatteryDevicePath", "(I)Ljava/lang/String;", (void*)nativeGetBatteryDevicePath}, {"reloadKeyboardLayouts", "()V", (void*)nativeReloadKeyboardLayouts}, {"reloadDeviceAliases", "()V", (void*)nativeReloadDeviceAliases}, {"dump", "()Ljava/lang/String;", (void*)nativeDump}, diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index c9fa84ca1acf..bb6bd4aa1bbc 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -375,7 +375,7 @@ import com.android.server.pm.RestrictionsSet; import com.android.server.pm.UserManagerInternal; import com.android.server.pm.UserManagerInternal.UserRestrictionsListener; import com.android.server.pm.UserRestrictionsUtils; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.storage.DeviceStorageMonitorInternal; import com.android.server.uri.NeededUriGrants; import com.android.server.uri.UriGrantsManagerInternal; @@ -10220,6 +10220,11 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { ApplicationInfo applicationInfo = mIPackageManager.getApplicationInfo( enabledPackage, PackageManager.MATCH_UNINSTALLED_PACKAGES, userIdToCheck); + + if (applicationInfo == null) { + return false; + } + systemService = (applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0; } catch (RemoteException e) { Slogf.i(LOG_TAG, "Can't talk to package managed", e); @@ -15408,24 +15413,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { } } - final String[] feature_allow = - { DevicePolicyManager.ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_ALLOWED }; - final String[] feature_disallow = - { DevicePolicyManager.ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_DISALLOWED }; - - boolean compatible = true; - for (Account account : accounts) { - if (hasAccountFeatures(am, account, feature_disallow)) { - Slogf.e(LOG_TAG, "%s has %s", account, feature_disallow[0]); - compatible = false; - break; - } - if (!hasAccountFeatures(am, account, feature_allow)) { - Slogf.e(LOG_TAG, "%s doesn't have %s", account, feature_allow[0]); - compatible = false; - break; - } - } + boolean compatible = !hasIncompatibleAccounts(am, accounts); if (compatible) { Slogf.w(LOG_TAG, "All accounts are compatible"); } else { @@ -15435,6 +15423,27 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { }); } + private boolean hasIncompatibleAccounts(AccountManager am, Account[] accounts) { + // TODO(b/244284408): Add test + final String[] feature_allow = + { DevicePolicyManager.ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_ALLOWED }; + final String[] feature_disallow = + { DevicePolicyManager.ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_DISALLOWED }; + + for (Account account : accounts) { + if (hasAccountFeatures(am, account, feature_disallow)) { + Slogf.e(LOG_TAG, "%s has %s", account, feature_disallow[0]); + return true; + } + if (!hasAccountFeatures(am, account, feature_allow)) { + Slogf.e(LOG_TAG, "%s doesn't have %s", account, feature_allow[0]); + return true; + } + } + + return false; + } + private boolean hasAccountFeatures(AccountManager am, Account account, String[] features) { try { return am.hasFeatures(account, features, null, null).getResult(); @@ -18698,7 +18707,10 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { } AccountManager am = AccountManager.get(mContext); Account[] accounts = am.getAccounts(); - return accounts.length == 0; + if (accounts.length == 0) { + return true; + } + return !hasIncompatibleAccounts(am, accounts); } private void setBypassDevicePolicyManagementRoleQualificationStateInternal( diff --git a/services/robotests/src/com/android/server/pm/CrossProfileAppsServiceImplRoboTest.java b/services/robotests/src/com/android/server/pm/CrossProfileAppsServiceImplRoboTest.java index df1d244ab879..3ef8586a83cf 100644 --- a/services/robotests/src/com/android/server/pm/CrossProfileAppsServiceImplRoboTest.java +++ b/services/robotests/src/com/android/server/pm/CrossProfileAppsServiceImplRoboTest.java @@ -60,9 +60,9 @@ import androidx.test.core.app.ApplicationProvider; import com.android.internal.util.FunctionalUtils.ThrowingRunnable; import com.android.internal.util.FunctionalUtils.ThrowingSupplier; import com.android.server.LocalServices; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.PackageImpl; import com.android.server.pm.parsing.pkg.ParsedPackage; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.testing.shadows.ShadowApplicationPackageManager; import com.android.server.testing.shadows.ShadowUserManager; import com.android.server.wm.ActivityTaskManagerInternal; diff --git a/services/tests/PackageManagerComponentOverrideTests/src/com/android/server/pm/test/override/PackageManagerComponentLabelIconOverrideTest.kt b/services/tests/PackageManagerComponentOverrideTests/src/com/android/server/pm/test/override/PackageManagerComponentLabelIconOverrideTest.kt index 9c0f71364354..f3ac7d55c5db 100644 --- a/services/tests/PackageManagerComponentOverrideTests/src/com/android/server/pm/test/override/PackageManagerComponentLabelIconOverrideTest.kt +++ b/services/tests/PackageManagerComponentOverrideTests/src/com/android/server/pm/test/override/PackageManagerComponentLabelIconOverrideTest.kt @@ -21,14 +21,25 @@ import android.content.ComponentName import android.content.Context import android.content.pm.ApplicationInfo import android.content.pm.PackageManager -import com.android.server.pm.pkg.component.ParsedActivity import android.os.Binder import android.os.UserHandle import android.util.ArrayMap -import com.android.server.pm.* -import com.android.server.pm.parsing.pkg.AndroidPackage +import com.android.server.pm.AppsFilterImpl +import com.android.server.pm.PackageManagerService +import com.android.server.pm.PackageManagerServiceInjector +import com.android.server.pm.PackageManagerServiceTestParams +import com.android.server.pm.PackageManagerTracedLock +import com.android.server.pm.PackageSetting +import com.android.server.pm.PendingPackageBroadcasts +import com.android.server.pm.Settings +import com.android.server.pm.SharedLibrariesImpl +import com.android.server.pm.UserManagerInternal +import com.android.server.pm.UserManagerService +import com.android.server.pm.parsing.pkg.AndroidPackageInternal import com.android.server.pm.parsing.pkg.PackageImpl import com.android.server.pm.parsing.pkg.ParsedPackage +import com.android.server.pm.pkg.AndroidPackage +import com.android.server.pm.pkg.component.ParsedActivity import com.android.server.pm.resolution.ComponentResolver import com.android.server.pm.snapshot.PackageDataSnapshot import com.android.server.pm.test.override.PackageManagerComponentLabelIconOverrideTest.Companion.Params.AppType @@ -168,7 +179,7 @@ class PackageManagerComponentLabelIconOverrideTest { lateinit var params: Params private lateinit var mockPendingBroadcasts: PendingPackageBroadcasts - private lateinit var mockPkg: AndroidPackage + private lateinit var mockPkg: AndroidPackageInternal private lateinit var mockPkgSetting: PackageSetting private lateinit var service: PackageManagerService @@ -287,7 +298,7 @@ class PackageManagerComponentLabelIconOverrideTest { .apply(block) .hideAsFinal() - private fun makePkgSetting(pkgName: String, pkg: AndroidPackage) = + private fun makePkgSetting(pkgName: String, pkg: AndroidPackageInternal) = PackageSetting( pkgName, null, File("/test"), null, null, null, null, 0, 0, 0, 0, null, null, null, null, null, @@ -297,7 +308,7 @@ class PackageManagerComponentLabelIconOverrideTest { this.flags = this.flags or ApplicationInfo.FLAG_SYSTEM } this.pkgState.isUpdatedSystemApp = params.isUpdatedSystemApp - this.pkg = pkg + setPkg(pkg) } private fun makeTestData() { diff --git a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/parsing/parcelling/AndroidPackageTest.kt b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/parsing/parcelling/AndroidPackageTest.kt index 391dd36fc989..5361041c4aff 100644 --- a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/parsing/parcelling/AndroidPackageTest.kt +++ b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/parsing/parcelling/AndroidPackageTest.kt @@ -31,8 +31,8 @@ import android.util.ArraySet import android.util.SparseArray import android.util.SparseIntArray import com.android.internal.R -import com.android.server.pm.parsing.pkg.AndroidPackage import com.android.server.pm.parsing.pkg.PackageImpl +import com.android.server.pm.pkg.AndroidPackage import com.android.server.pm.pkg.component.ParsedActivityImpl import com.android.server.pm.pkg.component.ParsedApexSystemServiceImpl import com.android.server.pm.pkg.component.ParsedAttributionImpl diff --git a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationCollectorTest.kt b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationCollectorTest.kt index 652dc38fa6ed..766ab94e8587 100644 --- a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationCollectorTest.kt +++ b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationCollectorTest.kt @@ -18,14 +18,15 @@ package com.android.server.pm.test.verify.domain import android.content.Intent import android.content.pm.ApplicationInfo -import com.android.server.pm.pkg.component.ParsedActivityImpl -import com.android.server.pm.pkg.component.ParsedIntentInfoImpl import android.os.Build import android.os.PatternMatcher import android.util.ArraySet import com.android.server.SystemConfig import com.android.server.compat.PlatformCompat -import com.android.server.pm.parsing.pkg.AndroidPackage +import com.android.server.pm.parsing.pkg.AndroidPackageInternal +import com.android.server.pm.pkg.AndroidPackage +import com.android.server.pm.pkg.component.ParsedActivityImpl +import com.android.server.pm.pkg.component.ParsedIntentInfoImpl import com.android.server.pm.verify.domain.DomainVerificationCollector import com.android.server.testutils.mockThrowOnUnmocked import com.android.server.testutils.whenever @@ -87,7 +88,7 @@ class DomainVerificationCollectorTest { @Test fun verifyV1NoValidIntentFilter() { - val pkg = mockThrowOnUnmocked<AndroidPackage> { + val pkg = mockThrowOnUnmocked<AndroidPackageInternal> { whenever(packageName) { TEST_PKG_NAME } whenever(targetSdkVersion) { Build.VERSION_CODES.R } diff --git a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationEnforcerTest.kt b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationEnforcerTest.kt index c9601de6ff26..e4d124e89f98 100644 --- a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationEnforcerTest.kt +++ b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationEnforcerTest.kt @@ -29,7 +29,8 @@ import android.util.IndentingPrintWriter import android.util.SparseArray import androidx.test.platform.app.InstrumentationRegistry import com.android.server.pm.Computer -import com.android.server.pm.parsing.pkg.AndroidPackage +import com.android.server.pm.parsing.pkg.AndroidPackageInternal +import com.android.server.pm.pkg.AndroidPackage import com.android.server.pm.pkg.PackageStateInternal import com.android.server.pm.pkg.PackageUserStateInternal import com.android.server.pm.pkg.component.ParsedActivityImpl @@ -303,7 +304,7 @@ class DomainVerificationEnforcerTest { ) } - fun mockPkg(packageName: String) = mockThrowOnUnmocked<AndroidPackage> { + fun mockPkg(packageName: String) = mockThrowOnUnmocked<AndroidPackageInternal> { whenever(this.packageName) { packageName } whenever(targetSdkVersion) { Build.VERSION_CODES.S } whenever(isEnabled) { true } diff --git a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationManagerApiTest.kt b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationManagerApiTest.kt index 7273b0b54e1e..c22bb53f62d3 100644 --- a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationManagerApiTest.kt +++ b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationManagerApiTest.kt @@ -29,7 +29,8 @@ import android.os.PatternMatcher import android.os.Process import android.util.ArraySet import android.util.SparseArray -import com.android.server.pm.parsing.pkg.AndroidPackage +import com.android.server.pm.parsing.pkg.AndroidPackageInternal +import com.android.server.pm.pkg.AndroidPackage import com.android.server.pm.pkg.PackageStateInternal import com.android.server.pm.pkg.PackageUserStateInternal import com.android.server.pm.pkg.component.ParsedActivityImpl @@ -520,7 +521,7 @@ class DomainVerificationManagerApiTest { pkgUserState1: PackageStateInternal.() -> PackageUserStateInternal = { PackageUserStateInternal.DEFAULT } ) = mockThrowOnUnmocked<PackageStateInternal> { - val pkg = mockThrowOnUnmocked<AndroidPackage> { + val pkg = mockThrowOnUnmocked<AndroidPackageInternal> { whenever(packageName) { pkgName } whenever(targetSdkVersion) { Build.VERSION_CODES.S } whenever(isEnabled) { true } diff --git a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationPackageTest.kt b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationPackageTest.kt index ed60c5064eb1..e55ff3b7c229 100644 --- a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationPackageTest.kt +++ b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationPackageTest.kt @@ -37,7 +37,8 @@ import android.util.ArraySet import android.util.SparseArray import android.util.Xml import com.android.server.pm.Computer -import com.android.server.pm.parsing.pkg.AndroidPackage +import com.android.server.pm.parsing.pkg.AndroidPackageInternal +import com.android.server.pm.pkg.AndroidPackage import com.android.server.pm.pkg.PackageStateInternal import com.android.server.pm.pkg.PackageUserStateInternal import com.android.server.pm.pkg.component.ParsedActivityImpl @@ -1046,7 +1047,7 @@ class DomainVerificationPackageTest { otherDomains: List<String> = listOf(), isSystemApp: Boolean = false ) = mockThrowOnUnmocked<PackageStateInternal> { - val pkg = mockThrowOnUnmocked<AndroidPackage> { + val pkg = mockThrowOnUnmocked<AndroidPackageInternal> { whenever(packageName) { pkgName } whenever(targetSdkVersion) { Build.VERSION_CODES.S } whenever(isEnabled) { true } diff --git a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationProxyTest.kt b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationProxyTest.kt index 0a54094b4b85..b985c0432850 100644 --- a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationProxyTest.kt +++ b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationProxyTest.kt @@ -29,7 +29,7 @@ import android.os.Bundle import android.os.UserHandle import android.util.ArraySet import com.android.server.DeviceIdleInternal -import com.android.server.pm.parsing.pkg.AndroidPackage +import com.android.server.pm.pkg.AndroidPackage import com.android.server.pm.verify.domain.DomainVerificationCollector import com.android.server.pm.verify.domain.DomainVerificationManagerInternal import com.android.server.pm.verify.domain.proxy.DomainVerificationProxy diff --git a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationSettingsMutationTest.kt b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationSettingsMutationTest.kt index fc20c2657b97..427b5b3494b2 100644 --- a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationSettingsMutationTest.kt +++ b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationSettingsMutationTest.kt @@ -19,16 +19,16 @@ package com.android.server.pm.test.verify.domain import android.content.Context import android.content.Intent import android.content.pm.PackageManager -import com.android.server.pm.pkg.component.ParsedActivityImpl -import com.android.server.pm.pkg.component.ParsedIntentInfoImpl -import com.android.server.pm.pkg.PackageUserStateInternal import android.content.pm.verify.domain.DomainVerificationState import android.os.Build import android.os.Process import android.util.ArraySet import android.util.SparseArray -import com.android.server.pm.parsing.pkg.AndroidPackage +import com.android.server.pm.parsing.pkg.AndroidPackageInternal import com.android.server.pm.pkg.PackageStateInternal +import com.android.server.pm.pkg.PackageUserStateInternal +import com.android.server.pm.pkg.component.ParsedActivityImpl +import com.android.server.pm.pkg.component.ParsedIntentInfoImpl import com.android.server.pm.verify.domain.DomainVerificationManagerInternal import com.android.server.pm.verify.domain.DomainVerificationService import com.android.server.pm.verify.domain.proxy.DomainVerificationProxy @@ -187,7 +187,7 @@ class DomainVerificationSettingsMutationTest { } - fun mockPkg() = mockThrowOnUnmocked<AndroidPackage> { + fun mockPkg() = mockThrowOnUnmocked<AndroidPackageInternal> { whenever(packageName) { TEST_PKG } whenever(targetSdkVersion) { Build.VERSION_CODES.S } whenever(isEnabled) { true } diff --git a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationUserSelectionOverrideTest.kt b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationUserSelectionOverrideTest.kt index 589633ccb900..6bb5f393f0d2 100644 --- a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationUserSelectionOverrideTest.kt +++ b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationUserSelectionOverrideTest.kt @@ -18,8 +18,6 @@ package com.android.server.pm.test.verify.domain import android.content.Intent import android.content.pm.PackageManager -import com.android.server.pm.pkg.component.ParsedActivityImpl -import com.android.server.pm.pkg.component.ParsedIntentInfoImpl import android.content.pm.verify.domain.DomainVerificationManager import android.content.pm.verify.domain.DomainVerificationState import android.content.pm.verify.domain.DomainVerificationUserState @@ -28,9 +26,12 @@ import android.os.PatternMatcher import android.os.Process import android.util.ArraySet import android.util.SparseArray -import com.android.server.pm.parsing.pkg.AndroidPackage +import com.android.server.pm.parsing.pkg.AndroidPackageInternal +import com.android.server.pm.pkg.AndroidPackage import com.android.server.pm.pkg.PackageStateInternal import com.android.server.pm.pkg.PackageUserStateInternal +import com.android.server.pm.pkg.component.ParsedActivityImpl +import com.android.server.pm.pkg.component.ParsedIntentInfoImpl import com.android.server.pm.verify.domain.DomainVerificationService import com.android.server.testutils.mockThrowOnUnmocked import com.android.server.testutils.whenever @@ -107,7 +108,7 @@ class DomainVerificationUserStateOverrideTest { fun mockPkgState(pkgName: String, domainSetId: UUID) = mockThrowOnUnmocked<PackageStateInternal> { - val pkg = mockThrowOnUnmocked<AndroidPackage> { + val pkg = mockThrowOnUnmocked<AndroidPackageInternal> { whenever(packageName) { pkgName } whenever(targetSdkVersion) { Build.VERSION_CODES.S } whenever(isEnabled) { true } diff --git a/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java index f9a60b6d2e09..d9c622d1efb5 100644 --- a/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java @@ -167,9 +167,9 @@ import com.android.server.AppStateTrackerImpl; import com.android.server.DeviceIdleInternal; import com.android.server.LocalServices; import com.android.server.SystemService; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.permission.PermissionManagerService; import com.android.server.pm.permission.PermissionManagerServiceInternal; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.tare.EconomyManagerInternal; import com.android.server.usage.AppStandbyInternal; diff --git a/services/tests/mockingservicestests/src/com/android/server/appop/AppOpsServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/appop/AppOpsServiceTest.java index 82334f29099d..9acc5b9f2214 100644 --- a/services/tests/mockingservicestests/src/com/android/server/appop/AppOpsServiceTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/appop/AppOpsServiceTest.java @@ -58,7 +58,7 @@ import androidx.test.runner.AndroidJUnit4; import com.android.dx.mockito.inline.extended.StaticMockitoSession; import com.android.server.LocalServices; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageStateInternal; import org.junit.After; diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/MockSystem.kt b/services/tests/mockingservicestests/src/com/android/server/pm/MockSystem.kt index efc1b5883cfa..bb5b1d8a67a9 100644 --- a/services/tests/mockingservicestests/src/com/android/server/pm/MockSystem.kt +++ b/services/tests/mockingservicestests/src/com/android/server/pm/MockSystem.kt @@ -62,7 +62,7 @@ import com.android.server.compat.PlatformCompat import com.android.server.extendedtestutils.wheneverStatic import com.android.server.pm.dex.DexManager import com.android.server.pm.parsing.PackageParser2 -import com.android.server.pm.parsing.pkg.AndroidPackage +import com.android.server.pm.pkg.AndroidPackage import com.android.server.pm.parsing.pkg.PackageImpl import com.android.server.pm.parsing.pkg.ParsedPackage import com.android.server.pm.permission.PermissionManagerServiceInternal diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/PackageManagerServiceBootTest.kt b/services/tests/mockingservicestests/src/com/android/server/pm/PackageManagerServiceBootTest.kt index c9b36f0d974d..987192d41203 100644 --- a/services/tests/mockingservicestests/src/com/android/server/pm/PackageManagerServiceBootTest.kt +++ b/services/tests/mockingservicestests/src/com/android/server/pm/PackageManagerServiceBootTest.kt @@ -21,7 +21,7 @@ import android.content.pm.PackageManager import android.os.Build import android.os.Process import android.util.Log -import com.android.server.pm.parsing.pkg.AndroidPackage +import com.android.server.pm.pkg.AndroidPackage import com.android.server.testutils.whenever import org.hamcrest.MatcherAssert.assertThat import org.hamcrest.Matchers.equalTo diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/SharedLibrariesImplTest.kt b/services/tests/mockingservicestests/src/com/android/server/pm/SharedLibrariesImplTest.kt index e59a404ebed4..8744f327565b 100644 --- a/services/tests/mockingservicestests/src/com/android/server/pm/SharedLibrariesImplTest.kt +++ b/services/tests/mockingservicestests/src/com/android/server/pm/SharedLibrariesImplTest.kt @@ -28,7 +28,7 @@ import com.android.server.SystemConfig.SharedLibraryEntry import com.android.server.compat.PlatformCompat import com.android.server.extendedtestutils.wheneverStatic import com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME -import com.android.server.pm.parsing.pkg.AndroidPackage +import com.android.server.pm.pkg.AndroidPackage import com.android.server.pm.parsing.pkg.PackageImpl import com.android.server.pm.parsing.pkg.ParsedPackage import com.android.server.testutils.any diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/UserManagerInternalTest.java b/services/tests/mockingservicestests/src/com/android/server/pm/UserManagerInternalTest.java index 86a5c90596ff..574bab2d9962 100644 --- a/services/tests/mockingservicestests/src/com/android/server/pm/UserManagerInternalTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/pm/UserManagerInternalTest.java @@ -19,6 +19,8 @@ import static android.os.UserHandle.USER_SYSTEM; import static android.view.Display.DEFAULT_DISPLAY; import static android.view.Display.INVALID_DISPLAY; +import static com.android.server.pm.UserManagerInternal.PARENT_DISPLAY; + import static com.google.common.truth.Truth.assertWithMessage; import static org.junit.Assert.assertThrows; @@ -119,9 +121,6 @@ public final class UserManagerInternalTest extends UserManagerServiceOrInternalT () -> mUmi.assignUserToDisplay(PROFILE_USER_ID, SECONDARY_DISPLAY_ID)); Log.v(TAG, "Exception: " + e); - assertWithMessage("exception (%s) message", e).that(e).hasMessageThat() - .matches("Cannot.*" + PROFILE_USER_ID + ".*" + SECONDARY_DISPLAY_ID - + ".*parent.*current.*" + PARENT_USER_ID + ".*"); assertNoUserAssignedToDisplay(); } @@ -136,10 +135,6 @@ public final class UserManagerInternalTest extends UserManagerServiceOrInternalT () -> mUmi.assignUserToDisplay(PROFILE_USER_ID, SECONDARY_DISPLAY_ID)); Log.v(TAG, "Exception: " + e); - assertWithMessage("exception (%s) message", e).that(e).hasMessageThat() - .matches("Cannot.*" + PROFILE_USER_ID + ".*" + SECONDARY_DISPLAY_ID - + ".*parent.*current.*" + PARENT_USER_ID + ".*"); - assertNoUserAssignedToDisplay(); } @@ -173,7 +168,7 @@ public final class UserManagerInternalTest extends UserManagerServiceOrInternalT addDefaultProfileAndParent(); mUmi.assignUserToDisplay(PARENT_USER_ID, SECONDARY_DISPLAY_ID); - mUmi.assignUserToDisplay(PROFILE_USER_ID, SECONDARY_DISPLAY_ID); + mUmi.assignUserToDisplay(PROFILE_USER_ID, PARENT_DISPLAY); assertUsersAssignedToDisplays(PARENT_USER_ID, SECONDARY_DISPLAY_ID, pair(PROFILE_USER_ID, SECONDARY_DISPLAY_ID)); @@ -185,13 +180,10 @@ public final class UserManagerInternalTest extends UserManagerServiceOrInternalT addDefaultProfileAndParent(); mUmi.assignUserToDisplay(PARENT_USER_ID, SECONDARY_DISPLAY_ID); - IllegalStateException e = assertThrows(IllegalStateException.class, - () -> mUmi.assignUserToDisplay(PROFILE_USER_ID, OTHER_SECONDARY_DISPLAY_ID)); + IllegalArgumentException e = assertThrows(IllegalArgumentException.class, + () -> mUmi.assignUserToDisplay(PROFILE_USER_ID, SECONDARY_DISPLAY_ID)); Log.v(TAG, "Exception: " + e); - assertWithMessage("exception (%s) message", e).that(e).hasMessageThat() - .matches("Cannot.*" + PROFILE_USER_ID + ".*" + OTHER_SECONDARY_DISPLAY_ID - + ".*parent.*" + PARENT_USER_ID + ".*" + SECONDARY_DISPLAY_ID + ".*"); assertUserAssignedToDisplay(PARENT_USER_ID, SECONDARY_DISPLAY_ID); } diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/UserManagerServiceOrInternalTestCase.java b/services/tests/mockingservicestests/src/com/android/server/pm/UserManagerServiceOrInternalTestCase.java index 991053a120ef..538adb211fff 100644 --- a/services/tests/mockingservicestests/src/com/android/server/pm/UserManagerServiceOrInternalTestCase.java +++ b/services/tests/mockingservicestests/src/com/android/server/pm/UserManagerServiceOrInternalTestCase.java @@ -267,7 +267,7 @@ abstract class UserManagerServiceOrInternalTestCase extends ExtendedMockitoTestC mockCurrentUser(USER_ID); assertWithMessage("isUserVisibleOnDisplay(%s, %s)", USER_ID, INVALID_DISPLAY) - .that(isUserVisibleOnDisplay(USER_ID, INVALID_DISPLAY)).isTrue(); + .that(isUserVisibleOnDisplay(USER_ID, INVALID_DISPLAY)).isFalse(); } @Test @@ -287,6 +287,49 @@ abstract class UserManagerServiceOrInternalTestCase extends ExtendedMockitoTestC } @Test + public void testIsUserVisibleOnDisplay_mumd_currentUserUnassignedSecondaryDisplay() { + enableUsersOnSecondaryDisplays(); + mockCurrentUser(USER_ID); + + assertWithMessage("isUserVisibleOnDisplay(%s, %s)", USER_ID, SECONDARY_DISPLAY_ID) + .that(isUserVisibleOnDisplay(USER_ID, SECONDARY_DISPLAY_ID)).isTrue(); + } + + @Test + public void testIsUserVisibleOnDisplay_mumd_currentUserSecondaryDisplayAssignedToAnotherUser() { + enableUsersOnSecondaryDisplays(); + mockCurrentUser(USER_ID); + assignUserToDisplay(OTHER_USER_ID, SECONDARY_DISPLAY_ID); + + assertWithMessage("isUserVisibleOnDisplay(%s, %s)", USER_ID, SECONDARY_DISPLAY_ID) + .that(isUserVisibleOnDisplay(USER_ID, SECONDARY_DISPLAY_ID)).isFalse(); + } + + @Test + public void testIsUserVisibleOnDisplay_mumd_startedProfileOfCurrentUserSecondaryDisplayAssignedToAnotherUser() { + enableUsersOnSecondaryDisplays(); + addDefaultProfileAndParent(); + startDefaultProfile(); + mockCurrentUser(PARENT_USER_ID); + assignUserToDisplay(OTHER_USER_ID, SECONDARY_DISPLAY_ID); + + assertWithMessage("isUserVisibleOnDisplay(%s, %s)", PROFILE_USER_ID, SECONDARY_DISPLAY_ID) + .that(isUserVisibleOnDisplay(PROFILE_USER_ID, SECONDARY_DISPLAY_ID)).isFalse(); + } + + @Test + public void testIsUserVisibleOnDisplay_mumd_stoppedProfileOfCurrentUserSecondaryDisplayAssignedToAnotherUser() { + enableUsersOnSecondaryDisplays(); + addDefaultProfileAndParent(); + stopDefaultProfile(); + mockCurrentUser(PARENT_USER_ID); + assignUserToDisplay(OTHER_USER_ID, SECONDARY_DISPLAY_ID); + + assertWithMessage("isUserVisibleOnDisplay(%s, %s)", PROFILE_USER_ID, SECONDARY_DISPLAY_ID) + .that(isUserVisibleOnDisplay(PROFILE_USER_ID, SECONDARY_DISPLAY_ID)).isFalse(); + } + + @Test public void testIsUserVisibleOnDisplay_nonCurrentUserDefaultDisplay() { mockCurrentUser(OTHER_USER_ID); @@ -358,7 +401,7 @@ abstract class UserManagerServiceOrInternalTestCase extends ExtendedMockitoTestC } @Test - public void testIsUserVisibleOnDisplay_bgUserOnSecondaryDisplay() { + public void testIsUserVisibleOnDisplay_mumd_bgUserOnSecondaryDisplay() { enableUsersOnSecondaryDisplays(); mockCurrentUser(OTHER_USER_ID); assignUserToDisplay(USER_ID, SECONDARY_DISPLAY_ID); @@ -367,6 +410,16 @@ abstract class UserManagerServiceOrInternalTestCase extends ExtendedMockitoTestC .that(isUserVisibleOnDisplay(USER_ID, SECONDARY_DISPLAY_ID)).isTrue(); } + @Test + public void testIsUserVisibleOnDisplay_mumd_bgUserOnAnotherSecondaryDisplay() { + enableUsersOnSecondaryDisplays(); + mockCurrentUser(OTHER_USER_ID); + assignUserToDisplay(USER_ID, SECONDARY_DISPLAY_ID); + + assertWithMessage("isUserVisibleOnDisplay(%s, %s)", USER_ID, SECONDARY_DISPLAY_ID) + .that(isUserVisibleOnDisplay(USER_ID, OTHER_SECONDARY_DISPLAY_ID)).isFalse(); + } + // NOTE: we don't need to add tests for profiles (started / stopped profiles of bg user), as // isUserVisibleOnDisplay() for bg users relies only on the user / display assignments @@ -535,8 +588,7 @@ abstract class UserManagerServiceOrInternalTestCase extends ExtendedMockitoTestC } protected final void stopDefaultProfile() { - // TODO(b/244798930): should set it to STATE_STOPPING or STATE_SHUTDOWN instead - removeUserState(PROFILE_USER_ID); + setUserState(PROFILE_USER_ID, UserState.STATE_STOPPING); } // NOTE: should only called by tests that indirectly needs to check user assignments (like diff --git a/services/tests/mockingservicestests/src/com/android/server/tare/AgentTest.java b/services/tests/mockingservicestests/src/com/android/server/tare/AgentTest.java index 831a69a8d890..94fff22cffe1 100644 --- a/services/tests/mockingservicestests/src/com/android/server/tare/AgentTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/tare/AgentTest.java @@ -18,6 +18,7 @@ package com.android.server.tare; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession; +import static com.android.server.tare.TareTestUtils.assertLedgersEqual; import static org.junit.Assert.assertEquals; import static org.mockito.ArgumentMatchers.anyInt; @@ -89,6 +90,33 @@ public class AgentTest { } @Test + public void testAppRemoval() { + final long consumptionLimit = 1_000_000L; + final long remainingCakes = consumptionLimit / 2; + mScribe.setConsumptionLimitLocked(consumptionLimit); + mScribe.adjustRemainingConsumableCakesLocked(remainingCakes - consumptionLimit); + assertEquals(remainingCakes, mScribe.getRemainingConsumableCakesLocked()); + + final int userId = 0; + final String pkgName = "com.test"; + final Agent agent = new Agent(mIrs, mScribe, mAnalyst); + final Ledger ledger = mScribe.getLedgerLocked(userId, pkgName); + + doReturn(consumptionLimit).when(mIrs).getConsumptionLimitLocked(); + doReturn(consumptionLimit).when(mEconomicPolicy) + .getMaxSatiatedBalance(anyInt(), anyString()); + + Ledger.Transaction transaction = new Ledger.Transaction(0, 0, 0, null, 5, 10); + agent.recordTransactionLocked(userId, pkgName, ledger, transaction, false); + assertEquals(5, ledger.getCurrentBalance()); + assertEquals(remainingCakes - 10, mScribe.getRemainingConsumableCakesLocked()); + + agent.onPackageRemovedLocked(userId, pkgName); + assertEquals(remainingCakes - 10, mScribe.getRemainingConsumableCakesLocked()); + assertLedgersEqual(new Ledger(), mScribe.getLedgerLocked(userId, pkgName)); + } + + @Test public void testRecordTransaction_UnderMax() { Agent agent = new Agent(mIrs, mScribe, mAnalyst); Ledger ledger = new Ledger(); diff --git a/services/tests/mockingservicestests/src/com/android/server/tare/ScribeTest.java b/services/tests/mockingservicestests/src/com/android/server/tare/ScribeTest.java index 5cf026e64f67..4ce268f0dc39 100644 --- a/services/tests/mockingservicestests/src/com/android/server/tare/ScribeTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/tare/ScribeTest.java @@ -18,6 +18,7 @@ package com.android.server.tare; import static com.android.dx.mockito.inline.extended.ExtendedMockito.inOrder; import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession; +import static com.android.server.tare.TareTestUtils.assertLedgersEqual; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -30,7 +31,6 @@ import android.content.pm.PackageInfo; import android.os.UserHandle; import android.util.Log; import android.util.SparseArrayMap; -import android.util.SparseLongArray; import androidx.test.InstrumentationRegistry; import androidx.test.filters.SmallTest; @@ -345,43 +345,6 @@ public class ScribeTest { assertEquals(900, mScribeUnderTest.getRemainingConsumableCakesLocked()); } - private void assertLedgersEqual(Ledger expected, Ledger actual) { - if (expected == null) { - assertNull(actual); - return; - } - assertNotNull(actual); - assertEquals(expected.getCurrentBalance(), actual.getCurrentBalance()); - - List<Ledger.Transaction> expectedTransactions = expected.getTransactions(); - List<Ledger.Transaction> actualTransactions = actual.getTransactions(); - assertEquals(expectedTransactions.size(), actualTransactions.size()); - for (int i = 0; i < expectedTransactions.size(); ++i) { - assertTransactionsEqual(expectedTransactions.get(i), actualTransactions.get(i)); - } - - List<Ledger.RewardBucket> expectedRewardBuckets = expected.getRewardBuckets(); - List<Ledger.RewardBucket> actualRewardBuckets = actual.getRewardBuckets(); - assertEquals(expectedRewardBuckets.size(), actualRewardBuckets.size()); - for (int i = 0; i < expectedRewardBuckets.size(); ++i) { - assertRewardBucketsEqual(expectedRewardBuckets.get(i), actualRewardBuckets.get(i)); - } - } - - private void assertSparseLongArraysEqual(SparseLongArray expected, SparseLongArray actual) { - if (expected == null) { - assertNull(actual); - return; - } - assertNotNull(actual); - final int size = expected.size(); - assertEquals(size, actual.size()); - for (int i = 0; i < size; ++i) { - assertEquals(expected.keyAt(i), actual.keyAt(i)); - assertEquals(expected.valueAt(i), actual.valueAt(i)); - } - } - private void assertReportListsEqual(List<Analyst.Report> expected, List<Analyst.Report> actual) { if (expected == null) { @@ -425,31 +388,6 @@ public class ScribeTest { } } - private void assertRewardBucketsEqual(Ledger.RewardBucket expected, - Ledger.RewardBucket actual) { - if (expected == null) { - assertNull(actual); - return; - } - assertNotNull(actual); - assertEquals(expected.startTimeMs, actual.startTimeMs); - assertSparseLongArraysEqual(expected.cumulativeDelta, actual.cumulativeDelta); - } - - private void assertTransactionsEqual(Ledger.Transaction expected, Ledger.Transaction actual) { - if (expected == null) { - assertNull(actual); - return; - } - assertNotNull(actual); - assertEquals(expected.startTimeMs, actual.startTimeMs); - assertEquals(expected.endTimeMs, actual.endTimeMs); - assertEquals(expected.eventId, actual.eventId); - assertEquals(expected.tag, actual.tag); - assertEquals(expected.delta, actual.delta); - assertEquals(expected.ctp, actual.ctp); - } - private void addInstalledPackage(int userId, String pkgName) { PackageInfo pkgInfo = new PackageInfo(); pkgInfo.packageName = pkgName; diff --git a/services/tests/mockingservicestests/src/com/android/server/tare/TareTestUtils.java b/services/tests/mockingservicestests/src/com/android/server/tare/TareTestUtils.java new file mode 100644 index 000000000000..1e4684b84516 --- /dev/null +++ b/services/tests/mockingservicestests/src/com/android/server/tare/TareTestUtils.java @@ -0,0 +1,89 @@ +/* + * Copyright (C) 2022 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.tare; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + +import android.util.SparseLongArray; + +import java.util.List; + +public class TareTestUtils { + static void assertLedgersEqual(Ledger expected, Ledger actual) { + if (expected == null) { + assertNull(actual); + return; + } + assertNotNull(actual); + assertEquals(expected.getCurrentBalance(), actual.getCurrentBalance()); + + List<Ledger.Transaction> expectedTransactions = expected.getTransactions(); + List<Ledger.Transaction> actualTransactions = actual.getTransactions(); + assertEquals(expectedTransactions.size(), actualTransactions.size()); + for (int i = 0; i < expectedTransactions.size(); ++i) { + assertTransactionsEqual(expectedTransactions.get(i), actualTransactions.get(i)); + } + + List<Ledger.RewardBucket> expectedRewardBuckets = expected.getRewardBuckets(); + List<Ledger.RewardBucket> actualRewardBuckets = actual.getRewardBuckets(); + assertEquals(expectedRewardBuckets.size(), actualRewardBuckets.size()); + for (int i = 0; i < expectedRewardBuckets.size(); ++i) { + assertRewardBucketsEqual(expectedRewardBuckets.get(i), actualRewardBuckets.get(i)); + } + } + + + static void assertSparseLongArraysEqual(SparseLongArray expected, SparseLongArray actual) { + if (expected == null) { + assertNull(actual); + return; + } + assertNotNull(actual); + final int size = expected.size(); + assertEquals(size, actual.size()); + for (int i = 0; i < size; ++i) { + assertEquals(expected.keyAt(i), actual.keyAt(i)); + assertEquals(expected.valueAt(i), actual.valueAt(i)); + } + } + + static void assertRewardBucketsEqual(Ledger.RewardBucket expected, Ledger.RewardBucket actual) { + if (expected == null) { + assertNull(actual); + return; + } + assertNotNull(actual); + assertEquals(expected.startTimeMs, actual.startTimeMs); + assertSparseLongArraysEqual(expected.cumulativeDelta, actual.cumulativeDelta); + } + + static void assertTransactionsEqual(Ledger.Transaction expected, Ledger.Transaction actual) { + if (expected == null) { + assertNull(actual); + return; + } + assertNotNull(actual); + assertEquals(expected.startTimeMs, actual.startTimeMs); + assertEquals(expected.endTimeMs, actual.endTimeMs); + assertEquals(expected.eventId, actual.eventId); + assertEquals(expected.tag, actual.tag); + assertEquals(expected.delta, actual.delta); + assertEquals(expected.ctp, actual.ctp); + } +} diff --git a/services/tests/servicestests/src/com/android/server/am/UserControllerTest.java b/services/tests/servicestests/src/com/android/server/am/UserControllerTest.java index db1209224bd5..fe079f423094 100644 --- a/services/tests/servicestests/src/com/android/server/am/UserControllerTest.java +++ b/services/tests/servicestests/src/com/android/server/am/UserControllerTest.java @@ -48,6 +48,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertThrows; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Matchers.any; @@ -64,7 +65,6 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.validateMockitoUsage; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import static org.testng.Assert.assertThrows; import android.annotation.Nullable; import android.annotation.UserIdInt; @@ -90,6 +90,7 @@ import android.os.UserManager; import android.os.storage.IStorageManager; import android.platform.test.annotations.Presubmit; import android.util.Log; +import android.view.Display; import androidx.test.filters.SmallTest; @@ -177,10 +178,11 @@ public class UserControllerTest { doNothing().when(mInjector).activityManagerOnUserStopped(anyInt()); doNothing().when(mInjector).clearBroadcastQueueForUser(anyInt()); doNothing().when(mInjector).taskSupervisorRemoveUser(anyInt()); + mockIsUsersOnSecondaryDisplaysEnabled(false); // All UserController params are set to default. mUserController = new UserController(mInjector); setUpUser(TEST_USER_ID, NO_USERINFO_FLAGS); - setUpUser(TEST_PRE_CREATED_USER_ID, NO_USERINFO_FLAGS, /* preCreated=*/ true, null); + setUpUser(TEST_PRE_CREATED_USER_ID, NO_USERINFO_FLAGS, /* preCreated= */ true, null); }); } @@ -199,11 +201,37 @@ public class UserControllerTest { verify(mInjector.getWindowManager()).setSwitchingUser(true); verify(mInjector).clearAllLockedTasks(anyString()); startForegroundUserAssertions(); + verifyUserAssignedToDisplay(TEST_USER_ID, Display.DEFAULT_DISPLAY); } @Test public void testStartUser_background() { - mUserController.startUser(TEST_USER_ID, false /* foreground */); + boolean started = mUserController.startUser(TEST_USER_ID, /* foreground= */ false); + assertWithMessage("startUser(%s, foreground=false)", TEST_USER_ID).that(started).isTrue(); + verify(mInjector.getWindowManager(), never()).startFreezingScreen(anyInt(), anyInt()); + verify(mInjector.getWindowManager(), never()).setSwitchingUser(anyBoolean()); + verify(mInjector, never()).clearAllLockedTasks(anyString()); + startBackgroundUserAssertions(); + verifyUserAssignedToDisplay(TEST_USER_ID, Display.DEFAULT_DISPLAY); + } + + @Test + public void testStartUserOnSecondaryDisplay_defaultDisplay() { + assertThrows(IllegalArgumentException.class, () -> mUserController + .startUserOnSecondaryDisplay(TEST_USER_ID, Display.DEFAULT_DISPLAY)); + + verifyUserNeverAssignedToDisplay(); + } + + @Test + public void testStartUserOnSecondaryDisplay() { + boolean started = mUserController.startUserOnSecondaryDisplay(TEST_USER_ID, 42); + + assertWithMessage("startUserOnSecondaryDisplay(%s, %s)", TEST_USER_ID, 42).that(started) + .isTrue(); + verifyUserAssignedToDisplay(TEST_USER_ID, 42); + + // TODO(b/239982558): might need to change assertions verify(mInjector.getWindowManager(), never()).startFreezingScreen(anyInt(), anyInt()); verify(mInjector.getWindowManager(), never()).setSwitchingUser(anyBoolean()); verify(mInjector, never()).clearAllLockedTasks(anyString()); @@ -611,6 +639,7 @@ public class UserControllerTest { setUpAndStartUserInBackground(TEST_USER_ID1); assertThrows(IllegalArgumentException.class, () -> mUserController.stopProfile(TEST_USER_ID1)); + verifyUserUnassignedFromDisplayNeverCalled(TEST_USER_ID); } @Test @@ -623,13 +652,26 @@ public class UserControllerTest { @Test public void testStartProfile() throws Exception { setUpAndStartProfileInBackground(TEST_USER_ID1); + + startBackgroundUserAssertions(); + verifyUserAssignedToDisplay(TEST_USER_ID1, Display.DEFAULT_DISPLAY); + } + + @Test + public void testStartProfile_whenUsersOnSecondaryDisplaysIsEnabled() throws Exception { + mockIsUsersOnSecondaryDisplaysEnabled(true); + + setUpAndStartProfileInBackground(TEST_USER_ID1); + startBackgroundUserAssertions(); + verifyUserAssignedToDisplay(TEST_USER_ID1, UserManagerInternal.PARENT_DISPLAY); } @Test public void testStopProfile() throws Exception { setUpAndStartProfileInBackground(TEST_USER_ID1); assertProfileLockedOrUnlockedAfterStopping(TEST_USER_ID1, /* expectLocking= */ true); + verifyUserUnassignedFromDisplay(TEST_USER_ID1); } /** Tests handleIncomingUser() for a variety of permissions and situations. */ @@ -680,7 +722,7 @@ public class UserControllerTest { eq(INTERACT_ACROSS_PROFILES), anyInt(), anyInt(), any())).thenReturn(false); checkHandleIncomingUser(user1a.id, user2.id, ALLOW_NON_FULL, true); - checkHandleIncomingUser(user1a.id, user2.id, ALLOW_NON_FULL_IN_PROFILE, false); + checkHandleIncomingUser(user1a.id, user2.id, ALLOW_NON_FULL_IN_PROFILE, false); checkHandleIncomingUser(user1a.id, user2.id, ALLOW_FULL_ONLY, false); checkHandleIncomingUser(user1a.id, user2.id, ALLOW_PROFILES_OR_NON_FULL, true); @@ -876,6 +918,26 @@ public class UserControllerTest { } } + private void mockIsUsersOnSecondaryDisplaysEnabled(boolean value) { + when(mInjector.isUsersOnSecondaryDisplaysEnabled()).thenReturn(value); + } + + private void verifyUserAssignedToDisplay(@UserIdInt int userId, int displayId) { + verify(mInjector.getUserManagerInternal()).assignUserToDisplay(userId, displayId); + } + + private void verifyUserNeverAssignedToDisplay() { + verify(mInjector.getUserManagerInternal(), never()).assignUserToDisplay(anyInt(), anyInt()); + } + + private void verifyUserUnassignedFromDisplay(@UserIdInt int userId) { + verify(mInjector.getUserManagerInternal()).unassignUserFromDisplay(userId); + } + + private void verifyUserUnassignedFromDisplayNeverCalled(@UserIdInt int userId) { + verify(mInjector.getUserManagerInternal(), never()).unassignUserFromDisplay(userId); + } + // Should be public to allow mocking private static class TestInjector extends UserController.Injector { public final TestHandler mHandler; diff --git a/services/tests/servicestests/src/com/android/server/companion/virtual/InputManagerMockHelper.java b/services/tests/servicestests/src/com/android/server/companion/virtual/InputManagerMockHelper.java index b7f564094cde..cc5ed92e02d9 100644 --- a/services/tests/servicestests/src/com/android/server/companion/virtual/InputManagerMockHelper.java +++ b/services/tests/servicestests/src/com/android/server/companion/virtual/InputManagerMockHelper.java @@ -25,7 +25,6 @@ import static org.mockito.Mockito.when; import android.hardware.input.IInputDevicesChangedListener; import android.hardware.input.IInputManager; -import android.hardware.input.InputDeviceCountryCode; import android.hardware.input.InputManager; import android.os.RemoteException; import android.testing.TestableLooper; @@ -81,11 +80,16 @@ class InputManagerMockHelper { private Void handleNativeOpenInputDevice(InvocationOnMock inv) { Objects.requireNonNull(mDevicesChangedListener, "InputController did not register an InputDevicesChangedListener."); - // We only use a subset of the fields of InputDevice in InputController. - final InputDevice device = new InputDevice(mDevices.size() /*id*/, 1 /*generation*/, 0, - inv.getArgument(0) /*name*/, inv.getArgument(1) /*vendorId*/, - inv.getArgument(2) /*productId*/, inv.getArgument(3) /*descriptor*/, true, 0, 0, - null, InputDeviceCountryCode.INVALID, false, false, false, false, false); + + final InputDevice device = new InputDevice.Builder() + .setId(mDevices.size()) + .setName(inv.getArgument(0)) + .setVendorId(inv.getArgument(1)) + .setProductId(inv.getArgument(2)) + .setDescriptor(inv.getArgument(3)) + .setExternal(true) + .build(); + mDevices.add(device); try { mDevicesChangedListener.onInputDevicesChanged( diff --git a/services/tests/servicestests/src/com/android/server/input/BatteryControllerTests.kt b/services/tests/servicestests/src/com/android/server/input/BatteryControllerTests.kt index c7a3756ed751..6e422fa7af7f 100644 --- a/services/tests/servicestests/src/com/android/server/input/BatteryControllerTests.kt +++ b/services/tests/servicestests/src/com/android/server/input/BatteryControllerTests.kt @@ -87,11 +87,13 @@ class BatteryControllerTests { } private fun createInputDevice(deviceId: Int): InputDevice = - InputDevice(deviceId, 0 /*generation*/, 0 /*controllerNumber*/, - "Device $deviceId" /*name*/, 0 /*vendorId*/, 0 /*productId*/, "descriptor$deviceId", - true /*isExternal*/, 0 /*sources*/, 0 /*keyboardType*/, null /*keyCharacterMap*/, - InputDeviceCountryCode.INVALID, false /*hasVibrator*/, false /*hasMicrophone*/, - false /*hasButtonUnderPad*/, false /*hasSensor*/, true /*hasBattery*/) + InputDevice.Builder() + .setId(deviceId) + .setName("Device $deviceId") + .setDescriptor("descriptor $deviceId") + .setExternal(true) + .setHasBattery(true) + .build() @After fun tearDown() { diff --git a/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java index 821ce5edad27..3bcde6a3aa53 100644 --- a/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java @@ -168,13 +168,13 @@ import com.android.internal.util.test.BroadcastInterceptingContext.FutureIntent; import com.android.internal.util.test.FsUtil; import com.android.server.DeviceIdleInternal; import com.android.server.LocalServices; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.usage.AppStandbyInternal; -import com.google.common.util.concurrent.AbstractFuture; - import libcore.io.Streams; +import com.google.common.util.concurrent.AbstractFuture; + import org.junit.After; import org.junit.Before; import org.junit.Rule; diff --git a/services/tests/servicestests/src/com/android/server/om/OverlayActorEnforcerTests.kt b/services/tests/servicestests/src/com/android/server/om/OverlayActorEnforcerTests.kt index 38125c7847f3..8f6dd5d5c799 100644 --- a/services/tests/servicestests/src/com/android/server/om/OverlayActorEnforcerTests.kt +++ b/services/tests/servicestests/src/com/android/server/om/OverlayActorEnforcerTests.kt @@ -23,7 +23,7 @@ import android.content.pm.PackageInfo import android.os.Process import android.util.ArrayMap import com.android.server.om.OverlayActorEnforcer.ActorState -import com.android.server.pm.parsing.pkg.AndroidPackage +import com.android.server.pm.pkg.AndroidPackage import com.android.server.testutils.mockThrowOnUnmocked import com.android.server.testutils.whenever import com.google.common.truth.Truth.assertThat 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 b793482b078f..301697d996d8 100644 --- a/services/tests/servicestests/src/com/android/server/om/OverlayManagerServiceImplTestsBase.java +++ b/services/tests/servicestests/src/com/android/server/om/OverlayManagerServiceImplTestsBase.java @@ -33,13 +33,11 @@ import android.os.FabricatedOverlayInternal; import android.text.TextUtils; import android.util.ArrayMap; import android.util.ArraySet; -import android.util.Pair; import androidx.annotation.Nullable; import com.android.internal.content.om.OverlayConfig; -import com.android.internal.util.CollectionUtils; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import org.junit.Assert; import org.junit.Before; diff --git a/services/tests/servicestests/src/com/android/server/om/OverlayReferenceMapperTests.kt b/services/tests/servicestests/src/com/android/server/om/OverlayReferenceMapperTests.kt index 876c84547cae..7be4921443b0 100644 --- a/services/tests/servicestests/src/com/android/server/om/OverlayReferenceMapperTests.kt +++ b/services/tests/servicestests/src/com/android/server/om/OverlayReferenceMapperTests.kt @@ -17,7 +17,7 @@ package com.android.server.om import android.net.Uri -import com.android.server.pm.parsing.pkg.AndroidPackage +import com.android.server.pm.pkg.AndroidPackage import com.android.server.testutils.mockThrowOnUnmocked import com.android.server.testutils.whenever import com.google.common.truth.Truth.assertThat diff --git a/services/tests/servicestests/src/com/android/server/people/data/DataManagerTest.java b/services/tests/servicestests/src/com/android/server/people/data/DataManagerTest.java index 66c3f0730404..050fbeaedfe2 100644 --- a/services/tests/servicestests/src/com/android/server/people/data/DataManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/people/data/DataManagerTest.java @@ -93,7 +93,7 @@ import com.android.internal.content.PackageMonitor; import com.android.server.LocalServices; import com.android.server.notification.NotificationManagerInternal; import com.android.server.people.PeopleService; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import com.google.common.collect.Iterables; diff --git a/services/tests/servicestests/src/com/android/server/pm/ApexManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/ApexManagerTest.java index 503ca69a627f..a7739ed2c169 100644 --- a/services/tests/servicestests/src/com/android/server/pm/ApexManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/ApexManagerTest.java @@ -47,7 +47,7 @@ import androidx.test.runner.AndroidJUnit4; import com.android.server.pm.parsing.PackageParser2; import com.android.server.pm.parsing.TestPackageParser2; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import org.junit.Before; import org.junit.Test; diff --git a/services/tests/servicestests/src/com/android/server/pm/AppsFilterImplTest.java b/services/tests/servicestests/src/com/android/server/pm/AppsFilterImplTest.java index af3b52fafc5a..c321639ffe2e 100644 --- a/services/tests/servicestests/src/com/android/server/pm/AppsFilterImplTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/AppsFilterImplTest.java @@ -47,9 +47,9 @@ import android.util.SparseArray; import androidx.annotation.NonNull; import com.android.server.om.OverlayReferenceMapper; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.PackageImpl; import com.android.server.pm.parsing.pkg.ParsedPackage; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.component.ParsedActivity; import com.android.server.pm.pkg.component.ParsedActivityImpl; import com.android.server.pm.pkg.component.ParsedComponentImpl; diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java b/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java index b32ace5e865b..67eeb4eafb76 100644 --- a/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java @@ -62,11 +62,11 @@ import com.android.server.pm.parsing.PackageCacher; import com.android.server.pm.parsing.PackageInfoUtils; import com.android.server.pm.parsing.PackageParser2; import com.android.server.pm.parsing.TestPackageParser2; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.AndroidPackageUtils; import com.android.server.pm.parsing.pkg.PackageImpl; import com.android.server.pm.parsing.pkg.ParsedPackage; import com.android.server.pm.permission.CompatibilityPermissionInfo; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageUserStateInternal; import com.android.server.pm.pkg.component.ParsedActivity; import com.android.server.pm.pkg.component.ParsedActivityImpl; diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageSettingBuilder.java b/services/tests/servicestests/src/com/android/server/pm/PackageSettingBuilder.java index 94d8358b4a43..42be3d36620a 100644 --- a/services/tests/servicestests/src/com/android/server/pm/PackageSettingBuilder.java +++ b/services/tests/servicestests/src/com/android/server/pm/PackageSettingBuilder.java @@ -19,7 +19,8 @@ package com.android.server.pm; import android.content.pm.SigningDetails; import android.util.SparseArray; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.parsing.pkg.ParsedPackage; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageUserStateImpl; import java.io.File; @@ -166,7 +167,7 @@ public class PackageSettingBuilder { packageSetting.setSignatures(mSigningDetails != null ? new PackageSignatures(mSigningDetails) : new PackageSignatures()); - packageSetting.setPkg(mPkg); + packageSetting.setPkg((ParsedPackage) mPkg); packageSetting.setAppId(mAppId); packageSetting.setVolumeUuid(this.mVolumeUuid); if (mInstallSource != null) { diff --git a/services/tests/servicestests/src/com/android/server/pm/SELinuxMMACTest.java b/services/tests/servicestests/src/com/android/server/pm/SELinuxMMACTest.java index 901b200417c9..eb916715bdb3 100644 --- a/services/tests/servicestests/src/com/android/server/pm/SELinuxMMACTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/SELinuxMMACTest.java @@ -26,9 +26,9 @@ import android.os.Build; import android.platform.test.annotations.Presubmit; import com.android.server.compat.PlatformCompat; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.PackageImpl; import com.android.server.pm.parsing.pkg.ParsedPackage; +import com.android.server.pm.pkg.AndroidPackage; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/services/tests/servicestests/src/com/android/server/pm/ScanRequestBuilder.java b/services/tests/servicestests/src/com/android/server/pm/ScanRequestBuilder.java index 9962a3c8b71f..1c3673e84038 100644 --- a/services/tests/servicestests/src/com/android/server/pm/ScanRequestBuilder.java +++ b/services/tests/servicestests/src/com/android/server/pm/ScanRequestBuilder.java @@ -20,8 +20,8 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.os.UserHandle; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.ParsedPackage; +import com.android.server.pm.pkg.AndroidPackage; class ScanRequestBuilder { private final ParsedPackage mPkg; diff --git a/services/tests/servicestests/src/com/android/server/pm/ScanTests.java b/services/tests/servicestests/src/com/android/server/pm/ScanTests.java index 8e53ca1d599d..084f4f1684ee 100644 --- a/services/tests/servicestests/src/com/android/server/pm/ScanTests.java +++ b/services/tests/servicestests/src/com/android/server/pm/ScanTests.java @@ -43,8 +43,6 @@ import android.Manifest; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.SharedLibraryInfo; -import com.android.server.pm.pkg.parsing.ParsingPackage; -import com.android.server.pm.pkg.component.ParsedUsesPermissionImpl; import android.content.res.TypedArray; import android.os.Environment; import android.os.UserHandle; @@ -53,9 +51,11 @@ import android.util.Pair; import com.android.server.compat.PlatformCompat; import com.android.server.pm.parsing.PackageInfoUtils; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.PackageImpl; import com.android.server.pm.parsing.pkg.ParsedPackage; +import com.android.server.pm.pkg.AndroidPackage; +import com.android.server.pm.pkg.component.ParsedUsesPermissionImpl; +import com.android.server.pm.pkg.parsing.ParsingPackage; import com.android.server.pm.verify.domain.DomainVerificationManagerInternal; import org.hamcrest.BaseMatcher; diff --git a/services/tests/servicestests/src/com/android/server/pm/UserSystemPackageInstallerTest.java b/services/tests/servicestests/src/com/android/server/pm/UserSystemPackageInstallerTest.java index ba7a10350f0b..b7729bb85591 100644 --- a/services/tests/servicestests/src/com/android/server/pm/UserSystemPackageInstallerTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/UserSystemPackageInstallerTest.java @@ -55,9 +55,9 @@ import androidx.test.runner.AndroidJUnit4; import com.android.server.LocalServices; import com.android.server.SystemConfig; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.PackageImpl; import com.android.server.pm.parsing.pkg.ParsedPackage; +import com.android.server.pm.pkg.AndroidPackage; import org.junit.After; import org.junit.Before; diff --git a/services/tests/servicestests/src/com/android/server/pm/dex/DexMetadataHelperTest.java b/services/tests/servicestests/src/com/android/server/pm/dex/DexMetadataHelperTest.java index b7b55ba16fb2..b2843d82a08a 100644 --- a/services/tests/servicestests/src/com/android/server/pm/dex/DexMetadataHelperTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/dex/DexMetadataHelperTest.java @@ -39,9 +39,9 @@ import androidx.test.runner.AndroidJUnit4; import com.android.frameworks.servicestests.R; import com.android.server.pm.PackageManagerException; import com.android.server.pm.parsing.TestPackageParser2; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.AndroidPackageUtils; import com.android.server.pm.parsing.pkg.ParsedPackage; +import com.android.server.pm.pkg.AndroidPackage; import org.junit.Assert; import org.junit.Before; diff --git a/services/tests/servicestests/src/com/android/server/pm/dex/DexoptUtilsTest.java b/services/tests/servicestests/src/com/android/server/pm/dex/DexoptUtilsTest.java index 7c8bbec458ee..ad9f920f029d 100644 --- a/services/tests/servicestests/src/com/android/server/pm/dex/DexoptUtilsTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/dex/DexoptUtilsTest.java @@ -23,16 +23,16 @@ import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import android.content.pm.SharedLibraryInfo; -import com.android.server.pm.pkg.parsing.ParsingPackage; import android.platform.test.annotations.Presubmit; import android.util.SparseArray; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.PackageImpl; import com.android.server.pm.parsing.pkg.ParsedPackage; +import com.android.server.pm.pkg.AndroidPackage; +import com.android.server.pm.pkg.parsing.ParsingPackage; import dalvik.system.DelegateLastClassLoader; import dalvik.system.DexClassLoader; diff --git a/services/tests/servicestests/src/com/android/server/pm/parsing/PackageParserLegacyCoreTest.java b/services/tests/servicestests/src/com/android/server/pm/parsing/PackageParserLegacyCoreTest.java index f013ecc97354..9cd97ff35b10 100644 --- a/services/tests/servicestests/src/com/android/server/pm/parsing/PackageParserLegacyCoreTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/parsing/PackageParserLegacyCoreTest.java @@ -46,14 +46,13 @@ import androidx.test.runner.AndroidJUnit4; import com.android.frameworks.servicestests.R; import com.android.internal.util.ArrayUtils; import com.android.server.pm.PackageManagerException; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.ParsedPackage; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.component.ParsedActivityUtils; import com.android.server.pm.pkg.component.ParsedComponent; import com.android.server.pm.pkg.component.ParsedIntentInfo; import com.android.server.pm.pkg.component.ParsedPermission; import com.android.server.pm.pkg.component.ParsedPermissionUtils; -import com.android.server.pm.pkg.parsing.ParsingPackage; import com.android.server.pm.pkg.parsing.ParsingPackageUtils; import com.google.common.truth.Expect; diff --git a/services/tests/servicestests/src/com/android/server/pm/parsing/library/AndroidHidlUpdaterTest.java b/services/tests/servicestests/src/com/android/server/pm/parsing/library/AndroidHidlUpdaterTest.java index 6b600421666e..d3107b07d828 100644 --- a/services/tests/servicestests/src/com/android/server/pm/parsing/library/AndroidHidlUpdaterTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/parsing/library/AndroidHidlUpdaterTest.java @@ -24,9 +24,9 @@ import android.platform.test.annotations.Presubmit; import androidx.test.filters.SmallTest; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.PackageImpl; import com.android.server.pm.parsing.pkg.ParsedPackage; +import com.android.server.pm.pkg.AndroidPackage; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/services/tests/servicestests/src/com/android/server/pm/parsing/library/AndroidNetIpSecIkeUpdaterTest.java b/services/tests/servicestests/src/com/android/server/pm/parsing/library/AndroidNetIpSecIkeUpdaterTest.java index 70d85b6e0411..36308d23e520 100644 --- a/services/tests/servicestests/src/com/android/server/pm/parsing/library/AndroidNetIpSecIkeUpdaterTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/parsing/library/AndroidNetIpSecIkeUpdaterTest.java @@ -21,9 +21,9 @@ import android.platform.test.annotations.Presubmit; import androidx.test.filters.SmallTest; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.PackageImpl; import com.android.server.pm.parsing.pkg.ParsedPackage; +import com.android.server.pm.pkg.AndroidPackage; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/services/tests/servicestests/src/com/android/server/pm/parsing/library/AndroidTestBaseUpdaterTest.java b/services/tests/servicestests/src/com/android/server/pm/parsing/library/AndroidTestBaseUpdaterTest.java index f536052a319d..3782f5d1e20d 100644 --- a/services/tests/servicestests/src/com/android/server/pm/parsing/library/AndroidTestBaseUpdaterTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/parsing/library/AndroidTestBaseUpdaterTest.java @@ -23,9 +23,9 @@ import android.platform.test.annotations.Presubmit; import androidx.test.filters.SmallTest; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.PackageImpl; import com.android.server.pm.parsing.pkg.ParsedPackage; +import com.android.server.pm.pkg.AndroidPackage; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/services/tests/servicestests/src/com/android/server/pm/parsing/library/AndroidTestRunnerSplitUpdaterTest.java b/services/tests/servicestests/src/com/android/server/pm/parsing/library/AndroidTestRunnerSplitUpdaterTest.java index 77197e3c6bcb..a739607bdb65 100644 --- a/services/tests/servicestests/src/com/android/server/pm/parsing/library/AndroidTestRunnerSplitUpdaterTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/parsing/library/AndroidTestRunnerSplitUpdaterTest.java @@ -25,9 +25,9 @@ import android.platform.test.annotations.Presubmit; import androidx.test.filters.SmallTest; import com.android.server.pm.parsing.library.PackageBackwardCompatibility.AndroidTestRunnerSplitUpdater; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.PackageImpl; import com.android.server.pm.parsing.pkg.ParsedPackage; +import com.android.server.pm.pkg.AndroidPackage; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/services/tests/servicestests/src/com/android/server/pm/parsing/library/ApexSharedLibraryUpdaterTest.java b/services/tests/servicestests/src/com/android/server/pm/parsing/library/ApexSharedLibraryUpdaterTest.java index 0b144dc7ee3a..3977d0dd7cc3 100644 --- a/services/tests/servicestests/src/com/android/server/pm/parsing/library/ApexSharedLibraryUpdaterTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/parsing/library/ApexSharedLibraryUpdaterTest.java @@ -23,9 +23,9 @@ import android.util.ArrayMap; import androidx.test.filters.SmallTest; import com.android.server.SystemConfig; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.PackageImpl; import com.android.server.pm.parsing.pkg.ParsedPackage; +import com.android.server.pm.pkg.AndroidPackage; import org.junit.Before; import org.junit.Test; diff --git a/services/tests/servicestests/src/com/android/server/pm/parsing/library/ComGoogleAndroidMapsUpdaterTest.java b/services/tests/servicestests/src/com/android/server/pm/parsing/library/ComGoogleAndroidMapsUpdaterTest.java index 404f29c118d0..a31c7817ab02 100644 --- a/services/tests/servicestests/src/com/android/server/pm/parsing/library/ComGoogleAndroidMapsUpdaterTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/parsing/library/ComGoogleAndroidMapsUpdaterTest.java @@ -21,9 +21,9 @@ import android.platform.test.annotations.Presubmit; import androidx.test.filters.SmallTest; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.PackageImpl; import com.android.server.pm.parsing.pkg.ParsedPackage; +import com.android.server.pm.pkg.AndroidPackage; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/services/tests/servicestests/src/com/android/server/pm/parsing/library/OrgApacheHttpLegacyUpdaterTest.java b/services/tests/servicestests/src/com/android/server/pm/parsing/library/OrgApacheHttpLegacyUpdaterTest.java index 95b8d3f9eb4e..f5e3f4ed5e71 100644 --- a/services/tests/servicestests/src/com/android/server/pm/parsing/library/OrgApacheHttpLegacyUpdaterTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/parsing/library/OrgApacheHttpLegacyUpdaterTest.java @@ -23,9 +23,9 @@ import android.platform.test.annotations.Presubmit; import androidx.test.filters.SmallTest; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.PackageImpl; import com.android.server.pm.parsing.pkg.ParsedPackage; +import com.android.server.pm.pkg.AndroidPackage; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/services/tests/servicestests/src/com/android/server/pm/parsing/library/PackageBackwardCompatibilityTest.java b/services/tests/servicestests/src/com/android/server/pm/parsing/library/PackageBackwardCompatibilityTest.java index b28446b337a6..b3648b1fe072 100644 --- a/services/tests/servicestests/src/com/android/server/pm/parsing/library/PackageBackwardCompatibilityTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/parsing/library/PackageBackwardCompatibilityTest.java @@ -23,16 +23,16 @@ import static com.android.server.pm.parsing.library.SharedLibraryNames.ORG_APACH import static com.google.common.truth.Truth.assertThat; -import com.android.server.pm.pkg.parsing.ParsingPackage; import android.os.Build; import android.platform.test.annotations.Presubmit; import androidx.test.filters.SmallTest; import com.android.server.pm.parsing.library.PackageBackwardCompatibility.RemoveUnnecessaryAndroidTestBaseLibrary; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.PackageImpl; import com.android.server.pm.parsing.pkg.ParsedPackage; +import com.android.server.pm.pkg.AndroidPackage; +import com.android.server.pm.pkg.parsing.ParsingPackage; import org.junit.Assume; import org.junit.Test; diff --git a/services/tests/servicestests/src/com/android/server/pm/parsing/library/PackageSharedLibraryUpdaterTest.java b/services/tests/servicestests/src/com/android/server/pm/parsing/library/PackageSharedLibraryUpdaterTest.java index a71572fa2b54..2450a14bd5ef 100644 --- a/services/tests/servicestests/src/com/android/server/pm/parsing/library/PackageSharedLibraryUpdaterTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/parsing/library/PackageSharedLibraryUpdaterTest.java @@ -18,8 +18,8 @@ package com.android.server.pm.parsing.library; import static org.junit.Assert.assertEquals; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.ParsedPackage; +import com.android.server.pm.pkg.AndroidPackage; import java.util.function.Supplier; diff --git a/services/tests/servicestests/src/com/android/server/pm/parsing/library/RemoveUnnecessaryAndroidTestBaseLibraryTest.java b/services/tests/servicestests/src/com/android/server/pm/parsing/library/RemoveUnnecessaryAndroidTestBaseLibraryTest.java index 1122490d6b1a..2825c69daeff 100644 --- a/services/tests/servicestests/src/com/android/server/pm/parsing/library/RemoveUnnecessaryAndroidTestBaseLibraryTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/parsing/library/RemoveUnnecessaryAndroidTestBaseLibraryTest.java @@ -24,9 +24,9 @@ import android.platform.test.annotations.Presubmit; import androidx.test.filters.SmallTest; import com.android.server.pm.parsing.library.PackageBackwardCompatibility.RemoveUnnecessaryAndroidTestBaseLibrary; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.PackageImpl; import com.android.server.pm.parsing.pkg.ParsedPackage; +import com.android.server.pm.pkg.AndroidPackage; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/services/tests/servicestests/src/com/android/server/pm/parsing/library/RemoveUnnecessaryOrgApacheHttpLegacyLibraryTest.java b/services/tests/servicestests/src/com/android/server/pm/parsing/library/RemoveUnnecessaryOrgApacheHttpLegacyLibraryTest.java index 3cc84753b810..c0da8a7ed0c1 100644 --- a/services/tests/servicestests/src/com/android/server/pm/parsing/library/RemoveUnnecessaryOrgApacheHttpLegacyLibraryTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/parsing/library/RemoveUnnecessaryOrgApacheHttpLegacyLibraryTest.java @@ -24,9 +24,9 @@ import android.platform.test.annotations.Presubmit; import androidx.test.filters.SmallTest; import com.android.server.pm.parsing.library.PackageBackwardCompatibility.RemoveUnnecessaryOrgApacheHttpLegacyLibrary; -import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.PackageImpl; import com.android.server.pm.parsing.pkg.ParsedPackage; +import com.android.server.pm.pkg.AndroidPackage; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/services/tests/servicestests/src/com/android/server/timedetector/GnssTimeUpdateServiceTest.java b/services/tests/servicestests/src/com/android/server/timedetector/GnssTimeUpdateServiceTest.java index 6402e1298124..3f550d0aa0c1 100644 --- a/services/tests/servicestests/src/com/android/server/timedetector/GnssTimeUpdateServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/timedetector/GnssTimeUpdateServiceTest.java @@ -16,15 +16,18 @@ package com.android.server.timedetector; +import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.any; import static org.mockito.Mockito.anyLong; import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.never; +import static org.mockito.Mockito.reset; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; import android.app.AlarmManager; +import android.app.AlarmManager.OnAlarmListener; import android.content.Context; import android.location.Location; import android.location.LocationListener; @@ -36,9 +39,6 @@ import android.os.TimestampedValue; import androidx.test.runner.AndroidJUnit4; -import com.android.server.LocalServices; - -import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -64,19 +64,13 @@ public final class GnssTimeUpdateServiceTest { public void setUp() { MockitoAnnotations.initMocks(this); - when(mMockLocationManager.hasProvider(LocationManager.GPS_PROVIDER)) - .thenReturn(true); + installGpsProviderInMockLocationManager(); mGnssTimeUpdateService = new GnssTimeUpdateService( mMockContext, mMockAlarmManager, mMockLocationManager, mMockLocationManagerInternal, mMockTimeDetectorInternal); } - @After - public void tearDown() { - LocalServices.removeServiceForTest(LocationManagerInternal.class); - } - @Test public void testLocationListenerOnLocationChanged_validLocationTime_suggestsGnssTime() { TimestampedValue<Long> timeSignal = new TimestampedValue<>( @@ -85,9 +79,9 @@ public final class GnssTimeUpdateServiceTest { LocationTime locationTime = new LocationTime(GNSS_TIME, ELAPSED_REALTIME_NS); doReturn(locationTime).when(mMockLocationManagerInternal).getGnssTimeMillis(); - mGnssTimeUpdateService.requestGnssTimeUpdates(); + assertTrue(mGnssTimeUpdateService.startGnssListeningInternal()); - ArgumentCaptor<LocationListener> argumentCaptor = + ArgumentCaptor<LocationListener> locationListenerCaptor = ArgumentCaptor.forClass(LocationListener.class); verify(mMockLocationManager).requestLocationUpdates( eq(LocationManager.GPS_PROVIDER), @@ -95,8 +89,8 @@ public final class GnssTimeUpdateServiceTest { .setMinUpdateIntervalMillis(0) .build()), any(), - argumentCaptor.capture()); - LocationListener locationListener = argumentCaptor.getValue(); + locationListenerCaptor.capture()); + LocationListener locationListener = locationListenerCaptor.getValue(); Location location = new Location(LocationManager.GPS_PROVIDER); locationListener.onLocationChanged(location); @@ -115,9 +109,9 @@ public final class GnssTimeUpdateServiceTest { public void testLocationListenerOnLocationChanged_nullLocationTime_doesNotSuggestGnssTime() { doReturn(null).when(mMockLocationManagerInternal).getGnssTimeMillis(); - mGnssTimeUpdateService.requestGnssTimeUpdates(); + assertTrue(mGnssTimeUpdateService.startGnssListeningInternal()); - ArgumentCaptor<LocationListener> argumentCaptor = + ArgumentCaptor<LocationListener> locationListenerCaptor = ArgumentCaptor.forClass(LocationListener.class); verify(mMockLocationManager).requestLocationUpdates( eq(LocationManager.GPS_PROVIDER), @@ -125,14 +119,14 @@ public final class GnssTimeUpdateServiceTest { .setMinUpdateIntervalMillis(0) .build()), any(), - argumentCaptor.capture()); - LocationListener locationListener = argumentCaptor.getValue(); + locationListenerCaptor.capture()); + LocationListener locationListener = locationListenerCaptor.getValue(); Location location = new Location(LocationManager.GPS_PROVIDER); locationListener.onLocationChanged(location); verify(mMockLocationManager).removeUpdates(locationListener); - verify(mMockTimeDetectorInternal, never()).suggestGnssTime(any()); + verifyZeroInteractions(mMockTimeDetectorInternal); verify(mMockAlarmManager).set( eq(AlarmManager.ELAPSED_REALTIME_WAKEUP), anyLong(), @@ -140,4 +134,90 @@ public final class GnssTimeUpdateServiceTest { any(), any()); } + + @Test + public void testLocationListeningRestartsAfterSleep() { + ArgumentCaptor<LocationListener> locationListenerCaptor = + ArgumentCaptor.forClass(LocationListener.class); + ArgumentCaptor<OnAlarmListener> alarmListenerCaptor = + ArgumentCaptor.forClass(OnAlarmListener.class); + + advanceServiceToSleepingState(locationListenerCaptor, alarmListenerCaptor); + + // Simulate the alarm manager's wake-up call. + OnAlarmListener wakeUpListener = alarmListenerCaptor.getValue(); + wakeUpListener.onAlarm(); + + // Verify the service returned to location listening. + verify(mMockLocationManager).requestLocationUpdates(any(), any(), any(), any()); + verifyZeroInteractions(mMockAlarmManager, mMockTimeDetectorInternal); + } + + // Tests what happens when a call is made to startGnssListeningInternal() when service is + // sleeping. This can happen when the start_gnss_listening shell command is used. + @Test + public void testStartGnssListeningInternalCalledWhenSleeping() { + ArgumentCaptor<LocationListener> locationListenerCaptor = + ArgumentCaptor.forClass(LocationListener.class); + ArgumentCaptor<OnAlarmListener> alarmListenerCaptor = + ArgumentCaptor.forClass(OnAlarmListener.class); + + advanceServiceToSleepingState(locationListenerCaptor, alarmListenerCaptor); + + // Call startGnssListeningInternal(), as can happen if the start_gnss_listening shell + // command is used. + assertTrue(mGnssTimeUpdateService.startGnssListeningInternal()); + + // Verify the alarm manager is told to stopped sleeping and the location manager is + // listening again. + verify(mMockAlarmManager).cancel(alarmListenerCaptor.getValue()); + verify(mMockLocationManager).requestLocationUpdates(any(), any(), any(), any()); + verifyZeroInteractions(mMockTimeDetectorInternal); + } + + private void advanceServiceToSleepingState( + ArgumentCaptor<LocationListener> locationListenerCaptor, + ArgumentCaptor<OnAlarmListener> alarmListenerCaptor) { + TimestampedValue<Long> timeSignal = new TimestampedValue<>( + ELAPSED_REALTIME_MS, GNSS_TIME); + GnssTimeSuggestion timeSuggestion = new GnssTimeSuggestion(timeSignal); + LocationTime locationTime = new LocationTime(GNSS_TIME, ELAPSED_REALTIME_NS); + doReturn(locationTime).when(mMockLocationManagerInternal).getGnssTimeMillis(); + + assertTrue(mGnssTimeUpdateService.startGnssListeningInternal()); + + verify(mMockLocationManager).requestLocationUpdates( + any(), any(), any(), locationListenerCaptor.capture()); + LocationListener locationListener = locationListenerCaptor.getValue(); + Location location = new Location(LocationManager.GPS_PROVIDER); + verifyZeroInteractions(mMockAlarmManager, mMockTimeDetectorInternal); + + locationListener.onLocationChanged(location); + + verify(mMockLocationManager).removeUpdates(locationListener); + verify(mMockTimeDetectorInternal).suggestGnssTime(timeSuggestion); + + // Verify the service is now "sleeping", i.e. waiting for a period before listening for + // GNSS locations again. + verify(mMockAlarmManager).set( + eq(AlarmManager.ELAPSED_REALTIME_WAKEUP), + anyLong(), + any(), + alarmListenerCaptor.capture(), + any()); + + // Reset mocks making it easier to verify the calls that follow. + reset(mMockAlarmManager, mMockTimeDetectorInternal, mMockLocationManager, + mMockLocationManagerInternal); + installGpsProviderInMockLocationManager(); + } + + /** + * Configures the mock response to ensure {@code + * locationManager.hasProvider(LocationManager.GPS_PROVIDER) == true } + */ + private void installGpsProviderInMockLocationManager() { + when(mMockLocationManager.hasProvider(LocationManager.GPS_PROVIDER)) + .thenReturn(true); + } } diff --git a/services/tests/servicestests/src/com/android/server/vibrator/InputDeviceDelegateTest.java b/services/tests/servicestests/src/com/android/server/vibrator/InputDeviceDelegateTest.java index ec4ad8965f7d..2ac8b3700043 100644 --- a/services/tests/servicestests/src/com/android/server/vibrator/InputDeviceDelegateTest.java +++ b/services/tests/servicestests/src/com/android/server/vibrator/InputDeviceDelegateTest.java @@ -33,7 +33,6 @@ import android.content.Context; import android.content.ContextWrapper; import android.hardware.input.IInputDevicesChangedListener; import android.hardware.input.IInputManager; -import android.hardware.input.InputDeviceCountryCode; import android.hardware.input.InputManager; import android.os.CombinedVibration; import android.os.Handler; @@ -328,10 +327,11 @@ public class InputDeviceDelegateTest { } private InputDevice createInputDevice(int id, boolean hasVibrator) { - return new InputDevice(id, 0, 0, "name", 0, 0, "description", false, 0, 0, - null, InputDeviceCountryCode.INVALID, hasVibrator, false, false, - false /* hasSensor */, false /* hasBattery */); - - + return new InputDevice.Builder() + .setId(id) + .setName("name") + .setDescriptor("descriptor") + .setHasVibrator(hasVibrator) + .build(); } } diff --git a/services/tests/servicestests/src/com/android/server/vibrator/VibratorManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/vibrator/VibratorManagerServiceTest.java index 8d53b71a93dc..c46fecd1a55e 100644 --- a/services/tests/servicestests/src/com/android/server/vibrator/VibratorManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/vibrator/VibratorManagerServiceTest.java @@ -46,7 +46,6 @@ import android.content.Context; import android.content.ContextWrapper; import android.content.pm.PackageManagerInternal; import android.hardware.input.IInputManager; -import android.hardware.input.InputDeviceCountryCode; import android.hardware.input.InputManager; import android.hardware.vibrator.IVibrator; import android.hardware.vibrator.IVibratorManager; @@ -1980,9 +1979,11 @@ public class VibratorManagerServiceTest { } private InputDevice createInputDeviceWithVibrator(int id) { - return new InputDevice(id, 0, 0, "name", 0, 0, "description", false, 0, 0, - null, InputDeviceCountryCode.INVALID, /* hasVibrator= */ true, false, false, false, - false); + return new InputDevice.Builder() + .setId(id) + .setName("Test Device " + id) + .setHasVibrator(true) + .build(); } private static <T> void addLocalServiceMock(Class<T> clazz, T mock) { diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java index 2204ae31642a..85e5bfd84f9f 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java @@ -102,7 +102,7 @@ import android.window.TaskFragmentOrganizerToken; import androidx.test.filters.SmallTest; -import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.AndroidPackage; import com.android.server.wm.LaunchParamsController.LaunchParamsModifier; import com.android.server.wm.utils.MockTracker; diff --git a/services/tests/wmtests/src/com/android/server/wm/ImeInsetsSourceProviderTest.java b/services/tests/wmtests/src/com/android/server/wm/ImeInsetsSourceProviderTest.java index ca8481a8c50b..c839d1254397 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ImeInsetsSourceProviderTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/ImeInsetsSourceProviderTest.java @@ -63,6 +63,7 @@ public class ImeInsetsSourceProviderTest extends WindowTestsBase { public void testInputMethodInputTargetCanShowIme() { WindowState target = createWindow(null, TYPE_APPLICATION, "app"); mDisplayContent.setImeLayeringTarget(target); + mDisplayContent.updateImeInputAndControlTarget(target); mImeProvider.scheduleShowImePostLayout(target); assertTrue(mImeProvider.isReadyToShowIme()); } diff --git a/services/tests/wmtests/src/com/android/server/wm/SafeActivityOptionsTest.java b/services/tests/wmtests/src/com/android/server/wm/SafeActivityOptionsTest.java index 71118521acf5..e57ad5d9ff8c 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SafeActivityOptionsTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/SafeActivityOptionsTest.java @@ -17,9 +17,12 @@ package com.android.server.wm; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertSame; +import static org.mockito.Mockito.mock; import android.app.ActivityOptions; import android.platform.test.annotations.Presubmit; +import android.window.WindowContainerToken; import androidx.test.filters.MediumTest; @@ -43,4 +46,21 @@ public class SafeActivityOptionsTest { final ActivityOptions result = options.mergeActivityOptions(opts1, opts2); assertEquals(6, result.getLaunchDisplayId()); } + + @Test + public void test_selectiveCloneDisplayOptions() { + final WindowContainerToken token = mock(WindowContainerToken.class); + final int launchDisplayId = 5; + final int callerDisplayId = 6; + + final SafeActivityOptions clone = new SafeActivityOptions(ActivityOptions.makeBasic() + .setLaunchTaskDisplayArea(token) + .setLaunchDisplayId(launchDisplayId) + .setCallerDisplayId(callerDisplayId)) + .selectiveCloneDisplayOptions(); + + assertSame(clone.getOriginalOptions().getLaunchTaskDisplayArea(), token); + assertEquals(clone.getOriginalOptions().getLaunchDisplayId(), launchDisplayId); + assertEquals(clone.getOriginalOptions().getCallerDisplayId(), callerDisplayId); + } } diff --git a/tests/Input/src/com/android/test/input/InputDeviceTest.java b/tests/Input/src/com/android/test/input/InputDeviceTest.java index 836d406d903c..06a96dfb8176 100644 --- a/tests/Input/src/com/android/test/input/InputDeviceTest.java +++ b/tests/Input/src/com/android/test/input/InputDeviceTest.java @@ -69,13 +69,25 @@ public class InputDeviceTest { } private void assertInputDeviceParcelUnparcel(KeyCharacterMap keyCharacterMap) { - final InputDevice device = - new InputDevice(DEVICE_ID, 0 /* generation */, 0 /* controllerNumber */, "name", - 0 /* vendorId */, 0 /* productId */, "descriptor", true /* isExternal */, - 0 /* sources */, 0 /* keyboardType */, keyCharacterMap, - InputDeviceCountryCode.INTERNATIONAL, false /* hasVibrator */, - false /* hasMicrophone */, false /* hasButtonUnderpad */, - true /* hasSensor */, false /* hasBattery */); + final InputDevice device = new InputDevice.Builder() + .setId(DEVICE_ID) + .setGeneration(42) + .setControllerNumber(43) + .setName("Test Device " + DEVICE_ID) + .setVendorId(44) + .setProductId(45) + .setDescriptor("descriptor") + .setExternal(true) + .setSources(InputDevice.SOURCE_HDMI) + .setKeyboardType(InputDevice.KEYBOARD_TYPE_NON_ALPHABETIC) + .setKeyCharacterMap(keyCharacterMap) + .setHasVibrator(true) + .setHasMicrophone(true) + .setHasButtonUnderPad(true) + .setHasSensor(true) + .setHasBattery(true) + .setCountryCode(InputDeviceCountryCode.INTERNATIONAL) + .build(); Parcel parcel = Parcel.obtain(); device.writeToParcel(parcel, 0); diff --git a/tools/codegen/BUILD.bazel b/tools/codegen/BUILD.bazel new file mode 100644 index 000000000000..c14046d674dc --- /dev/null +++ b/tools/codegen/BUILD.bazel @@ -0,0 +1,21 @@ +# TODO(b/245731902): auto-generate these with bp2build. +load("@rules_kotlin//kotlin:jvm_library.bzl", "kt_jvm_library") + +java_binary( + name = "codegen_cli", + main_class = "com.android.codegen.MainKt", + runtime_deps = [ + ":codegen_cli_kt_lib", + ], +) + +kt_jvm_library( + name = "codegen_cli_kt_lib", + srcs = glob(["src/**/*.kt"]), + deps = ["//external/javaparser"], +) + +kt_jvm_library( + name = "codegen-version-info", + srcs = glob(["src/**/SharedConstants.kt"]), +) |