diff options
202 files changed, 4310 insertions, 700 deletions
diff --git a/Android.bp b/Android.bp index 8d3b4af82bc8..935b2bb478bb 100644 --- a/Android.bp +++ b/Android.bp @@ -722,7 +722,6 @@ filegroup { "core/java/com/android/internal/util/IndentingPrintWriter.java", "core/java/com/android/internal/util/IState.java", "core/java/com/android/internal/util/MessageUtils.java", - "core/java/com/android/internal/util/Preconditions.java", "core/java/com/android/internal/util/State.java", "core/java/com/android/internal/util/StateMachine.java", "core/java/com/android/internal/util/TrafficStatsConstants.java", diff --git a/ApiDocs.bp b/ApiDocs.bp index 04ddc50a94c4..fbc5c9dc817d 100644 --- a/ApiDocs.bp +++ b/ApiDocs.bp @@ -65,8 +65,9 @@ stubs_defaults { "test-base/src/**/*.java", ":opt-telephony-srcs", ":opt-net-voip-srcs", - ":core-current-stubs-source", - ":core_public_api_files", + ":art-module-public-api-stubs-source", + ":conscrypt.module.public.api.stubs.source", + ":android_icu4j_public_api_files", "test-mock/src/**/*.java", "test-runner/src/**/*.java", ], diff --git a/StubLibraries.bp b/StubLibraries.bp index bfc1367cceb9..8fd8c907202c 100644 --- a/StubLibraries.bp +++ b/StubLibraries.bp @@ -47,8 +47,9 @@ stubs_defaults { "core/java/**/*.logtags", ":opt-telephony-srcs", ":opt-net-voip-srcs", - ":core-current-stubs-source", - ":core_public_api_files", + ":art-module-public-api-stubs-source", + ":conscrypt.module.public.api.stubs.source", + ":android_icu4j_public_api_files", ], // TODO(b/147699819): remove below aidl includes. aidl: { diff --git a/api/test-current.txt b/api/test-current.txt index 5d91adf6c060..5df84ec97bf7 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -3691,6 +3691,7 @@ package android.telecom { } public class TelecomManager { + method @NonNull public android.content.Intent createLaunchEmergencyDialerIntent(@Nullable String); method @NonNull @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public java.util.List<android.telecom.PhoneAccountHandle> getCallCapablePhoneAccounts(boolean); method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public int getCurrentTtyMode(); method @Nullable @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public String getDefaultDialerPackage(@NonNull android.os.UserHandle); diff --git a/cmds/statsd/tools/localtools/Android.bp b/cmds/statsd/tools/localtools/Android.bp index 75a57a3f3068..69a43a8f4712 100644 --- a/cmds/statsd/tools/localtools/Android.bp +++ b/cmds/statsd/tools/localtools/Android.bp @@ -11,9 +11,8 @@ java_binary_host { ], } -java_binary_host { - name: "statsd_testdrive", - manifest: "testdrive_manifest.txt", +java_library_host { + name: "statsd_testdrive_lib", srcs: [ "src/com/android/statsd/shelltools/testdrive/*.java", "src/com/android/statsd/shelltools/Utils.java", @@ -22,4 +21,26 @@ java_binary_host { "platformprotos", "guava", ], -}
\ No newline at end of file +} + + +java_binary_host { + name: "statsd_testdrive", + manifest: "testdrive_manifest.txt", + static_libs: [ + "statsd_testdrive_lib", + ], +} + +java_test_host { + name: "statsd_testdrive_test", + test_suites: ["general-tests"], + srcs: ["test/com/android/statsd/shelltools/testdrive/*.java"], + static_libs: [ + "statsd_testdrive_lib", + "junit", + "platformprotos", + "guava", + ], +} + diff --git a/cmds/statsd/tools/localtools/TEST_MAPPING b/cmds/statsd/tools/localtools/TEST_MAPPING new file mode 100644 index 000000000000..7c8a3db5c610 --- /dev/null +++ b/cmds/statsd/tools/localtools/TEST_MAPPING @@ -0,0 +1,8 @@ +{ + "presubmit": [ + { + "name": "statsd_testdrive_test", + "host": true + } + ] +} diff --git a/cmds/statsd/tools/localtools/src/com/android/statsd/shelltools/Utils.java b/cmds/statsd/tools/localtools/src/com/android/statsd/shelltools/Utils.java index 2909048da7ea..6a74480b505e 100644 --- a/cmds/statsd/tools/localtools/src/com/android/statsd/shelltools/Utils.java +++ b/cmds/statsd/tools/localtools/src/com/android/statsd/shelltools/Utils.java @@ -229,4 +229,56 @@ public class Utils { } return null; } + + /** + * Returns ANDROID_SERIAL environment variable, or null if that is undefined or unavailable. + * @param logger Destination of error messages. + * @return String value of ANDROID_SERIAL environment variable, or null. + */ + public static String getDefaultDevice(Logger logger) { + try { + return System.getenv("ANDROID_SERIAL"); + } catch (Exception ex) { + logger.log(Level.SEVERE, "Failed to check ANDROID_SERIAL environment variable.", + ex); + } + return null; + } + + /** + * Returns the device to use if one can be deduced, or null. + * @param device Command-line specified device, or null. + * @param connectedDevices List of all connected devices. + * @param defaultDevice Environment-variable specified device, or null. + * @param logger Destination of error messages. + * @return Device to use, or null. + */ + public static String chooseDevice(String device, List<String> connectedDevices, + String defaultDevice, Logger logger) { + if (connectedDevices == null || connectedDevices.isEmpty()) { + logger.severe("No connected device."); + return null; + } + if (device != null) { + if (connectedDevices.contains(device)) { + return device; + } + logger.severe("Device not connected: " + device); + return null; + } + if (connectedDevices.size() == 1) { + return connectedDevices.get(0); + } + if (defaultDevice != null) { + if (connectedDevices.contains(defaultDevice)) { + return defaultDevice; + } else { + logger.severe("ANDROID_SERIAL device is not connected: " + defaultDevice); + return null; + } + } + logger.severe("More than one device is connected. Choose one" + + " with -s DEVICE_SERIAL or environment variable ANDROID_SERIAL."); + return null; + } } diff --git a/cmds/statsd/tools/localtools/src/com/android/statsd/shelltools/localdrive/LocalDrive.java b/cmds/statsd/tools/localtools/src/com/android/statsd/shelltools/localdrive/LocalDrive.java index 7db514180b9a..ec3c7df7bfba 100644 --- a/cmds/statsd/tools/localtools/src/com/android/statsd/shelltools/localdrive/LocalDrive.java +++ b/cmds/statsd/tools/localtools/src/com/android/statsd/shelltools/localdrive/LocalDrive.java @@ -27,7 +27,6 @@ import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.List; -import java.util.logging.Level; import java.util.logging.Logger; /** @@ -112,17 +111,9 @@ public class LocalDrive { } List<String> connectedDevices = Utils.getDeviceSerials(sLogger); - if (connectedDevices == null || connectedDevices.size() == 0) { - sLogger.log(Level.SEVERE, "No device connected."); - return; - } - if (connectedDevices.size() == 1 && deviceSerial == null) { - deviceSerial = connectedDevices.get(0); - } - + deviceSerial = Utils.chooseDevice(deviceSerial, connectedDevices, + Utils.getDefaultDevice(sLogger), sLogger); if (deviceSerial == null) { - sLogger.log(Level.SEVERE, "More than one devices connected. Please specify" - + " with -s DEVICE_SERIAL"); return; } diff --git a/cmds/statsd/tools/localtools/src/com/android/statsd/shelltools/testdrive/TestDrive.java b/cmds/statsd/tools/localtools/src/com/android/statsd/shelltools/testdrive/TestDrive.java index 54a744b654cb..8ac251e39a18 100644 --- a/cmds/statsd/tools/localtools/src/com/android/statsd/shelltools/testdrive/TestDrive.java +++ b/cmds/statsd/tools/localtools/src/com/android/statsd/shelltools/testdrive/TestDrive.java @@ -15,6 +15,7 @@ */ package com.android.statsd.shelltools.testdrive; +import com.android.internal.os.StatsdConfigProto; import com.android.internal.os.StatsdConfigProto.AtomMatcher; import com.android.internal.os.StatsdConfigProto.EventMetric; import com.android.internal.os.StatsdConfigProto.FieldFilter; @@ -29,6 +30,7 @@ import com.android.os.StatsLog.ConfigMetricsReportList; import com.android.os.StatsLog.StatsLogReport; import com.android.statsd.shelltools.Utils; +import com.google.common.annotations.VisibleForTesting; import com.google.common.io.Files; import java.io.File; @@ -39,6 +41,7 @@ import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.TreeSet; import java.util.logging.Level; import java.util.logging.Logger; @@ -73,179 +76,269 @@ public class TestDrive { }; private static final Logger LOGGER = Logger.getLogger(TestDrive.class.getName()); - private String mAdditionalAllowedPackage; - private String mDeviceSerial; - private final Set<Long> mTrackedMetrics = new HashSet<>(); + @VisibleForTesting + String mDeviceSerial = null; public static void main(String[] args) { + final Configuration configuration = new Configuration(); + TestDrive testDrive = new TestDrive(); - Set<Integer> trackedAtoms = new HashSet<>(); Utils.setUpLogger(LOGGER, false); - String remoteConfigPath = null; - if (args.length < 1) { - LOGGER.log(Level.SEVERE, "Usage: ./test_drive [-p additional_allowed_package] " - + "[-s DEVICE_SERIAL_NUMBER]" - + "<atomId1> <atomId2> ... <atomIdN>"); + if (!testDrive.processArgs(configuration, args, + Utils.getDeviceSerials(LOGGER), Utils.getDefaultDevice(LOGGER))) { return; } - List<String> connectedDevices = Utils.getDeviceSerials(LOGGER); - if (connectedDevices == null || connectedDevices.size() == 0) { - LOGGER.log(Level.SEVERE, "No device connected."); - return; + final ConfigMetricsReportList reports = testDrive.testDriveAndGetReports( + configuration.createConfig(), configuration.hasPulledAtoms(), + configuration.hasPushedAtoms()); + if (reports != null) { + configuration.dumpMetrics(reports); } + } - int arg_index = 0; - while (arg_index < args.length) { - String arg = args[arg_index]; - if (arg.equals("-p")) { - testDrive.mAdditionalAllowedPackage = args[++arg_index]; - } else if (arg.equals("-s")) { - testDrive.mDeviceSerial = args[++arg_index]; - } else { - break; - } - arg_index++; + boolean processArgs(Configuration configuration, String[] args, List<String> connectedDevices, + String defaultDevice) { + if (args.length < 1) { + LOGGER.severe("Usage: ./test_drive [-one] " + + "[-p additional_allowed_package] " + + "[-s DEVICE_SERIAL_NUMBER] " + + "<atomId1> <atomId2> ... <atomIdN>"); + return false; } - if (connectedDevices.size() == 1 && testDrive.mDeviceSerial == null) { - testDrive.mDeviceSerial = connectedDevices.get(0); + int first_arg = 0; + // Consume all flags, which must precede all atoms + for (; first_arg < args.length; ++first_arg) { + String arg = args[first_arg]; + int remaining_args = args.length - first_arg; + if (remaining_args >= 2 && arg.equals("-one")) { + LOGGER.info("Creating one event metric to catch all pushed atoms."); + configuration.mOnePushedAtomEvent = true; + } else if (remaining_args >= 3 && arg.equals("-p")) { + configuration.mAdditionalAllowedPackage = args[++first_arg]; + } else if (remaining_args >= 3 && arg.equals("-s")) { + mDeviceSerial = args[++first_arg]; + } else { + break; // Found the atom list + } } - if (testDrive.mDeviceSerial == null) { - LOGGER.log(Level.SEVERE, "More than one devices connected. Please specify" - + " with -s DEVICE_SERIAL"); - return; + mDeviceSerial = Utils.chooseDevice(mDeviceSerial, connectedDevices, defaultDevice, LOGGER); + if (mDeviceSerial == null) { + return false; } - for (int i = arg_index; i < args.length; i++) { + for ( ; first_arg < args.length; ++first_arg) { + String atom = args[first_arg]; try { - int atomId = Integer.valueOf(args[i]); - if (Atom.getDescriptor().findFieldByNumber(atomId) == null) { - LOGGER.log(Level.SEVERE, "No such atom found: " + args[i]); - continue; - } - trackedAtoms.add(atomId); + configuration.addAtom(Integer.valueOf(atom)); } catch (NumberFormatException e) { - LOGGER.log(Level.SEVERE, "Bad atom id provided: " + args[i]); - continue; + LOGGER.severe("Bad atom id provided: " + atom); } } + return configuration.hasPulledAtoms() || configuration.hasPushedAtoms(); + } + + private ConfigMetricsReportList testDriveAndGetReports(StatsdConfig config, + boolean hasPulledAtoms, boolean hasPushedAtoms) { + if (config == null) { + LOGGER.severe("Failed to create valid config."); + return null; + } + + String remoteConfigPath = null; try { - StatsdConfig config = testDrive.createConfig(trackedAtoms); - if (config == null) { - LOGGER.log(Level.SEVERE, "Failed to create valid config."); - return; - } - remoteConfigPath = testDrive.pushConfig(config, testDrive.mDeviceSerial); - LOGGER.info("Pushed the following config to statsd:"); + remoteConfigPath = pushConfig(config, mDeviceSerial); + LOGGER.info("Pushed the following config to statsd on device '" + mDeviceSerial + + "':"); LOGGER.info(config.toString()); - if (!hasPulledAtom(trackedAtoms)) { + if (hasPushedAtoms) { + LOGGER.info("Now please play with the device to trigger the event."); + } + if (!hasPulledAtoms) { LOGGER.info( - "Now please play with the device to trigger the event. All events should " - + "be dumped after 1 min ..."); + "All events should be dumped after 1 min ..."); Thread.sleep(60_000); } else { - LOGGER.info("Now wait for 1.5 minutes ..."); + LOGGER.info("All events should be dumped after 1.5 minutes ..."); Thread.sleep(15_000); - Utils.logAppBreadcrumb(0, 0, LOGGER, testDrive.mDeviceSerial); + Utils.logAppBreadcrumb(0, 0, LOGGER, mDeviceSerial); Thread.sleep(75_000); } - testDrive.dumpMetrics(); + return Utils.getReportList(CONFIG_ID, true, false, LOGGER, + mDeviceSerial); } catch (Exception e) { LOGGER.log(Level.SEVERE, "Failed to test drive: " + e.getMessage(), e); } finally { - testDrive.removeConfig(testDrive.mDeviceSerial); + removeConfig(mDeviceSerial); if (remoteConfigPath != null) { try { Utils.runCommand(null, LOGGER, - "adb", "-s", testDrive.mDeviceSerial, "shell", "rm", remoteConfigPath); + "adb", "-s", mDeviceSerial, "shell", "rm", + remoteConfigPath); } catch (Exception e) { LOGGER.log(Level.WARNING, "Unable to remove remote config file: " + remoteConfigPath, e); } } } + return null; } - private void dumpMetrics() throws Exception { - ConfigMetricsReportList reportList = Utils.getReportList(CONFIG_ID, true, false, LOGGER, - mDeviceSerial); - // We may get multiple reports. Take the last one. - ConfigMetricsReport report = reportList.getReports(reportList.getReportsCount() - 1); - for (StatsLogReport statsLog : report.getMetricsList()) { - if (mTrackedMetrics.contains(statsLog.getMetricId())) { - LOGGER.info(statsLog.toString()); + static class Configuration { + boolean mOnePushedAtomEvent = false; + @VisibleForTesting + Set<Integer> mPushedAtoms = new TreeSet<>(); + @VisibleForTesting + Set<Integer> mPulledAtoms = new TreeSet<>(); + @VisibleForTesting + String mAdditionalAllowedPackage = null; + private final Set<Long> mTrackedMetrics = new HashSet<>(); + + private void dumpMetrics(ConfigMetricsReportList reportList) { + // We may get multiple reports. Take the last one. + ConfigMetricsReport report = reportList.getReports(reportList.getReportsCount() - 1); + for (StatsLogReport statsLog : report.getMetricsList()) { + if (isTrackedMetric(statsLog.getMetricId())) { + LOGGER.info(statsLog.toString()); + } } } - } - private StatsdConfig createConfig(Set<Integer> atomIds) { - long metricId = METRIC_ID_BASE; - long atomMatcherId = ATOM_MATCHER_ID_BASE; + boolean isTrackedMetric(long metricId) { + return mTrackedMetrics.contains(metricId); + } - ArrayList<String> allowedSources = new ArrayList<>(); - Collections.addAll(allowedSources, ALLOWED_LOG_SOURCES); - if (mAdditionalAllowedPackage != null) { - allowedSources.add(mAdditionalAllowedPackage); + static boolean isPulledAtom(int atomId) { + return atomId >= PULL_ATOM_START && atomId <= MAX_PLATFORM_ATOM_TAG + || atomId >= VENDOR_PULLED_ATOM_START_TAG; } - StatsdConfig.Builder builder = StatsdConfig.newBuilder(); - builder - .addAllAllowedLogSource(allowedSources) - .addAllDefaultPullPackages(Arrays.asList(DEFAULT_PULL_SOURCES)) - .addPullAtomPackages(PullAtomPackages.newBuilder() - .setAtomId(Atom.GPU_STATS_GLOBAL_INFO_FIELD_NUMBER) - .addPackages("AID_GPU_SERVICE")) - .addPullAtomPackages(PullAtomPackages.newBuilder() - .setAtomId(Atom.GPU_STATS_APP_INFO_FIELD_NUMBER) - .addPackages("AID_GPU_SERVICE")) - .addPullAtomPackages(PullAtomPackages.newBuilder() - .setAtomId(Atom.TRAIN_INFO_FIELD_NUMBER) - .addPackages("AID_STATSD")) - .setHashStringsInMetricReport(false); - - if (hasPulledAtom(atomIds)) { - builder.addAtomMatcher( - createAtomMatcher( - Atom.APP_BREADCRUMB_REPORTED_FIELD_NUMBER, APP_BREADCRUMB_MATCHER_ID)); + void addAtom(Integer atom) { + if (Atom.getDescriptor().findFieldByNumber(atom) == null) { + LOGGER.severe("No such atom found: " + atom); + return; + } + if (isPulledAtom(atom)) { + mPulledAtoms.add(atom); + } else { + mPushedAtoms.add(atom); + } } - for (int atomId : atomIds) { - if (isPulledAtom(atomId)) { + private boolean hasPulledAtoms() { + return !mPulledAtoms.isEmpty(); + } + + private boolean hasPushedAtoms() { + return !mPushedAtoms.isEmpty(); + } + + StatsdConfig createConfig() { + long metricId = METRIC_ID_BASE; + long atomMatcherId = ATOM_MATCHER_ID_BASE; + + StatsdConfig.Builder builder = baseBuilder(); + + if (hasPulledAtoms()) { + builder.addAtomMatcher( + createAtomMatcher( + Atom.APP_BREADCRUMB_REPORTED_FIELD_NUMBER, + APP_BREADCRUMB_MATCHER_ID)); + } + + for (int atomId : mPulledAtoms) { builder.addAtomMatcher(createAtomMatcher(atomId, atomMatcherId)); GaugeMetric.Builder gaugeMetricBuilder = GaugeMetric.newBuilder(); gaugeMetricBuilder - .setId(metricId) - .setWhat(atomMatcherId) - .setTriggerEvent(APP_BREADCRUMB_MATCHER_ID) - .setGaugeFieldsFilter(FieldFilter.newBuilder().setIncludeAll(true).build()) - .setBucket(TimeUnit.ONE_MINUTE) - .setSamplingType(GaugeMetric.SamplingType.FIRST_N_SAMPLES) - .setMaxNumGaugeAtomsPerBucket(100); + .setId(metricId) + .setWhat(atomMatcherId) + .setTriggerEvent(APP_BREADCRUMB_MATCHER_ID) + .setGaugeFieldsFilter(FieldFilter.newBuilder().setIncludeAll(true).build()) + .setBucket(TimeUnit.ONE_MINUTE) + .setSamplingType(GaugeMetric.SamplingType.FIRST_N_SAMPLES) + .setMaxNumGaugeAtomsPerBucket(100); builder.addGaugeMetric(gaugeMetricBuilder.build()); - } else { + atomMatcherId++; + mTrackedMetrics.add(metricId++); + } + + // A simple atom matcher for each pushed atom. + List<AtomMatcher> simpleAtomMatchers = new ArrayList<>(); + for (int atomId : mPushedAtoms) { + final AtomMatcher atomMatcher = createAtomMatcher(atomId, atomMatcherId++); + simpleAtomMatchers.add(atomMatcher); + builder.addAtomMatcher(atomMatcher); + } + + if (mOnePushedAtomEvent) { + // Create a union event metric, using an matcher that matches all pulled atoms. + AtomMatcher unionAtomMatcher = createUnionMatcher(simpleAtomMatchers, + atomMatcherId); + builder.addAtomMatcher(unionAtomMatcher); EventMetric.Builder eventMetricBuilder = EventMetric.newBuilder(); - eventMetricBuilder - .setId(metricId) - .setWhat(atomMatcherId); + eventMetricBuilder.setId(metricId).setWhat(unionAtomMatcher.getId()); builder.addEventMetric(eventMetricBuilder.build()); - builder.addAtomMatcher(createAtomMatcher(atomId, atomMatcherId)); + mTrackedMetrics.add(metricId++); + } else { + // Create multiple event metrics, one per pulled atom. + for (AtomMatcher atomMatcher : simpleAtomMatchers) { + EventMetric.Builder eventMetricBuilder = EventMetric.newBuilder(); + eventMetricBuilder + .setId(metricId) + .setWhat(atomMatcher.getId()); + builder.addEventMetric(eventMetricBuilder.build()); + mTrackedMetrics.add(metricId++); + } } - atomMatcherId++; - mTrackedMetrics.add(metricId++); + + return builder.build(); + } + + private static AtomMatcher createAtomMatcher(int atomId, long matcherId) { + AtomMatcher.Builder atomMatcherBuilder = AtomMatcher.newBuilder(); + atomMatcherBuilder + .setId(matcherId) + .setSimpleAtomMatcher(SimpleAtomMatcher.newBuilder().setAtomId(atomId)); + return atomMatcherBuilder.build(); } - return builder.build(); - } - private static AtomMatcher createAtomMatcher(int atomId, long matcherId) { - AtomMatcher.Builder atomMatcherBuilder = AtomMatcher.newBuilder(); - atomMatcherBuilder - .setId(matcherId) - .setSimpleAtomMatcher(SimpleAtomMatcher.newBuilder().setAtomId(atomId)); - return atomMatcherBuilder.build(); + private AtomMatcher createUnionMatcher(List<AtomMatcher> simpleAtomMatchers, + long atomMatcherId) { + AtomMatcher.Combination.Builder combinationBuilder = + AtomMatcher.Combination.newBuilder(); + combinationBuilder.setOperation(StatsdConfigProto.LogicalOperation.OR); + for (AtomMatcher matcher : simpleAtomMatchers) { + combinationBuilder.addMatcher(matcher.getId()); + } + AtomMatcher.Builder atomMatcherBuilder = AtomMatcher.newBuilder(); + atomMatcherBuilder.setId(atomMatcherId).setCombination(combinationBuilder.build()); + return atomMatcherBuilder.build(); + } + + private StatsdConfig.Builder baseBuilder() { + ArrayList<String> allowedSources = new ArrayList<>(); + Collections.addAll(allowedSources, ALLOWED_LOG_SOURCES); + if (mAdditionalAllowedPackage != null) { + allowedSources.add(mAdditionalAllowedPackage); + } + return StatsdConfig.newBuilder() + .addAllAllowedLogSource(allowedSources) + .addAllDefaultPullPackages(Arrays.asList(DEFAULT_PULL_SOURCES)) + .addPullAtomPackages(PullAtomPackages.newBuilder() + .setAtomId(Atom.GPU_STATS_GLOBAL_INFO_FIELD_NUMBER) + .addPackages("AID_GPU_SERVICE")) + .addPullAtomPackages(PullAtomPackages.newBuilder() + .setAtomId(Atom.GPU_STATS_APP_INFO_FIELD_NUMBER) + .addPackages("AID_GPU_SERVICE")) + .addPullAtomPackages(PullAtomPackages.newBuilder() + .setAtomId(Atom.TRAIN_INFO_FIELD_NUMBER) + .addPackages("AID_STATSD")) + .setHashStringsInMetricReport(false); + } } private static String pushConfig(StatsdConfig config, String deviceSerial) @@ -267,21 +360,7 @@ public class TestDrive { Utils.runCommand(null, LOGGER, "adb", "-s", deviceSerial, "shell", Utils.CMD_REMOVE_CONFIG, String.valueOf(CONFIG_ID)); } catch (Exception e) { - LOGGER.log(Level.SEVERE, "Failed to remove config: " + e.getMessage()); - } - } - - private static boolean isPulledAtom(int atomId) { - return atomId >= PULL_ATOM_START && atomId <= MAX_PLATFORM_ATOM_TAG - || atomId >= VENDOR_PULLED_ATOM_START_TAG; - } - - private static boolean hasPulledAtom(Set<Integer> atoms) { - for (Integer i : atoms) { - if (isPulledAtom(i)) { - return true; - } + LOGGER.severe("Failed to remove config: " + e.getMessage()); } - return false; } } diff --git a/cmds/statsd/tools/localtools/test/com/android/statsd/shelltools/testdrive/ConfigurationTest.java b/cmds/statsd/tools/localtools/test/com/android/statsd/shelltools/testdrive/ConfigurationTest.java new file mode 100644 index 000000000000..b1cc60f74993 --- /dev/null +++ b/cmds/statsd/tools/localtools/test/com/android/statsd/shelltools/testdrive/ConfigurationTest.java @@ -0,0 +1,326 @@ +/* + * 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.statsd.shelltools.testdrive; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import com.android.internal.os.StatsdConfigProto; +import com.android.internal.os.StatsdConfigProto.StatsdConfig; +import com.android.os.AtomsProto; + +import org.junit.Test; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * Tests for {@link TestDrive} + */ +public class ConfigurationTest { + + private StatsdConfigProto.AtomMatcher findAndRemoveAtomMatcherById( + List<StatsdConfigProto.AtomMatcher> atomMatchers, long id) { + int numMatches = 0; + StatsdConfigProto.AtomMatcher match = null; + for (StatsdConfigProto.AtomMatcher atomMatcher : atomMatchers) { + if (id == atomMatcher.getId()) { + ++numMatches; + match = atomMatcher; + } + } + if (numMatches == 1) { + atomMatchers.remove(match); + return match; + } + return null; // Too many, or not found + } + + private final TestDrive.Configuration mConfiguration = new TestDrive.Configuration(); + + @Test + public void testOnePushed() { + final int atom = 90; + assertFalse(TestDrive.Configuration.isPulledAtom(atom)); + mConfiguration.addAtom(atom); + StatsdConfig config = mConfiguration.createConfig(); + + //event_metric { + // id: 1111 + // what: 1234567 + //} + //atom_matcher { + // id: 1234567 + // simple_atom_matcher { + // atom_id: 90 + // } + //} + + assertEquals(1, config.getEventMetricCount()); + assertEquals(0, config.getGaugeMetricCount()); + + assertTrue(mConfiguration.isTrackedMetric(config.getEventMetric(0).getId())); + + final List<StatsdConfigProto.AtomMatcher> atomMatchers = + new ArrayList<>(config.getAtomMatcherList()); + assertEquals(atom, + findAndRemoveAtomMatcherById(atomMatchers, config.getEventMetric(0).getWhat()) + .getSimpleAtomMatcher().getAtomId()); + assertEquals(0, atomMatchers.size()); + } + + @Test + public void testOnePulled() { + final int atom = 10022; + assertTrue(TestDrive.Configuration.isPulledAtom(atom)); + mConfiguration.addAtom(atom); + StatsdConfig config = mConfiguration.createConfig(); + + //gauge_metric { + // id: 1111 + // what: 1234567 + // gauge_fields_filter { + // include_all: true + // } + // bucket: ONE_MINUTE + // sampling_type: FIRST_N_SAMPLES + // max_num_gauge_atoms_per_bucket: 100 + // trigger_event: 1111111 + //} + //atom_matcher { + // id: 1111111 + // simple_atom_matcher { + // atom_id: 47 + // } + //} + //atom_matcher { + // id: 1234567 + // simple_atom_matcher { + // atom_id: 10022 + // } + //} + + assertEquals(0, config.getEventMetricCount()); + assertEquals(1, config.getGaugeMetricCount()); + + assertTrue(mConfiguration.isTrackedMetric(config.getGaugeMetric(0).getId())); + + final StatsdConfigProto.GaugeMetric gaugeMetric = config.getGaugeMetric(0); + assertTrue(gaugeMetric.getGaugeFieldsFilter().getIncludeAll()); + + final List<StatsdConfigProto.AtomMatcher> atomMatchers = + new ArrayList<>(config.getAtomMatcherList()); + assertEquals(atom, + findAndRemoveAtomMatcherById(atomMatchers, gaugeMetric.getWhat()) + .getSimpleAtomMatcher().getAtomId()); + assertEquals(AtomsProto.Atom.APP_BREADCRUMB_REPORTED_FIELD_NUMBER, + findAndRemoveAtomMatcherById(atomMatchers, gaugeMetric.getTriggerEvent()) + .getSimpleAtomMatcher().getAtomId()); + assertEquals(0, atomMatchers.size()); + } + + @Test + public void testOnePulledTwoPushed() { + final int pulledAtom = 10022; + assertTrue(TestDrive.Configuration.isPulledAtom(pulledAtom)); + mConfiguration.addAtom(pulledAtom); + + Integer[] pushedAtoms = new Integer[]{244, 245}; + for (int atom : pushedAtoms) { + assertFalse(TestDrive.Configuration.isPulledAtom(atom)); + mConfiguration.addAtom(atom); + } + StatsdConfig config = mConfiguration.createConfig(); + + // event_metric { + // id: 1111 + // what: 1234567 + // } + // event_metric { + // id: 1112 + // what: 1234568 + // } + // gauge_metric { + // id: 1114 + // what: 1234570 + // gauge_fields_filter { + // include_all: true + // } + // bucket: ONE_MINUTE + // sampling_type: FIRST_N_SAMPLES + // max_num_gauge_atoms_per_bucket: 100 + // trigger_event: 1111111 + // } + // atom_matcher { + // id: 1111111 + // simple_atom_matcher { + // atom_id: 47 + // } + // } + // atom_matcher { + // id: 1234567 + // simple_atom_matcher { + // atom_id: 244 + // } + // } + // atom_matcher { + // id: 1234568 + // simple_atom_matcher { + // atom_id: 245 + // } + // } + // atom_matcher { + // id: 1234570 + // simple_atom_matcher { + // atom_id: 10022 + // } + // } + + assertEquals(2, config.getEventMetricCount()); + assertEquals(1, config.getGaugeMetricCount()); + + final StatsdConfigProto.GaugeMetric gaugeMetric = config.getGaugeMetric(0); + assertTrue(mConfiguration.isTrackedMetric(gaugeMetric.getId())); + assertTrue(gaugeMetric.getGaugeFieldsFilter().getIncludeAll()); + for (StatsdConfigProto.EventMetric eventMetric : config.getEventMetricList()) { + assertTrue(mConfiguration.isTrackedMetric(eventMetric.getId())); + } + + final List<StatsdConfigProto.AtomMatcher> atomMatchers = + new ArrayList<>(config.getAtomMatcherList()); + + assertEquals(pulledAtom, findAndRemoveAtomMatcherById(atomMatchers, gaugeMetric.getWhat()) + .getSimpleAtomMatcher().getAtomId()); + assertEquals(AtomsProto.Atom.APP_BREADCRUMB_REPORTED_FIELD_NUMBER, + findAndRemoveAtomMatcherById(atomMatchers, gaugeMetric.getTriggerEvent()) + .getSimpleAtomMatcher().getAtomId()); + + Integer[] actualAtoms = new Integer[]{ + findAndRemoveAtomMatcherById(atomMatchers, config.getEventMetric(0).getWhat()) + .getSimpleAtomMatcher().getAtomId(), + findAndRemoveAtomMatcherById(atomMatchers, config.getEventMetric(1).getWhat()) + .getSimpleAtomMatcher().getAtomId()}; + Arrays.sort(actualAtoms); + assertArrayEquals(pushedAtoms, actualAtoms); + + assertEquals(0, atomMatchers.size()); + } + + @Test + public void testOnePulledTwoPushedTogether() { + mConfiguration.mOnePushedAtomEvent = true; // Use one event grabbing all pushed atoms + + final int pulledAtom = 10022; + assertTrue(TestDrive.Configuration.isPulledAtom(pulledAtom)); + mConfiguration.addAtom(pulledAtom); + + Integer[] pushedAtoms = new Integer[]{244, 245}; + for (int atom : pushedAtoms) { + assertFalse(TestDrive.Configuration.isPulledAtom(atom)); + mConfiguration.addAtom(atom); + } + StatsdConfig config = mConfiguration.createConfig(); + + // event_metric { + // id: 1112 + // what: 1234570 + // } + // gauge_metric { + // id: 1111 + // what: 1234567 + // gauge_fields_filter { + // include_all: true + // } + // bucket: ONE_MINUTE + // sampling_type: FIRST_N_SAMPLES + // max_num_gauge_atoms_per_bucket: 100 + // trigger_event: 1111111 + // } + // atom_matcher { + // id: 1111111 + // simple_atom_matcher { + // atom_id: 47 + // } + // } + // atom_matcher { + // id: 1234567 + // simple_atom_matcher { + // atom_id: 10022 + // } + // } + // atom_matcher { + // id: 1234568 + // simple_atom_matcher { + // atom_id: 244 + // } + // } + // atom_matcher { + // id: 1234569 + // simple_atom_matcher { + // atom_id: 245 + // } + // } + // atom_matcher { + // id: 1234570 + // combination { + // operation: OR + // matcher: 1234568 + // matcher: 1234569 + // } + // } + + assertEquals(1, config.getEventMetricCount()); + assertEquals(1, config.getGaugeMetricCount()); + + final StatsdConfigProto.GaugeMetric gaugeMetric = config.getGaugeMetric(0); + assertTrue(mConfiguration.isTrackedMetric(gaugeMetric.getId())); + assertTrue(gaugeMetric.getGaugeFieldsFilter().getIncludeAll()); + + StatsdConfigProto.EventMetric eventMetric = config.getEventMetric(0); + assertTrue(mConfiguration.isTrackedMetric(eventMetric.getId())); + + final List<StatsdConfigProto.AtomMatcher> atomMatchers = + new ArrayList<>(config.getAtomMatcherList()); + + assertEquals(pulledAtom, findAndRemoveAtomMatcherById(atomMatchers, gaugeMetric.getWhat()) + .getSimpleAtomMatcher().getAtomId()); + assertEquals(AtomsProto.Atom.APP_BREADCRUMB_REPORTED_FIELD_NUMBER, + findAndRemoveAtomMatcherById(atomMatchers, gaugeMetric.getTriggerEvent()) + .getSimpleAtomMatcher().getAtomId()); + + StatsdConfigProto.AtomMatcher unionMatcher = findAndRemoveAtomMatcherById(atomMatchers, + eventMetric.getWhat()); + assertNotNull(unionMatcher.getCombination()); + assertEquals(2, unionMatcher.getCombination().getMatcherCount()); + + Integer[] actualAtoms = new Integer[]{ + findAndRemoveAtomMatcherById(atomMatchers, + unionMatcher.getCombination().getMatcher(0)) + .getSimpleAtomMatcher().getAtomId(), + findAndRemoveAtomMatcherById(atomMatchers, + unionMatcher.getCombination().getMatcher(1)) + .getSimpleAtomMatcher().getAtomId()}; + Arrays.sort(actualAtoms); + assertArrayEquals(pushedAtoms, actualAtoms); + + assertEquals(0, atomMatchers.size()); + } +} diff --git a/cmds/statsd/tools/localtools/test/com/android/statsd/shelltools/testdrive/TestDriveTest.java b/cmds/statsd/tools/localtools/test/com/android/statsd/shelltools/testdrive/TestDriveTest.java new file mode 100644 index 000000000000..9d986e7c09cf --- /dev/null +++ b/cmds/statsd/tools/localtools/test/com/android/statsd/shelltools/testdrive/TestDriveTest.java @@ -0,0 +1,169 @@ +/* + * 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.statsd.shelltools.testdrive; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +/** + * Tests for {@link TestDrive} + */ +@RunWith(Parameterized.class) +public class TestDriveTest { + /** + * Expected results of a single iteration of the paramerized test. + */ + static class Expect { + public boolean success; + public Integer[] atoms; + public boolean onePushedAtomEvent; + public String extraPackage; + public String target; + + static Expect success(Integer... atoms) { + return new Expect(true, atoms, false, null, + TARGET); + } + Expect(boolean success, Integer[] atoms, boolean onePushedAtomEvent, String extraPackage, + String target) { + this.success = success; + this.atoms = atoms; + this.onePushedAtomEvent = onePushedAtomEvent; + this.extraPackage = extraPackage; + this.target = target; + } + static final Expect FAILURE = new Expect(false, null, + false, null, null); + Expect onePushedAtomEvent() { + this.onePushedAtomEvent = true; + return this; + } + Expect extraPackage() { + this.extraPackage = TestDriveTest.PACKAGE; + return this; + } + } + + @Parameterized.Parameter(0) + public String[] mArgs; + + @Parameterized.Parameter(1) + public List<String> mConnectedDevices; + + @Parameterized.Parameter(2) + public String mDefaultDevice; + + @Parameterized.Parameter(3) + public Expect mExpect; + + private static final String TARGET = "target"; + private static final List<String> TARGET_AND_OTHER = Arrays.asList("otherDevice", + TARGET); + private static final List<String> TWO_OTHER_DEVICES = Arrays.asList( + "other1", "other2"); + private static final List<String> TARGET_ONLY = Collections.singletonList(TARGET); + private static final List<String> NOT_TARGET = Collections.singletonList("other"); + private static final List<String> NO_DEVICES = Collections.emptyList(); + private static final String PACKAGE = "extraPackage"; + + @Parameterized.Parameters + public static Collection<Object[]> data() { + return Arrays.asList( + new Object[]{new String[]{}, null, null, + Expect.FAILURE}, // Usage explanation + new Object[]{new String[]{"244", "245"}, null, null, + Expect.FAILURE}, // Failure looking up connected devices + new Object[]{new String[]{"244", "245"}, NO_DEVICES, null, + Expect.FAILURE}, // No connected devices + new Object[]{new String[]{"-s", TARGET, "244", "245"}, NOT_TARGET, null, + Expect.FAILURE}, // Wrong device connected + new Object[]{new String[]{"244", "245"}, TWO_OTHER_DEVICES, null, + Expect.FAILURE}, // Wrong devices connected + new Object[]{new String[]{"244", "245"}, TARGET_ONLY, null, + Expect.success(244, 245)}, // If only one device connected, guess that one + new Object[]{new String[]{"244", "not_an_atom"}, TARGET_ONLY, null, + Expect.success(244)}, // Ignore non-atoms + new Object[]{new String[]{"not_an_atom"}, TARGET_ONLY, null, + Expect.FAILURE}, // Require at least one atom + new Object[]{new String[]{"244", "245"}, TWO_OTHER_DEVICES, TARGET, + Expect.FAILURE}, // ANDROID_SERIAL specifies non-connected target + new Object[]{new String[]{"244", "245"}, TARGET_AND_OTHER, TARGET, + Expect.success(244, 245)}, // ANDROID_SERIAL specifies a valid target + new Object[]{new String[]{"244", "245"}, TARGET_AND_OTHER, null, + Expect.FAILURE}, // Two connected devices, no indication of which to use + new Object[]{new String[]{"-one", "244", "245"}, TARGET_ONLY, null, + Expect.success(244, 245).onePushedAtomEvent()}, + new Object[]{new String[]{"-p", PACKAGE, "244", "245"}, TARGET_ONLY, null, + Expect.success(244, 245).extraPackage()}, + new Object[]{new String[]{"-p", PACKAGE, "-one", "244", "245"}, TARGET_ONLY, null, + Expect.success(244, 245).extraPackage().onePushedAtomEvent()}, + new Object[]{new String[]{"-one", "-p", PACKAGE, "244", "245"}, TARGET_ONLY, null, + Expect.success(244, 245).extraPackage().onePushedAtomEvent()}, + new Object[]{new String[]{"-s", TARGET, "-one", "-p", PACKAGE, "244", "245"}, + TARGET_AND_OTHER, null, + Expect.success(244, 245).extraPackage().onePushedAtomEvent()}, + new Object[]{new String[]{"-one", "-s", TARGET, "-p", PACKAGE, "244", "245"}, + TARGET_AND_OTHER, null, + Expect.success(244, 245).extraPackage().onePushedAtomEvent()}, + new Object[]{new String[]{"-one", "-p", PACKAGE, "-s", TARGET, "244", "245"}, + TARGET_AND_OTHER, null, + Expect.success(244, 245).extraPackage().onePushedAtomEvent()} + ); + } + + private final TestDrive.Configuration mConfiguration = new TestDrive.Configuration(); + private final TestDrive mTestDrive = new TestDrive(); + + private static Integer[] collectAtoms(TestDrive.Configuration configuration) { + Integer[] result = new Integer[configuration.mPulledAtoms.size() + + configuration.mPushedAtoms.size()]; + int result_index = 0; + for (Integer atom : configuration.mPushedAtoms) { + result[result_index++] = atom; + } + for (Integer atom : configuration.mPulledAtoms) { + result[result_index++] = atom; + } + Arrays.sort(result); + return result; + } + + @Test + public void testProcessArgs() { + boolean result = mTestDrive.processArgs(mConfiguration, mArgs, mConnectedDevices, + mDefaultDevice); + if (mExpect.success) { + assertTrue(result); + assertArrayEquals(mExpect.atoms, collectAtoms(mConfiguration)); + assertEquals(mExpect.onePushedAtomEvent, mConfiguration.mOnePushedAtomEvent); + assertEquals(mExpect.target, mTestDrive.mDeviceSerial); + } else { + assertFalse(result); + } + } +} diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java index bb64c3492c4f..a4256a9d8ab3 100644 --- a/core/java/android/app/ContextImpl.java +++ b/core/java/android/app/ContextImpl.java @@ -250,6 +250,10 @@ class ContextImpl extends Context { private final Object mSync = new Object(); + /** + * Whether this is created from {@link #createSystemContext(ActivityThread)} or + * {@link #createSystemUiContext(ContextImpl, int)} or any {@link Context} that system UI uses. + */ private boolean mIsSystemOrSystemUiContext; private boolean mIsUiContext; private boolean mIsAssociatedWithDisplay; @@ -1922,16 +1926,18 @@ class ContextImpl extends Context { /** @hide */ @Override public boolean isUiContext() { - return mIsSystemOrSystemUiContext || mIsUiContext || isSystemOrSystemUI(); + return mIsSystemOrSystemUiContext || mIsUiContext; } /** * Temporary workaround to permit incorrect usages of Context by SystemUI. - * TODO(b/149790106): Fix usages and remove. + * TODO(b/147647877): Fix usages and remove. */ - private boolean isSystemOrSystemUI() { - return ActivityThread.isSystem() || checkPermission("android.permission.STATUS_BAR_SERVICE", - Binder.getCallingPid(), Binder.getCallingUid()) == PERMISSION_GRANTED; + private static boolean isSystemOrSystemUI(Context context) { + return ActivityThread.isSystem() || context.checkPermission( + "android.permission.STATUS_BAR_SERVICE", + Binder.getCallingPid(), + Binder.getCallingUid()) == PERMISSION_GRANTED; } private static boolean isUiComponent(String name) { @@ -2467,7 +2473,7 @@ class ContextImpl extends Context { @Override public Display getDisplay() { - if (!mIsSystemOrSystemUiContext && !mIsAssociatedWithDisplay && !isSystemOrSystemUI()) { + if (!mIsSystemOrSystemUiContext && !mIsAssociatedWithDisplay) { throw new UnsupportedOperationException("Tried to obtain display from a Context not " + "associated with one. Only visual Contexts (such as Activity or one created " + "with Context#createWindowContext) or ones created with " @@ -2643,6 +2649,7 @@ class ContextImpl extends Context { ContextImpl context = new ContextImpl(null, mainThread, packageInfo, null, null, null, null, 0, null, opPackageName); context.setResources(packageInfo.getResources()); + context.mIsSystemOrSystemUiContext = isSystemOrSystemUI(context); return context; } @@ -2672,6 +2679,7 @@ class ContextImpl extends Context { activityInfo.splitName, activityToken, null, 0, classLoader, null); context.mIsUiContext = true; context.mIsAssociatedWithDisplay = true; + context.mIsSystemOrSystemUiContext = isSystemOrSystemUI(context); // Clamp display ID to DEFAULT_DISPLAY if it is INVALID_DISPLAY. displayId = (displayId != Display.INVALID_DISPLAY) ? displayId : Display.DEFAULT_DISPLAY; diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index 4b050455eef2..8073982ef745 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -10251,6 +10251,9 @@ public class DevicePolicyManager { * <p> * The confirm credentials screen can be created using * {@link android.app.KeyguardManager#createConfirmDeviceCredentialIntent}. + * <p> + * Starting from Android R, the organization color will no longer be used as the background + * color of the confirm credentials screen. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param color The 24bit (0xRRGGBB) representation of the color to be used. diff --git a/core/java/android/content/ClipData.java b/core/java/android/content/ClipData.java index 1923bf3c5a23..234216539e97 100644 --- a/core/java/android/content/ClipData.java +++ b/core/java/android/content/ClipData.java @@ -27,7 +27,6 @@ import android.graphics.Bitmap; import android.net.Uri; import android.os.Build; import android.os.Parcel; -import android.os.ParcelFileDescriptor; import android.os.Parcelable; import android.os.StrictMode; import android.text.Html; @@ -171,11 +170,6 @@ public class ClipData implements Parcelable { static final String[] MIMETYPES_TEXT_INTENT = new String[] { ClipDescription.MIMETYPE_TEXT_INTENT }; - // Constants used in {@link #writeHtmlTextToParcel}. - static final int PARCEL_MAX_SIZE_BYTES = 800 * 1024; - static final int PARCEL_TYPE_STRING = 0; - static final int PARCEL_TYPE_PFD = 1; - final ClipDescription mClipDescription; final Bitmap mIcon; @@ -231,8 +225,7 @@ public class ClipData implements Parcelable { * with an alternative HTML formatted representation. You <em>must</em> * supply a plain text representation in addition to HTML text; coercion * will not be done from HTML formatted text into plain text. - * <p class="note"><strong>Note:</strong> It is strongly recommended to - * use content: URI for sharing large clip data. Starting on API 30, + * <p><strong>Warning:</strong> Use content: URI for sharing large clip data. * ClipData.Item doesn't accept an HTML text if it's larger than 800KB. * </p> */ @@ -1135,7 +1128,7 @@ public class ClipData implements Parcelable { for (int i=0; i<N; i++) { Item item = mItems.get(i); TextUtils.writeToParcel(item.mText, dest, flags); - writeHtmlTextToParcel(item.mHtmlText, dest, flags); + dest.writeString8(item.mHtmlText); if (item.mIntent != null) { dest.writeInt(1); item.mIntent.writeToParcel(dest, flags); @@ -1162,7 +1155,7 @@ public class ClipData implements Parcelable { final int N = in.readInt(); for (int i=0; i<N; i++) { CharSequence text = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in); - String htmlText = readHtmlTextFromParcel(in); + String htmlText = in.readString8(); Intent intent = in.readInt() != 0 ? Intent.CREATOR.createFromParcel(in) : null; Uri uri = in.readInt() != 0 ? Uri.CREATOR.createFromParcel(in) : null; mItems.add(new Item(text, htmlText, intent, uri)); @@ -1182,61 +1175,4 @@ public class ClipData implements Parcelable { return new ClipData[size]; } }; - - /** - * Helper function for writing an HTML text into a parcel. - * If the text size is larger than 400KB, it writes the text to a file descriptor to prevent the - * parcel from exceeding 800KB binder size limit. {@link android.os.Binder#checkParcel()} - * Otherwise, it directly writes the text into the parcel. - * Note: This function is a workaround for existing applications that still use HTML for sharing - * large clip data. We will ask application developers to use content: URI instead and remove - * this function in API 30. - */ - private static void writeHtmlTextToParcel(String text, Parcel dest, int flags) { - byte[] textData = (text != null) ? text.getBytes() : new byte[0]; - if (textData.length > PARCEL_MAX_SIZE_BYTES / 2 - && Build.VERSION.SDK_INT <= Build.VERSION_CODES.Q) { - try { - ParcelFileDescriptor pfd = ParcelFileDescriptor.fromData(textData, null); - dest.writeInt(PARCEL_TYPE_PFD); - dest.writeParcelable(pfd, flags); - } catch (IOException e) { - throw new IllegalStateException( - "Error creating the shared memory area: " + e.toString()); - } - } else { - dest.writeInt(PARCEL_TYPE_STRING); - dest.writeString8(text); - } - } - - /** - * Reads a text written by writeHtmlTextToParcel. - */ - private static String readHtmlTextFromParcel(Parcel in) { - if (in.readInt() == PARCEL_TYPE_STRING) { - return in.readString8(); - } - ParcelFileDescriptor pfd = - in.readParcelable(ParcelFileDescriptor.class.getClassLoader()); - if (pfd == null) { - throw new IllegalStateException("Error reading ParcelFileDescriptor from Parcel"); - } - FileInputStream fis = new ParcelFileDescriptor.AutoCloseInputStream(pfd); - InputStreamReader reader = new InputStreamReader(fis); - StringBuilder builder = new StringBuilder(); - char[] buffer = new char[4096]; - int numRead; - try { - while ((numRead = reader.read(buffer)) != -1) { - builder.append(buffer, 0, numRead); - } - return builder.toString(); - } catch (IOException e) { - throw new IllegalStateException( - "Error reading data from ParcelFileDescriptor: " + e.toString()); - } finally { - IoUtils.closeQuietly(fis); - } - } } diff --git a/core/java/android/net/TrafficStats.java b/core/java/android/net/TrafficStats.java index 8108cf08d5c3..e7bba69dbb84 100644 --- a/core/java/android/net/TrafficStats.java +++ b/core/java/android/net/TrafficStats.java @@ -775,17 +775,10 @@ public class TrafficStats { * @see android.content.pm.ApplicationInfo#uid */ public static long getUidTxBytes(int uid) { - // This isn't actually enforcing any security; it just returns the - // unsupported value. The real filtering is done at the kernel level. - final int callingUid = android.os.Process.myUid(); - if (callingUid == android.os.Process.SYSTEM_UID || callingUid == uid) { - try { - return getStatsService().getUidStats(uid, TYPE_TX_BYTES); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } - } else { - return UNSUPPORTED; + try { + return getStatsService().getUidStats(uid, TYPE_TX_BYTES); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } } @@ -808,17 +801,10 @@ public class TrafficStats { * @see android.content.pm.ApplicationInfo#uid */ public static long getUidRxBytes(int uid) { - // This isn't actually enforcing any security; it just returns the - // unsupported value. The real filtering is done at the kernel level. - final int callingUid = android.os.Process.myUid(); - if (callingUid == android.os.Process.SYSTEM_UID || callingUid == uid) { - try { - return getStatsService().getUidStats(uid, TYPE_RX_BYTES); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } - } else { - return UNSUPPORTED; + try { + return getStatsService().getUidStats(uid, TYPE_RX_BYTES); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } } @@ -841,17 +827,10 @@ public class TrafficStats { * @see android.content.pm.ApplicationInfo#uid */ public static long getUidTxPackets(int uid) { - // This isn't actually enforcing any security; it just returns the - // unsupported value. The real filtering is done at the kernel level. - final int callingUid = android.os.Process.myUid(); - if (callingUid == android.os.Process.SYSTEM_UID || callingUid == uid) { - try { - return getStatsService().getUidStats(uid, TYPE_TX_PACKETS); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } - } else { - return UNSUPPORTED; + try { + return getStatsService().getUidStats(uid, TYPE_TX_PACKETS); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } } @@ -874,17 +853,10 @@ public class TrafficStats { * @see android.content.pm.ApplicationInfo#uid */ public static long getUidRxPackets(int uid) { - // This isn't actually enforcing any security; it just returns the - // unsupported value. The real filtering is done at the kernel level. - final int callingUid = android.os.Process.myUid(); - if (callingUid == android.os.Process.SYSTEM_UID || callingUid == uid) { - try { - return getStatsService().getUidStats(uid, TYPE_RX_PACKETS); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } - } else { - return UNSUPPORTED; + try { + return getStatsService().getUidStats(uid, TYPE_RX_PACKETS); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } } diff --git a/core/java/android/service/notification/StatusBarNotification.java b/core/java/android/service/notification/StatusBarNotification.java index 5c43f8f829b0..08d990581390 100644 --- a/core/java/android/service/notification/StatusBarNotification.java +++ b/core/java/android/service/notification/StatusBarNotification.java @@ -486,15 +486,8 @@ public class StatusBarNotification implements Parcelable { /** * @hide */ - public String getShortcutId(Context context) { - String conversationId = getNotification().getShortcutId(); - if (TextUtils.isEmpty(conversationId) - && (Settings.Global.getInt(context.getContentResolver(), - Settings.Global.REQUIRE_SHORTCUTS_FOR_CONVERSATIONS, 0) == 0) - && getNotification().getNotificationStyle() == Notification.MessagingStyle.class) { - conversationId = getId() + getTag() + PLACEHOLDER_CONVERSATION_ID; - } - return conversationId; + public String getShortcutId() { + return getNotification().getShortcutId(); } /** diff --git a/core/java/com/android/internal/app/AbstractMultiProfilePagerAdapter.java b/core/java/com/android/internal/app/AbstractMultiProfilePagerAdapter.java index bcb32fb60f47..a47ad737c2ab 100644 --- a/core/java/com/android/internal/app/AbstractMultiProfilePagerAdapter.java +++ b/core/java/com/android/internal/app/AbstractMultiProfilePagerAdapter.java @@ -301,7 +301,7 @@ public abstract class AbstractMultiProfilePagerAdapter extends PagerAdapter { private boolean rebuildTab(ResolverListAdapter activeListAdapter, boolean doPostProcessing) { if (shouldShowNoCrossProfileIntentsEmptyState(activeListAdapter)) { - activeListAdapter.postListReadyRunnable(doPostProcessing); + activeListAdapter.postListReadyRunnable(doPostProcessing, /* rebuildCompleted */ true); return false; } return activeListAdapter.rebuildList(doPostProcessing); diff --git a/core/java/com/android/internal/app/ChooserActivity.java b/core/java/com/android/internal/app/ChooserActivity.java index b671fa74bf9a..a84d9640c7f8 100644 --- a/core/java/com/android/internal/app/ChooserActivity.java +++ b/core/java/com/android/internal/app/ChooserActivity.java @@ -2404,10 +2404,9 @@ public class ChooserActivity extends ResolverActivity implements public ChooserGridAdapter createChooserGridAdapter(Context context, List<Intent> payloadIntents, Intent[] initialIntents, List<ResolveInfo> rList, boolean filterLastUsed, boolean useLayoutForBrowsables, UserHandle userHandle) { - ChooserListAdapter chooserListAdapter = new ChooserListAdapter(context, payloadIntents, - initialIntents, rList, - filterLastUsed, createListController(userHandle), useLayoutForBrowsables, - this, this); + ChooserListAdapter chooserListAdapter = createChooserListAdapter(context, payloadIntents, + initialIntents, rList, filterLastUsed, + useLayoutForBrowsables, createListController(userHandle)); AppPredictor.Callback appPredictorCallback = createAppPredictorCallback(chooserListAdapter); AppPredictor appPredictor = setupAppPredictorForUser(userHandle, appPredictorCallback); chooserListAdapter.setAppPredictor(appPredictor); @@ -2416,6 +2415,16 @@ public class ChooserActivity extends ResolverActivity implements } @VisibleForTesting + public ChooserListAdapter createChooserListAdapter(Context context, + List<Intent> payloadIntents, Intent[] initialIntents, List<ResolveInfo> rList, + boolean filterLastUsed, boolean useLayoutForBrowsables, + ResolverListController resolverListController) { + return new ChooserListAdapter(context, payloadIntents, initialIntents, rList, + filterLastUsed, resolverListController, useLayoutForBrowsables, + this, this, context.getPackageManager()); + } + + @VisibleForTesting protected ResolverListController createListController(UserHandle userHandle) { AppPredictor appPredictor = getAppPredictorForShareActivitiesIfEnabled(userHandle); AbstractResolverComparator resolverComparator; diff --git a/core/java/com/android/internal/app/ChooserListAdapter.java b/core/java/com/android/internal/app/ChooserListAdapter.java index 69a4927c9ab1..73ee2950c481 100644 --- a/core/java/com/android/internal/app/ChooserListAdapter.java +++ b/core/java/com/android/internal/app/ChooserListAdapter.java @@ -88,7 +88,7 @@ public class ChooserListAdapter extends ResolverListAdapter { private final int mMaxShortcutTargetsPerApp; private final ChooserListCommunicator mChooserListCommunicator; private final SelectableTargetInfo.SelectableTargetInfoCommunicator - mSelectableTargetInfoComunicator; + mSelectableTargetInfoCommunicator; private int mNumShortcutResults = 0; @@ -117,7 +117,8 @@ public class ChooserListAdapter extends ResolverListAdapter { boolean filterLastUsed, ResolverListController resolverListController, boolean useLayoutForBrowsables, ChooserListCommunicator chooserListCommunicator, - SelectableTargetInfo.SelectableTargetInfoCommunicator selectableTargetInfoComunicator) { + SelectableTargetInfo.SelectableTargetInfoCommunicator selectableTargetInfoCommunicator, + PackageManager packageManager) { // Don't send the initial intents through the shared ResolverActivity path, // we want to separate them into a different section. super(context, payloadIntents, null, rList, filterLastUsed, @@ -128,10 +129,9 @@ public class ChooserListAdapter extends ResolverListAdapter { mMaxShortcutTargetsPerApp = context.getResources().getInteger(R.integer.config_maxShortcutTargetsPerApp); mChooserListCommunicator = chooserListCommunicator; - mSelectableTargetInfoComunicator = selectableTargetInfoComunicator; + mSelectableTargetInfoCommunicator = selectableTargetInfoCommunicator; if (initialIntents != null) { - final PackageManager pm = context.getPackageManager(); for (int i = 0; i < initialIntents.length; i++) { final Intent ii = initialIntents[i]; if (ii == null) { @@ -147,7 +147,7 @@ public class ChooserListAdapter extends ResolverListAdapter { final ComponentName cn = ii.getComponent(); if (cn != null) { try { - ai = pm.getActivityInfo(ii.getComponent(), 0); + ai = packageManager.getActivityInfo(ii.getComponent(), 0); ri = new ResolveInfo(); ri.activityInfo = ai; } catch (PackageManager.NameNotFoundException ignored) { @@ -155,7 +155,7 @@ public class ChooserListAdapter extends ResolverListAdapter { } } if (ai == null) { - ri = pm.resolveActivity(ii, PackageManager.MATCH_DEFAULT_ONLY); + ri = packageManager.resolveActivity(ii, PackageManager.MATCH_DEFAULT_ONLY); ai = ri != null ? ri.activityInfo : null; } if (ai == null) { @@ -455,7 +455,7 @@ public class ChooserListAdapter extends ResolverListAdapter { UserHandle userHandle = getUserHandle(); Context contextAsUser = mContext.createContextAsUser(userHandle, 0 /* flags */); boolean isInserted = insertServiceTarget(new SelectableTargetInfo(contextAsUser, - origTarget, target, targetScore, mSelectableTargetInfoComunicator, + origTarget, target, targetScore, mSelectableTargetInfoCommunicator, (isShortcutResult ? directShareToShortcutInfos.get(target) : null))); if (isInserted && isShortcutResult) { @@ -507,7 +507,7 @@ public class ChooserListAdapter extends ResolverListAdapter { .map(target -> new SelectableTargetInfo( contextAsUser, origTarget, target, target.getScore(), - mSelectableTargetInfoComunicator, + mSelectableTargetInfoCommunicator, (isShortcutResult ? directShareToShortcutInfos.get(target) : null)) ) diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java index 4ba6ce4e04ce..cf9b95533330 100644 --- a/core/java/com/android/internal/app/ResolverActivity.java +++ b/core/java/com/android/internal/app/ResolverActivity.java @@ -1026,7 +1026,8 @@ public class ResolverActivity extends Activity implements } @Override // ResolverListCommunicator - public final void onPostListReady(ResolverListAdapter listAdapter, boolean doPostProcessing) { + public final void onPostListReady(ResolverListAdapter listAdapter, boolean doPostProcessing, + boolean rebuildCompleted) { if (isAutolaunching()) { return; } @@ -1041,7 +1042,7 @@ public class ResolverActivity extends Activity implements } // showEmptyResolverListEmptyState can mark the tab as loaded, // which is a precondition for auto launching - if (maybeAutolaunchActivity()) { + if (rebuildCompleted && maybeAutolaunchActivity()) { return; } if (doPostProcessing) { diff --git a/core/java/com/android/internal/app/ResolverListAdapter.java b/core/java/com/android/internal/app/ResolverListAdapter.java index 62bddb17db5f..2fd938f45291 100644 --- a/core/java/com/android/internal/app/ResolverListAdapter.java +++ b/core/java/com/android/internal/app/ResolverListAdapter.java @@ -282,7 +282,7 @@ public class ResolverListAdapter extends BaseAdapter { } setPlaceholderCount(placeholderCount); createSortingTask(doPostProcessing).execute(currentResolveList); - postListReadyRunnable(doPostProcessing); + postListReadyRunnable(doPostProcessing, /* rebuildCompleted */ false); return false; } else { processSortedList(currentResolveList, doPostProcessing); @@ -370,7 +370,7 @@ public class ResolverListAdapter extends BaseAdapter { } mResolverListCommunicator.sendVoiceChoicesIfNeeded(); - postListReadyRunnable(doPostProcessing); + postListReadyRunnable(doPostProcessing, /* rebuildCompleted */ true); mIsTabLoaded = true; } @@ -380,14 +380,15 @@ public class ResolverListAdapter extends BaseAdapter { * handler thread to update after the current task is finished. * @param doPostProcessing Whether to update the UI and load additional direct share targets * after the list has been rebuilt + * @param rebuildCompleted Whether the list has been completely rebuilt */ - void postListReadyRunnable(boolean doPostProcessing) { + void postListReadyRunnable(boolean doPostProcessing, boolean rebuildCompleted) { if (mPostListReadyRunnable == null) { mPostListReadyRunnable = new Runnable() { @Override public void run() { mResolverListCommunicator.onPostListReady(ResolverListAdapter.this, - doPostProcessing); + doPostProcessing, rebuildCompleted); mPostListReadyRunnable = null; } }; @@ -649,7 +650,8 @@ public class ResolverListAdapter extends BaseAdapter { Intent getReplacementIntent(ActivityInfo activityInfo, Intent defIntent); - void onPostListReady(ResolverListAdapter listAdapter, boolean updateUi); + void onPostListReady(ResolverListAdapter listAdapter, boolean updateUi, + boolean rebuildCompleted); void sendVoiceChoicesIfNeeded(); diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index cc586bb7ee89..c388f751e628 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -442,19 +442,19 @@ <string name="printing_disabled_by">Printing disabled by <xliff:g id="owner_app">%s</xliff:g>.</string> <!-- Notification title. This notification lets a user know that their personal apps are - blocked due to a work policy from their IT admin, and tells them what they need to do - to unblock their apps.[CHAR LIMIT=29] --> - <string name="personal_apps_suspended_title">Unblock your personal apps</string> - <!-- Notification title. This notification lets a user know that their apps will be blocked - tomorrow due to a work policy from their IT admin, and tells them what they need to do to - prevent the apps from being blocked. [CHAR LIMIT=29] --> - <string name="personal_apps_suspended_tomorrow_title">Apps will be blocked tomorrow</string> - <!-- Notification text. This notification lets a user know that they need to turn on their - work profile due to a work policy from their IT admin. The number of days is at least 3. - [CHAR LIMIT=NONE] --> - <string name="personal_apps_suspended_text">Your IT admin doesn\u2019t allow your - work profile to be paused for more than <xliff:g id="days" example="3">%1$d</xliff:g> - days</string> + either blocked or will be blocked soon due to a work policy from their IT admin, and that + they need to turn on their work profile to unblock their apps.[CHAR LIMIT=29] --> + <string name="personal_apps_suspension_title">Turn on your work profile</string> + <!-- Notification text. This notification lets a user know that their personal apps are + blocked due to a work policy from their IT admin, and that they need to turn on their work + profile to unblock their apps.[CHAR LIMIT=NONE] --> + <string name="personal_apps_suspension_text"> + Your personal apps are blocked until you turn on your work profile</string> + <!-- Notification text. This notification lets a user know that their apps will be blocked + tomorrow due to a work policy from their IT admin, and that they need to turn on their work + profile to prevent the apps from being blocked. [CHAR LIMIT=NONE] --> + <string name="personal_apps_suspension_tomorrow_text"> + Your personal apps will be blocked tomorrow</string> <!-- Title for the button that turns work profile on. To be used in a notification [CHAR LIMIT=NONE] --> <string name="personal_apps_suspended_turn_profile_on">Turn on work profile</string> @@ -4842,10 +4842,10 @@ <string name="confirm_battery_saver">OK</string> <!-- [CHAR_LIMIT=NONE] Battery saver: Feature description, with a "learn more" link. --> - <string name="battery_saver_description_with_learn_more">To extend battery life, Battery Saver:\n·Turns on Dark theme\n·Turns off or restricts background activity, some visual effects, and other features like \u201cHey Google\u201d\n\n<annotation id="url">Learn more</annotation></string> + <string name="battery_saver_description_with_learn_more">To extend battery life, Battery Saver:\n\n\u2022Turns on Dark theme\n\u2022Turns off or restricts background activity, some visual effects, and other features like \u201cHey Google\u201d\n\n<annotation id="url">Learn more</annotation></string> <!-- [CHAR_LIMIT=NONE] Battery saver: Feature description, without a "learn more" link. --> - <string name="battery_saver_description">To extend battery life, Battery Saver:\n·Turns on Dark theme\n·Turns off or restricts background activity, some visual effects, and other features like \u201cHey Google\u201d</string> + <string name="battery_saver_description">To extend battery life, Battery Saver:\n\n\u2022Turns on Dark theme\n\u2022Turns off or restricts background activity, some visual effects, and other features like \u201cHey Google\u201d</string> <!-- [CHAR_LIMIT=NONE] Data saver: Feature description --> <string name="data_saver_description">To help reduce data usage, Data Saver prevents some apps from sending or receiving data in the background. An app you’re currently using can access data, but may do so less frequently. This may mean, for example, that images don’t display until you tap them.</string> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index da64e7764191..67a9df49c88b 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -1197,9 +1197,9 @@ <java-symbol type="string" name="network_logging_notification_text" /> <java-symbol type="string" name="location_changed_notification_title" /> <java-symbol type="string" name="location_changed_notification_text" /> - <java-symbol type="string" name="personal_apps_suspended_title" /> - <java-symbol type="string" name="personal_apps_suspended_tomorrow_title" /> - <java-symbol type="string" name="personal_apps_suspended_text" /> + <java-symbol type="string" name="personal_apps_suspension_title" /> + <java-symbol type="string" name="personal_apps_suspension_tomorrow_text" /> + <java-symbol type="string" name="personal_apps_suspension_text" /> <java-symbol type="string" name="factory_reset_warning" /> <java-symbol type="string" name="factory_reset_message" /> <java-symbol type="string" name="lockscreen_transport_play_description" /> diff --git a/core/tests/coretests/src/android/content/ContextTest.java b/core/tests/coretests/src/android/content/ContextTest.java index aab39bf61163..2057a8181147 100644 --- a/core/tests/coretests/src/android/content/ContextTest.java +++ b/core/tests/coretests/src/android/content/ContextTest.java @@ -18,12 +18,15 @@ package android.content; import static android.view.Display.DEFAULT_DISPLAY; +import static com.google.common.truth.Truth.assertThat; + import static org.junit.Assert.assertEquals; import android.app.ActivityThread; import android.hardware.display.DisplayManager; import android.os.UserHandle; +import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; import androidx.test.platform.app.InstrumentationRegistry; @@ -32,7 +35,6 @@ import org.junit.Test; import org.junit.runner.RunWith; /** - * * Build/Install/Run: * atest FrameworksCoreTests:ContextTest */ @@ -48,6 +50,14 @@ public class ContextTest { } @Test + public void testDisplayIdForSystemUiContext() { + final Context systemUiContext = + ActivityThread.currentActivityThread().getSystemUiContext(); + + assertEquals(systemUiContext.getDisplay().getDisplayId(), systemUiContext.getDisplayId()); + } + + @Test public void testDisplayIdForTestContext() { final Context testContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); @@ -94,4 +104,27 @@ public class ContextTest { InstrumentationRegistry.getInstrumentation().getTargetContext(); testContext.startActivityAsUser(new Intent(), new UserHandle(UserHandle.USER_ALL)); } + + @Test + public void testIsUiContext_appContext_returnsFalse() { + final Context appContext = ApplicationProvider.getApplicationContext(); + + assertThat(appContext.isUiContext()).isFalse(); + } + + @Test + public void testIsUiContext_systemContext_returnsTrue() { + final Context systemContext = + ActivityThread.currentActivityThread().getSystemContext(); + + assertThat(systemContext.isUiContext()).isTrue(); + } + + @Test + public void testIsUiContext_systemUiContext_returnsTrue() { + final Context systemUiContext = + ActivityThread.currentActivityThread().getSystemUiContext(); + + assertThat(systemUiContext.isUiContext()).isTrue(); + } } diff --git a/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java b/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java index c52555b5ed32..edad5c40fccd 100644 --- a/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java +++ b/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java @@ -34,6 +34,7 @@ import static com.android.internal.app.ChooserListAdapter.SHORTCUT_TARGET_SCORE_ import static com.android.internal.app.ChooserWrapperActivity.sOverrides; import static com.android.internal.app.MatcherUtils.first; +import static junit.framework.Assert.assertNull; import static junit.framework.Assert.assertTrue; import static org.hamcrest.CoreMatchers.is; @@ -41,6 +42,8 @@ import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.mock; @@ -55,6 +58,8 @@ import android.content.ClipboardManager; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.pm.ActivityInfo; +import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.pm.ShortcutInfo; @@ -302,7 +307,7 @@ public class ChooserActivityTest { waitForIdle(); UsageStatsManager usm = activity.getUsageStatsManager(); verify(sOverrides.resolverListController, times(1)) - .topK(Mockito.any(List.class), Mockito.anyInt()); + .topK(any(List.class), anyInt()); assertThat(activity.getIsSelected(), is(false)); sOverrides.onSafelyStartCallback = targetInfo -> { return true; @@ -312,7 +317,7 @@ public class ChooserActivityTest { .perform(click()); waitForIdle(); verify(sOverrides.resolverListController, times(1)) - .updateChooserCounts(Mockito.anyString(), Mockito.anyInt(), Mockito.anyString()); + .updateChooserCounts(Mockito.anyString(), anyInt(), Mockito.anyString()); verify(sOverrides.resolverListController, times(1)) .updateModel(toChoose.activityInfo.getComponentName()); assertThat(activity.getIsSelected(), is(true)); @@ -1750,6 +1755,54 @@ public class ChooserActivityTest { assertThat(chosen[0], is(personalResolvedComponentInfos.get(1).getResolveInfoAt(0))); } + @Test + public void testOneInitialIntent_noAutolaunch() { + List<ResolvedComponentInfo> personalResolvedComponentInfos = + createResolvedComponentsForTest(1); + when(sOverrides.resolverListController.getResolversForIntent(Mockito.anyBoolean(), + Mockito.anyBoolean(), + Mockito.isA(List.class))) + .thenReturn(new ArrayList<>(personalResolvedComponentInfos)); + Intent chooserIntent = createChooserIntent(new Intent[] {new Intent("action.fake")}); + ResolveInfo[] chosen = new ResolveInfo[1]; + sOverrides.onSafelyStartCallback = targetInfo -> { + chosen[0] = targetInfo.getResolveInfo(); + return true; + }; + sOverrides.packageManager = mock(PackageManager.class); + ResolveInfo ri = createFakeResolveInfo(); + when(sOverrides.packageManager.resolveActivity(any(Intent.class), anyInt())).thenReturn(ri); + waitForIdle(); + + mActivityRule.launchActivity(chooserIntent); + waitForIdle(); + + assertNull(chosen[0]); + } + + private Intent createChooserIntent(Intent[] initialIntents) { + Intent chooserIntent = new Intent(); + chooserIntent.setAction(Intent.ACTION_CHOOSER); + chooserIntent.putExtra(Intent.EXTRA_TEXT, "testing intent sending"); + chooserIntent.putExtra(Intent.EXTRA_TITLE, "some title"); + chooserIntent.putExtra(Intent.EXTRA_INTENT, createSendTextIntent()); + chooserIntent.setType("text/plain"); + if (initialIntents != null) { + chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, initialIntents); + } + return chooserIntent; + } + + private ResolveInfo createFakeResolveInfo() { + ResolveInfo ri = new ResolveInfo(); + ri.activityInfo = new ActivityInfo(); + ri.activityInfo.name = "FakeActivityName"; + ri.activityInfo.packageName = "fake.package.name"; + ri.activityInfo.applicationInfo = new ApplicationInfo(); + ri.activityInfo.applicationInfo.packageName = "fake.package.name"; + return ri; + } + private Intent createSendTextIntent() { Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); diff --git a/core/tests/coretests/src/com/android/internal/app/ChooserWrapperActivity.java b/core/tests/coretests/src/com/android/internal/app/ChooserWrapperActivity.java index 5b83f952b745..071b2259e1f0 100644 --- a/core/tests/coretests/src/com/android/internal/app/ChooserWrapperActivity.java +++ b/core/tests/coretests/src/com/android/internal/app/ChooserWrapperActivity.java @@ -58,6 +58,18 @@ public class ChooserWrapperActivity extends ChooserActivity { return multiProfilePagerAdapter; } + @Override + public ChooserListAdapter createChooserListAdapter(Context context, List<Intent> payloadIntents, + Intent[] initialIntents, List<ResolveInfo> rList, boolean filterLastUsed, + boolean useLayoutForBrowsables, ResolverListController resolverListController) { + PackageManager packageManager = + sOverrides.packageManager == null ? context.getPackageManager() + : sOverrides.packageManager; + return new ChooserListAdapter(context, payloadIntents, initialIntents, rList, + filterLastUsed, resolverListController, useLayoutForBrowsables, + this, this, packageManager); + } + ChooserListAdapter getAdapter() { return mChooserMultiProfilePagerAdapter.getActiveListAdapter(); } @@ -217,6 +229,7 @@ public class ChooserWrapperActivity extends ChooserActivity { public boolean hasCrossProfileIntents; public boolean isQuietModeEnabled; public AbstractMultiProfilePagerAdapter.Injector multiPagerAdapterInjector; + public PackageManager packageManager; public void reset() { onSafelyStartCallback = null; @@ -235,6 +248,7 @@ public class ChooserWrapperActivity extends ChooserActivity { workProfileUserHandle = null; hasCrossProfileIntents = true; isQuietModeEnabled = false; + packageManager = null; multiPagerAdapterInjector = new AbstractMultiProfilePagerAdapter.Injector() { @Override public boolean hasCrossProfileIntents(List<Intent> intents, int sourceUserId, diff --git a/graphics/java/android/graphics/ImageDecoder.java b/graphics/java/android/graphics/ImageDecoder.java index 83432c362672..97b448aa8ff0 100644 --- a/graphics/java/android/graphics/ImageDecoder.java +++ b/graphics/java/android/graphics/ImageDecoder.java @@ -270,7 +270,7 @@ public final class ImageDecoder implements AutoCloseable { public ImageDecoder createImageDecoder(boolean preferAnimation) throws IOException { AssetFileDescriptor assetFd = null; try { - if (mUri.getScheme().equals(ContentResolver.SCHEME_CONTENT)) { + if (ContentResolver.SCHEME_CONTENT.equals(mUri.getScheme())) { assetFd = mResolver.openTypedAssetFileDescriptor(mUri, "image/*", null); } else { diff --git a/media/java/android/media/MediaRoute2ProviderService.java b/media/java/android/media/MediaRoute2ProviderService.java index fb95e98ebf47..72162c44ec29 100644 --- a/media/java/android/media/MediaRoute2ProviderService.java +++ b/media/java/android/media/MediaRoute2ProviderService.java @@ -519,6 +519,7 @@ public abstract class MediaRoute2ProviderService extends Service { requestCreateSession)); } + //TODO: Ignore requests with unknown session ID. @Override public void selectRoute(long requestId, String sessionId, String routeId) { if (!checkCallerisSystem()) { diff --git a/media/java/android/media/MediaRouter2.java b/media/java/android/media/MediaRouter2.java index 2c65cc4440a4..7d14ef5542cc 100644 --- a/media/java/android/media/MediaRouter2.java +++ b/media/java/android/media/MediaRouter2.java @@ -604,7 +604,8 @@ public final class MediaRouter2 { RoutingController oldController = getCurrentController(); if (!oldController.releaseInternal( - /* shouldReleaseSession= */ true, /* shouldNotifyStop= */ false)) { + /* shouldReleaseSession= */ matchingRequest != null, + /* shouldNotifyStop= */ false)) { // Could not release the controller since it was just released by other thread. oldController = getSystemController(); } diff --git a/media/java/android/media/MediaRouter2Manager.java b/media/java/android/media/MediaRouter2Manager.java index 3b570b60ff24..5d61dd06c792 100644 --- a/media/java/android/media/MediaRouter2Manager.java +++ b/media/java/android/media/MediaRouter2Manager.java @@ -314,7 +314,6 @@ public final class MediaRouter2Manager { //TODO: Ignore unknown route. if (sessionInfo.getTransferableRoutes().contains(route.getId())) { - //TODO: callbacks must be called after this. transferToRoute(sessionInfo, route); return; } @@ -340,7 +339,6 @@ public final class MediaRouter2Manager { } catch (RemoteException ex) { Log.e(TAG, "Unable to select media route", ex); } - releaseSession(sessionInfo); } } @@ -489,6 +487,7 @@ public final class MediaRouter2Manager { notifyTransferFailed(matchingRequest.mOldSessionInfo, requestedRoute); return; } + releaseSession(matchingRequest.mOldSessionInfo); notifyTransferred(matchingRequest.mOldSessionInfo, sessionInfo); } diff --git a/packages/CarSystemUI/res/values/config.xml b/packages/CarSystemUI/res/values/config.xml index 050db3218a1d..67066d7c426f 100644 --- a/packages/CarSystemUI/res/values/config.xml +++ b/packages/CarSystemUI/res/values/config.xml @@ -92,35 +92,28 @@ <item>com.android.vending</item> </string-array> - <!-- SystemUI Services: The classes of the stuff to start. --> - <string-array name="config_systemUIServiceComponents" translatable="false"> - <item>com.android.systemui.util.NotificationChannels</item> - <item>com.android.systemui.keyguard.KeyguardViewMediator</item> -<!-- <item>com.android.systemui.recents.Recents</item>--> -<!-- <item>com.android.systemui.volume.VolumeUI</item>--> -<!-- <item>com.android.systemui.stackdivider.Divider</item>--> -<!-- <item>com.android.systemui.statusbar.phone.StatusBar</item>--> - <item>com.android.systemui.usb.StorageNotification</item> - <item>com.android.systemui.power.PowerUI</item> - <item>com.android.systemui.media.RingtonePlayer</item> -<!-- <item>com.android.systemui.keyboard.KeyboardUI</item>--> -<!-- <item>com.android.systemui.pip.PipUI</item>--> -<!-- <item>com.android.systemui.shortcut.ShortcutKeyDispatcher</item>--> - <item>@string/config_systemUIVendorServiceComponent</item> - <item>com.android.systemui.util.leak.GarbageMonitor$Service</item> -<!-- <item>com.android.systemui.LatencyTester</item>--> -<!-- <item>com.android.systemui.globalactions.GlobalActionsComponent</item>--> - <item>com.android.systemui.ScreenDecorations</item> - <item>com.android.systemui.biometrics.AuthController</item> -<!-- <item>com.android.systemui.SliceBroadcastRelayHandler</item>--> - <item>com.android.systemui.SizeCompatModeActivityController</item> -<!-- <item>com.android.systemui.statusbar.notification.InstantAppNotifier</item>--> - <item>com.android.systemui.theme.ThemeOverlayController</item> - <item>com.android.systemui.toast.ToastUI</item> + <!-- The list of components to exclude from config_systemUIServiceComponents. --> + <string-array name="config_systemUIServiceComponentsExclude" translatable="false"> + <item>com.android.systemui.recents.Recents</item> + <item>com.android.systemui.volume.VolumeUI</item> + <item>com.android.systemui.stackdivider.Divider</item> + <item>com.android.systemui.statusbar.phone.StatusBar</item> + <item>com.android.systemui.keyboard.KeyboardUI</item> + <item>com.android.systemui.pip.PipUI</item> + <item>com.android.systemui.shortcut.ShortcutKeyDispatcher</item> + <item>com.android.systemui.LatencyTester</item> + <item>com.android.systemui.globalactions.GlobalActionsComponent</item> + <item>com.android.systemui.SliceBroadcastRelayHandler</item> + <item>com.android.systemui.statusbar.notification.InstantAppNotifier</item> + <item>com.android.systemui.accessibility.WindowMagnification</item> + <item>com.android.systemui.accessibility.SystemActions</item> + </string-array> + + <!-- The list of components to append to config_systemUIServiceComponents. --> + <string-array name="config_systemUIServiceComponentsInclude" translatable="false"> <item>com.android.systemui.car.navigationbar.CarNavigationBar</item> <item>com.android.systemui.car.voicerecognition.ConnectedDeviceVoiceRecognitionNotifier</item> <item>com.android.systemui.car.window.SystemUIOverlayWindowManager</item> <item>com.android.systemui.car.volume.VolumeUI</item> - <item>com.android.systemui.car.sideloaded.SideLoadedAppController</item> </string-array> </resources> diff --git a/packages/CarSystemUI/src/com/android/systemui/CarSystemUIFactory.java b/packages/CarSystemUI/src/com/android/systemui/CarSystemUIFactory.java index 2bd5fe228f41..1a1b93b33caf 100644 --- a/packages/CarSystemUI/src/com/android/systemui/CarSystemUIFactory.java +++ b/packages/CarSystemUI/src/com/android/systemui/CarSystemUIFactory.java @@ -17,9 +17,13 @@ package com.android.systemui; import android.content.Context; +import android.content.res.Resources; import com.android.systemui.dagger.SystemUIRootComponent; +import java.util.HashSet; +import java.util.Set; + /** * Class factory to provide car specific SystemUI components. */ @@ -31,4 +35,26 @@ public class CarSystemUIFactory extends SystemUIFactory { .contextHolder(new ContextHolder(context)) .build(); } + + @Override + public String[] getSystemUIServiceComponents(Resources resources) { + Set<String> names = new HashSet<>(); + + for (String s : super.getSystemUIServiceComponents(resources)) { + names.add(s); + } + + for (String s : resources.getStringArray(R.array.config_systemUIServiceComponentsExclude)) { + names.remove(s); + } + + for (String s : resources.getStringArray(R.array.config_systemUIServiceComponentsInclude)) { + names.add(s); + } + + String[] finalNames = new String[names.size()]; + names.toArray(finalNames); + + return finalNames; + } } diff --git a/packages/CtsShim/apk/arm/CtsShim.apk b/packages/CtsShim/apk/arm/CtsShim.apk Binary files differindex 54ee0d07df34..6480deada771 100644 --- a/packages/CtsShim/apk/arm/CtsShim.apk +++ b/packages/CtsShim/apk/arm/CtsShim.apk diff --git a/packages/CtsShim/apk/arm/CtsShimPriv.apk b/packages/CtsShim/apk/arm/CtsShimPriv.apk Binary files differindex ca34af947986..08145012c64d 100644 --- a/packages/CtsShim/apk/arm/CtsShimPriv.apk +++ b/packages/CtsShim/apk/arm/CtsShimPriv.apk diff --git a/packages/CtsShim/apk/x86/CtsShim.apk b/packages/CtsShim/apk/x86/CtsShim.apk Binary files differindex 54ee0d07df34..6480deada771 100644 --- a/packages/CtsShim/apk/x86/CtsShim.apk +++ b/packages/CtsShim/apk/x86/CtsShim.apk diff --git a/packages/CtsShim/apk/x86/CtsShimPriv.apk b/packages/CtsShim/apk/x86/CtsShimPriv.apk Binary files differindex edbb1519eff6..b52dc9d8919b 100644 --- a/packages/CtsShim/apk/x86/CtsShimPriv.apk +++ b/packages/CtsShim/apk/x86/CtsShimPriv.apk diff --git a/packages/CtsShim/build/Android.bp b/packages/CtsShim/build/Android.bp index be790106f42d..d41c6728559b 100644 --- a/packages/CtsShim/build/Android.bp +++ b/packages/CtsShim/build/Android.bp @@ -76,6 +76,7 @@ android_app { "com.android.apex.cts.shim.v2_no_hashtree", "com.android.apex.cts.shim.v2_legacy", "com.android.apex.cts.shim.v2_sdk_target_p", + "com.android.apex.cts.shim.v2_unsigned_payload", "com.android.apex.cts.shim.v3", ], } @@ -148,6 +149,7 @@ android_app { "com.android.apex.cts.shim.v2_no_hashtree", "com.android.apex.cts.shim.v2_legacy", "com.android.apex.cts.shim.v2_sdk_target_p", + "com.android.apex.cts.shim.v2_unsigned_payload", "com.android.apex.cts.shim.v3", ], } diff --git a/packages/CtsShim/build/jni/Android.bp b/packages/CtsShim/build/jni/Android.bp index 7a5b07e61e9d..44775828e535 100644 --- a/packages/CtsShim/build/jni/Android.bp +++ b/packages/CtsShim/build/jni/Android.bp @@ -25,6 +25,7 @@ cc_library_shared { "com.android.apex.cts.shim.v2_no_hashtree", "com.android.apex.cts.shim.v2_legacy", "com.android.apex.cts.shim.v2_sdk_target_p", + "com.android.apex.cts.shim.v2_unsigned_payload", "com.android.apex.cts.shim.v3", ], } diff --git a/packages/DynamicSystemInstallationService/res/values-af/strings.xml b/packages/DynamicSystemInstallationService/res/values-af/strings.xml new file mode 100644 index 000000000000..1829d342e9c5 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-af/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Voer asseblief jou wagwoord in en gaan voort na Dinamiese Steselopdaterings"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"Dinamiese stelsel is gereed. Herbegin jou toestel om dit te begin gebruik."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Installeer tans"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Kon nie installeer nie"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Kon nie prent bekragtig nie. Staak installering."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Laat loop tans \'n dinamiese stelsel. Herbegin om die oorspronklike Android-weergawe te gebruik."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Kanselleer"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Gooi weg"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Herbegin"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Herbegin"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Het dinamiese stelsel weggegooi"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Kan nie dinamiese stelsel herbegin of laai nie"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-am/strings.xml b/packages/DynamicSystemInstallationService/res/values-am/strings.xml new file mode 100644 index 000000000000..7fcc40de38d2 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-am/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"እባክዎ የእርስዎን የይለፍ ቃል ያስገቡ እና ወደ የተለዋዋጭ ሥርዓት ዝማኔዎች ይቀጥሉ"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"የተለዋዋጭ ሥርዓት ዝግጁ ነው። እሱን መጠቀም ለመጀመር የእርስዎን መሣሪያ ዳግም ያስጀምሩ።"</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"ጭነት በሂደት ላይ ነው"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"መጫን አልተሳካም"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"የምስል ማረጋገጫ አልተሳካም። ጭነትን አጨናግፍ።"</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"የተለዋዋጭ ሥርዓትን አሁን ላይ በማስሄድ ላይ ኦርጂናሉን የAndroid ስሪት በመጠቀም ዳግም ያስጀምሩ።"</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"ይቅር"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"አስወግድ"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"ዳግም ጀምር"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"ዳግም ጀምር"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"የተጣለ ተለዋዋጭ ሥርዓት"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"ዳግም ማስጀመር አይቻልም ወይም ተለዋዋጭ ሥርዓትን ይስቀሉ"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-ar/strings.xml b/packages/DynamicSystemInstallationService/res/values-ar/strings.xml new file mode 100644 index 000000000000..be705c37ef1d --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-ar/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"يُرجى إدخال كلمة مرور والمتابعة إلى \"تحديثات النظام الديناميكية\""</string> + <string name="notification_install_completed" msgid="6252047868415172643">"النظام الديناميكي جاهز. لبدء استخدامه، يجب إعادة تشغيل الجهاز."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"التثبيت قيد التقدّم."</string> + <string name="notification_install_failed" msgid="4066039210317521404">"تعذّر التثبيت."</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"تعذّر التحقّق من الصورة. يجب إلغاء التثبيت."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"يتم الآن تشغيل نظام ديناميكي. يجب إعادة التشغيل لاستخدام الإصدار الأصلي لنظام Android."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"إلغاء"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"تجاهل"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"إعادة التشغيل"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"إعادة التشغيل"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"تم تجاهل النظام الديناميكي."</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"لا يمكن إعادة التشغيل أو تحميل النظام الديناميكي."</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-as/strings.xml b/packages/DynamicSystemInstallationService/res/values-as/strings.xml new file mode 100644 index 000000000000..14eead9f9753 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-as/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"অনুগ্ৰহ কৰি আপোনাৰ পাছৱৰ্ডটো দিয়ক আৰু ডায়নামিক ছিষ্টেম আপডে\'টসমূহলৈ অব্যাহত ৰাখক"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"ডায়নামিক ছিষ্টেমটো সাজু। এইটো ব্যৱহাৰ কৰা আৰম্ভ কৰিবলৈ আপোনাৰ ডিভাইচটো ৰিষ্টাৰ্ট কৰক।"</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"ইনষ্টল চলি আছে"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"ইনষ্টল কৰিব পৰা নগ’ল"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"প্ৰতিচ্ছবিখন সত্যাপন কৰিব পৰা নগ’ল। ইনষ্টলেশ্বন বাতিল কৰক।"</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"বৰ্তমান এটা ডায়নামিক ছিষ্টেম চলি আছে। মূল Android সংস্কৰণটো ব্যৱহাৰ কৰিবলৈ ৰিষ্টাৰ্ট কৰক।"</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"বাতিল কৰক"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"বাতিল কৰক"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"ৰিষ্টাৰ্ট কৰক"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"ৰিষ্টাৰ্ট কৰক"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"বাতিল কৰা ডায়নামিক ছিষ্টেম"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"ডায়নামিক ছিষ্টেম ৰিষ্টার্ট অথবা ল\'ড কৰিব নোৱাৰি"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-az/strings.xml b/packages/DynamicSystemInstallationService/res/values-az/strings.xml new file mode 100644 index 000000000000..d1f0a4b78ebb --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-az/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Parolunuzu daxil edin və Dinamik Sistem Güncəlləməsinə keçin"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"Dinamik sistem hazırdır. İstifadəyə başlamaq üçün cihazınızı yenidən başladın."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Quraşdırılır"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Quraşdırılmadı"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Şəkil təsdiqlənmədi. Quraşdırmanı dayandırın."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Hazırda dinamik sistem icra olunur. Orijinal Android versiyasından istifadə etmək üçün yenidən başladın."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Ləğv edin"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"İmtina edin"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Yenidən başladın"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Yenidən başladın"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Dinamik sistemdən imtina edildi"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Dinamik sistemi yenidən başlatmaq və ya yükləmək mümkün deyil"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-b+sr+Latn/strings.xml b/packages/DynamicSystemInstallationService/res/values-b+sr+Latn/strings.xml new file mode 100644 index 000000000000..ea23a28bc9e5 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-b+sr+Latn/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Unesite lozinku i nastavite do dinamičnih ažuriranja sistema"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"Dinamični sistem je spreman. Da biste počeli da ga koristite, restartujte uređaj."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Instalira se"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Instaliranje nije uspelo"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Validacija slike nije uspela. Otkažite instalaciju."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Trenutno je pokrenut dinamični sistem. Restartujte da biste koristili originalnu verziju Android-a."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Otkaži"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Odbaci"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Restartuj"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Restartuj"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Dinamični sistem je odbačen"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Restartovanje ili učitavanje dinamičnog sistema nije uspelo"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-be/strings.xml b/packages/DynamicSystemInstallationService/res/values-be/strings.xml new file mode 100644 index 000000000000..7eef297be292 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-be/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Увядзіце пароль і перайдзіце ў Дынамічныя абнаўленні сістэмы"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"Дынамічная сістэма гатовая. Каб пачаць выкарыстоўваць яе, перазапусціце прыладу."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Ідзе ўсталёўка"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Збой усталёўкі"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Збой пры праверцы відарыса. Усталёўка спынена."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Цяпер запушчана дынамічная сістэма. Перазапусціце, каб скарыстаць арыгінальную версію Android."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Скасаваць"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Адхіліць"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Перазапусціць"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Перазапусціць"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Дынамічная сістэма адхілена"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Не ўдалося перазапусціць або загрузіць дынамічную сістэму"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-bg/strings.xml b/packages/DynamicSystemInstallationService/res/values-bg/strings.xml new file mode 100644 index 000000000000..9176676c0618 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-bg/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Моля, въведете паролата си и продължете към функцията за динамични актуализации на системата"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"Динамичната система е готова. Рестартирайте устройството си, за да я използвате."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Инсталиране – в ход"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Инсталирането не бе успешно"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Проверката на изображението не бе успешна. Прекратяване на инсталирането."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Понастоящем се изпълнява динамична система. Рестартирайте, за да използвате оригиналната версия на Android."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Отказ"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Отхвърляне"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Рестартиране"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Рестартиране"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Динамичната система е отхвърлена"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Динамичната система не може да се рестартира или зареди"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-bn/strings.xml b/packages/DynamicSystemInstallationService/res/values-bn/strings.xml new file mode 100644 index 000000000000..38ef64935fb4 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-bn/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"আপনার পাসওয়ার্ড লিখে ডায়নামিক সিস্টেম আপডেট করা চালিয়ে যান"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"ডায়নামিক সিস্টেম রেডি হয়ে গেছে। সেটি ব্যবহার করা শুরু করতে আপনার ডিভাইস রিস্টার্ট করুন।"</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"ইনস্টল করা হচ্ছে"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"ইনস্টল করা যায়নি"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"ছবি যাচাই করা যায়নি। ইনস্টলেশন বন্ধ করুন।"</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"বর্তমানে ডায়নামিক সিস্টেম চালানো হচ্ছে। আসল Android ভার্সন ব্যবহার করার জন্য রিস্টার্ট করুন।"</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"বাতিল করুন"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"বাতিল করুন"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"রিস্টার্ট করুন"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"রিস্টার্ট করুন"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"ডায়নামিক সিস্টেম বাতিল করা হয়েছে"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"ডায়নামিক সিস্টেম রিস্টার্ট বা লোড করা যাচ্ছে না"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-bs/strings.xml b/packages/DynamicSystemInstallationService/res/values-bs/strings.xml new file mode 100644 index 000000000000..84ba540bb822 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-bs/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Unesite lozinku i nastavite na dinamična ažuriranja sistema"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"Dinamični sistem je spreman. Da ga počnete koristiti, ponovo pokrenite uređaj."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Instaliranje je u toku"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Instaliranje nije uspjelo"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Potvrda slike sistema nije uspjela. Prekini instalaciju."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Dinamični sistem je sada aktivan. Ponovo pokrenite da koristite originalnu verziju Androida."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Otkaži"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Odbaci"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Ponovo pokreni"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Ponovo pokreni"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Dinamični sistem je odbačen"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Nije moguće ponovo pokrenuti ili učitati dinamični sistem"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-ca/strings.xml b/packages/DynamicSystemInstallationService/res/values-ca/strings.xml new file mode 100644 index 000000000000..787e4960513b --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-ca/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Introdueix la contrasenya i continua cap a Actualització dinàmica del sistema"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"El sistema dinàmic ja està a punt. Per començar a utilitzar-lo, reinicia el teu dispositiu."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Instal·lació en curs"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Ha fallat la instal·lació"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"No s\'ha pogut validar la imatge. Anul·la la instal·lació."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"S\'està executant un sistema dinàmic. Reinicia per utilitzar la versió original d\'Android."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Cancel·la"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Descarta"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Reinicia"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Reinicia"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"S\'ha descartat el sistema dinàmic"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"No es pot reiniciar ni carregar el sistema dinàmic"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-cs/strings.xml b/packages/DynamicSystemInstallationService/res/values-cs/strings.xml new file mode 100644 index 000000000000..3dfb23f7d2ff --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-cs/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Zadejte heslo a pokračujte k dynamickým aktualizacím systému"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"Dynamický systém je připraven. Chcete-li ho začít používat, restartujte zařízení."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Probíhá instalace"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Instalace se nezdařila"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Obraz se nepodařilo ověřit. Zrušte instalaci."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Je spuštěn dynamický systém. Chcete-li použít původní verzi systému Android, restartujte zařízení."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Zrušit"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Zahodit"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Restartovat"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Restartovat"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Zahodit dynamický systém"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Dynamický systém nelze znovu spustit nebo načíst"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-da/strings.xml b/packages/DynamicSystemInstallationService/res/values-da/strings.xml new file mode 100644 index 000000000000..20005e739205 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-da/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Angiv din adgangskode, og fortsæt til Dynamiske systemopdateringer"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"Det dynamiske system er klar. Hvis du vil begynde at bruge det, skal du genstarte din enhed."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Installation i gang"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Installationen mislykkedes"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Billedet kunne ikke valideres. Afbryd installationen."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Der køres i øjeblikket et dynamisk system. Genstart for at bruge den oprindelige Android-version."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Annuller"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Afbryd"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Genstart"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Genstart"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Det dynamiske system blev slettet"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Det dynamiske system kan ikke genstartes eller indlæses"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-de/strings.xml b/packages/DynamicSystemInstallationService/res/values-de/strings.xml new file mode 100644 index 000000000000..3f000eaea251 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-de/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Gib dein Passwort ein und fahre mit Dynamic System Updates fort"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"Das dynamische System kann verwendet werden. Starte dazu dein Gerät neu."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Installation läuft"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Fehler bei der Installation"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Fehler bei der Imagevalidierung. Die Installation wird abgebrochen."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Momentan wird ein dynamisches System ausgeführt. Durch einen Neustart kannst du zur ursprünglichen Android-Version zurückkehren."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Abbrechen"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Verwerfen"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Neu starten"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Neu starten"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Dynamisches System verworfen"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Neustart und Laden des dynamischen Systems nicht möglich"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-el/strings.xml b/packages/DynamicSystemInstallationService/res/values-el/strings.xml new file mode 100644 index 000000000000..4d830dde12e5 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-el/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Πληκτρολογήστε τον κωδικό σας και συνεχίστε στις Δυναμικές ενημερώσεις συστήματος."</string> + <string name="notification_install_completed" msgid="6252047868415172643">"Οι δυναμικές συστήματος είναι έτοιμες. Για να ξεκινήσετε να τις χρησιμοποιείτε, επανεκκινήστε τη συσκευή σας."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Εγκατάσταση σε εξέλιξη"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Η εγκατάσταση απέτυχε."</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Η επαλήθευση εικόνας απέτυχε. Ακύρωση εγκατάστασης."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Αυτήν τη στιγμή εκτελούνται δυναμικές συστήματος. Επανεκκινήστε για να χρησιμοποιήσετε την αρχική έκδοση Android."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Ακύρωση"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Απόρριψη"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Επανεκκίνηση"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Επανεκκίνηση"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Οι δυναμικές συστήματος απορρίφθηκαν."</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Δεν είναι δυνατή η επανεκκίνηση ή η φόρτωση δυναμικών συστήματος"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-en-rAU/strings.xml b/packages/DynamicSystemInstallationService/res/values-en-rAU/strings.xml new file mode 100644 index 000000000000..d72863128257 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-en-rAU/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Please enter your password and continue to Dynamic System Updates"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"Dynamic system is ready. To start using it, restart your device."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Installation in progress"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Installation failed"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Image validation failed. Abort installation."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Currently running a dynamic system. Restart to use the original Android version."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Cancel"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Discard"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Restart"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Restart"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Discarded dynamic system"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Can’t restart or load dynamic system"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-en-rCA/strings.xml b/packages/DynamicSystemInstallationService/res/values-en-rCA/strings.xml new file mode 100644 index 000000000000..d72863128257 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-en-rCA/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Please enter your password and continue to Dynamic System Updates"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"Dynamic system is ready. To start using it, restart your device."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Installation in progress"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Installation failed"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Image validation failed. Abort installation."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Currently running a dynamic system. Restart to use the original Android version."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Cancel"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Discard"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Restart"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Restart"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Discarded dynamic system"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Can’t restart or load dynamic system"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-en-rGB/strings.xml b/packages/DynamicSystemInstallationService/res/values-en-rGB/strings.xml new file mode 100644 index 000000000000..d72863128257 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-en-rGB/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Please enter your password and continue to Dynamic System Updates"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"Dynamic system is ready. To start using it, restart your device."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Installation in progress"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Installation failed"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Image validation failed. Abort installation."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Currently running a dynamic system. Restart to use the original Android version."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Cancel"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Discard"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Restart"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Restart"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Discarded dynamic system"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Can’t restart or load dynamic system"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-en-rIN/strings.xml b/packages/DynamicSystemInstallationService/res/values-en-rIN/strings.xml new file mode 100644 index 000000000000..d72863128257 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-en-rIN/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Please enter your password and continue to Dynamic System Updates"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"Dynamic system is ready. To start using it, restart your device."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Installation in progress"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Installation failed"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Image validation failed. Abort installation."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Currently running a dynamic system. Restart to use the original Android version."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Cancel"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Discard"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Restart"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Restart"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Discarded dynamic system"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Can’t restart or load dynamic system"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-en-rXC/strings.xml b/packages/DynamicSystemInstallationService/res/values-en-rXC/strings.xml new file mode 100644 index 000000000000..6ac376322ceb --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-en-rXC/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Please enter your password and continue to Dynamic System Updates"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"Dynamic system is ready. To start using it, restart your device."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Install in progress"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Install failed"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Image validation failed. Abort installation."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Currently running a dynamic system. Restart to use the original Android version."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Cancel"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Discard"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Restart"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Restart"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Discarded dynamic system"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Can’t restart or load dynamic system"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-es-rUS/strings.xml b/packages/DynamicSystemInstallationService/res/values-es-rUS/strings.xml new file mode 100644 index 000000000000..9ec819656495 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-es-rUS/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Ingresa la contraseña y continúa en Actualizaciones dinámicas del sistema"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"El sistema dinámico está listo. Para comenzar a usarlo, reinicia el dispositivo."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Instalación en curso"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Error de instalación"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Se produjo un error con la validación de la imagen. Anula la instalación."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Se está ejecutando el sistema dinámico. Reinicia para usar la versión original de Android."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Cancelar"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Descartar"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Reiniciar"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Reiniciar"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Se descartó el sistema dinámico"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"No se puede reiniciar o cargar el sistema dinámico"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-es/strings.xml b/packages/DynamicSystemInstallationService/res/values-es/strings.xml new file mode 100644 index 000000000000..cd9db07168a2 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-es/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Introduce la contraseña y entra en Actualización Dinámica del Sistema"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"El sistema dinámico está listo. Para comenzar a usarlo, reinicia el dispositivo."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Instalación en curso"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"No se ha podido instalar"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"No se ha podido validar la imagen. Anula la instalación."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Se está ejecutando el sistema dinámico. Reinícialo para usar la versión original de Android."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Cancelar"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Descartar"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Reiniciar"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Reiniciar"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Se ha descartado el sistema dinámico"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"No se ha podido reiniciar o cargar el sistema dinámico"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-et/strings.xml b/packages/DynamicSystemInstallationService/res/values-et/strings.xml new file mode 100644 index 000000000000..64968b60ac6f --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-et/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Sisestage oma parool ja minge edasi rakendusse Dünaamiline süsteemivärskendus"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"Dünaamiline süsteem on valmis. Selle kasutamise alustamiseks taaskäivitage seade."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Installimine on pooleli"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Installimine ebaõnnestus"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Kujutise kinnitamine ebaõnnestus. Katkestage installimine."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Praegu kasutatakse dünaamilist süsteemi. Algse Androidi versiooni kasutamiseks taaskäivitage."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Tühista"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Loobu"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Taaskäivita"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Taaskäivita"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Dünaamilisest süsteemist loobuti"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Dünaamilist süsteemi ei saa taaskäivitada ega laadida"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-eu/strings.xml b/packages/DynamicSystemInstallationService/res/values-eu/strings.xml new file mode 100644 index 000000000000..7c4a67d4e6c2 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-eu/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Idatzi pasahitza eta joan Sistemaren eguneratze dinamikoa eginbidera"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"Prest dago sistema dinamikoa. Erabiltzen hasteko, berrabiarazi gailua."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Instalatzen"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Ezin izan da instalatu"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Ezin izan da balidatu irudia. Utzi bertan behera instalazioa."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Sistema dinamiko bat abian da. Berrabiarazi Android-en jatorrizko bertsioa erabiltzeko."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Utzi"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Baztertu"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Berrabiarazi"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Berrabiarazi"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Baztertu da sistema dinamikoa"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Ezin da berrabiarazi edo kargatu sistema dinamikoa"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-fa/strings.xml b/packages/DynamicSystemInstallationService/res/values-fa/strings.xml new file mode 100644 index 000000000000..7533e71cb26c --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-fa/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"لطفاً گذرواژه را وارد کنید و «بهروزرسانیهای سیستم پویا» را ادامه دهید"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"سیستم پویا آماده است. برای استفاده از آن، دستگاه را بازراهاندازی کنید."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"درحال نصب"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"نصب نشد"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"راستیآزمایی تصویر انجام نشد. نصب را لغو کنید."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"درحالحاضر سیستم پویا اجرا میشود. برای استفاده از نسخه اصلی Android، بازراهاندازی کنید."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"لغو کردن"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"صرفنظر کردن"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"بازراهاندازی"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"بازراهاندازی"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"از سیستم پویا صرفنظر شد"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"نمیتوان سیستم پویا را بازراهاندازی یا بار کرد"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-fi/strings.xml b/packages/DynamicSystemInstallationService/res/values-fi/strings.xml new file mode 100644 index 000000000000..948c3336cea8 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-fi/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Lisää salasanasi ja jatka dynaamisiin järjestelmäpäivityksiin"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"Dynaaminen järjestelmä on valmis. Aloita sen käyttö käynnistämällä laite uudelleen."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Asennus käynnissä"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Asennus epäonnistui"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Kuvavahvistus epäonnistui. Keskeytä asennus."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Käyttää tällä hetkellä dynaamista järjestelmää. Käynnistä uudelleen käyttääksesi alkuperäistä Android-versiota."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Peruuta"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Hylkää"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Käynn. uudelleen"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Käynn. uudelleen"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Dynaaminen järjestelmä hylätty"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Dynaamista järjestelmää ei voi käynnistää uudelleen tai ladata"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-fr-rCA/strings.xml b/packages/DynamicSystemInstallationService/res/values-fr-rCA/strings.xml new file mode 100644 index 000000000000..6e2f235bcb76 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-fr-rCA/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Veuillez entrer votre mot de passe et continuer vers les mises à jour système dynamiques"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"Le système dynamique est prêt. Pour commencer à l\'utiliser, redémarrez votre appareil."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Installation en cours…"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Échec de l\'installation"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Impossible de valider l\'image. Annulation de l\'installation."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Un système dynamique est en cours d\'exécution. Pour utiliser la version originale d\'Android, redémarrez l\'appareil."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Annuler"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Annuler"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Redémarrer"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Redémarrer"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Système dynamique supprimé"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Impossible de redémarrer ou de charger le système dynamique"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-fr/strings.xml b/packages/DynamicSystemInstallationService/res/values-fr/strings.xml new file mode 100644 index 000000000000..67f799731c6d --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-fr/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Veuillez saisir votre mot de passe pour accéder aux Mises à jour système dynamiques"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"Le système dynamique est prêt. Pour commencer à l\'utiliser, redémarrez votre appareil."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Installation…"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Échec de l\'installation"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Échec de la validation de l\'image. Annulez l\'installation."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Un système dynamique est en cours d\'exécution. Redémarrez pour utiliser la version Android d\'origine."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Annuler"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Supprimer"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Redémarrer"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Redémarrer"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Système dynamique supprimé"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Impossible de redémarrer ou de charger le système dynamique"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-gl/strings.xml b/packages/DynamicSystemInstallationService/res/values-gl/strings.xml new file mode 100644 index 000000000000..8ea6d1c6c3b6 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-gl/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Pon o teu contrasinal e vai a Dynamic System Updates"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"O sistema dinámico está listo. Para utilizalo, reinicia o dispositivo."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Instalación en curso"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Produciuse un erro durante a instalación"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Produciuse un erro ao validar a imaxe. Aborta a instalación."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Estase executando un sistema dinámico. Reinicia o dispositivo para utilizar a versión de Android orixinal."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Cancelar"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Descartar"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Reiniciar"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Reiniciar"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Descartouse o sistema dinámico"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Non se puido reiniciar nin cargar o sistema dinámico"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-gu/strings.xml b/packages/DynamicSystemInstallationService/res/values-gu/strings.xml new file mode 100644 index 000000000000..aec18049fdb0 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-gu/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"કૃપા કરીને તમારો પાસવર્ડ દાખલ કરો અને ડાઇનૅમિક સિસ્ટમ અપડેટ પર ચાલુ રાખો"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"ડાઇનૅમિક સિસ્ટમ તૈયાર છે. તેનો ઉપયોગ કરવા માટે, તમારા ડિવાઇસને ફરી શરૂ કરો."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"ઇન્સ્ટૉલ થઈ રહ્યું છે"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"ઇન્સ્ટૉલ કરવામાં નિષ્ફળ રહ્યાં"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"છબીની ચકાસણી નિષ્ફળ રહી. ઇન્સ્ટૉલેશન રદ કરો."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"હાલમાં ડાઇનૅમિક સિસ્ટમ ચાલી રહી છે. ઑરિજિનલ Android વર્ઝનનો ઉપયોગ કરવા માટે ફરી શરૂ કરો."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"રદ કરો"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"કાઢી નાખો"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"ફરી શરૂ કરો"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"ફરી શરૂ કરો"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"ડાઇનૅમિક સિસ્ટમ કાઢી નાખવામાં આવી"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"ડાઇનૅમિક સિસ્ટમને ફરી શરૂ અથવા લોડ કરી શકાતી નથી"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-hi/strings.xml b/packages/DynamicSystemInstallationService/res/values-hi/strings.xml new file mode 100644 index 000000000000..efedbe8e7ee6 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-hi/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"डाइनैमिक सिस्टम अपडेट की सुविधा जारी रखने के लिए कृपया अपना पासवर्ड डालें"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"डाइनैमिक सिस्टम तैयार है. इसका इस्तेमाल करने के लिए, अपना डिवाइस रीस्टार्ट करें."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"इंस्टॉल हो रहा है"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"इंस्टॉल नहीं हो सका"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"इमेज की पुष्टि नहीं हो सकी. इंस्टॉल करने की प्रक्रिया रद्द करें."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"फ़िलहाल, हम एक डाइनैमिक सिस्टम चला रहे हैं. Android का मूल वर्शन इस्तेमाल करने के लिए रीस्टार्ट करें."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"रद्द करें"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"खारिज करें"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"रीस्टार्ट करें"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"रीस्टार्ट करें"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"डाइनैमिक सिस्टम खारिज किया गया"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"डाइनैमिक सिस्टम रीस्टार्ट या लोड नहीं हो सका"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-hr/strings.xml b/packages/DynamicSystemInstallationService/res/values-hr/strings.xml new file mode 100644 index 000000000000..50ceaa16f764 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-hr/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Unesite zaporku i nastavite do dinamičnih ažuriranja sustava"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"Dinamični sustav je spreman. Da biste ga počeli upotrebljavati, ponovno pokrenite svoj uređaj."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Instalacija u tijeku"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Instaliranje nije uspjelo"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Provjera slike nije uspjela. Prekini instalaciju."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Trenutačno je pokrenut dinamični sustav. Ponovno pokrenite kako biste upotrebljavali izvornu verziju Androida."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Otkaži"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Odbaci"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Pokreni"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Pokreni"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Odbačeni dinamični sustav"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Nije moguće ponovno pokretanje ili učitavanje dinamičnog sustava"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-hu/strings.xml b/packages/DynamicSystemInstallationService/res/values-hu/strings.xml new file mode 100644 index 000000000000..94afa3b927b3 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-hu/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Adja meg jelszavát, hogy használhassa a Dinamikus rendszerfrissítések funkciót"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"A dinamikus rendszer készen áll. A használatához indítsa újra az eszközt."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Telepítés…"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Sikertelen telepítés"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"A kép ellenőrzése nem sikerült. A telepítés megszakad."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Jelenleg dinamikus rendszert futtat. Az eredeti Android-verzió használatához indítsa újra az eszközt."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Mégse"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Elvetés"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Újraindítás"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Újraindítás"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Elvetett dinamikus rendszer"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Nem lehet újraindítani vagy betölteni a dinamikus rendszert"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-hy/strings.xml b/packages/DynamicSystemInstallationService/res/values-hy/strings.xml new file mode 100644 index 000000000000..b0cd740d3e8d --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-hy/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Մուտքագրեք ձեր գաղտնաբառը և անցեք համակարգի դինամիկ թարմացումների էջ"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"Դինամիկ համակարգը պատրաստ է։ Այն օգտագործելու համար վերագործարկեք ձեր սարքը։"</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Տեղադրում"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Չհաջողվեց տեղադրել"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Չհաջողվեց հաստատել պատկերը։ Չեղարկել տեղադրումը։"</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Աշխատեցվում է դինամիկ համակարգը։ Վերագործարկեք՝ Android-ի նախկին տարբերակին անցնելու համար։"</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Չեղարկել"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Հրաժարվել"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"վերականգնել"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Վերագործարկել"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Դինամիկ համակարգի գործարկումը չեղարկվեց"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Չհաջողվեց վերագործարկել կամ բեռնել դինամիկ համակարգը"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-in/strings.xml b/packages/DynamicSystemInstallationService/res/values-in/strings.xml new file mode 100644 index 000000000000..44b4aeec8b78 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-in/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Masukkan sandi Anda dan lanjutkan ke Dynamic System Updates"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"Dynamic System sudah siap. Mulai ulang perangkat untuk mulai menggunakannya."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Sedang diinstal"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Penginstalan gagal"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Validasi image gagal. Batalkan penginstalan."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Saat ini sedang menjalankan Dynamic System. Mulai ulang untuk menggunakan Android versi asli."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Batal"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Hapus"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Mulai ulang"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Mulai ulang"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Dynamic System dihapus"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Tidak dapat memulai ulang atau memuat Dynamic System"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-is/strings.xml b/packages/DynamicSystemInstallationService/res/values-is/strings.xml new file mode 100644 index 000000000000..048d1bca5518 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-is/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Sláðu inn aðgangsorð og haltu áfram í „Breytilegar kerfisuppfærslur“"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"Breytilegt kerfi er tilbúið. Endurræstu tækið til að byrja að nota það."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Uppsetning stendur yfir"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Uppsetning mistókst"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Ekki tókst að staðfesta mynd. Hættu við uppsetninguna."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Tækið keyrir á breytilegu kerfi. Endurræstu til að nota upprunalega Android útgáfu."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Hætta við"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Fleygja"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Endurræsa"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Endurræsa"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Breytilegu kerfi fleygt"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Ekki tókst að endurræsa eða hlaða breytilegu kerfi"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-it/strings.xml b/packages/DynamicSystemInstallationService/res/values-it/strings.xml new file mode 100644 index 000000000000..f70b38178021 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-it/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Inserisci la password e continua su Aggiornamenti di sistema dinamici"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"Sistema dinamico pronto. Per iniziare a usarlo, riavvia il dispositivo."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Installazione in corso"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Installazione non riuscita"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Impossibile convalidare l\'immagine. Interrompi l\'installazione."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Sistema dinamico in uso. Riavvia per usare la versione di Android originale."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Annulla"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Annulla"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Riavvia"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Riavvia"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Sistema dinamico annullato"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Impossibile riavviare o caricare il sistema dinamico"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-iw/strings.xml b/packages/DynamicSystemInstallationService/res/values-iw/strings.xml new file mode 100644 index 000000000000..aff7c824ba1d --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-iw/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"יש להזין את הסיסמה ולהמשיך אל עדכוני המערכת הדינמיים"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"המערכת הדינמית מוכנה. כדי להתחיל להשתמש בה, יש להפעיל מחדש את המכשיר."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"ההתקנה מתבצעת"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"ההתקנה נכשלה"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"אימות התמונה נכשל. יש לבטל את ההתקנה."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"בשלב זה פועלת מערכת דינמית. כדי להשתמש בגרסת Android המקורית, יש לבצע הפעלה מחדש."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"ביטול"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"סגירה"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"הפעלה מחדש"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"הפעלה מחדש"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"המערכת הדינמית נסגרה"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"לא ניתן להפעיל מחדש או לטעון את המערכת הדינמית"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-ja/strings.xml b/packages/DynamicSystemInstallationService/res/values-ja/strings.xml new file mode 100644 index 000000000000..46c093057a49 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-ja/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"パスワードを入力し、Dynamic System Updates に移動してください"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"動的システムの準備ができました。使い始めるには、デバイスを再起動してください。"</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"インストールしています"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"インストールに失敗しました"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"イメージの検証に失敗しました。インストールを中止してください。"</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"現在、動的システムを実行しています。元の Android バージョンを使用するには再起動してください。"</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"キャンセル"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"破棄"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"再起動"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"再起動"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"動的システムを破棄しました"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"動的システムの再起動や読み込みを行えません"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-ka/strings.xml b/packages/DynamicSystemInstallationService/res/values-ka/strings.xml new file mode 100644 index 000000000000..f841a59801e4 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-ka/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"გთხოვთ, შეიყვანოთ პაროლი სისტემის დინამიურ განახლებებზე გადასასვლელად"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"დინამიური სისტემა მზადაა. გადატვირთეთ მოწყობილობა მის გამოსაყენებლად."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"ინსტალირდება"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"ინსტალაცია ვერ მოხერხდა"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"სურათის ვალიდაცია ვერ მოხერხდა. ინსტალაციის შეწყვეტა."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"ამჟამად გამოიყენება დინამიური სისტემა. გადატვირთეთ Android-ის ორიგინალი ვერსიის გამოსაყენებლად."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"გაუქმება"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"გაუქმება"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"გადატვირთვა"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"გადატვირთვა"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"გაუქმებული დინამიური სისტემა"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"დინამიური სისტემის გადატვირთვა ან ჩატვირთვა ვერ ხერხდება"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-kk/strings.xml b/packages/DynamicSystemInstallationService/res/values-kk/strings.xml new file mode 100644 index 000000000000..d367b614e528 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-kk/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Құпия сөзіңізді енгізіңіз және Dynamic System Updates функциясына өтіңіз."</string> + <string name="notification_install_completed" msgid="6252047868415172643">"Динамикалық жүйе дайын. Оны пайдалану үшін құрылғыңызды қайта қосыңыз."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Орнатылып жатыр."</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Орнатылмады."</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Кескін тексерілмеді. Орнатуды доғарыңыз."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Әзірге динамикалық жүйе пайдаланылуда. Бастапқы Android нұсқасын пайдалану үшін қайта қосыңыз."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Бас тарту"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Жабу"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Қайта қосу"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Қайта қосу"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Динамикалық жүйе өшірілді."</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Динамикалық жүйені қайта қосу не жүктеу мүмкін емес."</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-km/strings.xml b/packages/DynamicSystemInstallationService/res/values-km/strings.xml new file mode 100644 index 000000000000..56a37164fa6e --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-km/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"សូមបញ្ចូលពាក្យសម្ងាត់របស់អ្នក រួចបន្តទៅការដំឡើងកំណែប្រព័ន្ធឌីណាមិច"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"ប្រព័ន្ធឌីណាមិចអាចប្រើបានហើយ។ ដើម្បីចាប់ផ្ដើមប្រើប្រព័ន្ធឌីណាមិច សូមចាប់ផ្ដើមឧបករណ៍របស់អ្នកឡើងវិញ។"</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"ការដំឡើងកំពុងដំណើរការ"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"ការដំឡើងមិនបានសម្រេច"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"បញ្ជាក់ភាពត្រឹមត្រូវនៃរូបភាពមិនបានសម្រេច។ បោះបង់ការដំឡើង។"</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"បច្ចុប្បន្នកំពុងដំណើរការប្រព័ន្ធឌីណាមិច។ ចាប់ផ្ដើមឡើងវិញ ដើម្បីប្រើកំណែ Android ដើម។"</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"បោះបង់"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"លុបចោល"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"ចាប់ផ្ដើមឡើងវិញ"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"ចាប់ផ្ដើមឡើងវិញ"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"បានលុបចោលប្រព័ន្ធឌីណាមិច"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"មិនអាចចាប់ផ្ដើមឡើងវិញ ឬផ្ទុកប្រព័ន្ធឌីណាមិចបានទេ"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-kn/strings.xml b/packages/DynamicSystemInstallationService/res/values-kn/strings.xml new file mode 100644 index 000000000000..b4063df9c10d --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-kn/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ ನಮೂದಿಸಿ ನಂತರ ಡೈನಾಮಿಕ್ ಸಿಸ್ಟಂ ಅಪ್ಡೇಟ್ಗಳಿಗೆ ಮುಂದುವರಿಯಿರಿ"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"ಡೈನಾಮಿಕ್ ಸಿಸ್ಟಂ ಸಿದ್ದವಾಗಿದೆ. ಇದನ್ನು ಬಳಸಲು, ನಿಮ್ಮ ಸಾಧನವನ್ನು ಮರುಪ್ರಾರಂಭಿಸಿ."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"ಇನ್ಸ್ಟಾಲ್ ಆಗುತ್ತಿದೆ"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲು ವಿಫಲವಾಗಿದೆ"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"ಚಿತ್ರದ ಮೌಲ್ಯೀಕರಣ ವಿಫಲವಾಗಿದೆ. ಇನ್ಸ್ಟಾಲ್ ಮಾಡುವಿಕೆಯನ್ನು ರದ್ದುಗೊಳಿಸಿ."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"ಪ್ರಸ್ತುತವಾಗಿ ಡೈನಾಮಿಕ್ ಸಿಸ್ಟಂ ರನ್ ಆಗುತ್ತಿದೆ ಮೂಲ Android ಆವೃತ್ತಿ ಬಳಸಲು, ಮರುಪ್ರಾರಂಭಿಸಿ."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"ರದ್ದುಗೊಳಿಸಿ"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"ತ್ಯಜಿಸಿ"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"ಮರುಪ್ರಾರಂಭಿಸಿ"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"ಮರುಪ್ರಾರಂಭಿಸಿ"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"ಡೈನಮಿಕ್ ಸಿಸ್ಟಂ ಅನ್ನು ತ್ಯಜಿಸಲಾಗಿದೆ"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"ಡೈನಾಮಿಕ್ ಸಿಸ್ಟಂ ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಲು ಅಥವಾ ಲೋಡ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-ko/strings.xml b/packages/DynamicSystemInstallationService/res/values-ko/strings.xml new file mode 100644 index 000000000000..24ac9245e22c --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-ko/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"비밀번호를 입력하고 동적 시스템 업데이트를 계속 진행하세요."</string> + <string name="notification_install_completed" msgid="6252047868415172643">"동적 시스템이 준비되었습니다. 사용을 시작하려면 기기를 다시 시작하세요."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"설치 진행 중"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"설치할 수 없음"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"이미지를 확인할 수 없습니다. 설치를 취소합니다."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"현재 동적 시스템을 실행 중입니다. 기존의 Android 버전을 사용하려면 다시 시작하세요."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"취소"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"삭제"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"다시 시작"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"다시 시작"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"동적 시스템 삭제됨"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"동적 시스템을 다시 시작하거나 로드할 수 없음"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-ky/strings.xml b/packages/DynamicSystemInstallationService/res/values-ky/strings.xml new file mode 100644 index 000000000000..a4387e7bf4a1 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-ky/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Сырсөзүңүздү киргизип, системаны динамикалык жаңыртууга өтүңүз"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"Динамикалык система даяр. Аны колдонуу үчүн, түзмөктү өчүрүп күйгүзүңүз."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Орнотулууда"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Орнотулбай койду"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Сүрөт текшерилбей калды. Орнотууну токтотуңуз."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Учурда динамикалык система колдонулууда. Android\'дин түпнуска версиясын колдонуу үчүн, өчүрүп күйгүзүңүз."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Жок"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Жоюу"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Өчүрүп күйгүзүү"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Өчүрүп күйгүзүү"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Динамикалык система жоюлду"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Динамикалык система өчүрүлүп күйгүзүлбөй же жүктөлбөй жатат"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-lo/strings.xml b/packages/DynamicSystemInstallationService/res/values-lo/strings.xml new file mode 100644 index 000000000000..f17ca16bf777 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-lo/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"ກະລຸນາໃສ່ລະຫັດຜ່ານຂອງທ່ານ ແລະ ດຳເນີນການຕໍ່ຫາອັບເດດລະບົບແບບໄດນາມິກ"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"ລະບົບໄດນາມິກພ້ອມແລ້ວ. ກະລຸນາຣີສະຕາດອຸປະກອນຂອງທ່ານເພື່ອເລີ່ມນຳໃຊ້ມັນ."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"ກຳລັງຕິດຕັ້ງຢູ່"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"ຕິດຕັ້ງບໍ່ສຳເລັດ"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"ການກວດສອບໄຟລ໌ຮູບບໍ່ສຳເລັດ. ຍົກເລີກການຕິດຕັ້ງ."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"ຕອນນີ້ກຳລັງໃຊ້ລະບົບໄດນາມິກ. ກະລຸນາຣີສະຕາດເພື່ອໃຊ້ເວີຊັນ Android ຕົ້ນສະບັບ."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"ຍົກເລີກ"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"ປິດໄວ້"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"ຣີສະຕາດ"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"ຣີສະຕາດ"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"ລະບົບໄດນາມິກທີ່ຍົກເລີກແລ້ວ"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"ບໍ່ສາມາດຣີສະຕາດ ຫຼື ໂຫຼດລະບົບໄດນາມິກໄດ້"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-lt/strings.xml b/packages/DynamicSystemInstallationService/res/values-lt/strings.xml new file mode 100644 index 000000000000..8128eb7b0a72 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-lt/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Įveskite slaptažodį ir eikite į Dinaminių sistemos atnaujinimų funkciją"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"Dinaminė sistema paruošta. Jei norite pradėti ją naudoti, paleiskite įrenginį iš naujo."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Diegiama"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Įdiegti nepavyko"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Nepavyko patvirtinti vaizdo. Nutraukti diegimą."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Šiuo metu paleista dinaminė sistema. Paleiskite iš naujo, jei norite naudoti pradinę „Android“ versiją."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Atšaukti"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Atmesti"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Pal. iš naujo"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Pal. iš naujo"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Dinaminė sistema atmesta"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Nepavyko paleisti iš naujo ar įkelti dinaminės sistemos"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-lv/strings.xml b/packages/DynamicSystemInstallationService/res/values-lv/strings.xml new file mode 100644 index 000000000000..cfe7a087e148 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-lv/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Ievadiet paroli un pārejiet uz funkciju Dinamiskie sistēmas atjauninājumi"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"Dinamiskā sistēma ir gatava. Lai sāktu to izmantot, restartējiet ierīci."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Notiek instalēšana"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Instalēšana neizdevās"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Attēla validācija neizdevās. Instalācija tiek priekšlaikus pārtraukta."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Pašlaik darbojas dinamiska sistēma. Lai izmantotu sākotnējo Android versiju, restartējiet ierīci."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Atcelt"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Atmest"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Restartēt"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Restartēt"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Dinamiskā sistēma tika atmesta"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Nevar restartēt vai ielādēt dinamisko sistēmu"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-mk/strings.xml b/packages/DynamicSystemInstallationService/res/values-mk/strings.xml new file mode 100644 index 000000000000..21215aa77631 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-mk/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Внесете ја вашата лозинка и продолжете на „Динамични системски ажурирања“"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"Динамичниот систем е подготвен. За да започнете со користење, рестартирајте го уредот."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Инсталирањето е во тек"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Неуспешно инсталирање"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Проверката на сликата не успеа. Прекини ја инсталацијата."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Во моментов се извршува динамичен систем. Рестартирајте за да ја користите оригиналната верзија на Android."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Откажи"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Отфрли"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Рестартирај"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Рестартирај"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Отфрлен динамичен систем"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Не може да го рестартира или вчита динамичниот систем"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-ml/strings.xml b/packages/DynamicSystemInstallationService/res/values-ml/strings.xml new file mode 100644 index 000000000000..951a0b95f7e4 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-ml/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"നിങ്ങളുടെ പാസ്വേഡ് നൽകി ഡൈനാമിക് സിസ്റ്റം അപ്ഡേറ്റുകളിലേക്ക് പോകുക"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"ഡെെനാമിക് സിസ്റ്റം തയ്യാറാണ്. അത് ഉപയോഗിച്ച് തുടങ്ങാൻ നിങ്ങളുടെ ഉപകരണം റീസ്റ്റാർട്ട് ചെയ്യുക."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"ഇൻസ്റ്റാൾ ചെയ്യൽ പുരോഗതിയിലാണ്"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"ഇൻസ്റ്റാൾ ചെയ്യാനായില്ല"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"ചിത്രത്തിന്റെ മൂല്യനിർണ്ണയം നടത്താനായില്ല. ഇൻസ്റ്റലേഷൻ റദ്ദാക്കുക."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"നിലവിൽ ഒരു ഡെെനാമിക് സിസ്റ്റം റൺ ചെയ്യുന്നുണ്ട്. ഒറിജിനൽ Android പതിപ്പ് ഉപയോഗിക്കാൻ റീസ്റ്റാർട്ട് ചെയ്യുക."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"റദ്ദാക്കുക"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"നിരസിക്കുക"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"റീസ്റ്റാർട്ട് ചെയ്യൂ"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"റീസ്റ്റാർട്ട് ചെയ്യൂ"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"ഡെെനാമിക് സിസ്റ്റം നിരസിച്ചു"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"റീസ്റ്റാർട്ട് ചെയ്യാനോ ഡെെനാമിക് സിസ്റ്റം ലോഡ് ചെയ്യാനോ ആവില്ല"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-mn/strings.xml b/packages/DynamicSystemInstallationService/res/values-mn/strings.xml new file mode 100644 index 000000000000..d0965d021c65 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-mn/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Нууц үгээ оруулаад Динамик системийн шинэчлэлтийг үргэлжлүүлнэ үү"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"Динамик систем бэлэн боллоо. Түүнийг ашиглаж эхлэхийн тулд төхөөрөмжөө дахин эхлүүлнэ үү."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Суулгаж байна"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Суулгаж чадсангүй"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Системийн хуулбарын баталгаажуулалт амжилтгүй боллоо. Суулгах үйлдлийг зогсооно уу."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Одоогоор динамик системийг ажиллуулж байна. Android-н эх хувилбарыг ашиглахын тулд дахин эхлүүлнэ үү."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Болих"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Болих"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Дахин эхлүүлэх"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Дахин эхлүүлэх"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Динамик системийг устгасан"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Динамик системийг дахин эхлүүлэх эсвэл ачаалах боломжгүй байна"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-mr/strings.xml b/packages/DynamicSystemInstallationService/res/values-mr/strings.xml new file mode 100644 index 000000000000..268e1d344620 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-mr/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"कृपया तुमचा पासवर्ड एंटर करा आणि डायनॅमिक सिस्टम अपडेट वर जा"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"डायनॅमिक सिस्टम तयार आहे. ती वापरणे सुरू करण्यासाठी, तुमचे डिव्हाइस रीस्टार्ट करा."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"इंस्टॉल प्रगतीपथावर आहे"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"इंस्टॉल करता आली नाही"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"इमेज प्रमाणीकरण करता आले नाही. इंस्टॉलेशन रद्द करा."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"सध्या डायनॅमिक सिस्टम रन करत आहे. मूळ Android आवृत्ती वापरण्यासाठी रीस्टार्ट करा."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"रद्द करा"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"काढून टाका"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"रीस्टार्ट करा"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"रीस्टार्ट करा"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"डायनॅमिक सिस्टम काढून टाकली"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"डायनॅमिक सिस्टम रीस्टार्ट किंवा लोड करू शकत नाही"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-ms/strings.xml b/packages/DynamicSystemInstallationService/res/values-ms/strings.xml new file mode 100644 index 000000000000..bba8b9724f0d --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-ms/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Sila masukkan kata laluan dan teruskan ke Kemas Kini Sistem Dinamik"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"Sistem dinamik sudah sedia. Untuk mula menggunakan sistem ini, mulakan semula peranti anda"</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Pemasangan sedang dijalankan"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Pemasangan gagal"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Gagal mengesahkan imej. Henti paksa pemasangan."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Sedang menjalankan sistem dinamik. Mulakan semula peranti untuk menggunakan versi asal Android."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Batal"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Buang"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Mulakan semula"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Mulakan semula"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Sistem dinamik dibuang"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Tidak dapat memulakan semula atau memuatkan sistem dinamik"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-my/strings.xml b/packages/DynamicSystemInstallationService/res/values-my/strings.xml new file mode 100644 index 000000000000..b2488ece9ce3 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-my/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"သင့်စကားဝှက်ထည့်ပြီး ပြောင်းလဲနိုင်သော စနစ်အပ်ဒိတ်များသို့ ရှေ့ဆက်ပါ"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"ပြောင်းလဲနိုင်သောစနစ် အသင့်ဖြစ်ပါပြီ။ ၎င်းကို စတင်အသုံးပြုရန် သင့်စက်ကို ပြန်စပါ။"</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"ထည့်သွင်းနေဆဲဖြစ်သည်"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"ထည့်သွင်း၍မရပါ"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"ပုံအတည်ပြု၍ မရပါ။ ထည့်သွင်းမှုကို ရပ်ပါ။"</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"လက်ရှိတွင် ပြောင်းလဲနိုင်သောစနစ်ကို အသုံးပြုနေသည်။ မူလ Android ဗားရှင်း အသုံးပြုရန် ပြန်စတင်ပါ။"</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"မလုပ်တော့"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"ဖယ်ပစ်ရန်"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"ပြန်စရန်"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"ပြန်စရန်"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"ပြောင်းလဲနိုင်သောစနစ်ကို ဖယ်လိုက်သည်"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"ပြန်စ၍ မရပါ (သို့) ပြောင်းလဲနိုင်သောစနစ် ဖွင့်၍မရပါ"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-nb/strings.xml b/packages/DynamicSystemInstallationService/res/values-nb/strings.xml new file mode 100644 index 000000000000..36e3d6912e23 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-nb/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Skriv inn passordet ditt, og fortsett til dynamiske systemoppdateringer"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"Det dynamiske systemet er klart. Start enheten din på nytt for å begynne å bruke det."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Installeringen pågår"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Installeringen mislyktes"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Bildebekreftelsen mislyktes. Avbryt installeringen."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Kjører et dynamisk system nå. Start på nytt for å bruke den opprinnelige Android-versjonen."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Avbryt"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Forkast"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Start på nytt"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Start på nytt"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Det dynamiske systemet er forkastet"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Det dynamiske systemet kan ikke startes på nytt eller lastes inn"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-ne/strings.xml b/packages/DynamicSystemInstallationService/res/values-ne/strings.xml new file mode 100644 index 000000000000..ee9267852250 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-ne/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"कृपया आफ्नो पासवर्ड प्रविष्टि गर्नुहोस् र Dynamic System Updates को प्रक्रियालाई निरन्तरता दिनुहोस्"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"Dynamic System तयार छ। यसको प्रयोग सुरु गर्न आफ्नो यन्त्र रिस्टार्ट गर्नुहोस्।"</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"इन्स्टल हुँदै छ"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"स्थापना गर्न सकिएन"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"छवि पुष्टि गर्न सकिएन। स्थापना गर्ने प्रक्रिया रद्द गर्नुहोस्।"</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"हाल Dynamic System चलिरहेको छ। Android को मूल संस्करण प्रयोग गर्न यन्त्र रिस्टार्ट गर्नुहोस्।"</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"रद्द गर्नुहोस्"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"खारेज गर्नुहोस्"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"रिस्टार्ट गर्नु…"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"रिस्टार्ट गर्नु…"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Dynamic System खारेज गरियो"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"रिस्टार्ट गर्न वा Dynamic System लोड गर्न सकिएन"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-nl/strings.xml b/packages/DynamicSystemInstallationService/res/values-nl/strings.xml new file mode 100644 index 000000000000..47eeb839c6dc --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-nl/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Geef je wachtwoord op en ga door naar \'Dynamische systeemupdates\'"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"Dynamisch systeem is gereed. Start je apparaat opnieuw op om het te gebruiken."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Installatie wordt uitgevoerd"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Installatie mislukt"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Valideren van afbeelding mislukt. Installatie afbreken."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Er is momenteel een dynamisch systeem actief. Start je apparaat opnieuw op om de oorspronkelijke Android-versie te gebruiken."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Annuleren"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Niet opslaan"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Herstarten"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Herstarten"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Dynamisch systeem niet opgeslagen"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Kan dynamisch systeem niet opnieuw opstarten of laden"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-or/strings.xml b/packages/DynamicSystemInstallationService/res/values-or/strings.xml new file mode 100644 index 000000000000..e0c847094844 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-or/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"ଦୟାକରି ଆପଣଙ୍କ ପାସୱାର୍ଡ ଲେଖନ୍ତୁ ଏବଂ ଡାଇନାମିକ୍ ସିଷ୍ଟମ୍ ଅପଡେଟ୍ ଜାରି ରଖନ୍ତୁ"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"ଡାଇନାମିକ୍ ସିଷ୍ଟମ୍ ପ୍ରସ୍ତୁତ ଅଛି। ଏହାକୁ ବ୍ୟବହାର କରିବା ଆରମ୍ଭ କରିବାକୁ, ଆପଣଙ୍କ ଡିଭାଇସକୁ ରିଷ୍ଟାର୍ଟ କରନ୍ତୁ।"</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"ଇନଷ୍ଟଲ୍ ହେଉଛି"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"ଇନଷ୍ଟଲ୍ କରିବା ବିଫଳ ହୋଇଛି"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"ଛବି ବୈଧକରଣ ବିଫଳ ହୋଇଛି। ଇନଷ୍ଟଲେସନ୍ ରଦ୍ଦ କରନ୍ତୁ।"</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"ବର୍ତ୍ତମାନ ଏକ ଡାଇନାମିକ୍ ସିଷ୍ଟମ୍ ଚାଲୁଛି। ମୂଳ Android ସଂସ୍କରଣ ବ୍ୟବହାର କରିବାକୁ ରିଷ୍ଟାର୍ଟ କରନ୍ତୁ।"</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"ବାତିଲ୍ କରନ୍ତୁ"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"ଖାରଜ କରନ୍ତୁ"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"ରିଷ୍ଟାର୍ଟ କରନ୍ତୁ"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"ରିଷ୍ଟାର୍ଟ କରନ୍ତୁ"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"ଡାଇନାମିକ୍ ସିଷ୍ଟମ୍ ଖାରଜ କରାଯାଇଛି"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"ଡାଇନାମିକ୍ ସିଷ୍ଟମ୍ ରିଷ୍ଟାର୍ଟ କିମ୍ବା ଲୋଡ୍ କରାଯାଇପାରିବ ନାହିଁ"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-pa/strings.xml b/packages/DynamicSystemInstallationService/res/values-pa/strings.xml new file mode 100644 index 000000000000..c5f7a3d38cdc --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-pa/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"ਕਿਰਪਾ ਕਰਕੇ ਆਪਣਾ ਪਾਸਵਰਡ ਦਾਖਲ ਕਰੋ ਅਤੇ ਪਰਿਵਰਤਨਸ਼ੀਲ ਸਿਸਟਮ ਅੱਪਡੇਟ \'ਤੇ ਜਾਰੀ ਰੱਖੋ"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"ਪਰਿਵਰਤਨਸ਼ੀਲ ਸਿਸਟਮ ਤਿਆਰ ਹੈ। ਇਸ ਦੀ ਵਰਤੋਂ ਸ਼ੁਰੂ ਕਰਨ ਲਈ, ਆਪਣਾ ਡੀਵਾਈਸ ਮੁੜ-ਸ਼ੁਰੂ ਕਰੋ।"</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"ਸਥਾਪਨਾ ਜਾਰੀ ਹੈ"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"ਸਥਾਪਤ ਕਰਨਾ ਅਸਫਲ ਰਿਹਾ"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"ਚਿੱਤਰ ਪ੍ਰਮਾਣਿਕਤਾ ਅਸਫਲ ਰਹੀ। ਸਥਾਪਨਾ ਨੂੰ ਰੱਦ ਕਰੋ।"</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"ਫ਼ਿਲਹਾਲ ਪਰਿਵਰਤਨਸ਼ੀਲ ਸਿਸਟਮ ਚੱਲ ਰਿਹਾ ਹੈ। ਮੂਲ Android ਵਰਜਨ ਵਰਤਣ ਲਈ ਮੁੜ-ਸ਼ੁਰੂ ਕਰੋ।"</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"ਰੱਦ ਕਰੋ"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"ਖਾਰਜ ਕਰੋ"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"ਮੁੜ-ਸ਼ੁਰੂ ਕਰੋ"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"ਮੁੜ-ਸ਼ੁਰੂ ਕਰੋ"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"ਪਰਿਵਰਤਨਸ਼ੀਲ ਸਿਸਟਮ ਰੱਦ ਕੀਤਾ ਗਿਆ"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"ਪਰਿਵਰਤਨਸ਼ੀਲ ਸਿਸਟਮ ਮੁੜ-ਸ਼ੁਰੂ ਜਾਂ ਲੋਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-pl/strings.xml b/packages/DynamicSystemInstallationService/res/values-pl/strings.xml new file mode 100644 index 000000000000..bc7d5fe5b222 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-pl/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Wpisz hasło i przejdź do dynamicznych aktualizacji systemu"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"System dynamiczny jest gotowy. Aby zacząć go używać, uruchom urządzenie ponownie."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Instaluję"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Nie udało się zainstalować"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Nie udało się zweryfikować obrazu. Przerwij instalację."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Obecnie urządzenie korzysta z systemu dynamicznego. Aby powrócić do oryginalnej wersji Androida, uruchom urządzenie ponownie."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Anuluj"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Odrzuć"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Uruchom ponownie"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Uruchom ponownie"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Usunięto system dynamiczny"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Nie można ponownie uruchomić lub wczytać systemu dynamicznego"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-pt-rBR/strings.xml b/packages/DynamicSystemInstallationService/res/values-pt-rBR/strings.xml new file mode 100644 index 000000000000..31a9bb439235 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-pt-rBR/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Digite sua senha e prossiga para Atualizações dinâmicas do sistema"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"O sistema dinâmico está pronto. Para começar a usá-lo, reinicie o dispositivo."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Instalação em andamento"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Falha na instalação"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Falha ao validar imagem. Cancele a instalação."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Um sistema dinâmico está sendo executado no momento. Reinicie para usar a versão original do Android."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Cancelar"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Descartar"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Reiniciar"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Reiniciar"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Sistema dinâmico descartado"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Não é possível reiniciar ou carregar o sistema dinâmico"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-pt-rPT/strings.xml b/packages/DynamicSystemInstallationService/res/values-pt-rPT/strings.xml new file mode 100644 index 000000000000..d917c6afec6e --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-pt-rPT/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Introduza a sua palavra-passe e continue para a Atualização Dinâmica do Sistema."</string> + <string name="notification_install_completed" msgid="6252047868415172643">"O sistema dinâmico está pronto. Para o começar a utilizar, reinicie o dispositivo."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Instalação em curso"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Falha na instalação"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Falha ao validar a imagem. A instalação foi interrompida."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Está atualmente em execução um sistema dinâmico. Reinicie para utilizar a versão original do Android."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Cancelar"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Rejeitar"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Reiniciar"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Reiniciar"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Sistema dinâmico rejeitado"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Não é possível reiniciar ou carregar o sistema dinâmico."</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-pt/strings.xml b/packages/DynamicSystemInstallationService/res/values-pt/strings.xml new file mode 100644 index 000000000000..31a9bb439235 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-pt/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Digite sua senha e prossiga para Atualizações dinâmicas do sistema"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"O sistema dinâmico está pronto. Para começar a usá-lo, reinicie o dispositivo."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Instalação em andamento"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Falha na instalação"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Falha ao validar imagem. Cancele a instalação."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Um sistema dinâmico está sendo executado no momento. Reinicie para usar a versão original do Android."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Cancelar"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Descartar"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Reiniciar"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Reiniciar"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Sistema dinâmico descartado"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Não é possível reiniciar ou carregar o sistema dinâmico"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-ro/strings.xml b/packages/DynamicSystemInstallationService/res/values-ro/strings.xml new file mode 100644 index 000000000000..c21131857830 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-ro/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Introduceți parola și accesați Actualizările de sistem dinamice"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"Sistemul dinamic este pregătit. Ca să începeți să-l folosiți, reporniți dispozitivul."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Se instalează"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Instalarea nu a reușit"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Nu s-a validat imaginea. Abandonați instalarea."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Rulăm un sistem dinamic. Reporniți pentru a folosi versiunea Android inițială."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Anulați"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Renunțați"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Reporniți"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Reporniți"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"S-a renunțat la sistemul dinamic"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Nu se poate reporni sau încărca sistemul dinamic"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-ru/strings.xml b/packages/DynamicSystemInstallationService/res/values-ru/strings.xml new file mode 100644 index 000000000000..bf94c99b8fb5 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-ru/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Введите пароль и перейдите к динамическим обновлениям системы."</string> + <string name="notification_install_completed" msgid="6252047868415172643">"Динамическая система готова. Чтобы использовать ее, перезапустите устройство."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Идет установка…"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Ошибка установки."</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Не удалось проверить образ. Отмените установку."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Используется динамическая система. Чтобы вернуться к исходной версии Android, перезапустите устройство."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Отмена"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Отменить"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Перезапустить"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Перезапустить"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Динамическая система удалена."</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Не удается запустить или загрузить динамическую систему."</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-si/strings.xml b/packages/DynamicSystemInstallationService/res/values-si/strings.xml new file mode 100644 index 000000000000..e6a6ea2fe351 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-si/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"කරුණාකර ඔබගේ මුරපදය ඇතුළත් කර ගතික පද්ධති යාවත්කාලීන කිරීම් වෙත යන්න"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"ගතික පද්ධතිය සූදානම්ය. එය භාවිතා කිරීම ආරම්භ කිරීමට, ඔබගේ උපාංගය නැවත ආරම්භ කරන්න."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"ස්ථාපනය කෙරෙමින් පවතී"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"ස්ථාපනය අසාර්ථක විය"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"රූප වලංගු කිරීම අසාර්ථක විය. ස්ථාපනය අවලංගු කරන්න"</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"දැනට ගතික පද්ධතියක් ක්රියාත්මක කරයි. මුල් Android අනුවාදය භාවිතා කිරීමට නැවත ආරම්භ කරන්න."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"අවලංගු කරන්න"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"ඉවත ලන්න"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"යළි අරඹන්න"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"යළි අරඹන්න"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"ගතික පද්ධතිය ඉවත දමන ලදි"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"ගතික පද්ධතිය නැවත ආරම්භ කිරීමට හෝ පූරණය කිරීමට නොහැක"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-sk/strings.xml b/packages/DynamicSystemInstallationService/res/values-sk/strings.xml new file mode 100644 index 000000000000..99390cf07c74 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-sk/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Zadajte svoje heslo a pokračujte na dynamické aktualizácie systému"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"Dynamický systém je k dispozícii. Ak ho chcete začať používať, reštartujte zariadenie."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Prebieha inštalácia"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Nepodarilo sa nainštalovať"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Obrázok sa nepodarilo overiť. Prerušte inštaláciu."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Momentálne je spustený dynamický systém. Ak chcete používať pôvodnú verziu Androidu, reštartujte."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Zrušiť"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Zahodiť"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Reštartovať"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Reštartovať"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Zahodený dynamický systém"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Nie je možné reštartovať alebo načítať dynamický systém"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-sl/strings.xml b/packages/DynamicSystemInstallationService/res/values-sl/strings.xml new file mode 100644 index 000000000000..3ffd741ea4f6 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-sl/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Vnesite geslo in nadaljujte na dinamične posodobitve sistema"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"Dinamični sistem je pripravljen. Znova zaženite napravo, da ga boste lahko začeli uporabljati."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Namestitev poteka"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Namestitev ni uspela"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Preverjanje slike ni uspelo. Prekinite namestitev."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Trenutno se izvaja dinamični sistem. Znova zaženite, če želite uporabljati prvotno različico Androida."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Prekliči"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Zavrzi"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Znova zaženi"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Znova zaženi"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Dinamični sistem je bil zavržen"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Dinamičnega sistema ni mogoče znova zagnati ali naložiti"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-sq/strings.xml b/packages/DynamicSystemInstallationService/res/values-sq/strings.xml new file mode 100644 index 000000000000..704b512ad9ab --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-sq/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Fut fjalëkalimin tënd dhe vazhdo te përditësimet e sistemit dinamik"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"Sistemi dinamik është gati. Për të nisur përdorimin e tij, rinise pajisjen."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Instalimi në vazhdim"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Instalimi dështoi"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Verifikimi i imazhit dështoi. Ndërprit instalimin."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Aktualisht po ekzekutohet në një sistem dinamik. Rinise për të përdorur versionin origjinal të Android."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Anulo"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Hiq"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Rinis"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Rinis"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Sistemi dinamik u hoq"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Sistemi dinamik nuk mund të rinisej ose të ngarkohej"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-sr/strings.xml b/packages/DynamicSystemInstallationService/res/values-sr/strings.xml new file mode 100644 index 000000000000..5e4540a5eff0 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-sr/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Унесите лозинку и наставите до динамичних ажурирања система"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"Динамични систем је спреман. Да бисте почели да га користите, рестартујте уређај."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Инсталира се"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Инсталирање није успело"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Валидација слике није успела. Откажите инсталацију."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Тренутно је покренут динамични систем. Рестартујте да бисте користили оригиналну верзију Android-а."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Откажи"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Одбаци"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Рестартуј"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Рестартуј"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Динамични систем је одбачен"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Рестартовање или учитавање динамичног система није успело"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-sv/strings.xml b/packages/DynamicSystemInstallationService/res/values-sv/strings.xml new file mode 100644 index 000000000000..546ffddde639 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-sv/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Ange lösenordet och fortsätt till Dynamiska systemuppdateringar"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"Det dynamiska systemet är klart. Om du vill använda det startar du om enheten."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Installation pågår"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Installationen misslyckades"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Bildvalideringen misslyckades. Avbryt installationen."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Ett dynamiskt system körs. Om du vill använda den ursprungliga Android-versionen startar du om."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Avbryt"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Ignorera"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Starta om"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Starta om"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Det dynamiska systemet ignorerades"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Det gick inte att starta om eller läsa in det dynamiska systemet"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-sw/strings.xml b/packages/DynamicSystemInstallationService/res/values-sw/strings.xml new file mode 100644 index 000000000000..53414d5f6b0a --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-sw/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Tafadhali weka nenosiri lako na uende kwenye Dynamic System Updates"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"Dynamic system iko tayari. Ili uanze kuitumia, zima kisha uwashe kifaa chako."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Inasakinisha"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Imeshindwa kusakinisha"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Imeshindwa kuthibitisha picha. Ghairi usakinishaji."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Inatumia Dynamic System kwa sasa. Zima kisha uwashe ili utumie toleo halisi la Android."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Ghairi"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Ondoa"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Zima kisha uwashe"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Zima kisha uwashe"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Umeondoa Dynamic System"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Imeshindwa kuzima na kuwasha au kupakia Dynamic System"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-ta/strings.xml b/packages/DynamicSystemInstallationService/res/values-ta/strings.xml new file mode 100644 index 000000000000..e0aaaf7458fc --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-ta/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Dynamic System Updatesஸுக்குத் தொடர உங்கள் கடவுச்சொல்லை உள்ளிடவும்"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"Dynamic system தயாராக உள்ளது. இதைப் பயன்படுத்தத் தொடங்க உங்கள் சாதனத்தை மீண்டும் தொடங்கவும்."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"நிறுவப்படுகிறது"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"நிறுவ முடியவில்லை"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"படத்தைச் சரிபார்க்க முடியவில்லை. நிறுவலை ரத்துசெய்யவும்."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Dynamic system தற்போது இயக்கத்தில் உள்ளது. அசல் Android பதிப்பைப் பயன்படுத்த மீண்டும் தொடங்கவும்."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"ரத்துசெய்"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"நிராகரி"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"மீண்டும் தொடங்கு"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"மீண்டும் தொடங்கு"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Dynamic system நிராகரிக்கப்பட்டது"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Dynamic systemமை மீண்டும் தொடங்கவோ ஏற்றவோ முடியவில்லை"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-te/strings.xml b/packages/DynamicSystemInstallationService/res/values-te/strings.xml new file mode 100644 index 000000000000..d497630660e3 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-te/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"దయచేసి మీ పాస్వర్డ్ను ఎంటర్ చేసి, డైనమిక్ సిస్టమ్ అప్డేట్స్ను కొనసాగించండి"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"డైనమిక్ సిస్టమ్ సిద్ధంగా ఉంది. దీనిని ఉపయోగించడానికి, మీ పరికరాన్ని రీస్టార్ట్ చేయండి."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"ఇన్స్టాల్ అవుతోంది"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"ఇన్స్టాల్ చేయడం విఫలమైంది"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"ఇమేజ్ నిర్ధారణ విఫలమైంది. ఇన్స్టాలేషన్ను రద్దు చేయండి."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"ప్రస్తుతం డైనమిక్ సిస్టమ్ రన్నవుతోంది. ఒరిజినల్ Android వెర్షన్ను ఉపయోగించడానికి రీస్టార్ట్ చేయండి."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"రద్దు చేయండి"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"విస్మరించండి"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"రీస్టార్ట్ చేయి"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"రీస్టార్ట్ చేయి"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"డైనమిక్ సిస్టమ్ విస్మరించబడింది"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"డైనమిక్ సిస్టమ్ను రీస్టార్ట్ చేయడం లేదా లోడ్ చేయడం సాధ్యపడలేదు"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-th/strings.xml b/packages/DynamicSystemInstallationService/res/values-th/strings.xml new file mode 100644 index 000000000000..786324f57488 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-th/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"โปรดป้อนรหัสผ่านแล้วไปที่ \"อัปเดตระบบแบบไดนามิก\""</string> + <string name="notification_install_completed" msgid="6252047868415172643">"ระบบแบบไดนามิกพร้อมแล้ว โปรดรีสตาร์ทอุปกรณ์เพื่อเริ่มใช้"</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"กำลังติดตั้ง"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"ติดตั้งไม่สำเร็จ"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"ตรวจสอบรูปภาพไม่สำเร็จ ล้มเลิกการติดตั้ง"</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"ปัจจุบันใช้ระบบแบบไดนามิกอยู่ รีสตาร์ทเพื่อใช้ Android เวอร์ชันดั้งเดิม"</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"ยกเลิก"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"ยกเลิก"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"รีสตาร์ท"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"รีสตาร์ท"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"ยกเลิกระบบแบบไดนามิกแล้ว"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"รีสตาร์ทหรือโหลดระบบแบบไดนามิกไม่ได้"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-tl/strings.xml b/packages/DynamicSystemInstallationService/res/values-tl/strings.xml new file mode 100644 index 000000000000..df39f7b1886a --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-tl/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Pakilagay ang iyong password at ipagpatuloy ang Dynamic System Updates"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"Handa na ang dynamic system. Para simulang gamitin ito, i-restart ang iyong device."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Ini-install"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Hindi na-install"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Hindi na-validate ang image. I-abort ang pag-install."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Kasalukuyang pinapatakbo ang dynamic system. Mag-restart para gamitin ang orihinal na Android na bersyon."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Kanselahin"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"I-discard"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"I-restart"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"I-restart"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Na-discard ang dynamic system"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Hindi ma-restart o ma-load ang dynamic system"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-tr/strings.xml b/packages/DynamicSystemInstallationService/res/values-tr/strings.xml new file mode 100644 index 000000000000..1446f9632456 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-tr/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Lütfen şifrenizi girip Dinamik Sistem Güncellemesi\'ne gidin"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"Dinamik sistem hazır. Kullanmaya başlamak için cihazınızı yeniden başlatın."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Yükleme devam ediyor"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Yükleme başarısız oldu"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Resim doğrulanamadı. Yüklemeyi iptal edin."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Şu anda dinamik sistem çalıştırılıyor. Orijinal Android sürümünü kullanmak için cihazı yeniden başlatın."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"İptal"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Sil"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Yeniden başlat"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Yeniden başlat"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Dinamik sistem silindi"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Dinamik sistem yeniden başlatılamıyor veya yüklenemiyor"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-uk/strings.xml b/packages/DynamicSystemInstallationService/res/values-uk/strings.xml new file mode 100644 index 000000000000..9a44d9764014 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-uk/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Введіть пароль і перейдіть до Динамічних оновлень системи"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"Динамічна система готова. Щоб перейти до неї, перезапустіть пристрій."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Триває встановлення"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Не вдалося встановити"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Не вдалося перевірити образ. Встановлення скасовано."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Запущено динамічну систему. Перезапустіть пристрій, щоб повернутися до попередньої версії Android."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Скасувати"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Видалити"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Перезапустити"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Перезапустити"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Динамічну систему видалено"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Не вдається перезапустити пристрій або завантажити динамічну систему"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-ur/strings.xml b/packages/DynamicSystemInstallationService/res/values-ur/strings.xml new file mode 100644 index 000000000000..48dddbea3281 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-ur/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"براہ کرم اپنا پاس ورڈ درج کریں اور ڈائنیمک سسٹم اپ ڈیٹس پر جائیں"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"ڈائنیمک سسٹم تیار ہے۔ اس کا استعمال شروع کرنے کے لیے، اپنا آلہ ری سٹارٹ کریں۔"</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"انسٹال جاری ہے"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"انسٹال ناکام ہو گیا"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"تصویر کی توثیق ناکام ہو گئی۔ انسٹالیشن منسوخ کریں-"</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"فی الحال ہم ایک ڈائنیمک سسٹم چلا رہے ہیں۔ Android کا اصل ورژن استعمال کرنے کے لیے ری سٹارٹ کریں۔"</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"منسوخ کریں"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"مسترد کریں"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"ری سٹارٹ کریں"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"ری سٹارٹ کریں"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"مسترد کردہ ڈائنیمک سسٹم"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"ڈائنیمک سسٹم کو ری سٹارٹ یا لوڈ نہیں کر سکتے"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-uz/strings.xml b/packages/DynamicSystemInstallationService/res/values-uz/strings.xml new file mode 100644 index 000000000000..3f0227c1c383 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-uz/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Parolni kiriting va dinamik tizim yangilanishlarini davom ettiring"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"Dinamik tizim tayyor. Foydalanishni boshlash uchun qurilmani qayta ishga tushiring."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Oʻrnatilmoqda"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Oʻrnatilmadi"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Rasm tekshiruvi amalga oshmadi Oʻrnatishni bekor qilish."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Hozirda dinamik tizim ishga tushirilgan. Asl Android versiyasidan foydlanish uchun qayta ishga tushiring."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Bekor qilish"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Bekor qilish"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Boshidan"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Boshidan"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Dinamik tizim bekor qilindi"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Dinamik tizim qayta ishga tushmadi yoki yuklanmadi"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-vi/strings.xml b/packages/DynamicSystemInstallationService/res/values-vi/strings.xml new file mode 100644 index 000000000000..18c051c893f8 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-vi/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Vui lòng nhập mật khẩu và tiếp tục dùng Bản cập nhật hệ thống động"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"Hệ thống động đã sẵn sàng. Để bắt đầu sử dụng hệ thống này, hãy khởi động lại thiết bị của bạn."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Đang cài đặt"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Không cài đặt được"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Không xác thực được hình ảnh. Hủy cài đặt."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Thiết bị đang chạy một hệ thống động. Hãy khởi động lại để sử dụng Android phiên bản gốc."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Hủy"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Hủy"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Khởi động lại"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Khởi động lại"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Đã hủy hệ thống động"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Không thể khởi động lại hoặc tải hệ thống động"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-zh-rCN/strings.xml b/packages/DynamicSystemInstallationService/res/values-zh-rCN/strings.xml new file mode 100644 index 000000000000..b41d4e2bf912 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-zh-rCN/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"请输入您的密码,以便继续使用动态系统更新"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"动态系统已准备就绪。重启您的设备即可开始使用动态系统。"</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"正在安装"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"安装失败"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"图片验证失败。安装将中止。"</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"目前正在运行动态系统。需重启才能使用原 Android 版本。"</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"取消"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"舍弃"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"重启"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"重启"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"已舍弃动态系统"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"无法重启或加载动态系统"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-zh-rHK/strings.xml b/packages/DynamicSystemInstallationService/res/values-zh-rHK/strings.xml new file mode 100644 index 000000000000..c830dae24e97 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-zh-rHK/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"請輸入密碼,以使用「動態系統更新」"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"動態系統已可供使用。如要開始使用,請重新啟動裝置。"</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"安裝中"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"無法安裝"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"圖片驗證失敗,系統將取消安裝。"</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"系統目前正在執行動態系統。如要使用原本的 Android 版本,請重新啟動裝置。"</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"取消"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"捨棄"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"重新啟動"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"重新啟動"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"已捨棄動態系統"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"無法重新啟動或載入動態系統"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-zh-rTW/strings.xml b/packages/DynamicSystemInstallationService/res/values-zh-rTW/strings.xml new file mode 100644 index 000000000000..e43c0f2b08bb --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-zh-rTW/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"請輸入密碼,以便繼續使用動態系統更新"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"動態系統已可供使用。如要開始使用,請重新啟動裝置。"</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"安裝中"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"無法安裝"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"圖片驗證失敗,系統將取消安裝作業。"</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"系統目前正在執行動態系統。如要使用原本的 Android 版本,請重新啟動裝置。"</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"取消"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"捨棄"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"重新啟動"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"重新啟動"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"已捨棄動態系統"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"無法重新啟動或載入動態系統"</string> +</resources> diff --git a/packages/DynamicSystemInstallationService/res/values-zu/strings.xml b/packages/DynamicSystemInstallationService/res/values-zu/strings.xml new file mode 100644 index 000000000000..4a48444cb9a0 --- /dev/null +++ b/packages/DynamicSystemInstallationService/res/values-zu/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="keyguard_description" msgid="8582605799129954556">"Sicela ufake iphasiwedi yakho uphinde uqhubekele Ekubuyekezweni Kohlole Okunhlobonhlobo"</string> + <string name="notification_install_completed" msgid="6252047868415172643">"Uhlole Okunhlobonhlobo kulungile. Ukuze uqale ukuyisebenzisa, qalisa kabusha idivayisi yakho."</string> + <string name="notification_install_inprogress" msgid="7383334330065065017">"Ukufaka kuyaqhubeka"</string> + <string name="notification_install_failed" msgid="4066039210317521404">"Ukufaka kwehlulekile"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"Ukuqinisekiswa kwesithombe kuhlulekile. Yekisa ukufakwa."</string> + <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"Manje iqalisa uhlole olunhlobonhlobo. Qalisa kabusha ukuze usebenzise inguqulo yangempela ye-Android."</string> + <string name="notification_action_cancel" msgid="5929299408545961077">"Khansela"</string> + <string name="notification_action_discard" msgid="1817481003134947493">"Lahla"</string> + <string name="notification_action_reboot_to_dynsystem" msgid="4015817159115912479">"Qala kabusha"</string> + <string name="notification_action_reboot_to_origin" msgid="4013901243271889897">"Qala kabusha"</string> + <string name="toast_dynsystem_discarded" msgid="1733249860276017050">"Kulahlwe uhlole olunhlobonhlobo"</string> + <string name="toast_failed_to_reboot_to_dynsystem" msgid="6336737274625452067">"Ayikwazi ukuqalisa kabusha noma ukulayisha uhlole olunhlobonhlobo"</string> +</resources> diff --git a/packages/PackageInstaller/res/values-ne/strings.xml b/packages/PackageInstaller/res/values-ne/strings.xml index dffaba510dff..30f6a21efe8b 100644 --- a/packages/PackageInstaller/res/values-ne/strings.xml +++ b/packages/PackageInstaller/res/values-ne/strings.xml @@ -22,30 +22,30 @@ <string name="cancel" msgid="1018267193425558088">"रद्द गर्नुहोस्"</string> <string name="installing" msgid="4921993079741206516">"स्थापना गर्दै…"</string> <string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> स्थापना गर्दै…"</string> - <string name="install_done" msgid="5987363587661783896">"अनुप्रयोग स्थापना गरियो।"</string> - <string name="install_confirm_question" msgid="8176284075816604590">"तपाईं यो अनुप्रयोग स्थापना गर्न चाहनुहुन्छ?"</string> + <string name="install_done" msgid="5987363587661783896">"एप स्थापना गरियो।"</string> + <string name="install_confirm_question" msgid="8176284075816604590">"तपाईं यो एप स्थापना गर्न चाहनुहुन्छ?"</string> <string name="install_confirm_question_update" msgid="7942235418781274635">"तपाईं यो पहिलेदेखि नै विद्यमान अनुप्रयोगको साटो यसको अद्यावधिक संस्करण स्थापना गर्न चाहनुहुन्छ? तपाईंको विद्यमान डेटा गुम्ने छैन।"</string> <string name="install_confirm_question_update_system" msgid="4713001702777910263">"तपाईं यो अन्तर्निर्मित अनुप्रयोगको साटो यसको अद्यावधिक संस्करण स्थापना गर्न चाहनुहुन्छ? तपाईंको विद्यमान डेटा गुम्ने छैन।"</string> - <string name="install_failed" msgid="5777824004474125469">"अनुप्रयोग स्थापना गरिएन।"</string> + <string name="install_failed" msgid="5777824004474125469">"एप स्थापना गरिएन।"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"यो प्याकेज स्थापना गर्ने क्रममा अवरोध गरियो।"</string> - <string name="install_failed_conflict" msgid="3493184212162521426">"प्याकेजका रूपमा स्थापना नगरिएको अनुप्रयोग विद्यमान प्याकेजसँग मेल खाँदैन।"</string> - <string name="install_failed_incompatible" product="tablet" msgid="6019021440094927928">"अनुप्रयोगका रूपमा स्थापना नगरिएको अनुप्रयोग तपाईंको ट्याब्लेटसँग मिल्दो छैन।"</string> - <string name="install_failed_incompatible" product="tv" msgid="2890001324362291683">"यो अनुप्रयोग तपाईंको TV सँग मिल्दो छैन।"</string> - <string name="install_failed_incompatible" product="default" msgid="7254630419511645826">"अनुप्रयोगका रूपमा स्थापना नगरिएको अनुप्रयोग तपाईंको फोनसँग मिल्दो छैन।"</string> - <string name="install_failed_invalid_apk" msgid="8581007676422623930">"प्याकेजका रूपमा स्थापना नगरिएको अनुप्रयोग अमान्य जस्तो देखिन्छ।"</string> + <string name="install_failed_conflict" msgid="3493184212162521426">"प्याकेजका रूपमा स्थापना नगरिएको एप विद्यमान प्याकेजसँग मेल खाँदैन।"</string> + <string name="install_failed_incompatible" product="tablet" msgid="6019021440094927928">"एपका रूपमा स्थापना नगरिएको एप तपाईंको ट्याब्लेटसँग मिल्दो छैन।"</string> + <string name="install_failed_incompatible" product="tv" msgid="2890001324362291683">"यो एप तपाईंको TV सँग मिल्दो छैन।"</string> + <string name="install_failed_incompatible" product="default" msgid="7254630419511645826">"एपका रूपमा स्थापना नगरिएको एप तपाईंको फोनसँग मिल्दो छैन।"</string> + <string name="install_failed_invalid_apk" msgid="8581007676422623930">"प्याकेजका रूपमा स्थापना नगरिएको एप अमान्य जस्तो देखिन्छ।"</string> <string name="install_failed_msg" product="tablet" msgid="6298387264270562442">"तपाईंको ट्याब्लेटमा <xliff:g id="APP_NAME">%1$s</xliff:g> स्थापना गर्न सकिएन।"</string> <string name="install_failed_msg" product="tv" msgid="1920009940048975221">"तपाईंको TV मा <xliff:g id="APP_NAME">%1$s</xliff:g> स्थापना गर्न सकिएन।"</string> <string name="install_failed_msg" product="default" msgid="6484461562647915707">"तपाईंको फोनमा <xliff:g id="APP_NAME">%1$s</xliff:g> स्थापना गर्न सकिएन।"</string> <string name="launch" msgid="3952550563999890101">"खोल्नुहोस्"</string> <string name="unknown_apps_admin_dlg_text" msgid="4456572224020176095">"तपाईंका प्रशासकले अज्ञात स्रोतहरूबाट प्राप्त अनुप्रयोगहरूलाई स्थापना गर्ने अनुमति दिनुहुन्न"</string> - <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"यी प्रयोगकर्ता अज्ञात अनुप्रयोगहरू स्थापना गर्न सक्नुहुन्न"</string> - <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"यो प्रयोगकर्तालाई अनुप्रयोगहरू स्थापना गर्ने अनुमति छैन"</string> + <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"यी प्रयोगकर्ता अज्ञात एपहरू स्थापना गर्न सक्नुहुन्न"</string> + <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"यो प्रयोगकर्तालाई एपहरू स्थापना गर्ने अनुमति छैन"</string> <string name="ok" msgid="7871959885003339302">"ठिक छ"</string> <string name="manage_applications" msgid="5400164782453975580">"एपको प्रबन्ध गर्नु…"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"खाली ठाउँ छैन"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> स्थापना गर्न सकिएन। केही ठाउँ खाली गरेर फेरि प्रयास गर्नुहोस्।"</string> - <string name="app_not_found_dlg_title" msgid="5107924008597470285">"अनुप्रयोग फेला परेन"</string> - <string name="app_not_found_dlg_text" msgid="5219983779377811611">"स्थापना गरिएका अनुप्रयोगहरूको सूचीमा उक्त अनुप्रयोग भेटिएन।"</string> + <string name="app_not_found_dlg_title" msgid="5107924008597470285">"एप फेला परेन"</string> + <string name="app_not_found_dlg_text" msgid="5219983779377811611">"स्थापना गरिएका एपहरूको सूचीमा उक्त एप भेटिएन।"</string> <string name="user_is_not_allowed_dlg_title" msgid="6915293433252210232">"अनुमति छैन"</string> <string name="user_is_not_allowed_dlg_text" msgid="3468447791330611681">"हालका प्रयोगकर्तालाई यो स्थापना रद्द गर्ने कार्य गर्ने अनुमति छैन।"</string> <string name="generic_error_dlg_title" msgid="5863195085927067752">"त्रुटि"</string> @@ -54,7 +54,7 @@ <string name="uninstall_update_title" msgid="824411791011583031">"अद्यावधिकको स्थापना रद्द गर्नु…"</string> <string name="uninstall_activity_text" msgid="1928194674397770771">"<xliff:g id="ACTIVITY_NAME">%1$s</xliff:g> निम्न अनुप्रयोगको अंश हो:"</string> <string name="uninstall_application_text" msgid="3816830743706143980">"तपाईं यो अनुप्रयोगको स्थापना रद्द गर्न चाहनुहुन्छ?"</string> - <string name="uninstall_application_text_all_users" msgid="575491774380227119">"तपाईं "<b>"सबै"</b>" प्रयोगकर्ताका लागि यो अनुप्रयोगको स्थापना रद्द गर्न चाहनुहुन्छ? यन्त्रका "<b>"सबै"</b>" प्रयोगकर्ताहरूबाट उक्त अनुप्रयोग र यसको डेटा हटाइने छ।"</string> + <string name="uninstall_application_text_all_users" msgid="575491774380227119">"तपाईं "<b>"सबै"</b>" प्रयोगकर्ताका लागि यो एपको स्थापना रद्द गर्न चाहनुहुन्छ? यन्त्रका "<b>"सबै"</b>" प्रयोगकर्ताहरूबाट उक्त एप र यसको डेटा हटाइने छ।"</string> <string name="uninstall_application_text_user" msgid="498072714173920526">"तपाईं प्रयोगकर्ता <xliff:g id="USERNAME">%1$s</xliff:g> का लागि यो अनुप्रयोगको स्थापना रद्द गर्न चाहनुहुन्छ?"</string> <string name="uninstall_update_text" msgid="863648314632448705">"यस अनुप्रयोगलाई फ्याक्ट्रीको संस्करणले बदल्ने हो? सबै डेटा हटाइने छ।"</string> <string name="uninstall_update_text_multiuser" msgid="8992883151333057227">"यस अनुप्रयोगलाई फ्याक्ट्रीको संस्करणले बदल्ने हो? सबै डेटा हटाइने छ। यसले यस यन्त्रका कार्य प्रोफाइल भएका लगायत सबै प्रयोगकर्ताहरूमा असर पार्छ।"</string> @@ -70,22 +70,22 @@ <string name="uninstall_failed_device_policy_manager" msgid="785293813665540305">"यन्त्रको सक्रिय प्रशासकीय अनुप्रयोगको स्थापना रद्द गर्न मिल्दैन"</string> <string name="uninstall_failed_device_policy_manager_of_user" msgid="4813104025494168064">"<xliff:g id="USERNAME">%1$s</xliff:g> को यन्त्रको सक्रिय प्रशासकीय अनुप्रयोगको स्थापना रद्द गर्न मिल्दैन"</string> <string name="uninstall_all_blocked_profile_owner" msgid="2009393666026751501">"अन्य प्रयोगकर्ताहरूका लागि यस अनुप्रयोगको स्थापना रद्द गरे पनि केही प्रयोगकर्ता वा प्रोफाइलहरूलाई यसको आवश्यकता पर्दछ"</string> - <string name="uninstall_blocked_profile_owner" msgid="6373897407002404848">"यो अनुप्रयोग तपाईंको प्रोफाइलका लागि आवश्यक छ र यसको स्थापना रद्द गर्न सकिँदैन।"</string> - <string name="uninstall_blocked_device_owner" msgid="6724602931761073901">"यो अनुप्रयोग तपाईंको यन्त्रका प्रशासकका लागि आवश्यक छ र यसको स्थापना रद्द गर्न सकिँदैन।"</string> + <string name="uninstall_blocked_profile_owner" msgid="6373897407002404848">"यो एप तपाईंको प्रोफाइलका लागि आवश्यक छ र यसको स्थापना रद्द गर्न सकिँदैन।"</string> + <string name="uninstall_blocked_device_owner" msgid="6724602931761073901">"यो एप तपाईंको यन्त्रका प्रशासकका लागि आवश्यक छ र यसको स्थापना रद्द गर्न सकिँदैन।"</string> <string name="manage_device_administrators" msgid="3092696419363842816">"यन्त्रका व्यवस्थापकीय अनुप्रयोगको व्यवस्थापन गर्नु…"</string> <string name="manage_users" msgid="1243995386982560813">"प्रयोगकर्ताहरूको व्यवस्थापन गर्नुहोस्"</string> <string name="uninstall_failed_msg" msgid="2176744834786696012">"<xliff:g id="APP_NAME">%1$s</xliff:g> को स्थापना रद्द गर्न सकिएन।"</string> <string name="Parse_error_dlg_text" msgid="1661404001063076789">"प्याकेजलाई पार्स गर्ने क्रममा समस्या भयो।"</string> <string name="wear_not_allowed_dlg_title" msgid="8664785993465117517">"Android Wear"</string> <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear मा स्थापना/स्थापना रद्द गर्ने कारबाहीहरू समर्थित छैनन्।"</string> - <string name="message_staging" msgid="8032722385658438567">"अनुप्रयोग स्थापना गर्न तयारी गर्दै…"</string> + <string name="message_staging" msgid="8032722385658438567">"एप स्थापना गर्न तयारी गर्दै…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"अज्ञात"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"तपाईंको सुरक्षाका लागि, तपाईंको ट्याब्लेटलाई यो स्रोतबाट प्राप्त हुने अज्ञात अनुप्रयोगहरू स्थापना गर्ने अनुमति छैन।"</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"तपाईंको सुरक्षाका लागि, तपाईंको TV लाई यस स्रोतबाट प्राप्त हुने अज्ञात अनुप्रयोगहरू स्थापना गर्ने अनुमति छैन।"</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"तपाईंको सुरक्षाका लागि, तपाईंको फोनलाई यो स्रोतबाट प्राप्त हुने अज्ञात अनुप्रयोगहरू स्थापना गर्ने अनुमति छैन।"</string> - <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"तपाईंको फोन तथा व्यक्तिगत डेटा अज्ञात अनुप्रयोगहरूबाट हुने आक्रमणको चपेटामा पर्ने बढी जोखिममा हुन्छन्। यो अनुप्रयोग स्थापना गरेर तपाईं यसको प्रयोगबाट तपाईंको फोनमा हुन सक्ने क्षति वा डेटाको नोक्सानीका लागि स्वयं जिम्मेवार हुने कुरामा सहमत हुनुहुन्छ।"</string> - <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"तपाईंको ट्याब्लेट तथा व्यक्तिगत डेटा अज्ञात अनुप्रयोगहरूबाट हुने आक्रमणको चपेटामा पर्ने बढी जोखिममा हुन्छन्। यो अनुप्रयोग स्थापना गरेर तपाईं यसको प्रयोगबाट तपाईंको ट्याब्लेटमा हुन सक्ने क्षति वा डेटाको नोक्सानीका लागि स्वयं जिम्मेवार हुने कुरामा सहमत हुनुहुन्छ।"</string> - <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"तपाईंको TV तथा व्यक्तिगत डेटा अज्ञात अनुप्रयोगहरूबाट हुने आक्रमणको चपेटामा पर्ने बढी जोखिममा हुन्छन्। यो अनुप्रयोग स्थापना गरेर तपाईं यसको प्रयोगबाट तपाईंको TV मा हुन सक्ने क्षति वा डेटाको नोक्सानीका लागि स्वयं जिम्मेवार हुने कुरामा सहमत हुनुहुन्छ।"</string> + <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"तपाईंको सुरक्षाका लागि, तपाईंको ट्याब्लेटलाई यो स्रोतबाट प्राप्त हुने अज्ञात एपहरू स्थापना गर्ने अनुमति छैन।"</string> + <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"तपाईंको सुरक्षाका लागि, तपाईंको TV लाई यस स्रोतबाट प्राप्त हुने अज्ञात एपहरू स्थापना गर्ने अनुमति छैन।"</string> + <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"तपाईंको सुरक्षाका लागि, तपाईंको फोनलाई यो स्रोतबाट प्राप्त हुने अज्ञात एपहरू स्थापना गर्ने अनुमति छैन।"</string> + <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"तपाईंको फोन तथा व्यक्तिगत डेटा अज्ञात एपहरूबाट हुने आक्रमणको चपेटामा पर्ने बढी जोखिममा हुन्छन्। यो एप स्थापना गरेर तपाईं यसको प्रयोगबाट तपाईंको फोनमा हुन सक्ने क्षति वा डेटाको नोक्सानीका लागि स्वयं जिम्मेवार हुने कुरामा सहमत हुनुहुन्छ।"</string> + <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"तपाईंको ट्याब्लेट तथा व्यक्तिगत डेटा अज्ञात एपहरूबाट हुने आक्रमणको चपेटामा पर्ने बढी जोखिममा हुन्छन्। यो एप स्थापना गरेर तपाईं यसको प्रयोगबाट तपाईंको ट्याब्लेटमा हुन सक्ने क्षति वा डेटाको नोक्सानीका लागि स्वयं जिम्मेवार हुने कुरामा सहमत हुनुहुन्छ।"</string> + <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"तपाईंको TV तथा व्यक्तिगत डेटा अज्ञात एपहरूबाट हुने आक्रमणको चपेटामा पर्ने बढी जोखिममा हुन्छन्। यो एप स्थापना गरेर तपाईं यसको प्रयोगबाट तपाईंको TV मा हुन सक्ने क्षति वा डेटाको नोक्सानीका लागि स्वयं जिम्मेवार हुने कुरामा सहमत हुनुहुन्छ।"</string> <string name="anonymous_source_continue" msgid="4375745439457209366">"जारी राख्नुहोस्"</string> <string name="external_sources_settings" msgid="4046964413071713807">"सेटिङहरू"</string> <string name="wear_app_channel" msgid="1960809674709107850">"वेयर एपहरूको स्थापना/स्थापना रद्द गर्दै"</string> diff --git a/packages/PackageInstaller/res/values-or/strings.xml b/packages/PackageInstaller/res/values-or/strings.xml index 8c89ce9ca0eb..b9908d299a49 100644 --- a/packages/PackageInstaller/res/values-or/strings.xml +++ b/packages/PackageInstaller/res/values-or/strings.xml @@ -87,7 +87,7 @@ <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"ଅଜଣା ଆପ୍ ଦ୍ୱାରା ଆପଣଙ୍କ ଟାବଲେଟ୍ ଏବଂ ବ୍ୟକ୍ତିଗତ ଡାଟାକୁ ନଷ୍ଟ କରାଯାଇପାରିବାର ସମ୍ଭାବନା ବହୁତ ଅଧିକ। ଏହି ଆପ୍କୁ ଇନଷ୍ଟଲ୍ କରିବାର ଅର୍ଥ ହେଉଛି ଆପଣଙ୍କ ଟାବ୍ଲେଟ୍ରେ ଘଟିବା କୌଣସି ପ୍ରକାର କ୍ଷତି କିମ୍ବା ସେଗୁଡ଼ିକର ବ୍ୟବହାରରୁ ହେବା କୌଣସି ପ୍ରକାର ଡାଟାର ହାନୀ ପାଇଁ ଆପଣ ଦାୟୀ ରହିବାକୁ ରାଜି ହୁଅନ୍ତି।"</string> <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"ଅଜଣା ଆପ୍ ଦ୍ୱାରା ଆପଣଙ୍କ ଟିଭି ଏବଂ ବ୍ୟକ୍ତିଗତ ଡାଟାକୁ ନଷ୍ଟ କରାଯାଇପାରିବାର ସମ୍ଭାବନା ବହୁତ ଅଧିକ। ଏହି ଆପ୍କୁ ଇନଷ୍ଟଲ୍ କରିବାର ଅର୍ଥ ହେଉଛି ଆପଣଙ୍କ ଟିଭିରେ ଘଟିବା କୌଣସି ପ୍ରକାର କ୍ଷତି କିମ୍ବା ସେଗୁଡ଼ିକର ବ୍ୟବହାରରୁ ହେବା କୌଣସି ପ୍ରକାର ଡାଟାର ହାନୀ ପାଇଁ ଆପଣ ଦାୟୀ ରହିବାକୁ ରାଜି ହୁଅନ୍ତି।"</string> <string name="anonymous_source_continue" msgid="4375745439457209366">"ଜାରି ରଖନ୍ତୁ"</string> - <string name="external_sources_settings" msgid="4046964413071713807">"ସେଟିଙ୍ଗ"</string> + <string name="external_sources_settings" msgid="4046964413071713807">"ସେଟିଂସ୍"</string> <string name="wear_app_channel" msgid="1960809674709107850">"ୱିଅର୍ ଆପ୍ ଇନଷ୍ଟଲ୍/ଅନଇନଷ୍ଟଲ୍ କରାଯାଉଛି"</string> <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"ଆପ୍ ଇନ୍ଷ୍ଟଲ୍ କରାଯାଇଥିବା ବିଜ୍ଞପ୍ତି"</string> <string name="notification_installation_success_message" msgid="6450467996056038442">"ସଫଳତାପୂର୍ବକ ଇନ୍ଷ୍ଟଲ୍ କରାଗଲା"</string> diff --git a/packages/SettingsLib/src/com/android/settingslib/dream/DreamBackend.java b/packages/SettingsLib/src/com/android/settingslib/dream/DreamBackend.java index 57e680849fec..ab7b54d98285 100644 --- a/packages/SettingsLib/src/com/android/settingslib/dream/DreamBackend.java +++ b/packages/SettingsLib/src/com/android/settingslib/dream/DreamBackend.java @@ -159,6 +159,25 @@ public class DreamBackend { return null; } + /** + * Gets an icon from active dream. + */ + public Drawable getActiveIcon() { + final ComponentName cn = getActiveDream(); + if (cn != null) { + final PackageManager pm = mContext.getPackageManager(); + try { + final ServiceInfo ri = pm.getServiceInfo(cn, 0); + if (ri != null) { + return ri.loadIcon(pm); + } + } catch (PackageManager.NameNotFoundException exc) { + return null; + } + } + return null; + } + public @WhenToDream int getWhenToDreamSetting() { if (!isEnabled()) { return NEVER; diff --git a/packages/SettingsProvider/AndroidManifest.xml b/packages/SettingsProvider/AndroidManifest.xml index 839899ecaa31..04d3f9486354 100644 --- a/packages/SettingsProvider/AndroidManifest.xml +++ b/packages/SettingsProvider/AndroidManifest.xml @@ -21,5 +21,10 @@ android:singleUser="true" android:initOrder="100" android:visibleToInstantApps="true" /> + + <service + android:name="WriteFallbackSettingsFilesJobService" + android:permission="android.permission.BIND_JOB_SERVICE" + android:exported="true"/> </application> </manifest> diff --git a/packages/SettingsProvider/OWNERS b/packages/SettingsProvider/OWNERS index 2054129506bc..b2ac4f43e845 100644 --- a/packages/SettingsProvider/OWNERS +++ b/packages/SettingsProvider/OWNERS @@ -1,3 +1,5 @@ hackbod@google.com +narayan@google.com svetoslavganov@google.com -moltmann@google.com +schfan@google.com +toddke@google.com diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java index 2245ee4f2821..94509ddcc407 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java @@ -23,12 +23,16 @@ import static android.os.Process.SYSTEM_UID; import static android.provider.Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_MAGNIFICATION_CONTROLLER; import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_2BUTTON_OVERLAY; +import static com.android.providers.settings.SettingsState.FALLBACK_FILE_SUFFIX; + import android.Manifest; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityManager; import android.app.AppGlobals; import android.app.backup.BackupManager; +import android.app.job.JobInfo; +import android.app.job.JobScheduler; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.ContentProvider; @@ -55,12 +59,14 @@ import android.os.Build; import android.os.Bundle; import android.os.DropBoxManager; import android.os.Environment; +import android.os.FileUtils; import android.os.Handler; import android.os.HandlerThread; import android.os.IUserRestrictionsListener; import android.os.Looper; import android.os.Message; import android.os.ParcelFileDescriptor; +import android.os.PersistableBundle; import android.os.Process; import android.os.RemoteCallback; import android.os.RemoteException; @@ -95,6 +101,7 @@ import libcore.util.HexEncoding; import java.io.File; import java.io.FileDescriptor; import java.io.FileNotFoundException; +import java.io.IOException; import java.io.PrintWriter; import java.nio.ByteBuffer; import java.security.InvalidKeyException; @@ -154,9 +161,11 @@ public class SettingsProvider extends ContentProvider { private static final String LOG_TAG = "SettingsProvider"; - private static final String TABLE_SYSTEM = "system"; - private static final String TABLE_SECURE = "secure"; - private static final String TABLE_GLOBAL = "global"; + public static final String TABLE_SYSTEM = "system"; + public static final String TABLE_SECURE = "secure"; + public static final String TABLE_GLOBAL = "global"; + public static final String TABLE_SSAID = "ssaid"; + public static final String TABLE_CONFIG = "config"; // Old tables no longer exist. private static final String TABLE_FAVORITES = "favorites"; @@ -205,6 +214,10 @@ public class SettingsProvider extends ContentProvider { public static final String RESULT_ROWS_DELETED = "result_rows_deleted"; public static final String RESULT_SETTINGS_LIST = "result_settings_list"; + // Used for scheduling jobs to make a copy for the settings files + public static final int WRITE_FALLBACK_SETTINGS_FILES_JOB_ID = 1; + public static final long ONE_DAY_INTERVAL_MILLIS = 24 * 60 * 60 * 1000L; + // Overlay specified settings whitelisted for Instant Apps private static final Set<String> OVERLAY_ALLOWED_GLOBAL_INSTANT_APP_SETTINGS = new ArraySet<>(); private static final Set<String> OVERLAY_ALLOWED_SYSTEM_INSTANT_APP_SETTINGS = new ArraySet<>(); @@ -2484,6 +2497,68 @@ public class SettingsProvider extends ContentProvider { } } + /** + * Schedule the job service to make a copy of all the settings files. + */ + public void scheduleWriteFallbackFilesJob() { + final Context context = getContext(); + final JobScheduler jobScheduler = + (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); + if (jobScheduler == null) { + // Might happen: SettingsProvider is created before JobSchedulerService in system server + return; + } + // Check if the job is already scheduled. If so, skip scheduling another one + if (jobScheduler.getPendingJob(WRITE_FALLBACK_SETTINGS_FILES_JOB_ID) != null) { + return; + } + // Back up all settings files + final PersistableBundle bundle = new PersistableBundle(); + final File globalSettingsFile = mSettingsRegistry.getSettingsFile( + makeKey(SETTINGS_TYPE_GLOBAL, UserHandle.USER_SYSTEM)); + final File systemSettingsFile = mSettingsRegistry.getSettingsFile( + makeKey(SETTINGS_TYPE_SYSTEM, UserHandle.USER_SYSTEM)); + final File secureSettingsFile = mSettingsRegistry.getSettingsFile( + makeKey(SETTINGS_TYPE_SECURE, UserHandle.USER_SYSTEM)); + final File ssaidSettingsFile = mSettingsRegistry.getSettingsFile( + makeKey(SETTINGS_TYPE_SSAID, UserHandle.USER_SYSTEM)); + final File configSettingsFile = mSettingsRegistry.getSettingsFile( + makeKey(SETTINGS_TYPE_CONFIG, UserHandle.USER_SYSTEM)); + bundle.putString(TABLE_GLOBAL, globalSettingsFile.getAbsolutePath()); + bundle.putString(TABLE_SYSTEM, systemSettingsFile.getAbsolutePath()); + bundle.putString(TABLE_SECURE, secureSettingsFile.getAbsolutePath()); + bundle.putString(TABLE_SSAID, ssaidSettingsFile.getAbsolutePath()); + bundle.putString(TABLE_CONFIG, configSettingsFile.getAbsolutePath()); + // Schedule the job to write the fallback files, once daily when phone is charging + jobScheduler.schedule(new JobInfo.Builder(WRITE_FALLBACK_SETTINGS_FILES_JOB_ID, + new ComponentName(context, WriteFallbackSettingsFilesJobService.class)) + .setExtras(bundle) + .setPeriodic(ONE_DAY_INTERVAL_MILLIS) + .setRequiresCharging(true) + .setPersisted(true) + .build()); + } + + /** + * For each file in the given list, if it exists, copy it to a back up file. Ignore failures. + * @param filePaths List of paths of files that need to be backed up + */ + public static void writeFallBackSettingsFiles(List<String> filePaths) { + final int numFiles = filePaths.size(); + for (int i = 0; i < numFiles; i++) { + final String filePath = filePaths.get(i); + final File originalFile = new File(filePath); + if (SettingsState.stateFileExists(originalFile)) { + final File fallBackFile = new File(filePath + FALLBACK_FILE_SUFFIX); + try { + FileUtils.copy(originalFile, fallBackFile); + } catch (IOException ex) { + Slog.w(LOG_TAG, "Failed to write fallback file for: " + filePath); + } + } + } + } + final class SettingsRegistry { private static final String DROPBOX_TAG_USERLOG = "restricted_profile_ssaid"; @@ -3431,6 +3506,7 @@ public class SettingsProvider extends ContentProvider { case MSG_NOTIFY_DATA_CHANGED: { mBackupManager.dataChanged(); + scheduleWriteFallbackFilesJob(); } break; } } diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java index 6b8219ea9c70..6678cf6f1033 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java @@ -27,6 +27,7 @@ import android.content.pm.PackageManager; import android.content.pm.Signature; import android.os.Binder; import android.os.Build; +import android.os.FileUtils; import android.os.Handler; import android.os.Looper; import android.os.Message; @@ -101,6 +102,8 @@ final class SettingsState { public static final int VERSION_UNDEFINED = -1; + public static final String FALLBACK_FILE_SUFFIX = ".fallback"; + private static final String TAG_SETTINGS = "settings"; private static final String TAG_SETTING = "setting"; private static final String ATTR_PACKAGE = "package"; @@ -266,7 +269,7 @@ final class SettingsState { public SettingsState(Context context, Object lock, File file, int key, int maxBytesPerAppPackage, Looper looper) { // It is important that we use the same lock as the settings provider - // to ensure multiple mutations on this state are atomicaly persisted + // to ensure multiple mutations on this state are atomically persisted // as the async persistence should be blocked while we make changes. mContext = context; mLock = lock; @@ -998,24 +1001,56 @@ final class SettingsState { } @GuardedBy("mLock") - private void readStateSyncLocked() { + private void readStateSyncLocked() throws IllegalStateException { FileInputStream in; + AtomicFile file = new AtomicFile(mStatePersistFile); try { - in = new AtomicFile(mStatePersistFile).openRead(); + in = file.openRead(); } catch (FileNotFoundException fnfe) { - Slog.i(LOG_TAG, "No settings state " + mStatePersistFile); + Slog.w(LOG_TAG, "No settings state " + mStatePersistFile); logSettingsDirectoryInformation(mStatePersistFile); addHistoricalOperationLocked(HISTORICAL_OPERATION_INITIALIZE, null); return; } + if (parseStateFromXmlStreamLocked(in)) { + return; + } + + // Settings file exists but is corrupted. Retry with the fallback file + final File statePersistFallbackFile = new File( + mStatePersistFile.getAbsolutePath() + FALLBACK_FILE_SUFFIX); + Slog.i(LOG_TAG, "Failed parsing settings file: " + mStatePersistFile + + ", retrying with fallback file: " + statePersistFallbackFile); + try { + in = new AtomicFile(statePersistFallbackFile).openRead(); + } catch (FileNotFoundException fnfe) { + final String message = "No fallback file found for: " + mStatePersistFile; + Slog.wtf(LOG_TAG, message); + throw new IllegalStateException(message); + } + if (parseStateFromXmlStreamLocked(in)) { + // Parsed state from fallback file. Restore original file with fallback file + try { + FileUtils.copy(statePersistFallbackFile, mStatePersistFile); + } catch (IOException ignored) { + // Failed to copy, but it's okay because we already parsed states from fallback file + } + } else { + final String message = "Failed parsing settings file: " + mStatePersistFile; + Slog.wtf(LOG_TAG, message); + throw new IllegalStateException(message); + } + } + + @GuardedBy("mLock") + private boolean parseStateFromXmlStreamLocked(FileInputStream in) { try { XmlPullParser parser = Xml.newPullParser(); parser.setInput(in, StandardCharsets.UTF_8.name()); parseStateLocked(parser); + return true; } catch (XmlPullParserException | IOException e) { - String message = "Failed parsing settings file: " + mStatePersistFile; - Slog.wtf(LOG_TAG, message); - throw new IllegalStateException(message, e); + return false; } finally { IoUtils.closeQuietly(in); } diff --git a/packages/SettingsProvider/src/com/android/providers/settings/WriteFallbackSettingsFilesJobService.java b/packages/SettingsProvider/src/com/android/providers/settings/WriteFallbackSettingsFilesJobService.java new file mode 100644 index 000000000000..6e5b8890438d --- /dev/null +++ b/packages/SettingsProvider/src/com/android/providers/settings/WriteFallbackSettingsFilesJobService.java @@ -0,0 +1,58 @@ +/* + * 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.providers.settings; + +import static com.android.providers.settings.SettingsProvider.TABLE_CONFIG; +import static com.android.providers.settings.SettingsProvider.TABLE_GLOBAL; +import static com.android.providers.settings.SettingsProvider.TABLE_SECURE; +import static com.android.providers.settings.SettingsProvider.TABLE_SSAID; +import static com.android.providers.settings.SettingsProvider.TABLE_SYSTEM; +import static com.android.providers.settings.SettingsProvider.WRITE_FALLBACK_SETTINGS_FILES_JOB_ID; + +import android.app.job.JobParameters; +import android.app.job.JobService; + +import java.util.ArrayList; +import java.util.List; + +/** + * JobService to make a copy of a list of files, given their paths. + */ +public class WriteFallbackSettingsFilesJobService extends JobService { + @Override + public boolean onStartJob(final JobParameters params) { + switch (params.getJobId()) { + case WRITE_FALLBACK_SETTINGS_FILES_JOB_ID: + final List<String> settingsFiles = new ArrayList<>(); + settingsFiles.add(params.getExtras().getString(TABLE_GLOBAL, "")); + settingsFiles.add(params.getExtras().getString(TABLE_SYSTEM, "")); + settingsFiles.add(params.getExtras().getString(TABLE_SECURE, "")); + settingsFiles.add(params.getExtras().getString(TABLE_SSAID, "")); + settingsFiles.add(params.getExtras().getString(TABLE_CONFIG, "")); + SettingsProvider.writeFallBackSettingsFiles(settingsFiles); + return true; + default: + return false; + } + } + + @Override + public boolean onStopJob(JobParameters params) { + return false; + } + +} diff --git a/packages/SystemUI/res/drawable/ic_hardware_speaker.xml b/packages/SystemUI/res/drawable/ic_hardware_speaker.xml new file mode 100644 index 000000000000..0081e56a45f2 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_hardware_speaker.xml @@ -0,0 +1,24 @@ +<!-- + 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. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="18dp" + android:height="18dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:pathData="M17,2L7,2c-1.1,0 -2,0.9 -2,2v16c0,1.1 0.9,1.99 2,1.99L17,22c1.1,0 2,-0.9 2,-2L19,4c0,-1.1 -0.9,-2 -2,-2zM7,20L7,4h10v16L7,20zM12,9c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2c-1.11,0 -2,0.9 -2,2s0.89,2 2,2zM12,11c-2.21,0 -4,1.79 -4,4s1.79,4 4,4 4,-1.79 4,-4 -1.79,-4 -4,-4zM12,17c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2 2,0.9 2,2 -0.9,2 -2,2z" + android:fillColor="#000000"/> +</vector> diff --git a/packages/SystemUI/res/layout/global_screenshot.xml b/packages/SystemUI/res/layout/global_screenshot.xml index db109fe8a541..94a6bc566e73 100644 --- a/packages/SystemUI/res/layout/global_screenshot.xml +++ b/packages/SystemUI/res/layout/global_screenshot.xml @@ -38,6 +38,7 @@ android:elevation="1dp" android:fillViewport="true" android:layout_marginHorizontal="@dimen/screenshot_action_container_margin_horizontal" + android:layout_marginBottom="@dimen/screenshot_action_container_offset_y" android:gravity="center" android:paddingLeft="@dimen/screenshot_action_container_padding_left" android:paddingRight="@dimen/screenshot_action_container_padding_right" diff --git a/packages/SystemUI/res/layout/global_screenshot_action_chip.xml b/packages/SystemUI/res/layout/global_screenshot_action_chip.xml index 6b94befad0f8..bd91ddb5f406 100644 --- a/packages/SystemUI/res/layout/global_screenshot_action_chip.xml +++ b/packages/SystemUI/res/layout/global_screenshot_action_chip.xml @@ -16,14 +16,15 @@ --> <com.android.systemui.screenshot.ScreenshotActionChip xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/global_screenshot_action_chip" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginRight="@dimen/screenshot_action_chip_margin_right" - android:layout_gravity="center" - android:paddingVertical="@dimen/screenshot_action_chip_padding_vertical" - android:background="@drawable/action_chip_background" - android:gravity="center"> + android:id="@+id/global_screenshot_action_chip" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginRight="@dimen/screenshot_action_chip_margin_right" + android:layout_gravity="center" + android:paddingVertical="@dimen/screenshot_action_chip_padding_vertical" + android:background="@drawable/action_chip_background" + android:alpha="0" + android:gravity="center"> <ImageView android:id="@+id/screenshot_action_chip_icon" android:layout_width="@dimen/screenshot_action_chip_icon_size" diff --git a/packages/SystemUI/res/layout/partial_conversation_info.xml b/packages/SystemUI/res/layout/partial_conversation_info.xml new file mode 100644 index 000000000000..2401dfbc2435 --- /dev/null +++ b/packages/SystemUI/res/layout/partial_conversation_info.xml @@ -0,0 +1,200 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright 2020, The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<com.android.systemui.statusbar.notification.row.PartialConversationInfo + xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/notification_guts" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:focusable="true" + android:clipChildren="false" + android:clipToPadding="true" + android:orientation="vertical" + android:paddingStart="@*android:dimen/notification_content_margin_start"> + + <!-- Package Info --> + <LinearLayout + android:id="@+id/header" + android:layout_width="match_parent" + android:layout_height="@dimen/notification_guts_conversation_header_height" + android:gravity="center_vertical" + android:clipChildren="false" + android:clipToPadding="false"> + <ImageView + android:id="@+id/conversation_icon" + android:layout_width="@dimen/notification_guts_conversation_icon_size" + android:layout_height="@dimen/notification_guts_conversation_icon_size" + android:layout_centerVertical="true" + android:layout_alignParentStart="true" + android:layout_marginEnd="15dp" /> + <LinearLayout + android:id="@+id/names" + android:layout_weight="1" + android:layout_width="0dp" + android:orientation="vertical" + + android:layout_height="wrap_content" + android:minHeight="@dimen/notification_guts_conversation_icon_size" + android:layout_centerVertical="true" + android:gravity="center_vertical" + android:layout_alignEnd="@id/conversation_icon" + android:layout_toEndOf="@id/conversation_icon"> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:gravity="start" + android:orientation="horizontal"> + <TextView + android:id="@+id/name" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + style="@style/TextAppearance.NotificationImportanceChannel"/> + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_centerVertical="true" + style="@style/TextAppearance.NotificationImportanceHeader" + android:layout_marginStart="2dp" + android:layout_marginEnd="2dp" + android:text="@*android:string/notification_header_divider_symbol" /> + <TextView + android:id="@+id/parent_channel_name" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + style="@style/TextAppearance.NotificationImportanceChannel"/> + + </LinearLayout> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:gravity="start" + android:orientation="horizontal"> + <TextView + android:id="@+id/pkg_name" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + style="@style/TextAppearance.NotificationImportanceChannelGroup" + android:ellipsize="end" + android:maxLines="1"/> + <TextView + android:id="@+id/group_divider" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_centerVertical="true" + style="@style/TextAppearance.NotificationImportanceHeader" + android:layout_marginStart="2dp" + android:layout_marginEnd="2dp" + android:text="@*android:string/notification_header_divider_symbol" /> + <TextView + android:id="@+id/group_name" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_weight="1" + style="@style/TextAppearance.NotificationImportanceChannelGroup"/> + </LinearLayout> + <TextView + android:id="@+id/delegate_name" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_centerVertical="true" + style="@style/TextAppearance.NotificationImportanceHeader" + android:layout_marginStart="2dp" + android:layout_marginEnd="2dp" + android:ellipsize="end" + android:text="@string/notification_delegate_header" + android:maxLines="1" /> + + </LinearLayout> + + <!-- end aligned fields --> + <ImageButton + android:id="@+id/info" + android:layout_width="@dimen/notification_importance_toggle_size" + android:layout_height="@dimen/notification_importance_toggle_size" + android:layout_centerVertical="true" + android:background="@drawable/ripple_drawable" + android:contentDescription="@string/notification_more_settings" + android:src="@drawable/ic_settings" + android:layout_alignParentEnd="true" + android:tint="@color/notification_guts_link_icon_tint"/> + + </LinearLayout> + + <LinearLayout + android:id="@+id/inline_controls" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:paddingEnd="@*android:dimen/notification_content_margin_end" + android:layout_marginTop="@dimen/notification_guts_option_vertical_padding" + android:clipChildren="false" + android:clipToPadding="false" + android:orientation="vertical"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:clipChildren="false" + android:clipToPadding="false" + android:orientation="horizontal"> + <ImageView + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:contentDescription="@null" + android:src="@drawable/ic_info" + android:tint="?android:attr/textColorPrimary" + android:layout_marginEnd="8dp"/> + <TextView + android:id="@+id/non_configurable_text" + android:layout_width="match_parent" + android:layout_height="wrap_content" + style="@style/TextAppearance.NotificationImportanceChannelGroup" /> + </LinearLayout> + + <RelativeLayout + android:id="@+id/bottom_buttons" + android:layout_width="match_parent" + android:layout_height="60dp" + android:gravity="center_vertical" + android:paddingStart="4dp" + android:paddingEnd="4dp" + > + <TextView + android:id="@+id/turn_off_notifications" + android:text="@string/inline_turn_off_notifications" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignParentStart="true" + android:gravity="start|center_vertical" + android:minWidth="@dimen/notification_importance_toggle_size" + android:minHeight="@dimen/notification_importance_toggle_size" + android:maxWidth="200dp" + style="@style/TextAppearance.NotificationInfo.Button"/> + <TextView + android:id="@+id/done" + android:text="@string/inline_done_button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignParentEnd="true" + android:gravity="end|center_vertical" + android:minWidth="@dimen/notification_importance_toggle_size" + android:minHeight="@dimen/notification_importance_toggle_size" + android:maxWidth="125dp" + style="@style/TextAppearance.NotificationInfo.Button"/> + </RelativeLayout> + + </LinearLayout> +</com.android.systemui.statusbar.notification.row.PartialConversationInfo> diff --git a/packages/SystemUI/res/layout/qs_media_panel.xml b/packages/SystemUI/res/layout/qs_media_panel.xml index e5ac5f89cd25..a194569dcca4 100644 --- a/packages/SystemUI/res/layout/qs_media_panel.xml +++ b/packages/SystemUI/res/layout/qs_media_panel.xml @@ -119,6 +119,7 @@ android:id="@+id/media_seamless" android:background="@*android:drawable/media_seamless_background" android:layout_weight="1" + android:forceHasOverlappingRendering="false" > <ImageView android:layout_width="@dimen/qs_seamless_icon_size" diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index 5e0f65c4b3b4..64d89125ef4e 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -999,8 +999,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"যিকোনো সময়তে bubbles নিয়ন্ত্ৰণ কৰক"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"এই এপ্টোৰ পৰা bubbles অফ কৰিবলৈ পৰিচালনা কৰকত টিপক"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"বুজি পালোঁ"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ছেটিংসমূহ"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"ছিষ্টেম নেভিগেশ্বন আপডে’ট কৰা হ’ল। সলনি কৰিবলৈ ছেটিংসমূহ-লৈ যাওক।"</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"ছিষ্টেম নেভিগেশ্বন আপডে’ট কৰিবলৈ ছেটিংসমূহ-লৈ যাওক"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ষ্টেণ্ডবাই"</string> diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index 452a4aead149..a04f5c2ed88c 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -999,8 +999,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"যেকোনও সময় বাবল নিয়ন্ত্রণ করুন"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"এই অ্যাপ থেকে বাবল বন্ধ করতে ম্যানেজ করুন বিকল্প ট্যাপ করুন"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"বুঝেছি"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> সেটিংস"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"সিস্টেম নেভিগেশন আপডেট হয়েছে। পরিবর্তন করার জন্য সেটিংসে যান।"</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"সিস্টেম নেভিগেশন আপডেট করতে সেটিংসে যান"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"স্ট্যান্ডবাই"</string> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index f228e802437b..76390f0e04f7 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -33,7 +33,7 @@ <string name="invalid_charger_title" msgid="938685362320735167">"Enheden kan ikke oplades via USB"</string> <string name="invalid_charger_text" msgid="2339310107232691577">"Brug den oplader, der fulgte med din enhed"</string> <string name="battery_low_why" msgid="2056750982959359863">"Indstillinger"</string> - <string name="battery_saver_confirmation_title" msgid="1234998463717398453">"Vil du slå Batterisparefunktion til?"</string> + <string name="battery_saver_confirmation_title" msgid="1234998463717398453">"Vil du aktivere Batterisparefunktion?"</string> <string name="battery_saver_confirmation_title_generic" msgid="2299231884234959849">"Om Batterisparefunktion"</string> <string name="battery_saver_confirmation_ok" msgid="5042136476802816494">"Aktivér"</string> <string name="battery_saver_start_action" msgid="4553256017945469937">"Aktivér batterisparefunktion"</string> @@ -961,7 +961,7 @@ <string name="qs_dnd_replace" msgid="7712119051407052689">"Erstat"</string> <string name="running_foreground_services_title" msgid="5137313173431186685">"Apps, der kører i baggrunden"</string> <string name="running_foreground_services_msg" msgid="3009459259222695385">"Tryk for at se info om batteri- og dataforbrug"</string> - <string name="mobile_data_disable_title" msgid="5366476131671617790">"Vil du slå mobildata fra?"</string> + <string name="mobile_data_disable_title" msgid="5366476131671617790">"Vil du deaktivere mobildata?"</string> <string name="mobile_data_disable_message" msgid="8604966027899770415">"Du vil ikke have data- eller internetadgang via <xliff:g id="CARRIER">%s</xliff:g>. Der vil kun være adgang til internettet via Wi-Fi."</string> <string name="mobile_data_disable_message_default_carrier" msgid="6496033312431658238">"dit mobilselskab"</string> <string name="touch_filtered_warning" msgid="8119511393338714836">"Indstillinger kan ikke bekræfte dit svar, da en app dækker for en anmodning om tilladelse."</string> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index 31837eded54a..82b778eeffc7 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -999,8 +999,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Bubble-Einstellungen festlegen"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Tippe auf \"Verwalten\", um Bubbles für diese App zu deaktivieren"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"OK"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"Einstellungen für <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Systemsteuerungseinstellungen wurden angepasst. Änderungen kannst du in den Einstellungen vornehmen."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Gehe zu den Einstellungen, um die Systemsteuerung anzupassen"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string> diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index 6fb7a1f648f9..9b411daec4ea 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -999,8 +999,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"ಯಾವುದೇ ಸಮಯದಲ್ಲಿ ಬಬಲ್ಸ್ ಅನ್ನು ನಿಯಂತ್ರಿಸಿ"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"ಈ ಆ್ಯಪ್ನಿಂದ ಬಬಲ್ಸ್ ಅನ್ನು ಆಫ್ ಮಾಡಲು ನಿರ್ವಹಿಸಿ ಟ್ಯಾಪ್ ಮಾಡಿ"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"ಅರ್ಥವಾಯಿತು"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ಸೆಟ್ಟಿಂಗ್ಗಳು"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"ಸಿಸ್ಟಂ ನ್ಯಾವಿಗೇಷನ ಅಪ್ಡೇಟ್ ಮಾಡಲಾಗಿದೆ ಬದಲಾವಣೆಗಳನ್ನು ಮಾಡಲು, ಸೆಟ್ಟಿಂಗ್ಗಳಿಗೆ ಹೋಗಿ."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"ಸಿಸ್ಟಂ ನ್ಯಾವಿಗೇಷನ್ ಅಪ್ಡೇಟ್ ಮಾಡಲು ಸೆಟ್ಟಿಂಗ್ಗಳಿಗೆ ಹೋಗಿ"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ಸ್ಟ್ಯಾಂಡ್ಬೈ"</string> diff --git a/packages/SystemUI/res/values-ky-ldrtl/strings.xml b/packages/SystemUI/res/values-ky-ldrtl/strings.xml index b01a195dae38..2bc0fe45895a 100644 --- a/packages/SystemUI/res/values-ky-ldrtl/strings.xml +++ b/packages/SystemUI/res/values-ky-ldrtl/strings.xml @@ -19,5 +19,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Колдонмолорду тез которуштуруу үчүн солго сүйрөңүз"</string> + <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Колдонмолорду тез которуштуруу үчүн, солго сүйрөңүз"</string> </resources> diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index da4dae0c12d6..d7e6b3b687ad 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -999,8 +999,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"ബബിളുകൾ ഏതുസമയത്തും നിയന്ത്രിക്കുക"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"ഈ ആപ്പിൽ നിന്നുള്ള ബബിളുകൾ ഓഫാക്കാൻ മാനേജ് ചെയ്യുക ടാപ്പ് ചെയ്യുക"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"ലഭിച്ചു"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ക്രമീകരണം"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"സിസ്റ്റം നാവിഗേഷൻ അപ്ഡേറ്റ് ചെയ്തു. മാറ്റങ്ങൾ വരുത്താൻ ക്രമീകരണത്തിലേക്ക് പോവുക."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"സിസ്റ്റം നാവിഗേഷൻ അപ്ഡേറ്റ് ചെയ്യാൻ ക്രമീകരണത്തിലേക്ക് പോവുക"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"സ്റ്റാൻഡ്ബൈ"</string> diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index cd6aa2acdc25..af8a52db49be 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -999,8 +999,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"बबल कधीही नियंत्रित करा"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"या अॅपमधून बबल बंद करण्यासाठी व्यवस्थापित करा वर टॅप करा"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"समजले"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> सेटिंग्ज"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"सिस्टम नेव्हिगेशन अपडेट केले. बदल करण्यासाठी, सेटिंग्जवर जा."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"सिस्टम नेव्हिगेशन अपडेट करण्यासाठी सेटिंग्जवर जा"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"स्टँडबाय"</string> diff --git a/packages/SystemUI/res/values-ne-ldrtl/strings.xml b/packages/SystemUI/res/values-ne-ldrtl/strings.xml index b154443ad78b..4594c55aa447 100644 --- a/packages/SystemUI/res/values-ne-ldrtl/strings.xml +++ b/packages/SystemUI/res/values-ne-ldrtl/strings.xml @@ -19,5 +19,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"अनुप्रयोगहरू द्रुत गतिमा बदल्न बायाँतिर ड्र्याग गर्नुहोस्"</string> + <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"एपहरू द्रुत गतिमा बदल्न बायाँतिर ड्र्याग गर्नुहोस्"</string> </resources> diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index f072dc41af07..04cdeaf7685c 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -999,8 +999,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"जुनसुकै बेला बबलहरू नियन्त्रण गर्नुहोस्"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"यो अनुप्रयोगबाट आएका बबलहरू निष्क्रिय पार्न व्यवस्थापन गर्नुहोस् नामक बटनमा ट्याप गर्नुहोस्"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"बुझेँ"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> का सेटिङहरू"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"प्रणालीको नेभिगेसन अद्यावधिक गरियो। परिवर्तन गर्न सेटिङमा जानुहोस्।"</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"प्रणालीको नेभिगेसन अद्यावधिक गर्न सेटिङमा जानुहोस्"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"स्ट्यान्डबाई"</string> diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml index 8acd97cbf003..5c0679675ae7 100644 --- a/packages/SystemUI/res/values-or/strings.xml +++ b/packages/SystemUI/res/values-or/strings.xml @@ -36,7 +36,7 @@ <string name="battery_saver_confirmation_title" msgid="1234998463717398453">"ବ୍ୟାଟେରୀ ସେଭର୍ ଚାଲୁ କରିବେ?"</string> <string name="battery_saver_confirmation_title_generic" msgid="2299231884234959849">"ବ୍ୟାଟେରୀ ସେଭର୍ ବିଷୟରେ"</string> <string name="battery_saver_confirmation_ok" msgid="5042136476802816494">"ଅନ୍ କରନ୍ତୁ"</string> - <string name="battery_saver_start_action" msgid="4553256017945469937">"ବ୍ୟାଟେରୀ ସେଭର୍ ଅନ୍ କରନ୍ତୁ"</string> + <string name="battery_saver_start_action" msgid="4553256017945469937">"ବ୍ୟାଟେରୀ ସେଭର୍ ଚାଲୁ କରନ୍ତୁ"</string> <string name="status_bar_settings_settings_button" msgid="534331565185171556">"ସେଟିଂସ୍"</string> <string name="status_bar_settings_wifi_button" msgid="7243072479837270946">"ୱାଇ-ଫାଇ"</string> <string name="status_bar_settings_auto_rotation" msgid="8329080442278431708">"ଅଟୋ-ରୋଟେଟ୍ ସ୍କ୍ରିନ୍"</string> @@ -999,8 +999,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"ଯେ କୌଣସି ସମୟରେ ବବଲଗୁଡ଼ିକ ନିୟନ୍ତ୍ରଣ କରନ୍ତୁ"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"ଏହି ଆପର ବବଲଗୁଡ଼ିକ ବନ୍ଦ କରିବା ପାଇଁ \'ପରିଚାଳନା କରନ୍ତୁ\' ବଟନରେ ଟାପ୍ କରନ୍ତୁ"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"ବୁଝିଗଲି"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ସେଟିଂସ୍"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"ସିଷ୍ଟମ୍ ନାଭିଗେସନ୍ ଅପ୍ଡେଟ୍ ହୋଇଛି। ପରିବର୍ତ୍ତନ କରିବା ପାଇଁ, ସେଟିଂସ୍କୁ ଯାଆନ୍ତୁ।"</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"ସିଷ୍ଟମ୍ ନାଭିଗେସନ୍ ଅପ୍ଡେଟ୍ କରିବା ପାଇଁ ସେଟିଂସ୍କୁ ଯାଆନ୍ତୁ"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ଷ୍ଟାଣ୍ଡବାଏ"</string> diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index 4602968b1151..88ae0360010d 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -999,8 +999,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"ਬਬਲ ਨੂੰ ਕਿਸੇ ਵੇਲੇ ਵੀ ਕੰਟਰੋਲ ਕਰੋ"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"ਇਸ ਐਪ \'ਤੇ ਬਬਲ ਬੰਦ ਕਰਨ ਲਈ \'ਪ੍ਰਬੰਧਨ ਕਰੋ\' \'ਤੇ ਟੈਪ ਕਰੋ"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"ਸਮਝ ਲਿਆ"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ਸੈਟਿੰਗਾਂ"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"ਸਿਸਟਮ ਨੈਵੀਗੇਸ਼ਨ ਅੱਪਡੇਟ ਹੋ ਗਿਆ। ਤਬਦੀਲੀਆਂ ਕਰਨ ਲਈ, ਸੈਟਿੰਗਾਂ \'ਤੇ ਜਾਓ।"</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"ਸਿਸਟਮ ਨੈਵੀਗੇਸ਼ਨ ਨੂੰ ਅੱਪਡੇਟ ਕਰਨ ਲਈ ਸੈਟਿੰਗਾਂ \'ਤੇ ਜਾਓ"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ਸਟੈਂਡਬਾਈ"</string> diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index 4d90e7866cd7..9a2b77fa388b 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -999,8 +999,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"బబుల్స్ను ఎప్పుడైనా నియంత్రించండి"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"ఈ యాప్ నుండి వచ్చే బబుల్స్ను ఆఫ్ చేయడానికి మేనేజ్ బటన్ను ట్యాప్ చేయండి"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"అర్థమైంది"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> సెట్టింగ్లు"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"సిస్టమ్ నావిగేషన్ అప్డేట్ చేయబడింది. మార్పులు చేయడానికి, సెట్టింగ్లకు వెళ్లండి."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"సిస్టమ్ నావిగేషన్ను అప్డేట్ చేయడానికి సెట్టింగ్లకు వెళ్లండి"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"స్టాండ్బై"</string> diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml index b9cc796434ff..a993cb33c264 100644 --- a/packages/SystemUI/res/values-ur/strings.xml +++ b/packages/SystemUI/res/values-ur/strings.xml @@ -999,8 +999,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"کسی بھی وقت بلبلے کو کنٹرول کریں"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"اس ایپ سے بلبلوں کو آف کرنے کے لیے نظم کریں پر تھپتھپائیں"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"سمجھ آ گئی"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ترتیبات"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"سسٹم نیویگیشن اپ ڈیٹ کیا گیا۔ تبدیلیاں کرنے کے لیے، ترتیبات پر جائیں۔"</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"سسٹم نیویگیشن اپ ڈیٹ کرنے کے لیے ترتیبات پر جائیں"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"اسٹینڈ بائی"</string> diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index d639ed074240..43ebb4082650 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -1021,6 +1021,9 @@ <!-- QuickSettings: Text to prompt the user to stop an ongoing recording [CHAR LIMIT=20] --> <string name="quick_settings_screen_record_stop">Stop</string> + <!-- Default name for the media device shown in the output switcher when the name is not available [CHAR LIMIT=30] --> + <string name="media_seamless_remote_device">Device</string> + <!-- Recents: Text that shows above the navigation bar after launching a few apps. [CHAR LIMIT=NONE] --> <string name="recents_swipe_up_onboarding">Swipe up to switch apps</string> <!-- Recents: Text that shows above the navigation bar after launching several apps. [CHAR LIMIT=NONE] --> @@ -1844,6 +1847,9 @@ <!-- [CHAR LIMIT=150] Notification Importance title: important conversation level --> <string name="notification_priority_title">Priority</string> + <!-- Text shown in notification guts for conversation notifications that don't implement the full feature --> + <string name="no_shortcut"><xliff:g id="app_name" example="YouTube">%1$s</xliff:g> does not support conversation specific settings</string> + <!-- [CHAR LIMIT=NONE] Empty overflow title --> <string name="bubble_overflow_empty_title">No recent bubbles</string> diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginInstanceManager.java b/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginInstanceManager.java index ed9c98b47b08..c8607df8fe0b 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginInstanceManager.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginInstanceManager.java @@ -256,9 +256,9 @@ public class PluginInstanceManager<T extends Plugin> { case QUERY_ALL: if (DEBUG) Log.d(TAG, "queryAll " + mAction); for (int i = mPlugins.size() - 1; i >= 0; i--) { - PluginInfo<T> plugin = mPlugins.get(i); + PluginInfo<T> pluginInfo = mPlugins.get(i); mMainHandler.obtainMessage( - mMainHandler.PLUGIN_DISCONNECTED, plugin).sendToTarget(); + MainHandler.PLUGIN_DISCONNECTED, pluginInfo.mPlugin).sendToTarget(); } mPlugins.clear(); handleQueryPlugins(null); diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java b/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java index cbdae4e6fe63..c84701c9512e 100644 --- a/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java +++ b/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java @@ -139,7 +139,7 @@ public class SystemUIApplication extends Application implements */ public void startServicesIfNeeded() { - String[] names = getResources().getStringArray(R.array.config_systemUIServiceComponents); + String[] names = SystemUIFactory.getInstance().getSystemUIServiceComponents(getResources()); startServicesIfNeeded(/* metricsPrefix= */ "StartServices", names); } @@ -150,8 +150,8 @@ public class SystemUIApplication extends Application implements * <p>This method must only be called from the main thread.</p> */ void startSecondaryUserServicesIfNeeded() { - String[] names = - getResources().getStringArray(R.array.config_systemUIServiceComponentsPerUser); + String[] names = SystemUIFactory.getInstance().getSystemUIServiceComponentsPerUser( + getResources()); startServicesIfNeeded(/* metricsPrefix= */ "StartSecondaryServices", names); } diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java index fb40774a1f5c..be82a2d5325b 100644 --- a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java +++ b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java @@ -18,6 +18,7 @@ package com.android.systemui; import android.annotation.NonNull; import android.content.Context; +import android.content.res.Resources; import android.os.Handler; import android.os.Looper; import android.util.Log; @@ -120,6 +121,16 @@ public class SystemUIFactory { return mRootComponent; } + /** Returns the list of system UI components that should be started. */ + public String[] getSystemUIServiceComponents(Resources resources) { + return resources.getStringArray(R.array.config_systemUIServiceComponents); + } + + /** Returns the list of system UI components that should be started per user. */ + public String[] getSystemUIServiceComponentsPerUser(Resources resources) { + return resources.getStringArray(R.array.config_systemUIServiceComponentsPerUser); + } + /** * Creates an instance of ScreenshotNotificationSmartActionsProvider. * This method is overridden in vendor specific implementation of Sys UI. diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java index e8fd7e0e8b38..da2a56d65124 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java @@ -54,7 +54,6 @@ import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.content.res.Configuration; import android.graphics.Rect; -import android.os.Handler; import android.os.RemoteException; import android.os.ServiceManager; import android.service.notification.NotificationListenerService; @@ -177,9 +176,6 @@ public class BubbleController implements ConfigurationController.ConfigurationLi private IStatusBarService mBarService; private SysUiState mSysUiState; - // Used to post to main UI thread - private Handler mHandler = new Handler(); - // Used for determining view rect for touch interaction private Rect mTempRect = new Rect(); @@ -812,17 +808,7 @@ public class BubbleController implements ConfigurationController.ConfigurationLi Bubble bubble = mBubbleData.getOrCreateBubble(notif); bubble.setInflateSynchronously(mInflateSynchronously); bubble.inflate( - b -> { - mBubbleData.notificationEntryUpdated(b, suppressFlyout, showInShade); - if (bubble.getBubbleIntent() == null) { - return; - } - bubble.getBubbleIntent().registerCancelListener(pendingIntent -> { - mHandler.post( - () -> removeBubble(bubble.getEntry(), - BubbleController.DISMISS_INVALID_INTENT)); - }); - }, + b -> mBubbleData.notificationEntryUpdated(b, suppressFlyout, showInShade), mContext, mStackView, mBubbleIconFactory); } diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleOverflowActivity.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleOverflowActivity.java index 37841f24a3cf..13bc55c9dcb6 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleOverflowActivity.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleOverflowActivity.java @@ -21,6 +21,7 @@ import static com.android.systemui.bubbles.BubbleDebugConfig.TAG_BUBBLES; import static com.android.systemui.bubbles.BubbleDebugConfig.TAG_WITH_CLASS_NAME; import android.app.Activity; +import android.content.Context; import android.content.res.Configuration; import android.content.res.Resources; import android.content.res.TypedArray; @@ -60,6 +61,16 @@ public class BubbleOverflowActivity extends Activity { private RecyclerView mRecyclerView; private List<Bubble> mOverflowBubbles = new ArrayList<>(); + private class NoScrollGridLayoutManager extends GridLayoutManager { + NoScrollGridLayoutManager(Context context, int columns) { + super(context, columns); + } + @Override + public boolean canScrollVertically() { + return false; + } + } + @Inject public BubbleOverflowActivity(BubbleController controller) { mBubbleController = controller; @@ -78,7 +89,7 @@ public class BubbleOverflowActivity extends Activity { Resources res = getResources(); final int columns = res.getInteger(R.integer.bubbles_overflow_columns); mRecyclerView.setLayoutManager( - new GridLayoutManager(getApplicationContext(), columns)); + new NoScrollGridLayoutManager(getApplicationContext(), columns)); DisplayMetrics displayMetrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeDockHandler.java b/packages/SystemUI/src/com/android/systemui/doze/DozeDockHandler.java index 3f88f252bfe7..554457b3564a 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeDockHandler.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeDockHandler.java @@ -75,6 +75,12 @@ public class DozeDockHandler implements DozeMachine.Part { public void onEvent(int dockState) { if (DEBUG) Log.d(TAG, "dock event = " + dockState); + // Only act upon state changes, otherwise we might overwrite other transitions, + // like proximity sensor initialization. + if (mDockState == dockState) { + return; + } + mDockState = dockState; if (isPulsing()) { return; diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java index ddc9c9d7c314..b12d02d26b9b 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java +++ b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java @@ -36,6 +36,7 @@ import android.media.MediaDescription; import android.media.MediaMetadata; import android.media.ThumbnailUtils; import android.media.session.MediaController; +import android.media.session.MediaController.PlaybackInfo; import android.media.session.MediaSession; import android.media.session.PlaybackState; import android.net.Uri; @@ -96,6 +97,7 @@ public class MediaControlPanel { public static final String MEDIA_PREFERENCE_KEY = "browser_components"; private SharedPreferences mSharedPrefs; private boolean mCheckedForResumption = false; + private boolean mIsRemotePlayback; // Button IDs used in notifications protected static final int[] NOTIF_ACTION_IDS = { @@ -300,6 +302,13 @@ public class MediaControlPanel { Log.d(TAG, "LocalMediaManager is null. Not binding output chip for pkg=" + pkgName); } } + PlaybackInfo playbackInfo = mController.getPlaybackInfo(); + if (playbackInfo != null) { + mIsRemotePlayback = playbackInfo.getPlaybackType() == PlaybackInfo.PLAYBACK_TYPE_REMOTE; + } else { + Log.d(TAG, "PlaybackInfo was null. Defaulting to local playback."); + mIsRemotePlayback = false; + } makeActive(); @@ -545,7 +554,16 @@ public class MediaControlPanel { TextView deviceName = mSeamless.findViewById(R.id.media_seamless_text); deviceName.setTextColor(fgTintList); - if (device != null) { + if (mIsRemotePlayback) { + mSeamless.setEnabled(false); + mSeamless.setAlpha(0.38f); + iconView.setImageResource(R.drawable.ic_hardware_speaker); + iconView.setVisibility(View.VISIBLE); + iconView.setImageTintList(fgTintList); + deviceName.setText(R.string.media_seamless_remote_device); + } else if (device != null) { + mSeamless.setEnabled(true); + mSeamless.setAlpha(1f); Drawable icon = device.getIcon(); iconView.setVisibility(View.VISIBLE); iconView.setImageTintList(fgTintList); @@ -561,6 +579,8 @@ public class MediaControlPanel { } else { // Reset to default Log.d(TAG, "device is null. Not binding output chip."); + mSeamless.setEnabled(true); + mSeamless.setAlpha(1f); iconView.setVisibility(View.GONE); deviceName.setText(com.android.internal.R.string.ext_media_seamless_action); } diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java index 290816b7e8af..fdf2c34f9850 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java @@ -82,6 +82,7 @@ import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.statusbar.phone.StatusBar; +import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.concurrent.ExecutionException; @@ -162,6 +163,9 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset private static final long SCREENSHOT_TO_CORNER_X_DURATION_MS = 234; private static final long SCREENSHOT_TO_CORNER_Y_DURATION_MS = 500; private static final long SCREENSHOT_TO_CORNER_SCALE_DURATION_MS = 234; + private static final long SCREENSHOT_ACTIONS_EXPANSION_DURATION_MS = 400; + private static final long SCREENSHOT_ACTIONS_ALPHA_DURATION_MS = 100; + private static final float SCREENSHOT_ACTIONS_START_SCALE_X = .7f; private static final float ROUNDED_CORNER_RADIUS = .05f; private static final long SCREENSHOT_CORNER_TIMEOUT_MILLIS = 6000; private static final int MESSAGE_CORNER_TIMEOUT = 2; @@ -263,6 +267,7 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset mScreenshotSelectorView.setFocusableInTouchMode(true); mScreenshotView.setPivotX(0); mScreenshotView.setPivotY(0); + mActionsContainer.setPivotX(0); // Setup the window that we are going to use mWindowLayoutParams = new WindowManager.LayoutParams( @@ -661,6 +666,8 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset } catch (RemoteException e) { } + ArrayList<ScreenshotActionChip> chips = new ArrayList<>(); + for (Notification.Action smartAction : imageData.smartActions) { ScreenshotActionChip actionChip = (ScreenshotActionChip) inflater.inflate( R.layout.global_screenshot_action_chip, mActionsView, false); @@ -673,6 +680,7 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset mOnCompleteRunnable.run(); }); mActionsView.addView(actionChip); + chips.add(actionChip); } ScreenshotActionChip shareChip = (ScreenshotActionChip) inflater.inflate( @@ -685,6 +693,7 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset mOnCompleteRunnable.run(); }); mActionsView.addView(shareChip); + chips.add(shareChip); ScreenshotActionChip editChip = (ScreenshotActionChip) inflater.inflate( R.layout.global_screenshot_action_chip, mActionsView, false); @@ -696,6 +705,7 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset mOnCompleteRunnable.run(); }); mActionsView.addView(editChip); + chips.add(editChip); mScreenshotView.setOnClickListener(v -> { try { @@ -709,7 +719,6 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset }); mScreenshotView.setContentDescription(imageData.editAction.title); - if (DeviceConfig.getBoolean(NAMESPACE_SYSTEMUI, SCREENSHOT_SCROLLING_ENABLED, false)) { ScreenshotActionChip scrollChip = (ScreenshotActionChip) inflater.inflate( R.layout.global_screenshot_action_chip, mActionsView, false); @@ -723,18 +732,27 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset scrollNotImplemented.show(); }); mActionsView.addView(scrollChip); + chips.add(scrollChip); } ValueAnimator animator = ValueAnimator.ofFloat(0, 1); - mActionsContainer.setY(mDisplayMetrics.heightPixels); + animator.setDuration(SCREENSHOT_ACTIONS_EXPANSION_DURATION_MS); + float alphaFraction = (float) SCREENSHOT_ACTIONS_ALPHA_DURATION_MS + / SCREENSHOT_ACTIONS_EXPANSION_DURATION_MS; mActionsContainer.setVisibility(VISIBLE); - mActionsContainer.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); - float actionsViewHeight = mActionsContainer.getMeasuredHeight() + mScreenshotHeightPx; + mActionsContainer.setAlpha(0); animator.addUpdateListener(animation -> { float t = animation.getAnimatedFraction(); mBackgroundProtection.setAlpha(t); - mActionsContainer.setY(mDisplayMetrics.heightPixels - actionsViewHeight * t); + mActionsContainer.setAlpha(t < alphaFraction ? t / alphaFraction : 1); + float containerScale = SCREENSHOT_ACTIONS_START_SCALE_X + + (t * (1 - SCREENSHOT_ACTIONS_START_SCALE_X)); + mActionsContainer.setScaleX(containerScale); + for (ScreenshotActionChip chip : chips) { + chip.setAlpha(t); + chip.setScaleX(1 / containerScale); // invert to keep size of children constant + } }); return animator; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationChannelHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationChannelHelper.java index ff945d15a4ed..1c2a00ed601a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationChannelHelper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationChannelHelper.java @@ -26,7 +26,6 @@ import android.os.UserHandle; import android.text.TextUtils; import android.util.Slog; -import com.android.systemui.R; import com.android.systemui.statusbar.notification.collection.NotificationEntry; /** @@ -44,32 +43,18 @@ public class NotificationChannelHelper { if (!TextUtils.isEmpty(channel.getConversationId())) { return channel; } - final String conversationId = entry.getSbn().getShortcutId(context); + final String conversationId = entry.getSbn().getShortcutId(); final String pkg = entry.getSbn().getPackageName(); final int appUid = entry.getSbn().getUid(); - if (TextUtils.isEmpty(conversationId) || TextUtils.isEmpty(pkg)) { + if (TextUtils.isEmpty(conversationId) || TextUtils.isEmpty(pkg) + || entry.getRanking().getShortcutInfo() == null) { return channel; } - String name; - if (entry.getRanking().getShortcutInfo() != null) { - name = entry.getRanking().getShortcutInfo().getShortLabel().toString(); - } else { - Bundle extras = entry.getSbn().getNotification().extras; - String nameString = extras.getString(Notification.EXTRA_CONVERSATION_TITLE); - if (TextUtils.isEmpty(nameString)) { - nameString = extras.getString(Notification.EXTRA_TITLE); - } - name = nameString; - } - // If this channel is not already a customized conversation channel, create // a custom channel try { - // TODO: When shortcuts are enforced remove this and use the shortcut label for naming - channel.setName(context.getString( - R.string.notification_summary_message_format, - name, channel.getName())); + channel.setName(getName(entry)); notificationManager.createConversationNotificationChannelForPackage( pkg, appUid, entry.getSbn().getKey(), channel, conversationId); @@ -81,4 +66,19 @@ public class NotificationChannelHelper { } return channel; } + + private static String getName(NotificationEntry entry) { + if (entry.getRanking().getShortcutInfo().getShortLabel() != null) { + return entry.getRanking().getShortcutInfo().getShortLabel().toString(); + } + Bundle extras = entry.getSbn().getNotification().extras; + String nameString = extras.getString(Notification.EXTRA_CONVERSATION_TITLE); + if (TextUtils.isEmpty(nameString)) { + nameString = extras.getString(Notification.EXTRA_TITLE); + } + if (TextUtils.isEmpty(nameString)) { + nameString = "fallback"; + } + return nameString; + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java index a9bb416cbebb..66b2ca633ca1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java @@ -1141,6 +1141,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView if (mMenuRow.shouldUseDefaultMenuItems()) { ArrayList<MenuItem> items = new ArrayList<>(); items.add(NotificationMenuRow.createConversationItem(mContext)); + items.add(NotificationMenuRow.createPartialConversationItem(mContext)); items.add(NotificationMenuRow.createInfoItem(mContext)); items.add(NotificationMenuRow.createSnoozeItem(mContext)); items.add(NotificationMenuRow.createAppOpsItem(mContext)); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java index f23f3bf28312..e9849ec84987 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java @@ -1347,11 +1347,11 @@ public class NotificationContentView extends FrameLayout { if (bubbleButton == null || actionContainer == null) { return; } - boolean isPerson = + boolean isPersonWithShortcut = mPeopleIdentifier.getPeopleNotificationType(entry.getSbn(), entry.getRanking()) - != PeopleNotificationIdentifier.TYPE_NON_PERSON; + >= PeopleNotificationIdentifier.TYPE_FULL_PERSON; boolean showButton = isBubblesEnabled() - && isPerson + && isPersonWithShortcut && entry.getBubbleMetadata() != null; if (showButton) { Drawable d = mContext.getResources().getDrawable(entry.isBubble() diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java index 23b911b6f687..863951e655e9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java @@ -97,7 +97,6 @@ public class NotificationConversationInfo extends LinearLayout implements private String mDelegatePkg; private NotificationChannel mNotificationChannel; private ShortcutInfo mShortcutInfo; - private String mConversationId; private StatusBarNotification mSbn; @Nullable private Notification.BubbleMetadata mBubbleMetadata; private Context mUserContext; @@ -233,14 +232,10 @@ public class NotificationConversationInfo extends LinearLayout implements mBuilderProvider = builderProvider; mShortcutManager = shortcutManager; - mConversationId = mNotificationChannel.getConversationId(); - if (TextUtils.isEmpty(mNotificationChannel.getConversationId())) { - mConversationId = mSbn.getShortcutId(mContext); - } - if (TextUtils.isEmpty(mConversationId)) { + mShortcutInfo = entry.getRanking().getShortcutInfo(); + if (mShortcutInfo == null) { throw new IllegalArgumentException("Does not have required information"); } - mShortcutInfo = entry.getRanking().getShortcutInfo(); mNotificationChannel = NotificationChannelHelper.createConversationChannelIfNeeded( getContext(), mINotificationManager, entry, mNotificationChannel); @@ -319,31 +314,9 @@ public class NotificationConversationInfo extends LinearLayout implements private void bindIcon(boolean important) { ImageView image = findViewById(R.id.conversation_icon); - if (mShortcutInfo != null) { - image.setImageDrawable(mIconFactory.getConversationDrawable( - mShortcutInfo, mPackageName, mAppUid, - important)); - } else { - if (mSbn.getNotification().extras.getBoolean(EXTRA_IS_GROUP_CONVERSATION, false)) { - // TODO: maybe use a generic group icon, or a composite of recent senders - image.setImageDrawable(mPm.getDefaultActivityIcon()); - } else { - final List<Notification.MessagingStyle.Message> messages = - Notification.MessagingStyle.Message.getMessagesFromBundleArray( - (Parcelable[]) mSbn.getNotification().extras.get( - Notification.EXTRA_MESSAGES)); - - final Notification.MessagingStyle.Message latestMessage = - Notification.MessagingStyle.findLatestIncomingMessage(messages); - Icon personIcon = latestMessage.getSenderPerson().getIcon(); - if (personIcon != null) { - image.setImageIcon(latestMessage.getSenderPerson().getIcon()); - } else { - // TODO: choose something better - image.setImageDrawable(mPm.getDefaultActivityIcon()); - } - } - } + image.setImageDrawable(mIconFactory.getConversationDrawable( + mShortcutInfo, mPackageName, mAppUid, important)); + } private void bindPackage() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java index 1c808cf90321..9c7de2bbf2ae 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java @@ -252,6 +252,9 @@ public class NotificationGutsManager implements Dumpable, NotificationLifetimeEx } else if (gutsView instanceof NotificationConversationInfo) { initializeConversationNotificationInfo( row, (NotificationConversationInfo) gutsView); + } else if (gutsView instanceof PartialConversationInfo) { + initializePartialConversationNotificationInfo(row, + (PartialConversationInfo) gutsView); } return true; } catch (Exception e) { @@ -357,7 +360,47 @@ public class NotificationGutsManager implements Dumpable, NotificationLifetimeEx } /** - * Sets up the {@link NotificationConversationInfo} inside the notification row's guts. + * Sets up the {@link PartialConversationInfo} inside the notification row's guts. + * @param row view to set up the guts for + * @param notificationInfoView view to set up/bind within {@code row} + */ + @VisibleForTesting + void initializePartialConversationNotificationInfo( + final ExpandableNotificationRow row, + PartialConversationInfo notificationInfoView) throws Exception { + NotificationGuts guts = row.getGuts(); + StatusBarNotification sbn = row.getEntry().getSbn(); + String packageName = sbn.getPackageName(); + // Settings link is only valid for notifications that specify a non-system user + NotificationInfo.OnSettingsClickListener onSettingsClick = null; + UserHandle userHandle = sbn.getUser(); + PackageManager pmUser = StatusBar.getPackageManagerForUser( + mContext, userHandle.getIdentifier()); + + if (!userHandle.equals(UserHandle.ALL) + || mLockscreenUserManager.getCurrentUserId() == UserHandle.USER_SYSTEM) { + onSettingsClick = (View v, NotificationChannel channel, int appUid) -> { + mMetricsLogger.action(MetricsProto.MetricsEvent.ACTION_NOTE_INFO); + guts.resetFalsingCheck(); + mOnSettingsClickListener.onSettingsClick(sbn.getKey()); + startAppNotificationSettingsActivity(packageName, appUid, channel, row); + }; + } + + notificationInfoView.bindNotification( + pmUser, + mNotificationManager, + packageName, + row.getEntry().getChannel(), + row.getUniqueChannels(), + row.getEntry(), + onSettingsClick, + mDeviceProvisionedController.isDeviceProvisioned(), + row.getIsNonblockable()); + } + + /** + * Sets up the {@link ConversationInfo} inside the notification row's guts. * @param row view to set up the guts for * @param notificationInfoView view to set up/bind within {@code row} */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java index 83a6eb297ab3..5e1e3b255867 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java @@ -268,7 +268,9 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl NotificationEntry entry = mParent.getEntry(); int personNotifType = mPeopleNotificationIdentifier .getPeopleNotificationType(entry.getSbn(), entry.getRanking()); - if (personNotifType != PeopleNotificationIdentifier.TYPE_NON_PERSON) { + if (personNotifType == PeopleNotificationIdentifier.TYPE_PERSON) { + mInfoItem = createPartialConversationItem(mContext); + } else if (personNotifType >= PeopleNotificationIdentifier.TYPE_FULL_PERSON) { mInfoItem = createConversationItem(mContext); } else { mInfoItem = createInfoItem(mContext); @@ -667,6 +669,16 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl R.drawable.ic_settings); } + static NotificationMenuItem createPartialConversationItem(Context context) { + Resources res = context.getResources(); + String infoDescription = res.getString(R.string.notification_menu_gear_description); + PartialConversationInfo infoContent = + (PartialConversationInfo) LayoutInflater.from(context).inflate( + R.layout.partial_conversation_info, null, false); + return new NotificationMenuItem(context, infoDescription, infoContent, + R.drawable.ic_settings); + } + static NotificationMenuItem createInfoItem(Context context) { Resources res = context.getResources(); String infoDescription = res.getString(R.string.notification_menu_gear_description); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/PartialConversationInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/PartialConversationInfo.java new file mode 100644 index 000000000000..2189b872da43 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/PartialConversationInfo.java @@ -0,0 +1,376 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.systemui.statusbar.notification.row; + +import static android.app.Notification.EXTRA_IS_GROUP_CONVERSATION; +import static android.app.NotificationManager.IMPORTANCE_LOW; +import static android.app.NotificationManager.IMPORTANCE_UNSPECIFIED; + +import static com.android.systemui.Interpolators.FAST_OUT_SLOW_IN; + +import static java.lang.annotation.RetentionPolicy.SOURCE; + +import android.annotation.IntDef; +import android.app.INotificationManager; +import android.app.Notification; +import android.app.NotificationChannel; +import android.app.NotificationChannelGroup; +import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.Icon; +import android.os.Bundle; +import android.os.Parcelable; +import android.os.RemoteException; +import android.service.notification.StatusBarNotification; +import android.text.TextUtils; +import android.transition.ChangeBounds; +import android.transition.Fade; +import android.transition.TransitionManager; +import android.transition.TransitionSet; +import android.util.AttributeSet; +import android.view.View; +import android.view.accessibility.AccessibilityEvent; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.android.internal.annotations.VisibleForTesting; +import com.android.systemui.Dependency; +import com.android.systemui.R; +import com.android.systemui.statusbar.notification.collection.NotificationEntry; + +import java.lang.annotation.Retention; +import java.util.List; +import java.util.Set; + +/** + * The guts of a conversation notification that doesn't use valid shortcuts that is revealed when + * performing a long press. + */ +public class PartialConversationInfo extends LinearLayout implements + NotificationGuts.GutsContent { + private static final String TAG = "PartialConvoGuts"; + + private INotificationManager mINotificationManager; + private PackageManager mPm; + private String mPackageName; + private String mAppName; + private int mAppUid; + private String mDelegatePkg; + private NotificationChannel mNotificationChannel; + private StatusBarNotification mSbn; + private boolean mIsDeviceProvisioned; + private boolean mIsNonBlockable; + private Set<NotificationChannel> mUniqueChannelsInRow; + private Drawable mPkgIcon; + + private @Action int mSelectedAction = -1; + private boolean mPressedApply; + private boolean mPresentingChannelEditorDialog = false; + + private NotificationInfo.OnSettingsClickListener mOnSettingsClickListener; + private NotificationGuts mGutsContainer; + private ChannelEditorDialogController mChannelEditorDialogController; + + @VisibleForTesting + boolean mSkipPost = false; + + @Retention(SOURCE) + @IntDef({ACTION_SETTINGS}) + private @interface Action {} + static final int ACTION_SETTINGS = 5; + + private OnClickListener mOnDone = v -> { + mPressedApply = true; + closeControls(v, true); + }; + + public PartialConversationInfo(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public void bindNotification( + PackageManager pm, + INotificationManager iNotificationManager, + String pkg, + NotificationChannel notificationChannel, + Set<NotificationChannel> uniqueChannelsInRow, + NotificationEntry entry, + NotificationInfo.OnSettingsClickListener onSettingsClick, + boolean isDeviceProvisioned, + boolean isNonBlockable) { + mSelectedAction = -1; + mINotificationManager = iNotificationManager; + mPackageName = pkg; + mSbn = entry.getSbn(); + mPm = pm; + mAppName = mPackageName; + mOnSettingsClickListener = onSettingsClick; + mNotificationChannel = notificationChannel; + mAppUid = mSbn.getUid(); + mDelegatePkg = mSbn.getOpPkg(); + mIsDeviceProvisioned = isDeviceProvisioned; + mIsNonBlockable = isNonBlockable; + mChannelEditorDialogController = Dependency.get(ChannelEditorDialogController.class); + mUniqueChannelsInRow = uniqueChannelsInRow; + + bindHeader(); + bindActions(); + + View turnOffButton = findViewById(R.id.turn_off_notifications); + turnOffButton.setOnClickListener(getTurnOffNotificationsClickListener()); + turnOffButton.setVisibility(turnOffButton.hasOnClickListeners() && !mIsNonBlockable + ? VISIBLE : GONE); + + View done = findViewById(R.id.done); + done.setOnClickListener(mOnDone); + } + + private void bindActions() { + final View settingsButton = findViewById(R.id.info); + settingsButton.setOnClickListener(getSettingsOnClickListener()); + settingsButton.setVisibility(settingsButton.hasOnClickListeners() ? VISIBLE : GONE); + + TextView msg = findViewById(R.id.non_configurable_text); + msg.setText(getResources().getString(R.string.no_shortcut, mAppName)); + } + + private void bindHeader() { + bindConversationDetails(); + + // Delegate + bindDelegate(); + } + + private OnClickListener getSettingsOnClickListener() { + if (mAppUid >= 0 && mOnSettingsClickListener != null && mIsDeviceProvisioned) { + final int appUidF = mAppUid; + return ((View view) -> { + mOnSettingsClickListener.onClick(view, mNotificationChannel, appUidF); + }); + } + return null; + } + + private OnClickListener getTurnOffNotificationsClickListener() { + return ((View view) -> { + if (!mPresentingChannelEditorDialog && mChannelEditorDialogController != null) { + mPresentingChannelEditorDialog = true; + + mChannelEditorDialogController.prepareDialogForApp(mAppName, mPackageName, mAppUid, + mUniqueChannelsInRow, mPkgIcon, mOnSettingsClickListener); + mChannelEditorDialogController.setOnFinishListener(() -> { + mPresentingChannelEditorDialog = false; + closeControls(this, false); + }); + mChannelEditorDialogController.show(); + } + }); + } + + private void bindConversationDetails() { + final TextView channelName = findViewById(R.id.parent_channel_name); + channelName.setText(mNotificationChannel.getName()); + + bindGroup(); + bindName(); + bindPackage(); + bindIcon(); + } + + private void bindName() { + TextView name = findViewById(R.id.name); + Bundle extras = mSbn.getNotification().extras; + String nameString = extras.getString(Notification.EXTRA_CONVERSATION_TITLE); + if (TextUtils.isEmpty(nameString)) { + nameString = extras.getString(Notification.EXTRA_TITLE); + } + name.setText(nameString); + } + + private void bindIcon() { + ImageView image = findViewById(R.id.conversation_icon); + if (mSbn.getNotification().extras.getBoolean(EXTRA_IS_GROUP_CONVERSATION, false)) { + // TODO: maybe use a generic group icon, or a composite of recent senders + image.setImageDrawable(mPkgIcon); + } else { + final List<Notification.MessagingStyle.Message> messages = + Notification.MessagingStyle.Message.getMessagesFromBundleArray( + (Parcelable[]) mSbn.getNotification().extras.get( + Notification.EXTRA_MESSAGES)); + + final Notification.MessagingStyle.Message latestMessage = + Notification.MessagingStyle.findLatestIncomingMessage(messages); + Icon personIcon = null; + if (latestMessage != null && latestMessage.getSenderPerson() != null) { + personIcon = latestMessage.getSenderPerson().getIcon(); + } + if (personIcon != null) { + image.setImageIcon(latestMessage.getSenderPerson().getIcon()); + } else { + image.setImageDrawable(mPkgIcon); + } + } + } + + private void bindPackage() { + ApplicationInfo info; + try { + info = mPm.getApplicationInfo( + mPackageName, + PackageManager.MATCH_UNINSTALLED_PACKAGES + | PackageManager.MATCH_DISABLED_COMPONENTS + | PackageManager.MATCH_DIRECT_BOOT_UNAWARE + | PackageManager.MATCH_DIRECT_BOOT_AWARE); + if (info != null) { + mAppName = String.valueOf(mPm.getApplicationLabel(info)); + mPkgIcon = mPm.getApplicationIcon(info); + } + } catch (PackageManager.NameNotFoundException e) { + mPkgIcon = mPm.getDefaultActivityIcon(); + } + ((TextView) findViewById(R.id.pkg_name)).setText(mAppName); + } + + private void bindDelegate() { + TextView delegateView = findViewById(R.id.delegate_name); + + if (!TextUtils.equals(mPackageName, mDelegatePkg)) { + // this notification was posted by a delegate! + delegateView.setVisibility(View.VISIBLE); + } else { + delegateView.setVisibility(View.GONE); + } + } + + private void bindGroup() { + // Set group information if this channel has an associated group. + CharSequence groupName = null; + if (mNotificationChannel != null && mNotificationChannel.getGroup() != null) { + try { + final NotificationChannelGroup notificationChannelGroup = + mINotificationManager.getNotificationChannelGroupForPackage( + mNotificationChannel.getGroup(), mPackageName, mAppUid); + if (notificationChannelGroup != null) { + groupName = notificationChannelGroup.getName(); + } + } catch (RemoteException e) { + } + } + TextView groupNameView = findViewById(R.id.group_name); + View groupDivider = findViewById(R.id.group_divider); + if (groupName != null) { + groupNameView.setText(groupName); + groupNameView.setVisibility(VISIBLE); + groupDivider.setVisibility(VISIBLE); + } else { + groupNameView.setVisibility(GONE); + groupDivider.setVisibility(GONE); + } + } + + @Override + public boolean post(Runnable action) { + if (mSkipPost) { + action.run(); + return true; + } else { + return super.post(action); + } + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + } + + @Override + public void onFinishedClosing() { + // TODO: do we need to do anything here? + } + + @Override + public void onInitializeAccessibilityEvent(AccessibilityEvent event) { + super.onInitializeAccessibilityEvent(event); + if (mGutsContainer != null && + event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) { + if (mGutsContainer.isExposed()) { + event.getText().add(mContext.getString( + R.string.notification_channel_controls_opened_accessibility, mAppName)); + } else { + event.getText().add(mContext.getString( + R.string.notification_channel_controls_closed_accessibility, mAppName)); + } + } + } + + /** + * Closes the controls and commits the updated importance values (indirectly). + * + * <p><b>Note,</b> this will only get called once the view is dismissing. This means that the + * user does not have the ability to undo the action anymore. + */ + @VisibleForTesting + void closeControls(View v, boolean save) { + int[] parentLoc = new int[2]; + int[] targetLoc = new int[2]; + mGutsContainer.getLocationOnScreen(parentLoc); + v.getLocationOnScreen(targetLoc); + final int centerX = v.getWidth() / 2; + final int centerY = v.getHeight() / 2; + final int x = targetLoc[0] - parentLoc[0] + centerX; + final int y = targetLoc[1] - parentLoc[1] + centerY; + mGutsContainer.closeControls(x, y, save, false /* force */); + } + + @Override + public void setGutsParent(NotificationGuts guts) { + mGutsContainer = guts; + } + + @Override + public boolean willBeRemoved() { + return false; + } + + @Override + public boolean shouldBeSaved() { + return mPressedApply; + } + + @Override + public View getContentView() { + return this; + } + + @Override + public boolean handleCloseControls(boolean save, boolean force) { + return false; + } + + @Override + public int getActualHeight() { + return getHeight(); + } + + @VisibleForTesting + public boolean isAnimating() { + return false; + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallback.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallback.java index 6193a8e9005b..428de9e9adbb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallback.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallback.java @@ -30,6 +30,7 @@ import android.content.IntentSender; import android.os.Handler; import android.os.RemoteException; import android.os.UserHandle; +import android.util.Log; import android.view.View; import android.view.ViewParent; @@ -47,6 +48,8 @@ import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout; import com.android.systemui.statusbar.policy.KeyguardStateController; +import java.util.concurrent.atomic.AtomicReference; + import javax.inject.Inject; import javax.inject.Singleton; @@ -54,7 +57,8 @@ import javax.inject.Singleton; */ @Singleton public class StatusBarRemoteInputCallback implements Callback, Callbacks, - StatusBarStateController.StateListener { + StatusBarStateController.StateListener, KeyguardStateController.Callback { + private static final String TAG = StatusBarRemoteInputCallback.class.getSimpleName(); private final KeyguardStateController mKeyguardStateController; private final SysuiStatusBarStateController mStatusBarStateController; @@ -72,6 +76,7 @@ public class StatusBarRemoteInputCallback implements Callback, Callbacks, private int mDisabled2; protected BroadcastReceiver mChallengeReceiver = new ChallengeReceiver(); private Handler mMainHandler = new Handler(); + private final AtomicReference<Intent> mPendingConfirmCredentialIntent = new AtomicReference(); /** */ @@ -98,6 +103,9 @@ public class StatusBarRemoteInputCallback implements Callback, Callbacks, mCommandQueue.addCallback(this); mActivityIntentHelper = new ActivityIntentHelper(mContext); mGroupManager = groupManager; + // Listen to onKeyguardShowingChanged in case a managed profile needs to be unlocked + // once the primary profile's keyguard is no longer shown. + mKeyguardStateController.addCallback(this); } @Override @@ -201,12 +209,39 @@ public class StatusBarRemoteInputCallback implements Callback, Callbacks, // Clear pending remote view, as we do not want to trigger pending remote input view when // it's called by other code mPendingWorkRemoteInputView = null; - // Begin old BaseStatusBar.startWorkChallengeIfNecessary. + + final Intent newIntent = createConfirmDeviceCredentialIntent( + userId, intendSender, notificationKey); + if (newIntent == null) { + Log.w(TAG, String.format("Cannot create intent to unlock user %d", userId)); + return false; + } + + mPendingConfirmCredentialIntent.set(newIntent); + + // If the Keyguard is currently showing, starting the ConfirmDeviceCredentialActivity + // would cause it to pause, not letting the user actually unlock the managed profile. + // Instead, wait until we receive a callback indicating it is no longer showing and + // then start the pending intent. + if (mKeyguardStateController.isShowing()) { + // Do nothing, since the callback will get the pending intent and start it. + Log.w(TAG, String.format("Keyguard is showing, waiting until it's not")); + } else { + startPendingConfirmDeviceCredentialIntent(); + } + + return true; + } + + private Intent createConfirmDeviceCredentialIntent( + int userId, IntentSender intendSender, String notificationKey) { final Intent newIntent = mKeyguardManager.createConfirmDeviceCredentialIntent(null, null, userId); + if (newIntent == null) { - return false; + return null; } + final Intent callBackIntent = new Intent(NOTIFICATION_UNLOCKED_BY_WORK_CHALLENGE_ACTION); callBackIntent.putExtra(Intent.EXTRA_INTENT, intendSender); callBackIntent.putExtra(Intent.EXTRA_INDEX, notificationKey); @@ -222,14 +257,40 @@ public class StatusBarRemoteInputCallback implements Callback, Callbacks, newIntent.putExtra( Intent.EXTRA_INTENT, callBackPendingIntent.getIntentSender()); + + return newIntent; + } + + private void startPendingConfirmDeviceCredentialIntent() { + final Intent pendingIntent = mPendingConfirmCredentialIntent.getAndSet(null); + if (pendingIntent == null) { + return; + } + try { - ActivityManager.getService().startConfirmDeviceCredentialIntent(newIntent, + if (mKeyguardStateController.isShowing()) { + Log.w(TAG, "Keyguard is showing while starting confirm device credential intent."); + } + ActivityManager.getService().startConfirmDeviceCredentialIntent(pendingIntent, null /*options*/); } catch (RemoteException ex) { // ignore } - return true; - // End old BaseStatusBar.startWorkChallengeIfNecessary. + } + + @Override + public void onKeyguardShowingChanged() { + if (mKeyguardStateController.isShowing()) { + // In order to avoid jarring UX where/ the managed profile challenge is shown and + // immediately dismissed, do not attempt to start the confirm device credential + // activity if the keyguard is still showing. + if (mPendingConfirmCredentialIntent.get() != null) { + Log.w(TAG, "There's a pending unlock intent but keyguard is still showing, abort."); + } + return; + } + + startPendingConfirmDeviceCredentialIntent(); } @Override diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeDockHandlerTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeDockHandlerTest.java index 9985d21e8515..dc027997578f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeDockHandlerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeDockHandlerTest.java @@ -19,6 +19,7 @@ package com.android.systemui.doze; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; @@ -83,7 +84,16 @@ public class DozeDockHandlerTest extends SysuiTestCase { } @Test + public void onEvent_noneWhileEnabledAod_ignoresIfAlreadyNone() { + mDockManagerFake.setDockEvent(DockManager.STATE_NONE); + + verify(mMachine, never()).requestState(eq(State.DOZE_AOD)); + } + + @Test public void onEvent_noneWhileEnabledAod_requestsAodState() { + mDockManagerFake.setDockEvent(DockManager.STATE_DOCKED); + clearInvocations(mMachine); mDockManagerFake.setDockEvent(DockManager.STATE_NONE); verify(mMachine).requestState(eq(State.DOZE_AOD)); @@ -91,6 +101,8 @@ public class DozeDockHandlerTest extends SysuiTestCase { @Test public void onEvent_noneWhileDisabledAod_requestsDozeState() { + mDockManagerFake.setDockEvent(DockManager.STATE_DOCKED); + clearInvocations(mMachine); doReturn(false).when(mConfig).alwaysOnEnabled(anyInt()); mDockManagerFake.setDockEvent(DockManager.STATE_NONE); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfoTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfoTest.java index 3847028a25df..dbf40e467c95 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfoTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfoTest.java @@ -386,7 +386,10 @@ public class NotificationConversationInfoTest extends SysuiTestCase { applicationInfo); when(mMockPackageManager.getApplicationLabel(any())).thenReturn("Other"); - NotificationEntry entry = new NotificationEntryBuilder().setSbn(mSbn).build(); + NotificationEntry entry = new NotificationEntryBuilder() + .setSbn(mSbn) + .setShortcutInfo(mShortcutInfo) + .build(); mNotificationInfo.bindNotification( mShortcutManager, mMockPackageManager, diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/PartialConversationInfoTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/PartialConversationInfoTest.java new file mode 100644 index 000000000000..c390e3933d7a --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/PartialConversationInfoTest.java @@ -0,0 +1,397 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.systemui.statusbar.notification.row; + +import static android.app.Notification.EXTRA_IS_GROUP_CONVERSATION; +import static android.app.NotificationManager.IMPORTANCE_LOW; +import static android.print.PrintManager.PRINT_SPOOLER_PACKAGE_NAME; +import static android.view.View.GONE; +import static android.view.View.VISIBLE; + +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertTrue; + +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.anyBoolean; +import static org.mockito.Mockito.anyInt; +import static org.mockito.Mockito.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import android.app.INotificationManager; +import android.app.Notification; +import android.app.NotificationChannel; +import android.app.NotificationChannelGroup; +import android.app.Person; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.Icon; +import android.os.UserHandle; +import android.service.notification.StatusBarNotification; +import android.test.suitebuilder.annotation.SmallTest; +import android.testing.AndroidTestingRunner; +import android.testing.TestableLooper; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import com.android.internal.logging.MetricsLogger; +import com.android.systemui.Dependency; +import com.android.systemui.R; +import com.android.systemui.SysuiTestCase; +import com.android.systemui.statusbar.notification.collection.NotificationEntry; +import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder; + +import org.junit.Before; +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 java.util.HashSet; +import java.util.Set; +import java.util.concurrent.CountDownLatch; + +@SmallTest +@RunWith(AndroidTestingRunner.class) +@TestableLooper.RunWithLooper +public class PartialConversationInfoTest extends SysuiTestCase { + private static final String TEST_PACKAGE_NAME = "test_package"; + private static final String TEST_SYSTEM_PACKAGE_NAME = PRINT_SPOOLER_PACKAGE_NAME; + private static final int TEST_UID = 1; + private static final String TEST_CHANNEL = "test_channel"; + private static final String TEST_CHANNEL_NAME = "TEST CHANNEL NAME"; + + private TestableLooper mTestableLooper; + private PartialConversationInfo mInfo; + private NotificationChannel mNotificationChannel; + private NotificationChannel mDefaultNotificationChannel; + private Set<NotificationChannel> mNotificationChannelSet = new HashSet<>(); + private Set<NotificationChannel> mDefaultNotificationChannelSet = new HashSet<>(); + private StatusBarNotification mSbn; + private NotificationEntry mEntry; + + @Rule + public MockitoRule mockito = MockitoJUnit.rule(); + @Mock + private MetricsLogger mMetricsLogger; + @Mock + private INotificationManager mMockINotificationManager; + @Mock + private PackageManager mMockPackageManager; + + @Mock + private Icon mIcon; + @Mock + private Drawable mDrawable; + + @Before + public void setUp() throws Exception { + mTestableLooper = TestableLooper.get(this); + + mDependency.injectTestDependency(Dependency.BG_LOOPER, mTestableLooper.getLooper()); + mDependency.injectTestDependency(MetricsLogger.class, mMetricsLogger); + // Inflate the layout + final LayoutInflater layoutInflater = LayoutInflater.from(mContext); + mInfo = (PartialConversationInfo) layoutInflater.inflate(R.layout.partial_conversation_info, + null); + mInfo.setGutsParent(mock(NotificationGuts.class)); + // Our view is never attached to a window so the View#post methods in NotificationInfo never + // get called. Setting this will skip the post and do the action immediately. + mInfo.mSkipPost = true; + + // PackageManager must return a packageInfo and applicationInfo. + final PackageInfo packageInfo = new PackageInfo(); + packageInfo.packageName = TEST_PACKAGE_NAME; + when(mMockPackageManager.getPackageInfo(eq(TEST_PACKAGE_NAME), anyInt())) + .thenReturn(packageInfo); + final ApplicationInfo applicationInfo = new ApplicationInfo(); + applicationInfo.uid = TEST_UID; // non-zero + when(mMockPackageManager.getApplicationInfo(eq(TEST_PACKAGE_NAME), anyInt())).thenReturn( + applicationInfo); + final PackageInfo systemPackageInfo = new PackageInfo(); + systemPackageInfo.packageName = TEST_SYSTEM_PACKAGE_NAME; + when(mMockPackageManager.getPackageInfo(eq(TEST_SYSTEM_PACKAGE_NAME), anyInt())) + .thenReturn(systemPackageInfo); + when(mMockPackageManager.getPackageInfo(eq("android"), anyInt())) + .thenReturn(packageInfo); + + // Package has one channel by default. + when(mMockINotificationManager.getNumNotificationChannelsForPackage( + eq(TEST_PACKAGE_NAME), eq(TEST_UID), anyBoolean())).thenReturn(1); + + when(mIcon.loadDrawable(any())).thenReturn(mDrawable); + + // Some test channels. + mNotificationChannel = new NotificationChannel( + TEST_CHANNEL, TEST_CHANNEL_NAME, IMPORTANCE_LOW); + mNotificationChannelSet.add(mNotificationChannel); + mDefaultNotificationChannel = new NotificationChannel( + NotificationChannel.DEFAULT_CHANNEL_ID, TEST_CHANNEL_NAME, + IMPORTANCE_LOW); + mDefaultNotificationChannelSet.add(mDefaultNotificationChannel); + mSbn = new StatusBarNotification(TEST_PACKAGE_NAME, TEST_PACKAGE_NAME, 0, null, TEST_UID, 0, + new Notification(), UserHandle.CURRENT, null, 0); + mEntry = new NotificationEntryBuilder().setSbn(mSbn).build(); + } + + @Test + public void testBindNotification_SetsTextApplicationName() throws Exception { + when(mMockPackageManager.getApplicationLabel(any())).thenReturn("App Name"); + mInfo.bindNotification( + mMockPackageManager, + mMockINotificationManager, + TEST_PACKAGE_NAME, + mNotificationChannel, + mNotificationChannelSet, + mEntry, + null, + true, + false); + final TextView textView = mInfo.findViewById(R.id.pkg_name); + assertTrue(textView.getText().toString().contains("App Name")); + assertEquals(VISIBLE, mInfo.findViewById(R.id.header).getVisibility()); + } + + @Test + public void testBindNotification_groupSetsPackageIcon() { + mEntry.getSbn().getNotification().extras.putBoolean(EXTRA_IS_GROUP_CONVERSATION, true); + final Drawable iconDrawable = mock(Drawable.class); + when(mMockPackageManager.getApplicationIcon(any(ApplicationInfo.class))) + .thenReturn(iconDrawable); + mInfo.bindNotification( + mMockPackageManager, + mMockINotificationManager, + TEST_PACKAGE_NAME, + mNotificationChannel, + mNotificationChannelSet, + mEntry, + null, + true, + false); + final ImageView iconView = mInfo.findViewById(R.id.conversation_icon); + assertEquals(iconDrawable, iconView.getDrawable()); + } + + @Test + public void testBindNotification_notGroupSetsMessageIcon() { + Notification n = new Notification.Builder(mContext, TEST_CHANNEL_NAME) + .setStyle(new Notification.MessagingStyle( + new Person.Builder().setName("me").build()) + .addMessage(new Notification.MessagingStyle.Message("hello", 0, + new Person.Builder().setName("friend").setIcon(mIcon).build()))) + .build(); + mSbn = new StatusBarNotification(TEST_PACKAGE_NAME, TEST_PACKAGE_NAME, 0, null, TEST_UID, 0, + n, UserHandle.CURRENT, null, 0); + mEntry.setSbn(mSbn); + mEntry.getSbn().getNotification().extras.putBoolean(EXTRA_IS_GROUP_CONVERSATION, false); + mInfo.bindNotification( + mMockPackageManager, + mMockINotificationManager, + TEST_PACKAGE_NAME, + mNotificationChannel, + mNotificationChannelSet, + mEntry, + null, + true, + false); + final ImageView iconView = mInfo.findViewById(R.id.conversation_icon); + assertEquals(mDrawable.hashCode() + "", mDrawable, iconView.getDrawable()); + } + + @Test + public void testBindNotification_noDelegate() { + mInfo.bindNotification( + mMockPackageManager, + mMockINotificationManager, + TEST_PACKAGE_NAME, + mNotificationChannel, + mNotificationChannelSet, + mEntry, + null, + true, + false); + final TextView nameView = mInfo.findViewById(R.id.delegate_name); + assertEquals(GONE, nameView.getVisibility()); + final TextView dividerView = mInfo.findViewById(R.id.group_divider); + assertEquals(GONE, dividerView.getVisibility()); + } + + @Test + public void testBindNotification_delegate() throws Exception { + mSbn = new StatusBarNotification(TEST_PACKAGE_NAME, "other", 0, null, TEST_UID, 0, + new Notification(), UserHandle.CURRENT, null, 0); + final ApplicationInfo applicationInfo = new ApplicationInfo(); + applicationInfo.uid = 7; // non-zero + when(mMockPackageManager.getApplicationInfo(eq("other"), anyInt())).thenReturn( + applicationInfo); + when(mMockPackageManager.getApplicationLabel(any())).thenReturn("Other"); + + NotificationEntry entry = new NotificationEntryBuilder().setSbn(mSbn).build(); + mInfo.bindNotification( + mMockPackageManager, + mMockINotificationManager, + TEST_PACKAGE_NAME, + mNotificationChannel, + mNotificationChannelSet, + entry, + null, + true, + false); + final TextView nameView = mInfo.findViewById(R.id.delegate_name); + assertEquals(VISIBLE, nameView.getVisibility()); + assertTrue(nameView.getText().toString().contains("Proxied")); + } + + @Test + public void testBindNotification_GroupNameHiddenIfNoGroup() throws Exception { + mInfo.bindNotification( + mMockPackageManager, + mMockINotificationManager, + TEST_PACKAGE_NAME, + mNotificationChannel, + mNotificationChannelSet, + mEntry, + null, + true, + false); + final TextView groupNameView = mInfo.findViewById(R.id.group_name); + assertEquals(GONE, groupNameView.getVisibility()); + final TextView dividerView = mInfo.findViewById(R.id.group_divider); + assertEquals(GONE, dividerView.getVisibility()); + } + + @Test + public void testBindNotification_SetsGroupNameIfNonNull() throws Exception { + mNotificationChannel.setGroup("test_group_id"); + final NotificationChannelGroup notificationChannelGroup = + new NotificationChannelGroup("test_group_id", "Test Group Name"); + when(mMockINotificationManager.getNotificationChannelGroupForPackage( + eq("test_group_id"), eq(TEST_PACKAGE_NAME), eq(TEST_UID))) + .thenReturn(notificationChannelGroup); + mInfo.bindNotification( + mMockPackageManager, + mMockINotificationManager, + TEST_PACKAGE_NAME, + mNotificationChannel, + mNotificationChannelSet, + mEntry, + null, + true, + false); + final TextView groupNameView = mInfo.findViewById(R.id.group_name); + assertEquals(View.VISIBLE, groupNameView.getVisibility()); + assertEquals("Test Group Name", groupNameView.getText()); + final TextView dividerView = mInfo.findViewById(R.id.group_divider); + assertEquals(View.VISIBLE, dividerView.getVisibility()); + } + + @Test + public void testBindNotification_SetsTextChannelName() { + mInfo.bindNotification( + mMockPackageManager, + mMockINotificationManager, + TEST_PACKAGE_NAME, + mNotificationChannel, + mNotificationChannelSet, + mEntry, + null, + true, + false); + final TextView textView = mInfo.findViewById(R.id.parent_channel_name); + assertEquals(TEST_CHANNEL_NAME, textView.getText()); + } + + @Test + public void testBindNotification_SetsOnClickListenerForSettings() { + final CountDownLatch latch = new CountDownLatch(1); + mInfo.bindNotification( + mMockPackageManager, + mMockINotificationManager, + TEST_PACKAGE_NAME, + mNotificationChannel, + mNotificationChannelSet, + mEntry, + (View v, NotificationChannel c, int appUid) -> { + assertEquals(mNotificationChannel, c); + latch.countDown(); + }, + true, + false); + + final View settingsButton = mInfo.findViewById(R.id.info); + settingsButton.performClick(); + // Verify that listener was triggered. + assertEquals(0, latch.getCount()); + } + + @Test + public void testBindNotification_SettingsButtonInvisibleWhenNoClickListener() { + mInfo.bindNotification( + mMockPackageManager, + mMockINotificationManager, + TEST_PACKAGE_NAME, + mNotificationChannel, + mNotificationChannelSet, + mEntry, + null, + true, + false); + final View settingsButton = mInfo.findViewById(R.id.info); + assertTrue(settingsButton.getVisibility() != View.VISIBLE); + } + + @Test + public void testBindNotification_SettingsButtonInvisibleWhenDeviceUnprovisioned() { + mInfo.bindNotification( + mMockPackageManager, + mMockINotificationManager, + TEST_PACKAGE_NAME, + mNotificationChannel, + mNotificationChannelSet, + mEntry, + (View v, NotificationChannel c, int appUid) -> { + assertEquals(mNotificationChannel, c); + }, + false, + false); + final View settingsButton = mInfo.findViewById(R.id.info); + assertTrue(settingsButton.getVisibility() != View.VISIBLE); + } + + @Test + public void testBindNotification_whenAppUnblockable() { + mInfo.bindNotification( + mMockPackageManager, + mMockINotificationManager, + TEST_PACKAGE_NAME, + mNotificationChannel, + mNotificationChannelSet, + mEntry, + null, + true, + true); + + assertEquals(GONE, + mInfo.findViewById(R.id.turn_off_notifications).getVisibility()); + } +} diff --git a/packages/Tethering/jarjar-rules.txt b/packages/Tethering/jarjar-rules.txt index c6efa41e580a..e90a2ccaa2a3 100644 --- a/packages/Tethering/jarjar-rules.txt +++ b/packages/Tethering/jarjar-rules.txt @@ -8,7 +8,6 @@ rule com.android.internal.util.BitUtils* com.android.networkstack.tethering.util rule com.android.internal.util.IndentingPrintWriter.java* com.android.networkstack.tethering.util.IndentingPrintWriter.java@1 rule com.android.internal.util.IState.java* com.android.networkstack.tethering.util.IState.java@1 rule com.android.internal.util.MessageUtils* com.android.networkstack.tethering.util.MessageUtils@1 -rule com.android.internal.util.Preconditions* com.android.networkstack.tethering.util.Preconditions@1 rule com.android.internal.util.State* com.android.networkstack.tethering.util.State@1 rule com.android.internal.util.StateMachine* com.android.networkstack.tethering.util.StateMachine@1 rule com.android.internal.util.TrafficStatsConstants* com.android.networkstack.tethering.util.TrafficStatsConstants@1 diff --git a/packages/Tethering/src/com/android/networkstack/tethering/UpstreamNetworkMonitor.java b/packages/Tethering/src/com/android/networkstack/tethering/UpstreamNetworkMonitor.java index 25ddce4404e4..320427c393ac 100644 --- a/packages/Tethering/src/com/android/networkstack/tethering/UpstreamNetworkMonitor.java +++ b/packages/Tethering/src/com/android/networkstack/tethering/UpstreamNetworkMonitor.java @@ -43,7 +43,6 @@ import android.util.Log; import android.util.SparseIntArray; import com.android.internal.annotations.VisibleForTesting; -import com.android.internal.util.Preconditions; import com.android.internal.util.StateMachine; import java.util.HashMap; @@ -591,7 +590,9 @@ public class UpstreamNetworkMonitor { // Map from type to transports. final int notFound = -1; final int transport = sLegacyTypeToTransport.get(type, notFound); - Preconditions.checkArgument(transport != notFound, "unknown legacy type: " + type); + if (transport == notFound) { + throw new IllegalArgumentException("unknown legacy type: " + type); + } builder.addTransportType(transport); if (type == TYPE_MOBILE_DUN) { diff --git a/packages/Tethering/tests/unit/jarjar-rules.txt b/packages/Tethering/tests/unit/jarjar-rules.txt index 921fbed373b0..1ea56cdf1a3d 100644 --- a/packages/Tethering/tests/unit/jarjar-rules.txt +++ b/packages/Tethering/tests/unit/jarjar-rules.txt @@ -4,7 +4,6 @@ rule com.android.internal.util.BitUtils* com.android.networkstack.tethering.util rule com.android.internal.util.IndentingPrintWriter.java* com.android.networkstack.tethering.util.IndentingPrintWriter.java@1 rule com.android.internal.util.IState.java* com.android.networkstack.tethering.util.IState.java@1 rule com.android.internal.util.MessageUtils* com.android.networkstack.tethering.util.MessageUtils@1 -rule com.android.internal.util.Preconditions* com.android.networkstack.tethering.util.Preconditions@1 rule com.android.internal.util.State* com.android.networkstack.tethering.util.State@1 rule com.android.internal.util.StateMachine* com.android.networkstack.tethering.util.StateMachine@1 rule com.android.internal.util.TrafficStatsConstants* com.android.networkstack.tethering.util.TrafficStatsConstants@1 diff --git a/services/accessibility/java/com/android/server/accessibility/gestures/TouchExplorer.java b/services/accessibility/java/com/android/server/accessibility/gestures/TouchExplorer.java index bc38fbf50000..4fee672a8803 100644 --- a/services/accessibility/java/com/android/server/accessibility/gestures/TouchExplorer.java +++ b/services/accessibility/java/com/android/server/accessibility/gestures/TouchExplorer.java @@ -566,6 +566,7 @@ public class TouchExplorer extends BaseEventStreamTransformation // a given distance perform a drag. mState.startDragging(); mDraggingPointerId = pointerId; + adjustEventLocationForDrag(event); event.setEdgeFlags(mReceivedPointerTracker.getLastReceivedDownEdgeFlags()); mDispatcher.sendMotionEvent( event, MotionEvent.ACTION_DOWN, rawEvent, pointerIdBits, policyFlags); @@ -793,10 +794,6 @@ public class TouchExplorer extends BaseEventStreamTransformation */ private void handleMotionEventStateDelegating( MotionEvent event, MotionEvent rawEvent, int policyFlags) { - if (mGestureDetector.isMultiFingerGesturesEnabled()) { - // Multi-finger gestures conflict with this functionality. - return; - } switch (event.getActionMasked()) { case MotionEvent.ACTION_DOWN: { Slog.e(LOG_TAG, "Delegating state can only be reached if " diff --git a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java index d8bf9edee2b7..5e865e7cb715 100644 --- a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java +++ b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java @@ -1574,8 +1574,15 @@ class MediaRouter2ServiceImpl { } // Succeeded - notifySessionCreatedToRouter(matchingRequest.mRouterRecord, - toOriginalRequestId(uniqueRequestId), sessionInfo); + if (sessionInfo.isSystemSession() + && !matchingRequest.mRouterRecord.mHasModifyAudioRoutingPermission) { + notifySessionCreatedToRouter(matchingRequest.mRouterRecord, + toOriginalRequestId(uniqueRequestId), + mSystemProvider.getDefaultSessionInfo()); + } else { + notifySessionCreatedToRouter(matchingRequest.mRouterRecord, + toOriginalRequestId(uniqueRequestId), sessionInfo); + } mSessionToRouterMap.put(sessionInfo.getId(), routerRecord); } diff --git a/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java b/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java index 41d7fff52a91..b585b49928cd 100644 --- a/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java +++ b/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java @@ -36,6 +36,7 @@ import android.media.IAudioRoutesObserver; import android.media.IAudioService; import android.media.MediaRoute2Info; import android.media.MediaRoute2ProviderInfo; +import android.media.MediaRoute2ProviderService; import android.media.RouteDiscoveryPreference; import android.media.RoutingSessionInfo; import android.os.Bundle; @@ -47,6 +48,7 @@ import android.text.TextUtils; import android.util.Log; import com.android.internal.R; +import com.android.internal.annotations.GuardedBy; import java.util.Objects; @@ -80,6 +82,10 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider { RoutingSessionInfo mDefaultSessionInfo; final AudioRoutesInfo mCurAudioRoutesInfo = new AudioRoutesInfo(); + private final Object mRequestLock = new Object(); + @GuardedBy("mRequestLock") + private volatile SessionCreationRequest mPendingSessionCreationRequest; + final IAudioRoutesObserver.Stub mAudioRoutesObserver = new IAudioRoutesObserver.Stub() { @Override public void dispatchAudioRoutesChanged(final AudioRoutesInfo newRoutes) { @@ -135,10 +141,27 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider { @Override public void requestCreateSession(long requestId, String packageName, String routeId, Bundle sessionHints) { + // Assume a router without MODIFY_AUDIO_ROUTING permission can't request with + // a route ID different from the default route ID. The service should've filtered. + if (TextUtils.equals(routeId, DEFAULT_ROUTE_ID)) { + mCallback.onSessionCreated(this, requestId, mDefaultSessionInfo); + return; + } + if (TextUtils.equals(routeId, mSelectedRouteId)) { + mCallback.onSessionCreated(this, requestId, mSessionInfos.get(0)); + return; + } + + synchronized (mRequestLock) { + // Handle the previous request as a failure if exists. + if (mPendingSessionCreationRequest != null) { + mCallback.onRequestFailed(this, mPendingSessionCreationRequest.mRequestId, + MediaRoute2ProviderService.REASON_UNKNOWN_ERROR); + } + mPendingSessionCreationRequest = new SessionCreationRequest(requestId, routeId); + } transferToRoute(requestId, SYSTEM_SESSION_ID, routeId); - mCallback.onSessionCreated(this, requestId, mSessionInfos.get(0)); - //TODO: We should call after the session info is changed. } @Override @@ -280,6 +303,24 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider { } RoutingSessionInfo newSessionInfo = builder.setProviderId(mUniqueId).build(); + + if (mPendingSessionCreationRequest != null) { + SessionCreationRequest sessionCreationRequest; + synchronized (mRequestLock) { + sessionCreationRequest = mPendingSessionCreationRequest; + mPendingSessionCreationRequest = null; + } + if (sessionCreationRequest != null) { + if (TextUtils.equals(mSelectedRouteId, sessionCreationRequest.mRouteId)) { + mCallback.onSessionCreated(this, + sessionCreationRequest.mRequestId, newSessionInfo); + } else { + mCallback.onRequestFailed(this, sessionCreationRequest.mRequestId, + MediaRoute2ProviderService.REASON_UNKNOWN_ERROR); + } + } + } + if (Objects.equals(oldSessionInfo, newSessionInfo)) { return false; } else { @@ -310,6 +351,16 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider { mCallback.onSessionUpdated(this, sessionInfo); } + private static class SessionCreationRequest { + final long mRequestId; + final String mRouteId; + + SessionCreationRequest(long requestId, String routeId) { + this.mRequestId = requestId; + this.mRouteId = routeId; + } + } + private class VolumeChangeReceiver extends BroadcastReceiver { // This will be called in the main thread. @Override diff --git a/services/core/java/com/android/server/net/NetworkStatsService.java b/services/core/java/com/android/server/net/NetworkStatsService.java index 44173c6e661f..1951fc071d3a 100644 --- a/services/core/java/com/android/server/net/NetworkStatsService.java +++ b/services/core/java/com/android/server/net/NetworkStatsService.java @@ -47,6 +47,7 @@ import static android.net.NetworkTemplate.buildTemplateMobileWildcard; import static android.net.NetworkTemplate.buildTemplateWifiWildcard; import static android.net.TrafficStats.KB_IN_BYTES; import static android.net.TrafficStats.MB_IN_BYTES; +import static android.net.TrafficStats.UNSUPPORTED; import static android.os.Trace.TRACE_TAG_NETWORK; import static android.provider.Settings.Global.NETSTATS_AUGMENT_ENABLED; import static android.provider.Settings.Global.NETSTATS_COMBINE_SUBTYPE_ENABLED; @@ -1031,6 +1032,10 @@ public class NetworkStatsService extends INetworkStatsService.Stub { @Override public long getUidStats(int uid, int type) { + final int callingUid = Binder.getCallingUid(); + if (callingUid != android.os.Process.SYSTEM_UID && callingUid != uid) { + return UNSUPPORTED; + } return nativeGetUidStat(uid, type, checkBpfStatsEnable()); } diff --git a/services/core/java/com/android/server/notification/NotificationChannelExtractor.java b/services/core/java/com/android/server/notification/NotificationChannelExtractor.java index 83ca69956033..2f60e426245d 100644 --- a/services/core/java/com/android/server/notification/NotificationChannelExtractor.java +++ b/services/core/java/com/android/server/notification/NotificationChannelExtractor.java @@ -47,7 +47,7 @@ public class NotificationChannelExtractor implements NotificationSignalExtractor NotificationChannel updatedChannel = mConfig.getConversationNotificationChannel( record.getSbn().getPackageName(), record.getSbn().getUid(), record.getChannel().getId(), - record.getSbn().getShortcutId(mContext), true, false); + record.getSbn().getShortcutId(), true, false); record.updateNotificationChannel(updatedChannel); return null; diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 6c3177fe253a..2f76a1f9e246 100755 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -2718,12 +2718,12 @@ public class NotificationManagerService extends SystemService { } return text == null ? null : String.valueOf(text); } - + protected void maybeRegisterMessageSent(NotificationRecord r) { Context appContext = r.getSbn().getPackageContext(getContext()); - Notification.Builder nb = + Notification.Builder nb = Notification.Builder.recoverBuilder(appContext, r.getNotification()); - if (nb.getStyle() instanceof Notification.MessagingStyle) { + if (nb.getStyle() instanceof Notification.MessagingStyle && r.getShortcutInfo() == null) { mPreferencesHelper.setMessageSent(r.getSbn().getPackageName(), r.getUid()); handleSavePolicyFile(); } @@ -5627,7 +5627,7 @@ public class NotificationManagerService extends SystemService { if (mIsTelevision && (new Notification.TvExtender(notification)).getChannelId() != null) { channelId = (new Notification.TvExtender(notification)).getChannelId(); } - String shortcutId = n.getShortcutId(getContext()); + String shortcutId = n.getShortcutId(); final NotificationChannel channel = mPreferencesHelper.getConversationNotificationChannel( pkg, notificationUid, channelId, shortcutId, true /* parent ok */, false /* includeDeleted */); diff --git a/services/core/java/com/android/server/notification/NotificationRecord.java b/services/core/java/com/android/server/notification/NotificationRecord.java index e45b41df38b2..8e3de1598275 100644 --- a/services/core/java/com/android/server/notification/NotificationRecord.java +++ b/services/core/java/com/android/server/notification/NotificationRecord.java @@ -1386,10 +1386,6 @@ public final class NotificationRecord { || !Notification.MessagingStyle.class.equals(notification.getNotificationStyle())) { return false; } - if (mShortcutInfo == null && Settings.Global.getInt(mContext.getContentResolver(), - Settings.Global.REQUIRE_SHORTCUTS_FOR_CONVERSATIONS, 0) == 1) { - return false; - } if (mIsNotConversationOverride) { return false; } diff --git a/services/core/java/com/android/server/notification/PreferencesHelper.java b/services/core/java/com/android/server/notification/PreferencesHelper.java index 6d7b410b0b99..a4b99b376b30 100644 --- a/services/core/java/com/android/server/notification/PreferencesHelper.java +++ b/services/core/java/com/android/server/notification/PreferencesHelper.java @@ -116,7 +116,7 @@ public class PreferencesHelper implements RankingConfig { private static final String ATT_ENABLED = "enabled"; private static final String ATT_USER_ALLOWED = "allowed"; private static final String ATT_HIDE_SILENT = "hide_gentle"; - private static final String ATT_SENT_MESSAGE = "sent_msg"; + private static final String ATT_SENT_MESSAGE = "sent_invalid_msg"; private static final int DEFAULT_PRIORITY = Notification.PRIORITY_DEFAULT; private static final int DEFAULT_VISIBILITY = NotificationManager.VISIBILITY_NO_OVERRIDE; @@ -194,8 +194,6 @@ public class PreferencesHelper implements RankingConfig { updateBadgingEnabled(); updateBubblesEnabled(); syncChannelsBypassingDnd(mContext.getUserId()); - mAllowInvalidShortcuts = Settings.Global.getInt(mContext.getContentResolver(), - Settings.Global.REQUIRE_SHORTCUTS_FOR_CONVERSATIONS, 0) == 0; } public void readXml(XmlPullParser parser, boolean forRestore, int userId) @@ -1313,7 +1311,9 @@ public class PreferencesHelper implements RankingConfig { int N = r.channels.size(); for (int i = 0; i < N; i++) { final NotificationChannel nc = r.channels.valueAt(i); - if (!TextUtils.isEmpty(nc.getConversationId()) && !nc.isDeleted()) { + if (!TextUtils.isEmpty(nc.getConversationId()) + && !nc.isDeleted() + && !nc.isDemoted()) { ConversationChannelWrapper conversation = new ConversationChannelWrapper(); conversation.setPkg(r.pkg); conversation.setUid(r.uid); diff --git a/services/core/java/com/android/server/notification/ShortcutHelper.java b/services/core/java/com/android/server/notification/ShortcutHelper.java index 13892ba0e480..94f69e9c73b3 100644 --- a/services/core/java/com/android/server/notification/ShortcutHelper.java +++ b/services/core/java/com/android/server/notification/ShortcutHelper.java @@ -152,9 +152,13 @@ public class ShortcutHelper { if (shortcutInfo == null || !shortcutInfo.isLongLived() || !shortcutInfo.isEnabled()) { return false; } - return mShortcutServiceInternal.isSharingShortcut(callingUserId, "android", + // TODO (b/155016294) uncomment when sharing shortcuts are required + /* + mShortcutServiceInternal.isSharingShortcut(callingUserId, "android", shortcutInfo.getPackage(), shortcutInfo.getId(), shortcutInfo.getUserId(), SHARING_FILTER); + */ + return true; } /** 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 f5fff7d8ab58..c425307d3fe9 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java @@ -2499,24 +2499,10 @@ public class PermissionManagerService extends IPermissionManager.Stub { synchronized (mLock) { ArraySet<String> newImplicitPermissions = new ArraySet<>(); - // TODO ntmyren: Remove once propagated to droidfood - int flagMask = PackageManager.FLAG_PERMISSION_USER_SENSITIVE_WHEN_GRANTED - | PackageManager.FLAG_PERMISSION_USER_SENSITIVE_WHEN_DENIED; - int user = UserHandle.getUserId(pkg.getUid()); - final int N = pkg.getRequestedPermissions().size(); for (int i = 0; i < N; i++) { final String permName = pkg.getRequestedPermissions().get(i); final BasePermission bp = mSettings.getPermissionLocked(permName); - - // TODO ntmyren: Remove once propagated to droidfood - if (bp != null && !bp.isRuntime()) { - PermissionState permState = permissionsState.getInstallPermissionState(bp.name); - if (permState == null || (permState.getFlags() & flagMask) != 0) { - permissionsState.updatePermissionFlags(bp, user, flagMask, 0); - } - } - final boolean appSupportsRuntimePermissions = pkg.getTargetSdkVersion() >= Build.VERSION_CODES.M; String upgradedActivityRecognitionPermission = null; diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java index 299592d33a11..373cb8be9c66 100644 --- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java +++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java @@ -2951,7 +2951,7 @@ public class StatsPullAtomService extends SystemService { } int processHistoricalOps(HistoricalOps histOps, int atomTag, List<StatsEvent> pulledData) { - int counter = 0; + int counter = 1; for (int uidIdx = 0; uidIdx < histOps.getUidCount(); uidIdx++) { final HistoricalUidOps uidOps = histOps.getUidOpsAt(uidIdx); final int uid = uidOps.getUid(); diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 44049b84de40..5a27f47b28aa 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -1431,15 +1431,15 @@ class Task extends WindowContainer<WindowContainer> { @Override void removeChild(WindowContainer child) { - // A rootable child task that is now being removed from an organized task. Making sure - // the stack references is keep updated. - if (mTaskOrganizer != null && mCreatedByOrganizer && child.asTask() != null) { - getDisplayArea().removeStackReferenceIfNeeded((ActivityStack) child); - } removeChild(child, "removeChild"); } void removeChild(WindowContainer r, String reason) { + // A rootable child task that is now being removed from an organized task. Making sure + // the stack references is keep updated. + if (mTaskOrganizer != null && mCreatedByOrganizer && r.asTask() != null) { + getDisplayArea().removeStackReferenceIfNeeded((ActivityStack) r); + } if (!mChildren.contains(r)) { Slog.e(TAG, "removeChild: r=" + r + " not found in t=" + this); return; @@ -3112,7 +3112,8 @@ class Task extends WindowContainer<WindowContainer> { @Override boolean showToCurrentUser() { - return mForceShowForAllUsers || showForAllUsers() || mWmService.isCurrentProfile(mUserId); + return mForceShowForAllUsers || showForAllUsers() + || mWmService.isCurrentProfile(getTopMostTask().mUserId); } void setForceShowForAllUsers(boolean forceShowForAllUsers) { diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 7e4c8f3e48e5..a74706be8915 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -15948,22 +15948,31 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { */ private void updatePersonalAppsSuspension(int profileUserId, boolean unlocked) { final boolean suspended; + final int deadlineState; + final String poPackage; synchronized (getLockObject()) { final ActiveAdmin profileOwner = getProfileOwnerAdminLocked(profileUserId); if (profileOwner != null) { - final int deadlineState = + deadlineState = updateProfileOffDeadlineLocked(profileUserId, profileOwner, unlocked); suspended = profileOwner.mSuspendPersonalApps || deadlineState == PROFILE_OFF_DEADLINE_REACHED; - Slog.d(LOG_TAG, String.format("Personal apps suspended: %b, deadline state: %d", - suspended, deadlineState)); - updateProfileOffDeadlineNotificationLocked(profileUserId, profileOwner, - unlocked ? PROFILE_OFF_DEADLINE_DEFAULT : deadlineState); + poPackage = profileOwner.info.getPackageName(); } else { + poPackage = null; suspended = false; + deadlineState = PROFILE_OFF_DEADLINE_DEFAULT; } } + Slog.d(LOG_TAG, String.format("Personal apps suspended: %b, deadline state: %d", + suspended, deadlineState)); + + if (poPackage != null) { + final int notificationState = unlocked ? PROFILE_OFF_DEADLINE_DEFAULT : deadlineState; + updateProfileOffDeadlineNotification(profileUserId, poPackage, notificationState); + } + final int parentUserId = getProfileParentId(profileUserId); suspendPersonalAppsInternal(parentUserId, suspended); } @@ -16067,38 +16076,34 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { } } - private void updateProfileOffDeadlineNotificationLocked(int profileUserId, - @Nullable ActiveAdmin profileOwner, int notificationState) { + private void updateProfileOffDeadlineNotification( + int profileUserId, String profileOwnerPackage, int notificationState) { if (notificationState == PROFILE_OFF_DEADLINE_DEFAULT) { mInjector.getNotificationManager().cancel(SystemMessage.NOTE_PERSONAL_APPS_SUSPENDED); return; } - final String profileOwnerPackageName = profileOwner.info.getPackageName(); - final long maxTimeOffDays = - TimeUnit.MILLISECONDS.toDays(profileOwner.mProfileMaximumTimeOffMillis); - final Intent intent = new Intent(DevicePolicyManager.ACTION_CHECK_POLICY_COMPLIANCE); - intent.setPackage(profileOwnerPackageName); + intent.setPackage(profileOwnerPackage); final PendingIntent pendingIntent = mInjector.pendingIntentGetActivityAsUser(mContext, 0 /* requestCode */, intent, PendingIntent.FLAG_UPDATE_CURRENT, null /* options */, UserHandle.of(profileUserId)); // TODO(b/149075510): Only the first of the notifications should be dismissible. - final String title = mContext.getString( + final String text = mContext.getString( notificationState == PROFILE_OFF_DEADLINE_WARNING - ? R.string.personal_apps_suspended_tomorrow_title - : R.string.personal_apps_suspended_title); + ? R.string.personal_apps_suspension_tomorrow_text + : R.string.personal_apps_suspension_text); final Notification notification = new Notification.Builder(mContext, SystemNotificationChannels.DEVICE_ADMIN) .setSmallIcon(android.R.drawable.stat_sys_warning) .setOngoing(true) - .setContentTitle(title) - .setContentText(mContext.getString( - R.string.personal_apps_suspended_text, maxTimeOffDays)) + .setContentTitle(mContext.getString( + R.string.personal_apps_suspension_title)) + .setContentText(text) .setColor(mContext.getColor(R.color.system_notification_accent_color)) .setContentIntent(pendingIntent) .build(); diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java index b042e7794666..c2285081770e 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java @@ -15,6 +15,8 @@ */ package com.android.server.devicepolicy; +import static android.app.Notification.EXTRA_TEXT; +import static android.app.Notification.EXTRA_TITLE; import static android.app.admin.DevicePolicyManager.DELEGATION_APP_RESTRICTIONS; import static android.app.admin.DevicePolicyManager.DELEGATION_CERT_INSTALL; import static android.app.admin.DevicePolicyManager.ID_TYPE_BASE_INFO; @@ -195,9 +197,10 @@ public class DevicePolicyManagerTest extends DpmTestBase { PROFILE_OFF_START + PROFILE_OFF_TIMEOUT - TimeUnit.DAYS.toMillis(1); // Time when the apps should be suspended private static final long PROFILE_OFF_DEADLINE = PROFILE_OFF_START + PROFILE_OFF_TIMEOUT; - // Notification titles for setManagedProfileMaximumTimeOff tests: - private static final String PROFILE_OFF_WARNING_TITLE = "suspended_tomorrow"; - private static final String PROFILE_OFF_SUSPENDED_TITLE = "suspended"; + // Notification title and text for setManagedProfileMaximumTimeOff tests: + private static final String PROFILE_OFF_SUSPENSION_TITLE = "suspension_title"; + private static final String PROFILE_OFF_SUSPENSION_TEXT = "suspension_text"; + private static final String PROFILE_OFF_SUSPENSION_TOMORROW_TEXT = "suspension_tomorrow_text"; @Override protected void setUp() throws Exception { @@ -1576,7 +1579,9 @@ public class DevicePolicyManagerTest extends DpmTestBase { dpms.approveCaCert(fourCerts.getList().get(1), userId, true); // a notification should be shown saying that there are two certificates left to approve. verify(getServices().notificationManager, timeout(1000)) - .notifyAsUser(anyString(), anyInt(), argThat(hasTitle(TEST_STRING)), eq(user)); + .notifyAsUser(anyString(), anyInt(), argThat(hasExtra(EXTRA_TITLE, + TEST_STRING + )), eq(user)); } /** @@ -6317,7 +6322,8 @@ public class DevicePolicyManagerTest extends DpmTestBase { verify(getServices().alarmManager, times(1)).set(anyInt(), eq(PROFILE_OFF_DEADLINE), any()); // Now the user should see a warning notification. verify(getServices().notificationManager, times(1)) - .notify(anyInt(), argThat(hasTitle(PROFILE_OFF_WARNING_TITLE))); + .notify(anyInt(), argThat(hasExtra(EXTRA_TITLE, PROFILE_OFF_SUSPENSION_TITLE, + EXTRA_TEXT, PROFILE_OFF_SUSPENSION_TOMORROW_TEXT))); // Apps shouldn't be suspended yet. verifyZeroInteractions(getServices().ipackageManager); clearInvocations(getServices().alarmManager); @@ -6331,7 +6337,8 @@ public class DevicePolicyManagerTest extends DpmTestBase { verifyZeroInteractions(getServices().alarmManager); // Now the user should see a notification about suspended apps. verify(getServices().notificationManager, times(1)) - .notify(anyInt(), argThat(hasTitle(PROFILE_OFF_SUSPENDED_TITLE))); + .notify(anyInt(), argThat(hasExtra(EXTRA_TITLE, PROFILE_OFF_SUSPENSION_TITLE, + EXTRA_TEXT, PROFILE_OFF_SUSPENSION_TEXT))); // Verify that the apps are suspended. verify(getServices().ipackageManager, times(1)).setPackagesSuspendedAsUser( any(), eq(true), any(), any(), any(), any(), anyInt()); @@ -6461,25 +6468,41 @@ public class DevicePolicyManagerTest extends DpmTestBase { // Setup notification titles. when(mServiceContext.resources - .getString(R.string.personal_apps_suspended_tomorrow_title)) - .thenReturn(PROFILE_OFF_WARNING_TITLE); + .getString(R.string.personal_apps_suspension_title)) + .thenReturn(PROFILE_OFF_SUSPENSION_TITLE); when(mServiceContext.resources - .getString(R.string.personal_apps_suspended_title)) - .thenReturn(PROFILE_OFF_SUSPENDED_TITLE); + .getString(R.string.personal_apps_suspension_text)) + .thenReturn(PROFILE_OFF_SUSPENSION_TEXT); + when(mServiceContext.resources + .getString(R.string.personal_apps_suspension_tomorrow_text)) + .thenReturn(PROFILE_OFF_SUSPENSION_TOMORROW_TEXT); clearInvocations(getServices().ipackageManager); } - private static Matcher<Notification> hasTitle(String expected) { + private static Matcher<Notification> hasExtra(String... extras) { + assertEquals("Odd numebr of extra key-values", 0, extras.length % 2); return new BaseMatcher<Notification>() { @Override public boolean matches(Object item) { final Notification notification = (Notification) item; - return expected.equals(notification.extras.getString(Notification.EXTRA_TITLE)); + for (int i = 0; i < extras.length / 2; i++) { + if (!extras[i * 2 + 1].equals(notification.extras.getString(extras[i * 2]))) { + return false; + } + } + return true; } @Override public void describeTo(Description description) { - description.appendText("Notification{title=\"" + expected + "\"}"); + description.appendText("Notification{"); + for (int i = 0; i < extras.length / 2; i++) { + if (i > 0) { + description.appendText(","); + } + description.appendText(extras[i * 2] + "=\"" + extras[i * 2 + 1] + "\""); + } + description.appendText("}"); } }; } diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationChannelExtractorTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationChannelExtractorTest.java index a23ade68b344..77ce2f032a09 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationChannelExtractorTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationChannelExtractorTest.java @@ -76,8 +76,6 @@ public class NotificationChannelExtractorTest extends UiServiceTestCase { @Test public void testInvalidShortcutFlagEnabled_looksUpCorrectChannel() { - Settings.Global.putInt(mContext.getContentResolver(), - Settings.Global.REQUIRE_SHORTCUTS_FOR_CONVERSATIONS, 0); NotificationChannelExtractor extractor = new NotificationChannelExtractor(); extractor.setConfig(mConfig); @@ -96,7 +94,7 @@ public class NotificationChannelExtractorTest extends UiServiceTestCase { NotificationChannel updatedChannel = new NotificationChannel("a", "", IMPORTANCE_HIGH); when(mConfig.getConversationNotificationChannel( - any(), anyInt(), eq("a"), eq(r.getSbn().getShortcutId(mContext)), + any(), anyInt(), eq("a"), eq(r.getSbn().getShortcutId()), eq(true), eq(false))) .thenReturn(updatedChannel); @@ -106,8 +104,6 @@ public class NotificationChannelExtractorTest extends UiServiceTestCase { @Test public void testInvalidShortcutFlagDisabled_looksUpCorrectChannel() { - Settings.Global.putInt(mContext.getContentResolver(), - Settings.Global.REQUIRE_SHORTCUTS_FOR_CONVERSATIONS, 1); NotificationChannelExtractor extractor = new NotificationChannelExtractor(); extractor.setConfig(mConfig); diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java index 41748b8a893b..d5ecfeb55e95 100755 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java @@ -6589,14 +6589,45 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { } @Test - public void testRecordMessages() throws RemoteException { + public void testRecordMessages_invalidMsg() throws RemoteException { NotificationRecord nr = generateMessageBubbleNotifRecord(mTestNotificationChannel, - "testRecordMessages"); + "testRecordMessages_invalidMsg"); mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(), nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId()); waitForIdle(); assertTrue(mBinderService.hasSentMessage(PKG, mUid)); } + + @Test + public void testRecordMessages_validMsg() throws RemoteException { + // Messaging notification with shortcut info + Notification.BubbleMetadata metadata = + new Notification.BubbleMetadata.Builder("id").build(); + Notification.Builder nb = getMessageStyleNotifBuilder(false /* addDefaultMetadata */, + null /* groupKey */, false /* isSummary */); + nb.setShortcutId("id"); + nb.setBubbleMetadata(metadata); + StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 1, + "testRecordMessages_validMsg", mUid, 0, nb.build(), new UserHandle(mUid), null, 0); + NotificationRecord nr = new NotificationRecord(mContext, sbn, mTestNotificationChannel); + + // Pretend the shortcut exists + List<ShortcutInfo> shortcutInfos = new ArrayList<>(); + ShortcutInfo info = mock(ShortcutInfo.class); + when(info.getPackage()).thenReturn(PKG); + when(info.getId()).thenReturn("id"); + when(info.getUserId()).thenReturn(USER_SYSTEM); + when(info.isLongLived()).thenReturn(true); + when(info.isEnabled()).thenReturn(true); + shortcutInfos.add(info); + when(mLauncherApps.getShortcuts(any(), any())).thenReturn(shortcutInfos); + + mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(), + nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId()); + waitForIdle(); + + assertFalse(mBinderService.hasSentMessage(PKG, mUid)); + } } diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordTest.java index 3139bfaaf1f5..9f593ce42741 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordTest.java @@ -123,8 +123,6 @@ public class NotificationRecordTest extends UiServiceTestCase { when(mMockContext.getResources()).thenReturn(getContext().getResources()); when(mMockContext.getPackageManager()).thenReturn(mPm); when(mMockContext.getContentResolver()).thenReturn(mContentResolver); - Settings.Global.putInt(mContext.getContentResolver(), - Settings.Global.REQUIRE_SHORTCUTS_FOR_CONVERSATIONS, 1); ApplicationInfo appInfo = new ApplicationInfo(); appInfo.targetSdkVersion = Build.VERSION_CODES.O; when(mMockContext.getApplicationInfo()).thenReturn(appInfo); @@ -1127,18 +1125,7 @@ public class NotificationRecordTest extends UiServiceTestCase { } @Test - public void testIsConversation_nullShortcut() { - StatusBarNotification sbn = getMessagingStyleNotification(); - NotificationRecord record = new NotificationRecord(mMockContext, sbn, channel); - record.setShortcutInfo(null); - - assertFalse(record.isConversation()); - } - - @Test - public void testIsConversation_bypassShortcutFlagEnabled() { - Settings.Global.putInt(mContext.getContentResolver(), - Settings.Global.REQUIRE_SHORTCUTS_FOR_CONVERSATIONS, 0); + public void testIsConversation_noShortcut() { StatusBarNotification sbn = getMessagingStyleNotification(); NotificationRecord record = new NotificationRecord(mMockContext, sbn, channel); record.setShortcutInfo(null); diff --git a/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java index e11392bde993..4320f1c3c896 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java @@ -3023,31 +3023,7 @@ public class PreferencesHelperTest extends UiServiceTestCase { } @Test - public void testPlaceholderConversationId_shortcutNotRequired() throws Exception { - Settings.Global.putInt(mContext.getContentResolver(), - Settings.Global.REQUIRE_SHORTCUTS_FOR_CONVERSATIONS, 0); - - mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger, - mAppOpsManager); - - final String xml = "<ranking version=\"1\">\n" - + "<package name=\"" + PKG_O + "\" uid=\"" + UID_O + "\" >\n" - + "<channel id=\"id\" name=\"hi\" importance=\"3\" conv_id=\"foo:placeholder_id\"/>" - + "</package>" - + "</ranking>"; - XmlPullParser parser = Xml.newPullParser(); - parser.setInput(new BufferedInputStream(new ByteArrayInputStream(xml.getBytes())), - null); - parser.nextTag(); - mHelper.readXml(parser, false, UserHandle.USER_ALL); - - assertNotNull(mHelper.getNotificationChannel(PKG_O, UID_O, "id", true)); - } - - @Test public void testPlaceholderConversationId_shortcutRequired() throws Exception { - Settings.Global.putInt(mContext.getContentResolver(), - Settings.Global.REQUIRE_SHORTCUTS_FOR_CONVERSATIONS, 1); mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger, mAppOpsManager); @@ -3067,8 +3043,6 @@ public class PreferencesHelperTest extends UiServiceTestCase { @Test public void testNormalConversationId_shortcutRequired() throws Exception { - Settings.Global.putInt(mContext.getContentResolver(), - Settings.Global.REQUIRE_SHORTCUTS_FOR_CONVERSATIONS, 1); mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger, mAppOpsManager); @@ -3088,8 +3062,6 @@ public class PreferencesHelperTest extends UiServiceTestCase { @Test public void testNoConversationId_shortcutRequired() throws Exception { - Settings.Global.putInt(mContext.getContentResolver(), - Settings.Global.REQUIRE_SHORTCUTS_FOR_CONVERSATIONS, 1); mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger, mAppOpsManager); @@ -3276,6 +3248,19 @@ public class PreferencesHelperTest extends UiServiceTestCase { } @Test + public void testGetConversations_noDemoted() { + NotificationChannel parent = new NotificationChannel("parent", "p", 1); + mHelper.createNotificationChannel(PKG_O, UID_O, parent, true, false); + NotificationChannel channel = + new NotificationChannel("convo", "convo", IMPORTANCE_DEFAULT); + channel.setConversationId("parent", "convo"); + channel.setDemoted(true); + mHelper.createNotificationChannel(PKG_O, UID_O, channel, true, false); + + assertThat(mHelper.getConversations(PKG_O, UID_O)).isEmpty(); + } + + @Test public void testGetConversations() { NotificationChannelGroup group = new NotificationChannelGroup("acct", "account_name"); mHelper.createNotificationChannelGroup(PKG_O, UID_O, group, true); diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ShortcutHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ShortcutHelperTest.java index 3095c87ba2f6..eb2d9fed197f 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/ShortcutHelperTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/ShortcutHelperTest.java @@ -40,6 +40,7 @@ import androidx.test.runner.AndroidJUnit4; import com.android.server.UiServiceTestCase; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; @@ -184,6 +185,7 @@ public class ShortcutHelperTest extends UiServiceTestCase { assertThat(mShortcutHelper.getValidShortcutInfo("a", "p", UserHandle.SYSTEM)).isNull(); } + @Ignore("b/155016294") @Test public void testGetValidShortcutInfo_notSharingShortcut() { ShortcutInfo si = mock(ShortcutInfo.class); @@ -229,8 +231,9 @@ public class ShortcutHelperTest extends UiServiceTestCase { ArrayList<ShortcutInfo> shortcuts = new ArrayList<>(); shortcuts.add(si); when(mLauncherApps.getShortcuts(any(), any())).thenReturn(shortcuts); - when(mShortcutServiceInternal.isSharingShortcut(anyInt(), anyString(), anyString(), - anyString(), anyInt(), any())).thenReturn(true); + // TODO: b/155016294 + //when(mShortcutServiceInternal.isSharingShortcut(anyInt(), anyString(), anyString(), + // anyString(), anyInt(), any())).thenReturn(true); assertThat(mShortcutHelper.getValidShortcutInfo("a", "p", UserHandle.SYSTEM)).isSameAs(si); } diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java index 6c209e496cf6..5227f3c885ba 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java @@ -234,6 +234,25 @@ public class ActivityStackTests extends ActivityTestsBase { } @Test + public void testRemoveOrganizedTask_UpdateStackReference() { + final ActivityStack rootHomeTask = mDefaultTaskDisplayArea.getRootHomeTask(); + final ActivityRecord homeActivity = new ActivityBuilder(mService) + .setStack(rootHomeTask) + .setCreateTask(true) + .build(); + final ActivityStack secondaryStack = (ActivityStack) WindowContainer.fromBinder( + mService.mTaskOrganizerController.createRootTask(rootHomeTask.getDisplayId(), + WINDOWING_MODE_SPLIT_SCREEN_SECONDARY).token.asBinder()); + + rootHomeTask.reparent(secondaryStack, POSITION_TOP); + assertEquals(secondaryStack, rootHomeTask.getParent()); + + // This should call to {@link TaskDisplayArea#removeStackReferenceIfNeeded}. + homeActivity.removeImmediately(); + assertNull(mDefaultTaskDisplayArea.getRootHomeTask()); + } + + @Test public void testStackInheritsDisplayWindowingMode() { final ActivityStack primarySplitScreen = mDefaultTaskDisplayArea.createStack( WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_STANDARD, true /* onTop */); diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java index 17dd26ed18e9..4b43ceb6e07f 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java @@ -39,6 +39,7 @@ import android.content.res.Configuration; import android.graphics.Rect; import android.os.IBinder; import android.os.RemoteException; +import android.platform.test.annotations.Presubmit; import android.view.IDisplayWindowListener; import androidx.test.filters.MediumTest; @@ -57,6 +58,7 @@ import java.util.ArrayList; * Build/Install/Run: * atest WmTests:ActivityTaskManagerServiceTests */ +@Presubmit @MediumTest @RunWith(WindowTestRunner.class) public class ActivityTaskManagerServiceTests extends ActivityTestsBase { diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskStackTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskStackTests.java index f354a04101f5..9fdb9d8f9844 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskStackTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskStackTests.java @@ -72,6 +72,13 @@ public class TaskStackTests extends WindowTestsBase { stack.positionChildAt(WindowContainer.POSITION_TOP, task2, false /* includingParents */); assertEquals(stack.mChildren.get(0), task2); assertEquals(stack.mChildren.get(1), task1); + + // Non-leaf task should be moved to top regardless of the user id. + createTaskInStack((ActivityStack) task2, 0 /* userId */); + createTaskInStack((ActivityStack) task2, 1 /* userId */); + stack.positionChildAt(WindowContainer.POSITION_TOP, task2, false /* includingParents */); + assertEquals(stack.mChildren.get(0), task1); + assertEquals(stack.mChildren.get(1), task2); } @Test diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowManagerSettingsTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowManagerSettingsTests.java index 926bd8c9846a..8d5363c89570 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowManagerSettingsTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowManagerSettingsTests.java @@ -30,6 +30,7 @@ import static org.mockito.Mockito.verify; import android.content.ContentResolver; import android.net.Uri; +import android.platform.test.annotations.Presubmit; import android.provider.Settings; import androidx.test.filters.SmallTest; @@ -43,6 +44,7 @@ import org.junit.runner.RunWith; * Build/Install/Run: * atest WmTests:WindowManagerSettingsTests */ +@Presubmit @SmallTest @RunWith(WindowTestRunner.class) public class WindowManagerSettingsTests extends WindowTestsBase { diff --git a/services/tests/wmtests/src/com/android/server/wm/utils/RotationAnimationUtilsTest.java b/services/tests/wmtests/src/com/android/server/wm/utils/RotationAnimationUtilsTest.java index e5497a2313d1..233e147c5904 100644 --- a/services/tests/wmtests/src/com/android/server/wm/utils/RotationAnimationUtilsTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/utils/RotationAnimationUtilsTest.java @@ -27,10 +27,12 @@ import android.graphics.GraphicBuffer; import android.graphics.Matrix; import android.graphics.PointF; import android.view.Surface; +import android.platform.test.annotations.Presubmit; import org.junit.Before; import org.junit.Test; +@Presubmit public class RotationAnimationUtilsTest { private static final int BITMAP_HEIGHT = 100; diff --git a/telecomm/java/android/telecom/TelecomManager.java b/telecomm/java/android/telecom/TelecomManager.java index 0983db6d9663..eb553d3e8af3 100644 --- a/telecomm/java/android/telecom/TelecomManager.java +++ b/telecomm/java/android/telecom/TelecomManager.java @@ -2215,6 +2215,7 @@ public class TelecomManager { * @hide */ @SystemApi + @TestApi @NonNull public Intent createLaunchEmergencyDialerIntent(@Nullable String number) { ITelecomService service = getTelecomService(); diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index d2de19aaf89a..6b285d747854 100755 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -3050,19 +3050,93 @@ public class CarrierConfigManager { public static final String KEY_5G_ICON_CONFIGURATION_STRING = "5g_icon_configuration_string"; /** - * Timeout in seconds for displaying 5G icon, default value is 0 which means the timer is - * disabled. + * This configuration allows the system UI to determine how long to continue to display 5G icons + * when the device switches between different 5G scenarios. + * + * There are six 5G scenarios: + * 1. connected_mmwave: device currently connected to 5G cell as the secondary cell and using + * millimeter wave. + * 2. connected: device currently connected to 5G cell as the secondary cell but not using + * millimeter wave. + * 3. not_restricted_rrc_idle: device camped on a network that has 5G capability(not necessary + * to connect a 5G cell as a secondary cell) and the use of 5G is not restricted and RRC + * currently in IDLE state. + * 4. not_restricted_rrc_con: device camped on a network that has 5G capability(not necessary + * to connect a 5G cell as a secondary cell) and the use of 5G is not restricted and RRC + * currently in CONNECTED state. + * 5. restricted: device camped on a network that has 5G capability(not necessary to connect a + * 5G cell as a secondary cell) but the use of 5G is restricted. + * 6. any: any of the above scenarios, as well as none (not connected to 5G) + * + * The configured string contains various timer rules separated by a semicolon. + * Each rule will have three items: prior 5G scenario, current 5G scenario, and grace period + * in seconds before changing the icon. When the 5G state changes from the prior to the current + * 5G scenario, the system UI will continue to show the icon for the prior 5G scenario (defined + * in {@link #KEY_5G_ICON_CONFIGURATION_STRING}) for the amount of time specified by the grace + * period. If the prior 5G scenario is reestablished, the timer will reset and start again if + * the UE changes 5G scenarios again. Defined states (5G scenarios #1-5) take precedence over + * 'any' (5G scenario #6), and unspecified transitions have a default grace period of 0. + * The order of rules in the configuration determines the priority (the first applicable timer + * rule will be used). + * + * Here is an example: "connected_mmwave,connected,30;connected_mmwave,any,10;connected,any,10" + * This configuration defines 3 timers: + * 1. When UE goes from 'connected_mmwave' to 'connected', system UI will continue to display + * the 5G icon for 'connected_mmwave' for 30 seconds. + * 2. When UE goes from 'connected_mmwave' to any other state (except for connected, since + * rule 1 would be used instead), system UI will continue to display the 5G icon for + * 'connected_mmwave' for 10 seconds. + * 3. When UE goes from 'connected' to any other state, system UI will continue to display the + * 5G icon for 'connected' for 10 seconds. + * + * @hide + */ + public static final String KEY_5G_ICON_DISPLAY_GRACE_PERIOD_STRING = + "5g_icon_display_grace_period_string"; + + /** + * This configuration extends {@link #KEY_5G_ICON_DISPLAY_GRACE_PERIOD_STRING} to allow the + * system UI to continue displaying 5G icons after the initial timer expires. + * + * There are six 5G scenarios: + * 1. connected_mmwave: device currently connected to 5G cell as the secondary cell and using + * millimeter wave. + * 2. connected: device currently connected to 5G cell as the secondary cell but not using + * millimeter wave. + * 3. not_restricted_rrc_idle: device camped on a network that has 5G capability(not necessary + * to connect a 5G cell as a secondary cell) and the use of 5G is not restricted and RRC + * currently in IDLE state. + * 4. not_restricted_rrc_con: device camped on a network that has 5G capability(not necessary + * to connect a 5G cell as a secondary cell) and the use of 5G is not restricted and RRC + * currently in CONNECTED state. + * 5. restricted: device camped on a network that has 5G capability(not necessary to connect a + * 5G cell as a secondary cell) but the use of 5G is restricted. + * 6. any: any of the above scenarios, as well as none (not connected to 5G) + * + * The configured string contains various timer rules separated by a semicolon. + * Each rule will have three items: primary 5G scenario, secondary 5G scenario, and + * grace period in seconds before changing the icon. When the timer for the primary 5G timer + * expires, the system UI will continue to show the icon for the primary 5G scenario (defined + * in {@link #KEY_5G_ICON_CONFIGURATION_STRING}) for the amount of time specified by the grace + * period. If the primary 5G scenario is reestablished, the timers will reset and the system UI + * will continue to display the icon for the primary 5G scenario without interruption. If the + * secondary 5G scenario is lost, the timer will reset and the icon will reflect the true state. + * Defined states (5G scenarios #1-5) take precedence over 'any' (5G scenario #6), and + * unspecified transitions have a default grace period of 0. The order of rules in the + * configuration determines the priority (the first applicable timer rule will be used). * - * System UI will show the 5G icon and start a timer with the timeout from this config when the - * device connects to a 5G cell. System UI stops displaying 5G icon when both the device - * disconnects from 5G cell and the timer is expired. + * Here is an example: "connected,not_restricted_rrc_idle,30" + * This configuration defines a secondary timer that extends the primary 'connected' timer. + * When the primary 'connected' timer expires while the UE is in the 'not_restricted_rrc_idle' + * 5G state, system UI will continue to display the 5G icon for 'connected' for 30 seconds. + * If the 5G state returns to 'connected', the timer will be reset without change to the icon, + * and if the 5G state changes to neither 'connected' not 'not_restricted_rrc_idle', the icon + * will change to reflect the true state. * - * If 5G is reacquired during this timer, the timer is canceled and restarted when 5G is next - * lost. Allows us to momentarily lose 5G without blinking the icon. * @hide */ - public static final String KEY_5G_ICON_DISPLAY_GRACE_PERIOD_SEC_INT = - "5g_icon_display_grace_period_sec_int"; + public static final String KEY_5G_ICON_DISPLAY_SECONDARY_GRACE_PERIOD_STRING = + "5g_icon_display_secondary_grace_period_string"; /** * Controls time in milliseconds until DcTracker reevaluates 5G connection state. @@ -4148,7 +4222,8 @@ public class CarrierConfigManager { sDefaults.putString(KEY_5G_ICON_CONFIGURATION_STRING, "connected_mmwave:5G,connected:5G,not_restricted_rrc_idle:5G," + "not_restricted_rrc_con:5G"); - sDefaults.putInt(KEY_5G_ICON_DISPLAY_GRACE_PERIOD_SEC_INT, 0); + sDefaults.putString(KEY_5G_ICON_DISPLAY_GRACE_PERIOD_STRING, ""); + sDefaults.putString(KEY_5G_ICON_DISPLAY_SECONDARY_GRACE_PERIOD_STRING, ""); /* Default value is 1 hour. */ sDefaults.putLong(KEY_5G_WATCHDOG_TIME_MS_LONG, 3600000); sDefaults.putBoolean(KEY_UNMETERED_NR_NSA_BOOL, false); diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java index 801d63905af9..45dc7afc3dc0 100644 --- a/telephony/java/android/telephony/SubscriptionManager.java +++ b/telephony/java/android/telephony/SubscriptionManager.java @@ -135,29 +135,28 @@ public class SubscriptionManager { public static final String CACHE_KEY_DEFAULT_SUB_ID_PROPERTY = "cache_key.telephony.get_default_sub_id"; - private static final int DEFAULT_SUB_ID_CACHE_SIZE = 1; + /** @hide */ + public static final String CACHE_KEY_DEFAULT_DATA_SUB_ID_PROPERTY = + "cache_key.telephony.get_default_data_sub_id"; + + private static final int MAX_CACHE_SIZE = 4; private static PropertyInvalidatedCache<Void, Integer> sDefaultSubIdCache = new PropertyInvalidatedCache<Void, Integer>( - DEFAULT_SUB_ID_CACHE_SIZE, - CACHE_KEY_DEFAULT_SUB_ID_PROPERTY) { - @Override - protected Integer recompute(Void query) { - int subId = INVALID_SUBSCRIPTION_ID; + MAX_CACHE_SIZE, CACHE_KEY_DEFAULT_SUB_ID_PROPERTY) { + @Override + protected Integer recompute(Void query) { + return getDefaultSubscriptionIdInternal(); + }}; - try { - ISub iSub = TelephonyManager.getSubscriptionService(); - if (iSub != null) { - subId = iSub.getDefaultSubId(); - } - } catch (RemoteException ex) { - // ignore it - } + private static PropertyInvalidatedCache<Void, Integer> sDefaultDataSubIdCache = + new PropertyInvalidatedCache<Void, Integer>( + MAX_CACHE_SIZE, CACHE_KEY_DEFAULT_DATA_SUB_ID_PROPERTY) { + @Override + protected Integer recompute(Void query) { + return getDefaultDataSubscriptionIdInternal(); + }}; - if (VDBG) logd("getDefaultSubId=" + subId); - return subId; - } - }; /** * Generates a content {@link Uri} used to receive updates on simInfo change * on the given subscriptionId @@ -1871,6 +1870,22 @@ public class SubscriptionManager { return sDefaultSubIdCache.query(null); } + private static int getDefaultSubscriptionIdInternal() { + int subId = INVALID_SUBSCRIPTION_ID; + + try { + ISub iSub = TelephonyManager.getSubscriptionService(); + if (iSub != null) { + subId = iSub.getDefaultSubId(); + } + } catch (RemoteException ex) { + // ignore it + } + + if (VDBG) logd("getDefaultSubId=" + subId); + return subId; + } + /** * Returns the system's default voice subscription id. * @@ -2021,6 +2036,10 @@ public class SubscriptionManager { * @return the default data subscription Id. */ public static int getDefaultDataSubscriptionId() { + return sDefaultDataSubIdCache.query(null); + } + + private static int getDefaultDataSubscriptionIdInternal() { int subId = INVALID_SUBSCRIPTION_ID; try { @@ -3296,6 +3315,11 @@ public class SubscriptionManager { PropertyInvalidatedCache.invalidateCache(CACHE_KEY_DEFAULT_SUB_ID_PROPERTY); } + /** @hide */ + public static void invalidateDefaultDataSubIdCaches() { + PropertyInvalidatedCache.invalidateCache(CACHE_KEY_DEFAULT_DATA_SUB_ID_PROPERTY); + } + /** * Clears all process-local binder caches. * @@ -3303,5 +3327,6 @@ public class SubscriptionManager { */ public static void clearCaches() { sDefaultSubIdCache.clear(); + sDefaultDataSubIdCache.clear(); } } diff --git a/telephony/java/android/telephony/euicc/EuiccManager.java b/telephony/java/android/telephony/euicc/EuiccManager.java index 7488a1aec0e5..2edb564cc950 100644 --- a/telephony/java/android/telephony/euicc/EuiccManager.java +++ b/telephony/java/android/telephony/euicc/EuiccManager.java @@ -269,10 +269,10 @@ public class EuiccManager { * only contains {@link #OPERATION_DOWNLOAD} and ErrorCode is 0 implies this is an unknown * Download error. * - * @see {@link #EXTRA_EMBEDDED_SUBSCRIPTION_OPERATION_CODE} - * @see {@link #EXTRA_EMBEDDED_SUBSCRIPTION_ERROR_CODE} - * @see {@link #EXTRA_EMBEDDED_SUBSCRIPTION_SMDX_SUBJECT_CODE} - * @see {@link #EXTRA_EMBEDDED_SUBSCRIPTION_SMDX_REASON_CODE} + * @see #EXTRA_EMBEDDED_SUBSCRIPTION_OPERATION_CODE + * @see #EXTRA_EMBEDDED_SUBSCRIPTION_ERROR_CODE + * @see #EXTRA_EMBEDDED_SUBSCRIPTION_SMDX_SUBJECT_CODE + * @see #EXTRA_EMBEDDED_SUBSCRIPTION_SMDX_REASON_CODE */ public static final String EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE = "android.telephony.euicc.extra.EMBEDDED_SUBSCRIPTION_DETAILED_CODE"; @@ -552,7 +552,7 @@ public class EuiccManager { /** * List of OperationCode corresponding to {@link #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE}'s - * value, an integer. @see {@link #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE} for details + * value, an integer. @see #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE for details * * @hide */ @@ -575,44 +575,44 @@ public class EuiccManager { /** * Internal system error. - * @see {@link #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE} for details + * @see #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE for details */ public static final int OPERATION_SYSTEM = 1; /** * SIM slot error. Failed to switch slot, failed to access the physical slot etc. - * @see {@link #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE} for details + * @see #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE for details */ public static final int OPERATION_SIM_SLOT = 2; /** * eUICC card error. - * @see {@link #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE} for details + * @see #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE for details */ public static final int OPERATION_EUICC_CARD = 3; /** * Generic switching profile error - * @see {@link #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE} for details + * @see #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE for details */ public static final int OPERATION_SWITCH = 4; /** * Download profile error. - * @see {@link #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE} for details + * @see #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE for details */ public static final int OPERATION_DOWNLOAD = 5; /** * Subscription's metadata error - * @see {@link #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE} for details + * @see #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE for details */ public static final int OPERATION_METADATA = 6; /** * eUICC returned an error defined in GSMA (SGP.22 v2.2) while running one of the ES10x * functions. - * @see {@link #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE} for details + * @see #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE for details */ public static final int OPERATION_EUICC_GSMA = 7; @@ -620,13 +620,13 @@ public class EuiccManager { * The exception of failing to execute an APDU command. It can be caused by an error * happening on opening the basic or logical channel, or the response of the APDU command is * not success (0x9000). - * @see {@link #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE} for details + * @see #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE for details */ public static final int OPERATION_APDU = 8; /** * SMDX(SMDP/SMDS) error - * @see {@link #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE} for details + * @see #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE for details */ public static final int OPERATION_SMDX = 9; @@ -655,19 +655,19 @@ public class EuiccManager { * Thus the integer stored in {@link #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE} is * 0xA8B1051(176885841) * - * @see {@link #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE} for details + * @see #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE for details */ public static final int OPERATION_SMDX_SUBJECT_REASON_CODE = 10; /** * HTTP error - * @see {@link #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE} for details + * @see #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE for details */ public static final int OPERATION_HTTP = 11; /** * List of ErrorCode corresponding to {@link #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE} - * @see {@link #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE} for details + * @see #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE for details * @hide */ @Retention(RetentionPolicy.SOURCE) @@ -695,56 +695,56 @@ public class EuiccManager { /** * Operation such as downloading/switching to another profile failed due to device being * carrier locked. - * @see {@link #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE} for details + * @see #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE for details */ public static final int ERROR_CARRIER_LOCKED = 10000; /** * The activation code(SGP.22 v2.2 section[4.1]) is invalid. - * @see {@link #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE} for details + * @see #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE for details */ public static final int ERROR_INVALID_ACTIVATION_CODE = 10001; /** * The confirmation code(SGP.22 v2.2 section[4.7]) is invalid. - * @see {@link #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE} for details + * @see #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE for details */ public static final int ERROR_INVALID_CONFIRMATION_CODE = 10002; /** * The profile's carrier is incompatible with the LPA. - * @see {@link #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE} for details + * @see #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE for details */ public static final int ERROR_INCOMPATIBLE_CARRIER = 10003; /** * There is no more space available on the eUICC for new profiles. - * @see {@link #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE} for details + * @see #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE for details */ public static final int ERROR_EUICC_INSUFFICIENT_MEMORY = 10004; /** * Timed out while waiting for an operation to complete. i.e restart, disable, * switch reset etc. - * @see {@link #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE} for details + * @see #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE for details */ public static final int ERROR_TIME_OUT = 10005; /** * eUICC is missing or defective on the device. - * @see {@link #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE} for details + * @see #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE for details */ public static final int ERROR_EUICC_MISSING = 10006; /** * The eUICC card(hardware) version is incompatible with the software - * @see {@link #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE} for details + * @see #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE for details */ public static final int ERROR_UNSUPPORTED_VERSION = 10007; /** * No SIM card is available in the device. - * @see {@link #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE} for details + * @see #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE for details */ public static final int ERROR_SIM_MISSING = 10008; @@ -754,52 +754,52 @@ public class EuiccManager { * 2. GSMA(.22 v2.2) Profile Install Result - installFailedDueToDataMismatch * 3. operation was interrupted * 4. SIMalliance error in PEStatus(SGP.22 v2.2 section 2.5.6.1) - * @see {@link #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE} for details + * @see #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE for details */ public static final int ERROR_INSTALL_PROFILE = 10009; /** * Failed to load profile onto eUICC due to Profile Poicly Rules. - * @see {@link #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE} for details + * @see #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE for details */ public static final int ERROR_DISALLOWED_BY_PPR = 10010; /** * Address is missing e.g SMDS/SMDP address is missing. - * @see {@link #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE} for details + * @see #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE for details */ public static final int ERROR_ADDRESS_MISSING = 10011; /** * Certificate needed for authentication is not valid or missing. E.g SMDP/SMDS authentication * failed. - * @see {@link #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE} for details + * @see #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE for details */ public static final int ERROR_CERTIFICATE_ERROR = 10012; /** * No profiles available. - * @see {@link #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE} for details + * @see #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE for details */ public static final int ERROR_NO_PROFILES_AVAILABLE = 10013; /** * Failure to create a connection. - * @see {@link #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE} for details + * @see #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE for details */ public static final int ERROR_CONNECTION_ERROR = 10014; /** * Response format is invalid. e.g SMDP/SMDS response contains invalid json, header or/and ASN1. - * @see {@link #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE} for details + * @see #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE for details */ public static final int ERROR_INVALID_RESPONSE = 10015; /** * The operation is currently busy, try again later. - * @see {@link #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE} for details + * @see #EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE for details */ public static final int ERROR_OPERATION_BUSY = 10016; diff --git a/telephony/java/com/android/internal/telephony/DctConstants.java b/telephony/java/com/android/internal/telephony/DctConstants.java index 18e25921555a..76fc4f7d0519 100644 --- a/telephony/java/com/android/internal/telephony/DctConstants.java +++ b/telephony/java/com/android/internal/telephony/DctConstants.java @@ -109,11 +109,10 @@ public class DctConstants { public static final int EVENT_DATA_SERVICE_BINDING_CHANGED = BASE + 49; public static final int EVENT_DEVICE_PROVISIONED_CHANGE = BASE + 50; public static final int EVENT_DATA_ENABLED_OVERRIDE_RULES_CHANGED = BASE + 51; - public static final int EVENT_SERVICE_STATE_CHANGED = BASE + 52; - public static final int EVENT_5G_TIMER_HYSTERESIS = BASE + 53; - public static final int EVENT_5G_TIMER_WATCHDOG = BASE + 54; - public static final int EVENT_CARRIER_CONFIG_CHANGED = BASE + 55; - public static final int EVENT_SIM_STATE_UPDATED = BASE + 56; + public static final int EVENT_TELEPHONY_DISPLAY_INFO_CHANGED = BASE + 52; + public static final int EVENT_NR_TIMER_WATCHDOG = BASE + 53; + public static final int EVENT_CARRIER_CONFIG_CHANGED = BASE + 54; + public static final int EVENT_SIM_STATE_UPDATED = BASE + 55; /***** Constants *****/ |