diff options
249 files changed, 4245 insertions, 2603 deletions
diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto index 8c5718d30c09..f00a35d10819 100644 --- a/cmds/statsd/src/atoms.proto +++ b/cmds/statsd/src/atoms.proto @@ -447,7 +447,7 @@ message Atom { } // Pulled events will start at field 10000. - // Next: 10080 + // Next: 10082 oneof pulled { WifiBytesTransfer wifi_bytes_transfer = 10000 [(module) = "framework"]; WifiBytesTransferByFgBg wifi_bytes_transfer_by_fg_bg = 10001 [(module) = "framework"]; @@ -538,6 +538,7 @@ message Atom { SimSlotState sim_slot_state = 10078 [(module) = "telephony"]; SupportedRadioAccessFamily supported_radio_access_family = 10079 [(module) = "telephony"]; SettingSnapshot setting_snapshot = 10080 [(module) = "framework"]; + DisplayWakeReason display_wake_reason = 10081 [(module) = "framework"]; } // DO NOT USE field numbers above 100,000 in AOSP. @@ -9632,6 +9633,17 @@ message AccessibilityServiceReported { optional android.stats.accessibility.ServiceStatus service_status = 2; } +message DisplayWakeReason { + // Wake_up_reason code + // If LOWORD(wake_up_reason) = 0 + // reference to HIWORD(wake_up_reason) PowerManager.WAKE_REASON_XXX + // else reference wake_up_reason to + // frameworks/base/services/core/java/com/android/server/power/Notifier.java#DispWakeupReason + optional int32 wake_up_reason = 1; + // Count of wake up by reason + optional int32 wake_times = 2; +} + /** * Logs app usage events. */ diff --git a/cmds/statsd/src/metrics/MetricProducer.h b/cmds/statsd/src/metrics/MetricProducer.h index 91c98ea27269..28563ad4b0f5 100644 --- a/cmds/statsd/src/metrics/MetricProducer.h +++ b/cmds/statsd/src/metrics/MetricProducer.h @@ -442,7 +442,7 @@ protected: bool mIsActive; // The slice_by_state atom ids defined in statsd_config. - std::vector<int32_t> mSlicedStateAtoms; + const std::vector<int32_t> mSlicedStateAtoms; // Maps atom ids and state values to group_ids (<atom_id, <value, group_id>>). const std::unordered_map<int32_t, std::unordered_map<int, int64_t>> mStateGroupMap; diff --git a/cmds/statsd/src/metrics/MetricsManager.cpp b/cmds/statsd/src/metrics/MetricsManager.cpp index d7ad27bd9134..e8c575a1adea 100644 --- a/cmds/statsd/src/metrics/MetricsManager.cpp +++ b/cmds/statsd/src/metrics/MetricsManager.cpp @@ -71,6 +71,8 @@ MetricsManager::MetricsManager(const ConfigKey& key, const StatsdConfig& config, mLastReportTimeNs(currentTimeNs), mLastReportWallClockNs(getWallClockNs()), mPullerManager(pullerManager), + mWhitelistedAtomIds(config.whitelisted_atom_ids().begin(), + config.whitelisted_atom_ids().end()), mShouldPersistHistory(config.persist_locally()) { // Init the ttl end timestamp. refreshTtl(timeBaseNs); @@ -366,11 +368,16 @@ void MetricsManager::onDumpReport(const int64_t dumpTimeStampNs, bool MetricsManager::checkLogCredentials(const LogEvent& event) { + // TODO(b/154856835): Remove this check once we get whitelist from the config. if (android::util::AtomsInfo::kWhitelistedAtoms.find(event.GetTagId()) != android::util::AtomsInfo::kWhitelistedAtoms.end()) { return true; } + + if (mWhitelistedAtomIds.find(event.GetTagId()) != mWhitelistedAtomIds.end()) { + return true; + } std::lock_guard<std::mutex> lock(mAllowedLogSourcesMutex); if (mAllowedLogSources.find(event.GetUid()) == mAllowedLogSources.end()) { VLOG("log source %d not on the whitelist", event.GetUid()); diff --git a/cmds/statsd/src/metrics/MetricsManager.h b/cmds/statsd/src/metrics/MetricsManager.h index ef03d2064ab0..c30532a39244 100644 --- a/cmds/statsd/src/metrics/MetricsManager.h +++ b/cmds/statsd/src/metrics/MetricsManager.h @@ -189,6 +189,8 @@ private: // To guard access to mAllowedLogSources mutable std::mutex mAllowedLogSourcesMutex; + const std::set<int32_t> mWhitelistedAtomIds; + // We can pull any atom from these uids. std::set<int32_t> mDefaultPullUids; diff --git a/cmds/statsd/src/metrics/metrics_manager_util.cpp b/cmds/statsd/src/metrics/metrics_manager_util.cpp index 3ab44f4a06af..210d382b1363 100644 --- a/cmds/statsd/src/metrics/metrics_manager_util.cpp +++ b/cmds/statsd/src/metrics/metrics_manager_util.cpp @@ -791,10 +791,19 @@ bool initMetrics(const ConfigKey& key, const StatsdConfig& config, const int64_t } noReportMetricIds.insert(no_report_metric); } + + const set<int> whitelistedAtomIds(config.whitelisted_atom_ids().begin(), + config.whitelisted_atom_ids().end()); for (const auto& it : allMetricProducers) { // Register metrics to StateTrackers for (int atomId : it->getSlicedStateAtoms()) { - StateManager::getInstance().registerListener(atomId, it); + // Register listener for non-whitelisted atoms only. Using whitelisted atom as a sliced + // state atom is not allowed. + if (whitelistedAtomIds.find(atomId) == whitelistedAtomIds.end()) { + StateManager::getInstance().registerListener(atomId, it); + } else { + return false; + } } } return true; diff --git a/cmds/statsd/src/statsd_config.proto b/cmds/statsd/src/statsd_config.proto index c7407bd9af1e..7c0057d87ca9 100644 --- a/cmds/statsd/src/statsd_config.proto +++ b/cmds/statsd/src/statsd_config.proto @@ -489,6 +489,8 @@ message StatsdConfig { repeated PullAtomPackages pull_atom_packages = 23; + repeated int32 whitelisted_atom_ids = 24; + // Field number 1000 is reserved for later use. reserved 1000; } diff --git a/cmds/statsd/tests/MetricsManager_test.cpp b/cmds/statsd/tests/MetricsManager_test.cpp index 3890fbe7dc6f..b3b095bf4bff 100644 --- a/cmds/statsd/tests/MetricsManager_test.cpp +++ b/cmds/statsd/tests/MetricsManager_test.cpp @@ -29,6 +29,7 @@ #include "src/metrics/MetricProducer.h" #include "src/metrics/ValueMetricProducer.h" #include "src/metrics/metrics_manager_util.h" +#include "src/state/StateManager.h" #include "statsd_test_util.h" using namespace testing; @@ -591,6 +592,58 @@ TEST(MetricsManagerTest, TestLogSources) { EXPECT_TRUE(isSubset(defaultPullUids, set<int32_t>(atom3Uids.begin(), atom3Uids.end()))); } +TEST(MetricsManagerTest, TestCheckLogCredentialsWhitelistedAtom) { + sp<UidMap> uidMap; + sp<StatsPullerManager> pullerManager = new StatsPullerManager(); + sp<AlarmMonitor> anomalyAlarmMonitor; + sp<AlarmMonitor> periodicAlarmMonitor; + + StatsdConfig config = buildGoodConfig(); + config.add_whitelisted_atom_ids(3); + config.add_whitelisted_atom_ids(4); + + MetricsManager metricsManager(kConfigKey, config, timeBaseSec, timeBaseSec, uidMap, + pullerManager, anomalyAlarmMonitor, periodicAlarmMonitor); + + LogEvent event(0 /* uid */, 0 /* pid */); + CreateNoValuesLogEvent(&event, 10 /* atom id */, 0 /* timestamp */); + EXPECT_FALSE(metricsManager.checkLogCredentials(event)); + + CreateNoValuesLogEvent(&event, 3 /* atom id */, 0 /* timestamp */); + EXPECT_TRUE(metricsManager.checkLogCredentials(event)); + + CreateNoValuesLogEvent(&event, 4 /* atom id */, 0 /* timestamp */); + EXPECT_TRUE(metricsManager.checkLogCredentials(event)); +} + +TEST(MetricsManagerTest, TestWhitelistedAtomStateTracker) { + sp<UidMap> uidMap; + sp<StatsPullerManager> pullerManager = new StatsPullerManager(); + sp<AlarmMonitor> anomalyAlarmMonitor; + sp<AlarmMonitor> periodicAlarmMonitor; + + StatsdConfig config = buildGoodConfig(); + config.add_allowed_log_source("AID_SYSTEM"); + config.add_whitelisted_atom_ids(3); + config.add_whitelisted_atom_ids(4); + + State state; + state.set_id(1); + state.set_atom_id(3); + + *config.add_state() = state; + + config.mutable_count_metric(0)->add_slice_by_state(state.id()); + + StateManager::getInstance().clear(); + + MetricsManager metricsManager(kConfigKey, config, timeBaseSec, timeBaseSec, uidMap, + pullerManager, anomalyAlarmMonitor, periodicAlarmMonitor); + + EXPECT_EQ(0, StateManager::getInstance().getStateTrackersCount()); + EXPECT_FALSE(metricsManager.isConfigValid()); +} + } // namespace statsd } // namespace os } // namespace android diff --git a/cmds/statsd/tests/statsd_test_util.cpp b/cmds/statsd/tests/statsd_test_util.cpp index fae56f09c1df..6a7ad1faddea 100644 --- a/cmds/statsd/tests/statsd_test_util.cpp +++ b/cmds/statsd/tests/statsd_test_util.cpp @@ -1339,7 +1339,7 @@ Status FakeSubsystemSleepCallback::onPullAtom(int atomTag, // stats_event.h/c uses a vector as opposed to a buffer. p.buffer.assign(buffer, buffer + size); parcels.push_back(std::move(p)); - AStatsEvent_write(event); + AStatsEvent_release(event); } resultReceiver->pullFinished(atomTag, /*success=*/true, parcels); return Status::ok(); diff --git a/cmds/uiautomator/cmds/uiautomator/src/com/android/commands/uiautomator/DumpCommand.java b/cmds/uiautomator/cmds/uiautomator/src/com/android/commands/uiautomator/DumpCommand.java index c35f7fc3fcc8..3b14be7327f7 100644 --- a/cmds/uiautomator/cmds/uiautomator/src/com/android/commands/uiautomator/DumpCommand.java +++ b/cmds/uiautomator/cmds/uiautomator/src/com/android/commands/uiautomator/DumpCommand.java @@ -16,6 +16,7 @@ package com.android.commands.uiautomator; +import android.accessibilityservice.AccessibilityServiceInfo; import android.app.UiAutomation; import android.graphics.Point; import android.hardware.display.DisplayManagerGlobal; @@ -61,11 +62,14 @@ public class DumpCommand extends Command { public void run(String[] args) { File dumpFile = DEFAULT_DUMP_FILE; boolean verboseMode = true; + boolean allWindows = false; for (String arg : args) { if (arg.equals("--compressed")) verboseMode = false; - else if (!arg.startsWith("-")) { + else if (arg.equals("--windows")) { + allWindows = true; + } else if (!arg.startsWith("-")) { dumpFile = new File(arg); } } @@ -85,18 +89,28 @@ public class DumpCommand extends Command { try { UiAutomation uiAutomation = automationWrapper.getUiAutomation(); uiAutomation.waitForIdle(1000, 1000 * 10); - AccessibilityNodeInfo info = uiAutomation.getRootInActiveWindow(); - if (info == null) { - System.err.println("ERROR: null root node returned by UiTestAutomationBridge."); - return; - } + if (allWindows) { + AccessibilityServiceInfo info = uiAutomation.getServiceInfo(); + info.flags |= AccessibilityServiceInfo.FLAG_RETRIEVE_INTERACTIVE_WINDOWS; + uiAutomation.setServiceInfo(info); + AccessibilityNodeInfoDumper.dumpWindowsToFile( + uiAutomation.getWindowsOnAllDisplays(), dumpFile, + DisplayManagerGlobal.getInstance()); + } else { + AccessibilityNodeInfo info = uiAutomation.getRootInActiveWindow(); + if (info == null) { + System.err.println("ERROR: null root node returned by UiTestAutomationBridge."); + return; + } - Display display = - DisplayManagerGlobal.getInstance().getRealDisplay(Display.DEFAULT_DISPLAY); - int rotation = display.getRotation(); - Point size = new Point(); - display.getSize(size); - AccessibilityNodeInfoDumper.dumpWindowToFile(info, dumpFile, rotation, size.x, size.y); + Display display = + DisplayManagerGlobal.getInstance().getRealDisplay(Display.DEFAULT_DISPLAY); + int rotation = display.getRotation(); + Point size = new Point(); + display.getSize(size); + AccessibilityNodeInfoDumper.dumpWindowToFile(info, dumpFile, rotation, size.x, + size.y); + } } catch (TimeoutException re) { System.err.println("ERROR: could not get idle state."); return; diff --git a/cmds/uiautomator/library/core-src/com/android/uiautomator/core/AccessibilityNodeInfoDumper.java b/cmds/uiautomator/library/core-src/com/android/uiautomator/core/AccessibilityNodeInfoDumper.java index 63c51e84d74a..ab198b319e27 100644 --- a/cmds/uiautomator/library/core-src/com/android/uiautomator/core/AccessibilityNodeInfoDumper.java +++ b/cmds/uiautomator/library/core-src/com/android/uiautomator/core/AccessibilityNodeInfoDumper.java @@ -16,11 +16,17 @@ package com.android.uiautomator.core; +import android.graphics.Point; +import android.graphics.Rect; +import android.hardware.display.DisplayManagerGlobal; import android.os.Environment; import android.os.SystemClock; import android.util.Log; +import android.util.SparseArray; import android.util.Xml; +import android.view.Display; import android.view.accessibility.AccessibilityNodeInfo; +import android.view.accessibility.AccessibilityWindowInfo; import org.xmlpull.v1.XmlSerializer; @@ -28,6 +34,7 @@ import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.StringWriter; +import java.util.List; /** * @@ -98,6 +105,95 @@ public class AccessibilityNodeInfoDumper { Log.w(LOGTAG, "Fetch time: " + (endTime - startTime) + "ms"); } + /** + * Using {@link AccessibilityWindowInfo} this method will dump some window information and + * then walk the layout hierarchy of it's + * and generates an xml dump to the location specified by <code>dumpFile</code> + * @param allWindows All windows indexed by display-id. + * @param dumpFile The file to dump to. + */ + public static void dumpWindowsToFile(SparseArray<List<AccessibilityWindowInfo>> allWindows, + File dumpFile, DisplayManagerGlobal displayManager) { + if (allWindows.size() == 0) { + return; + } + final long startTime = SystemClock.uptimeMillis(); + try { + FileWriter writer = new FileWriter(dumpFile); + XmlSerializer serializer = Xml.newSerializer(); + StringWriter stringWriter = new StringWriter(); + serializer.setOutput(stringWriter); + serializer.startDocument("UTF-8", true); + serializer.startTag("", "displays"); + for (int d = 0, nd = allWindows.size(); d < nd; ++d) { + int displayId = allWindows.keyAt(d); + Display display = displayManager.getRealDisplay(displayId); + if (display == null) { + continue; + } + final List<AccessibilityWindowInfo> windows = allWindows.valueAt(d); + if (windows.isEmpty()) { + continue; + } + serializer.startTag("", "display"); + serializer.attribute("", "id", Integer.toString(displayId)); + int rotation = display.getRotation(); + Point size = new Point(); + display.getSize(size); + for (int i = 0, n = windows.size(); i < n; ++i) { + dumpWindowRec(windows.get(i), serializer, i, size.x, size.y, rotation); + } + serializer.endTag("", "display"); + } + serializer.endTag("", "displays"); + serializer.endDocument(); + writer.write(stringWriter.toString()); + writer.close(); + } catch (IOException e) { + Log.e(LOGTAG, "failed to dump window to file", e); + } + final long endTime = SystemClock.uptimeMillis(); + Log.w(LOGTAG, "Fetch time: " + (endTime - startTime) + "ms"); + } + + private static void dumpWindowRec(AccessibilityWindowInfo winfo, XmlSerializer serializer, + int index, int width, int height, int rotation) throws IOException { + serializer.startTag("", "window"); + serializer.attribute("", "index", Integer.toString(index)); + final CharSequence title = winfo.getTitle(); + serializer.attribute("", "title", title != null ? title.toString() : ""); + final Rect tmpBounds = new Rect(); + winfo.getBoundsInScreen(tmpBounds); + serializer.attribute("", "bounds", tmpBounds.toShortString()); + serializer.attribute("", "active", Boolean.toString(winfo.isActive())); + serializer.attribute("", "focused", Boolean.toString(winfo.isFocused())); + serializer.attribute("", "accessibility-focused", + Boolean.toString(winfo.isAccessibilityFocused())); + serializer.attribute("", "id", Integer.toString(winfo.getId())); + serializer.attribute("", "layer", Integer.toString(winfo.getLayer())); + serializer.attribute("", "type", AccessibilityWindowInfo.typeToString(winfo.getType())); + int count = winfo.getChildCount(); + for (int i = 0; i < count; ++i) { + AccessibilityWindowInfo child = winfo.getChild(i); + if (child == null) { + Log.i(LOGTAG, String.format("Null window child %d/%d, parent: %s", i, count, + winfo.getTitle())); + continue; + } + dumpWindowRec(child, serializer, i, width, height, rotation); + child.recycle(); + } + AccessibilityNodeInfo root = winfo.getRoot(); + if (root != null) { + serializer.startTag("", "hierarchy"); + serializer.attribute("", "rotation", Integer.toString(rotation)); + dumpNodeRec(root, serializer, 0, width, height); + root.recycle(); + serializer.endTag("", "hierarchy"); + } + serializer.endTag("", "window"); + } + private static void dumpNodeRec(AccessibilityNodeInfo node, XmlSerializer serializer,int index, int width, int height) throws IOException { serializer.startTag("", "node"); diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index b0ce7d1cc18c..97b704ccc1c9 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -601,6 +601,20 @@ public class ActivityManager { @TestApi public static final int PROCESS_CAPABILITY_FOREGROUND_MICROPHONE = 1 << 2; + // TODO: remove this when development is done. + // These are debug flags used between OomAdjuster and AppOpsService to detect and report absence + // of the real flags. + /** @hide */ + public static final int DEBUG_PROCESS_CAPABILITY_FOREGROUND_MICROPHONE_Q = 1 << 27; + /** @hide */ + public static final int DEBUG_PROCESS_CAPABILITY_FOREGROUND_CAMERA_Q = 1 << 28; + /** @hide */ + public static final int DEBUG_PROCESS_CAPABILITY_FOREGROUND_MICROPHONE = 1 << 29; + /** @hide */ + public static final int DEBUG_PROCESS_CAPABILITY_FOREGROUND_CAMERA = 1 << 30; + /** @hide */ + public static final int DEBUG_PROCESS_CAPABILITY_FOREGROUND_LOCATION = 1 << 31; + /** @hide all capabilities, the ORing of all flags in {@link ProcessCapability}*/ @TestApi public static final int PROCESS_CAPABILITY_ALL = PROCESS_CAPABILITY_FOREGROUND_LOCATION @@ -623,6 +637,51 @@ public class ActivityManager { public static final int PROCESS_CAPABILITY_ALL_IMPLICIT = PROCESS_CAPABILITY_FOREGROUND_CAMERA | PROCESS_CAPABILITY_FOREGROUND_MICROPHONE; + /** + * Print capability bits in human-readable form. + * @hide + */ + public static void printCapabilitiesSummary(PrintWriter pw, @ProcessCapability int caps) { + pw.print((caps & PROCESS_CAPABILITY_FOREGROUND_LOCATION) != 0 ? 'L' : '-'); + pw.print((caps & PROCESS_CAPABILITY_FOREGROUND_CAMERA) != 0 ? 'C' : '-'); + pw.print((caps & PROCESS_CAPABILITY_FOREGROUND_MICROPHONE) != 0 ? 'M' : '-'); + } + + /** + * Print capability bits in human-readable form. + * @hide + */ + public static void printCapabilitiesFull(PrintWriter pw, @ProcessCapability int caps) { + printCapabilitiesSummary(pw, caps); + if ((caps & DEBUG_PROCESS_CAPABILITY_FOREGROUND_LOCATION) != 0) { + pw.print(" !L"); + } + if ((caps & DEBUG_PROCESS_CAPABILITY_FOREGROUND_CAMERA) != 0) { + pw.print(" !C"); + } + if ((caps & DEBUG_PROCESS_CAPABILITY_FOREGROUND_CAMERA_Q) != 0) { + pw.print(" !Cq"); + } + if ((caps & DEBUG_PROCESS_CAPABILITY_FOREGROUND_MICROPHONE) != 0) { + pw.print(" !M"); + } + if ((caps & DEBUG_PROCESS_CAPABILITY_FOREGROUND_MICROPHONE_Q) != 0) { + pw.print(" !Mq"); + } + final int remain = caps & ~(PROCESS_CAPABILITY_FOREGROUND_LOCATION + | PROCESS_CAPABILITY_FOREGROUND_CAMERA + | PROCESS_CAPABILITY_FOREGROUND_MICROPHONE + | DEBUG_PROCESS_CAPABILITY_FOREGROUND_LOCATION + | DEBUG_PROCESS_CAPABILITY_FOREGROUND_CAMERA + | DEBUG_PROCESS_CAPABILITY_FOREGROUND_CAMERA_Q + | DEBUG_PROCESS_CAPABILITY_FOREGROUND_MICROPHONE + | DEBUG_PROCESS_CAPABILITY_FOREGROUND_MICROPHONE_Q); + if (remain != 0) { + pw.print('+'); + pw.print(remain); + } + } + // NOTE: If PROCESS_STATEs are added, then new fields must be added // to frameworks/base/core/proto/android/app/enums.proto and the following method must // be updated to correctly map between them. diff --git a/core/java/android/app/INotificationManager.aidl b/core/java/android/app/INotificationManager.aidl index 8dfce14af5f7..4c3e888157ee 100644 --- a/core/java/android/app/INotificationManager.aidl +++ b/core/java/android/app/INotificationManager.aidl @@ -58,7 +58,9 @@ interface INotificationManager void setShowBadge(String pkg, int uid, boolean showBadge); boolean canShowBadge(String pkg, int uid); - boolean hasSentMessage(String pkg, int uid); + boolean isInInvalidMsgState(String pkg, int uid); + boolean hasUserDemotedInvalidMsgApp(String pkg, int uid); + void setInvalidMsgAppDemoted(String pkg, int uid, boolean isDemoted); void setNotificationsEnabledForPackage(String pkg, int uid, boolean enabled); /** * Updates the notification's enabled state. Additionally locks importance for all of the diff --git a/core/java/android/content/IntentFilter.java b/core/java/android/content/IntentFilter.java index 745add174582..79da1f6ab282 100644 --- a/core/java/android/content/IntentFilter.java +++ b/core/java/android/content/IntentFilter.java @@ -1183,7 +1183,8 @@ public class IntentFilter implements Parcelable { return NO_MATCH_DATA; } } - if (mPort >= 0) { + // if we're dealing with wildcard support, we ignore ports + if (!wildcardSupported && mPort >= 0) { if (mPort != data.getPort()) { return NO_MATCH_DATA; } @@ -1580,12 +1581,13 @@ public class IntentFilter implements Parcelable { * @param wildcardSupported if true, will allow parameters to use wildcards */ private int matchData(String type, String scheme, Uri data, boolean wildcardSupported) { - final ArrayList<String> types = mDataTypes; + final boolean wildcardWithMimegroups = wildcardSupported && countMimeGroups() != 0; + final List<String> types = mDataTypes; final ArrayList<String> schemes = mDataSchemes; int match = MATCH_CATEGORY_EMPTY; - if (types == null && schemes == null) { + if (!wildcardWithMimegroups && types == null && schemes == null) { return ((type == null && data == null) ? (MATCH_CATEGORY_EMPTY+MATCH_ADJUSTMENT_NORMAL) : NO_MATCH_DATA); } @@ -1640,7 +1642,9 @@ public class IntentFilter implements Parcelable { } } - if (types != null) { + if (wildcardWithMimegroups) { + return MATCH_CATEGORY_TYPE; + } else if (types != null) { if (findMimeType(type)) { match = MATCH_CATEGORY_TYPE; } else { diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 1e9cddbb684a..9832bc1b79d2 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -51,7 +51,9 @@ import android.content.pm.dex.ArtManager; import android.content.pm.parsing.PackageInfoWithoutStateUtils; import android.content.pm.parsing.ParsingPackage; import android.content.pm.parsing.ParsingPackageUtils; +import android.content.pm.parsing.result.ParseInput; import android.content.pm.parsing.result.ParseResult; +import android.content.pm.parsing.result.ParseTypeImpl; import android.content.res.Resources; import android.content.res.XmlResourceParser; import android.graphics.Rect; @@ -6061,7 +6063,8 @@ public abstract class PackageManager { boolean collectCertificates = (flags & PackageManager.GET_SIGNATURES) != 0 || (flags & PackageManager.GET_SIGNING_CERTIFICATES) != 0; - ParseResult<ParsingPackage> result = ParsingPackageUtils.parseDefaultOneTime( + ParseInput input = ParseTypeImpl.forParsingWithoutPlatformCompat().reset(); + ParseResult<ParsingPackage> result = ParsingPackageUtils.parseDefault(input, new File(archiveFilePath), 0, collectCertificates); if (result.isError()) { return null; diff --git a/core/java/android/content/pm/parsing/ParsingPackageUtils.java b/core/java/android/content/pm/parsing/ParsingPackageUtils.java index cb2943122781..5a7947503d5c 100644 --- a/core/java/android/content/pm/parsing/ParsingPackageUtils.java +++ b/core/java/android/content/pm/parsing/ParsingPackageUtils.java @@ -131,14 +131,23 @@ public class ParsingPackageUtils { public static final String TAG = ParsingUtils.TAG; /** + * @see #parseDefault(ParseInput, File, int, boolean) + */ + @NonNull + public static ParseResult<ParsingPackage> parseDefaultOneTime(File file, + @PackageParser.ParseFlags int parseFlags, boolean collectCertificates) { + ParseInput input = ParseTypeImpl.forDefaultParsing().reset(); + return parseDefault(input, file, parseFlags, collectCertificates); + } + + /** * For cases outside of PackageManagerService when an APK needs to be parsed as a one-off * request, without caching the input object and without querying the internal system state * for feature support. */ @NonNull - public static ParseResult<ParsingPackage> parseDefaultOneTime(File file, + public static ParseResult<ParsingPackage> parseDefault(ParseInput input, File file, @PackageParser.ParseFlags int parseFlags, boolean collectCertificates) { - ParseInput input = ParseTypeImpl.forDefaultParsing().reset(); ParseResult<ParsingPackage> result; ParsingPackageUtils parser = new ParsingPackageUtils(false, null, null, new Callback() { diff --git a/core/java/android/content/pm/parsing/result/ParseInput.java b/core/java/android/content/pm/parsing/result/ParseInput.java index d5898b7f57a1..0fb18aee1eb4 100644 --- a/core/java/android/content/pm/parsing/result/ParseInput.java +++ b/core/java/android/content/pm/parsing/result/ParseInput.java @@ -16,6 +16,7 @@ package android.content.pm.parsing.result; +import android.annotation.IntRange; import android.annotation.NonNull; import android.annotation.Nullable; import android.compat.annotation.ChangeId; @@ -69,6 +70,25 @@ public interface ParseInput { @ChangeId @EnabledAfter(targetSdkVersion = Build.VERSION_CODES.Q) public static final long RESOURCES_ARSC_COMPRESSED = 132742131; + + /** + * TODO(chiuwinson): This is required because PackageManager#getPackageArchiveInfo + * cannot read the targetSdk info from the changeId because it requires the + * READ_COMPAT_CHANGE_CONFIG which cannot be obtained automatically without entering the + * server process. This should be removed once an alternative is found, or if the API + * is removed. + * @return the targetSdk that this change is gated on (> check), or -1 if disabled + */ + @IntRange(from = -1, to = Integer.MAX_VALUE) + public static int getTargetSdkForChange(long changeId) { + if (changeId == MISSING_APP_TAG + || changeId == EMPTY_INTENT_ACTION_CATEGORY + || changeId == RESOURCES_ARSC_COMPRESSED) { + return Build.VERSION_CODES.Q; + } + + return -1; + } } <ResultType> ParseResult<ResultType> success(ResultType result); diff --git a/core/java/android/content/pm/parsing/result/ParseTypeImpl.java b/core/java/android/content/pm/parsing/result/ParseTypeImpl.java index 91e571be3d89..14992fb2a4d1 100644 --- a/core/java/android/content/pm/parsing/result/ParseTypeImpl.java +++ b/core/java/android/content/pm/parsing/result/ParseTypeImpl.java @@ -65,6 +65,21 @@ public class ParseTypeImpl implements ParseInput, ParseResult<Object> { private Integer mTargetSdkVersion; /** + * Specifically for {@link PackageManager#getPackageArchiveInfo(String, int)} where + * {@link IPlatformCompat} cannot be used because the cross-package READ_COMPAT_CHANGE_CONFIG + * permission cannot be obtained. + */ + public static ParseTypeImpl forParsingWithoutPlatformCompat() { + return new ParseTypeImpl((changeId, packageName, targetSdkVersion) -> { + int gateSdkVersion = DeferredError.getTargetSdkForChange(changeId); + if (gateSdkVersion == -1) { + return false; + } + return targetSdkVersion > gateSdkVersion; + }); + } + + /** * Assumes {@link Context#PLATFORM_COMPAT_SERVICE} is available to the caller. For use * with {@link android.content.pm.parsing.ApkLiteParseUtils} or similar where parsing is * done outside of {@link com.android.server.pm.PackageManagerService}. diff --git a/core/java/android/debug/AdbNotifications.java b/core/java/android/debug/AdbNotifications.java index fed5f5f9a0bf..9f1a5f80aa4d 100644 --- a/core/java/android/debug/AdbNotifications.java +++ b/core/java/android/debug/AdbNotifications.java @@ -17,11 +17,13 @@ package android.debug; import android.annotation.NonNull; +import android.annotation.Nullable; import android.app.Notification; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; import android.content.res.Resources; import android.os.UserHandle; import android.provider.Settings; @@ -42,8 +44,9 @@ public final class AdbNotifications { * Builds a notification to show connected state for adb over a transport type. * @param context the context * @param transportType the adb transport type. - * @return a newly created Notification for the transport type. + * @return a newly created Notification for the transport type, or null on error. */ + @Nullable public static Notification createNotification(@NonNull Context context, byte transportType) { Resources resources = context.getResources(); @@ -66,10 +69,16 @@ public final class AdbNotifications { Intent intent = new Intent(Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); - intent.setPackage(context.getPackageManager().resolveActivity(intent, - PackageManager.MATCH_SYSTEM_ONLY).activityInfo.packageName); - PendingIntent pIntent = PendingIntent.getActivityAsUser(context, 0, intent, - PendingIntent.FLAG_IMMUTABLE, null, UserHandle.CURRENT); + ResolveInfo resolveInfo = context.getPackageManager().resolveActivity(intent, + PackageManager.MATCH_SYSTEM_ONLY); + // Settings app may not be available (e.g. device policy manager removes it) + PendingIntent pIntent = null; + if (resolveInfo != null) { + intent.setPackage(resolveInfo.activityInfo.packageName); + pIntent = PendingIntent.getActivityAsUser(context, 0, intent, + PendingIntent.FLAG_IMMUTABLE, null, UserHandle.CURRENT); + } + return new Notification.Builder(context, SystemNotificationChannels.DEVELOPER_IMPORTANT) .setSmallIcon(com.android.internal.R.drawable.stat_sys_adb) diff --git a/core/java/android/hardware/camera2/CameraCharacteristics.java b/core/java/android/hardware/camera2/CameraCharacteristics.java index 20120394d1e9..b149d7798aab 100644 --- a/core/java/android/hardware/camera2/CameraCharacteristics.java +++ b/core/java/android/hardware/camera2/CameraCharacteristics.java @@ -43,6 +43,10 @@ import java.util.Set; * through the {@link CameraManager CameraManager} * interface with {@link CameraManager#getCameraCharacteristics}.</p> * + * <p>When obtained by a client that does not hold the CAMERA permission, some metadata values are + * not included. The list of keys that require the permission is given by + * {@link #getKeysNeedingPermission}.</p> + * * <p>{@link CameraCharacteristics} objects are immutable.</p> * * @see CameraDevice diff --git a/core/java/android/hardware/camera2/CameraManager.java b/core/java/android/hardware/camera2/CameraManager.java index e81c649796a0..230aa044a9db 100644 --- a/core/java/android/hardware/camera2/CameraManager.java +++ b/core/java/android/hardware/camera2/CameraManager.java @@ -362,6 +362,11 @@ public final class CameraManager { * cameras that can only be used as part of logical multi-camera. These cameras cannot be * opened directly via {@link #openCamera}</p> * + * <p>Also starting with API level 29, while most basic camera information is still available + * even without the CAMERA permission, some values are not available to apps that do not hold + * that permission. The keys not available are listed by + * {@link CameraCharacteristics#getKeysNeedingPermission}.</p> + * * @param cameraId The id of the camera device to query. This could be either a standalone * camera ID which can be directly opened by {@link #openCamera}, or a physical camera ID that * can only used as part of a logical multi-camera. diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java index 25bf43043422..4832e564dbcf 100644 --- a/core/java/android/os/UserManager.java +++ b/core/java/android/os/UserManager.java @@ -1729,9 +1729,15 @@ public class UserManager { * <p>As of {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this method can * now automatically identify goats using advanced goat recognition technology.</p> * - * @return Returns true if the user making this call is a goat. + * <p>As of {@link android.os.Build.VERSION_CODES#R}, this method always returns + * {@code false} in order to protect goat privacy.</p> + * + * @return Returns whether the user making this call is a goat. */ public boolean isUserAGoat() { + if (mContext.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.R) { + return false; + } return mContext.getPackageManager() .isPackageAvailable("com.coffeestainstudios.goatsimulator"); } diff --git a/core/java/android/view/accessibility/AccessibilityWindowInfo.java b/core/java/android/view/accessibility/AccessibilityWindowInfo.java index ca5c417bdc6d..813234f1f49c 100644 --- a/core/java/android/view/accessibility/AccessibilityWindowInfo.java +++ b/core/java/android/view/accessibility/AccessibilityWindowInfo.java @@ -752,7 +752,10 @@ public final class AccessibilityWindowInfo implements Parcelable { } } - private static String typeToString(int type) { + /** + * @hide + */ + public static String typeToString(int type) { switch (type) { case TYPE_APPLICATION: { return "TYPE_APPLICATION"; @@ -770,7 +773,7 @@ public final class AccessibilityWindowInfo implements Parcelable { return "TYPE_SPLIT_SCREEN_DIVIDER"; } default: - return "<UNKNOWN>"; + return "<UNKNOWN:" + type + ">"; } } diff --git a/core/java/com/android/internal/app/ChooserActivity.java b/core/java/com/android/internal/app/ChooserActivity.java index 3fc3f3e65d37..cff669e6c5b9 100644 --- a/core/java/com/android/internal/app/ChooserActivity.java +++ b/core/java/com/android/internal/app/ChooserActivity.java @@ -778,6 +778,11 @@ public class ChooserActivity extends ResolverActivity implements mDirectShareShortcutInfoCache = new HashMap<>(); } + @Override + protected int appliedThemeResId() { + return R.style.Theme_DeviceDefault_Chooser; + } + private AppPredictor setupAppPredictorForUser(UserHandle userHandle, AppPredictor.Callback appPredictorCallback) { AppPredictor appPredictor = getAppPredictorForDirectShareIfEnabled(userHandle); diff --git a/core/java/com/android/internal/app/ChooserListAdapter.java b/core/java/com/android/internal/app/ChooserListAdapter.java index f426bc0ecbb5..492f98c1e6da 100644 --- a/core/java/com/android/internal/app/ChooserListAdapter.java +++ b/core/java/com/android/internal/app/ChooserListAdapter.java @@ -30,6 +30,7 @@ import android.content.pm.LabeledIntent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.pm.ShortcutInfo; +import android.graphics.drawable.Drawable; import android.os.AsyncTask; import android.os.UserHandle; import android.os.UserManager; @@ -103,7 +104,7 @@ public class ChooserListAdapter extends ResolverListAdapter { private Set<ComponentName> mPendingChooserTargetService = new HashSet<>(); private Set<ComponentName> mShortcutComponents = new HashSet<>(); private final List<ChooserTargetInfo> mServiceTargets = new ArrayList<>(); - private final List<TargetInfo> mCallerTargets = new ArrayList<>(); + private final List<DisplayResolveInfo> mCallerTargets = new ArrayList<>(); private final ChooserActivity.BaseChooserTargetComparator mBaseTargetComparator = new ChooserActivity.BaseChooserTargetComparator(); @@ -253,28 +254,44 @@ public class ChooserListAdapter extends ResolverListAdapter { holder.text.setBackground(null); holder.itemView.setBackground(holder.defaultItemViewBackground); } + + // If the target is grouped show an indicator + if (info instanceof MultiDisplayResolveInfo) { + Drawable bkg = mContext.getDrawable(R.drawable.chooser_group_background); + holder.text.setPaddingRelative(0, 0, bkg.getIntrinsicWidth() /* end */, 0); + holder.text.setBackground(bkg); + } else { + holder.text.setBackground(null); + holder.text.setPaddingRelative(0, 0, 0, 0); + } } void updateAlphabeticalList() { mSortedList.clear(); + List<DisplayResolveInfo> tempList = new ArrayList<>(); + tempList.addAll(mDisplayList); + tempList.addAll(mCallerTargets); if (mEnableStackedApps) { // Consolidate multiple targets from same app. Map<String, DisplayResolveInfo> consolidated = new HashMap<>(); - for (DisplayResolveInfo info : mDisplayList) { + for (DisplayResolveInfo info : tempList) { String packageName = info.getResolvedComponentName().getPackageName(); - if (consolidated.get(packageName) != null) { - // create consolidated target + DisplayResolveInfo multiDri = consolidated.get(packageName); + if (multiDri == null) { + consolidated.put(packageName, info); + } else if (multiDri instanceof MultiDisplayResolveInfo) { + ((MultiDisplayResolveInfo) multiDri).addTarget(info); + } else { + // create consolidated target from the single DisplayResolveInfo MultiDisplayResolveInfo multiDisplayResolveInfo = - new MultiDisplayResolveInfo(packageName, info); - multiDisplayResolveInfo.addTarget(consolidated.get(packageName)); + new MultiDisplayResolveInfo(packageName, multiDri); + multiDisplayResolveInfo.addTarget(info); consolidated.put(packageName, multiDisplayResolveInfo); - } else { - consolidated.put(packageName, info); } } mSortedList.addAll(consolidated.values()); } else { - mSortedList.addAll(mDisplayList); + mSortedList.addAll(tempList); } Collections.sort(mSortedList, new ChooserActivity.AzInfoComparator(mContext)); } @@ -326,7 +343,10 @@ public class ChooserListAdapter extends ResolverListAdapter { return standardCount > mChooserListCommunicator.getMaxRankedTargets() ? standardCount : 0; } - int getRankedTargetCount() { + /** + * Fetch ranked app target count + */ + public int getRankedTargetCount() { int spacesAvailable = mChooserListCommunicator.getMaxRankedTargets() - getCallerTargetCount(); return Math.min(spacesAvailable, super.getCount()); @@ -411,6 +431,19 @@ public class ChooserListAdapter extends ResolverListAdapter { return null; } + // Check whether {@code dri} should be added into mDisplayList. + @Override + protected boolean shouldAddResolveInfo(DisplayResolveInfo dri) { + // Checks if this info is already listed in callerTargets. + for (TargetInfo existingInfo : mCallerTargets) { + if (mResolverListCommunicator + .resolveInfoMatch(dri.getResolveInfo(), existingInfo.getResolveInfo())) { + return false; + } + } + return super.shouldAddResolveInfo(dri); + } + /** * Fetch surfaced direct share target info */ diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java index 3084f2a84945..4b5735ce34ed 100644 --- a/core/java/com/android/internal/app/ResolverActivity.java +++ b/core/java/com/android/internal/app/ResolverActivity.java @@ -324,7 +324,7 @@ public class ResolverActivity extends Activity implements protected void onCreate(Bundle savedInstanceState, Intent intent, CharSequence title, int defaultTitleRes, Intent[] initialIntents, List<ResolveInfo> rList, boolean supportsAlwaysUseOption) { - setTheme(R.style.Theme_DeviceDefault_Resolver); + setTheme(appliedThemeResId()); super.onCreate(savedInstanceState); // Determine whether we should show that intent is forwarded @@ -507,6 +507,10 @@ public class ResolverActivity extends Activity implements /* shouldShowNoCrossProfileIntentsEmptyState= */ getUser().equals(intentUser)); } + protected int appliedThemeResId() { + return R.style.Theme_DeviceDefault_Resolver; + } + /** * Returns the user id of the user that the starting intent originated from. * <p>This is not necessarily equal to {@link #getUserId()} or {@link UserHandle#myUserId()}, diff --git a/core/java/com/android/internal/app/ResolverListAdapter.java b/core/java/com/android/internal/app/ResolverListAdapter.java index 24bf98b6502c..af9c0408ccaa 100644 --- a/core/java/com/android/internal/app/ResolverListAdapter.java +++ b/core/java/com/android/internal/app/ResolverListAdapter.java @@ -85,7 +85,7 @@ public class ResolverListAdapter extends BaseAdapter { private int mLastChosenPosition = -1; private boolean mFilterLastUsed; - private final ResolverListCommunicator mResolverListCommunicator; + final ResolverListCommunicator mResolverListCommunicator; private Runnable mPostListReadyRunnable; private final boolean mIsAudioCaptureDevice; private boolean mIsTabLoaded; @@ -443,15 +443,22 @@ public class ResolverListAdapter extends BaseAdapter { // TODO(arangelov): Is that UserHandle.USER_CURRENT check okay? if (dri != null && dri.getResolveInfo() != null && dri.getResolveInfo().targetUserId == UserHandle.USER_CURRENT) { - // Checks if this info is already listed in display. - for (DisplayResolveInfo existingInfo : mDisplayList) { - if (mResolverListCommunicator - .resolveInfoMatch(dri.getResolveInfo(), existingInfo.getResolveInfo())) { - return; - } + if (shouldAddResolveInfo(dri)) { + mDisplayList.add(dri); + } + } + } + + // Check whether {@code dri} should be added into mDisplayList. + protected boolean shouldAddResolveInfo(DisplayResolveInfo dri) { + // Checks if this info is already listed in display. + for (DisplayResolveInfo existingInfo : mDisplayList) { + if (mResolverListCommunicator + .resolveInfoMatch(dri.getResolveInfo(), existingInfo.getResolveInfo())) { + return false; } - mDisplayList.add(dri); } + return true; } @Nullable diff --git a/core/java/com/android/internal/app/SimpleIconFactory.java b/core/java/com/android/internal/app/SimpleIconFactory.java index d618cdf86865..ffe2dbe4ccc0 100644 --- a/core/java/com/android/internal/app/SimpleIconFactory.java +++ b/core/java/com/android/internal/app/SimpleIconFactory.java @@ -20,6 +20,7 @@ import static android.content.Context.ACTIVITY_SERVICE; import static android.graphics.Paint.DITHER_FLAG; import static android.graphics.Paint.FILTER_BITMAP_FLAG; +import android.annotation.AttrRes; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityManager; @@ -46,6 +47,7 @@ import android.graphics.drawable.DrawableWrapper; import android.os.UserHandle; import android.util.AttributeSet; import android.util.Pools.SynchronizedPool; +import android.util.TypedValue; import com.android.internal.R; @@ -92,10 +94,8 @@ public class SimpleIconFactory { final ActivityManager am = (ActivityManager) ctx.getSystemService(ACTIVITY_SERVICE); final int iconDpi = (am == null) ? 0 : am.getLauncherLargeIconDensity(); - final Resources r = ctx.getResources(); - final int iconSize = r.getDimensionPixelSize(R.dimen.resolver_icon_size); - final int badgeSize = r.getDimensionPixelSize(R.dimen.resolver_badge_size); - + final int iconSize = getIconSizeFromContext(ctx); + final int badgeSize = getBadgeSizeFromContext(ctx); instance = new SimpleIconFactory(ctx, iconDpi, iconSize, badgeSize); instance.setWrapperBackgroundColor(Color.WHITE); } @@ -103,6 +103,27 @@ public class SimpleIconFactory { return instance; } + private static int getAttrDimFromContext(Context ctx, @AttrRes int attrId, String errorMsg) { + final Resources res = ctx.getResources(); + TypedValue outVal = new TypedValue(); + if (!ctx.getTheme().resolveAttribute(attrId, outVal, true)) { + throw new IllegalStateException(errorMsg); + } + return res.getDimensionPixelSize(outVal.resourceId); + } + + private static int getIconSizeFromContext(Context ctx) { + return getAttrDimFromContext(ctx, + com.android.internal.R.attr.iconfactoryIconSize, + "Expected theme to define iconfactoryIconSize."); + } + + private static int getBadgeSizeFromContext(Context ctx) { + return getAttrDimFromContext(ctx, + com.android.internal.R.attr.iconfactoryBadgeSize, + "Expected theme to define iconfactoryBadgeSize."); + } + /** * Recycles the SimpleIconFactory so others may use it. * diff --git a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java index 6f33096a14fd..d238d0eb916d 100644 --- a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java +++ b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java @@ -61,22 +61,6 @@ public final class SystemUiDeviceConfigFlags { public static final String SCREENSHOT_NOTIFICATION_SMART_ACTIONS_TIMEOUT_MS = "screenshot_notification_smart_actions_timeout_ms"; - // Flags related to controls - - /** - * (boolean) Whether to have split behavior when opening QS - */ - public static final String QS_SPLIT_ENABLED = "qs_split_enabled"; - - /** - * (int) Open settings panels for WiFi and BT tiles - * 0 - default behavior, link to settings - * 1 - open panel on long press, click remains the same - * 2 - open panel on click, long press remains the same - * 3 - use details on long press - */ - public static final String QS_USE_SETTINGS_PANELS = "qs_use_settings_panels"; - // Flags related to Smart Suggestions - these are read in SmartReplyConstants. /** (boolean) Whether to enable smart suggestions in notifications. */ diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 0bf504595714..3cd0f03de727 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -5053,7 +5053,7 @@ android:forceQueryable="true" android:directBootAware="true"> <activity android:name="com.android.internal.app.ChooserActivity" - android:theme="@style/Theme.DeviceDefault.Resolver" + android:theme="@style/Theme.DeviceDefault.Chooser" android:finishOnCloseSystemDialogs="true" android:excludeFromRecents="true" android:documentLaunchMode="never" diff --git a/core/res/res/drawable/chooser_group_background.xml b/core/res/res/drawable/chooser_group_background.xml new file mode 100644 index 000000000000..2bf9337557ed --- /dev/null +++ b/core/res/res/drawable/chooser_group_background.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2020 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> + +<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:drawable="@drawable/ic_chooser_group_arrow" + android:gravity="end|center_vertical" + android:width="12dp" + android:height="12dp" + android:start="4dp" + android:end="4dp" /> +</layer-list> diff --git a/core/res/res/drawable/ic_chooser_group_arrow.xml b/core/res/res/drawable/ic_chooser_group_arrow.xml new file mode 100644 index 000000000000..d42bb97bbb37 --- /dev/null +++ b/core/res/res/drawable/ic_chooser_group_arrow.xml @@ -0,0 +1,26 @@ +<!-- + ~ 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="12dp" + android:height="12dp" + android:viewportWidth="12" + android:viewportHeight="12" + android:tint="?attr/textColorSecondary"> + <path + android:pathData="M2,4L6,8L10,4L2,4Z" + android:fillColor="#FF000000"/> +</vector> diff --git a/core/res/res/layout/car_user_switching_dialog.xml b/core/res/res/layout/car_user_switching_dialog.xml deleted file mode 100644 index d7274348bd16..000000000000 --- a/core/res/res/layout/car_user_switching_dialog.xml +++ /dev/null @@ -1,37 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - Copyright (C) 2018 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. ---> -<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:fitsSystemWindows="true" - android:layout_width="wrap_content" - android:layout_height="wrap_content"> - - <ImageView - android:id="@+id/user_loading_avatar" - android:layout_width="@dimen/car_fullscreen_user_pod_image_avatar_width" - android:layout_height="@dimen/car_fullscreen_user_pod_image_avatar_height" - android:layout_centerHorizontal="true"/> - - <TextView android:id="@+id/user_loading" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginTop="@dimen/car_padding_4" - android:textSize="@dimen/car_body1_size" - android:textColor="@color/car_body1" - android:layout_below="@id/user_loading_avatar" - android:gravity="center"/> - -</RelativeLayout>
\ No newline at end of file diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index b92bbd6b2461..8a4676dec6b3 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -9230,4 +9230,7 @@ </declare-styleable> <attr name="autoSizePresetSizes" /> + + <attr name="iconfactoryIconSize" format="dimension"/> + <attr name="iconfactoryBadgeSize" format="dimension"/> </resources> diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml index 2ac61ecad2e5..c7ad5da7d1c7 100644 --- a/core/res/res/values/dimens.xml +++ b/core/res/res/values/dimens.xml @@ -810,7 +810,8 @@ <dimen name="chooser_header_scroll_elevation">4dp</dimen> <dimen name="chooser_max_collapsed_height">288dp</dimen> <dimen name="chooser_direct_share_label_placeholder_max_width">72dp</dimen> - <dimen name="chooser_icon_size">42dp</dimen> + <dimen name="chooser_icon_size">56dp</dimen> + <dimen name="chooser_badge_size">22dp</dimen> <dimen name="resolver_icon_size">32dp</dimen> <dimen name="resolver_button_bar_spacing">8dp</dimen> <dimen name="resolver_badge_size">18dp</dimen> diff --git a/core/res/res/values/dimens_car.xml b/core/res/res/values/dimens_car.xml index bd4c48427e0e..2c4f4c89ab81 100644 --- a/core/res/res/values/dimens_car.xml +++ b/core/res/res/values/dimens_car.xml @@ -16,14 +16,7 @@ */ --> <resources> - <dimen name="car_fullscreen_user_pod_icon_text_size">64sp</dimen> - <dimen name="car_fullscreen_user_pod_width">243dp</dimen> - <dimen name="car_fullscreen_user_pod_height">356dp</dimen> - <dimen name="car_fullscreen_user_pod_image_avatar_width">96dp</dimen> - <dimen name="car_fullscreen_user_pod_image_avatar_height">96dp</dimen> <dimen name="car_large_avatar_size">96dp</dimen> - - <!-- Application Bar --> <dimen name="car_app_bar_height">80dp</dimen> <!-- Margin --> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 369a3e51df26..8347a2478dfa 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -2534,6 +2534,7 @@ <java-symbol type="style" name="TextAppearance.Material.TimePicker.TimeLabel" /> <java-symbol type="attr" name="seekBarPreferenceStyle" /> <java-symbol type="style" name="Theme.DeviceDefault.Resolver" /> + <java-symbol type="style" name="Theme.DeviceDefault.Chooser" /> <java-symbol type="style" name="Theme.DeviceDefault.System" /> <java-symbol type="attr" name="preferenceActivityStyle" /> <java-symbol type="attr" name="preferenceFragmentStyle" /> @@ -2744,6 +2745,8 @@ <java-symbol type="id" name="chooser_row_text_option" /> <java-symbol type="dimen" name="chooser_row_text_option_translate" /> <java-symbol type="dimen" name="chooser_preview_image_max_dimen"/> + <java-symbol type="drawable" name="ic_chooser_group_arrow"/> + <java-symbol type="drawable" name="chooser_group_background"/> <java-symbol type="integer" name="config_maxShortcutTargetsPerApp" /> <java-symbol type="layout" name="resolve_grid_item" /> <java-symbol type="id" name="day_picker_view_pager" /> @@ -3638,13 +3641,6 @@ <java-symbol type="color" name="car_card_dark" /> <java-symbol type="dimen" name="car_body1_size" /> <java-symbol type="dimen" name="car_padding_4" /> - <java-symbol type="dimen" name="car_fullscreen_user_pod_icon_text_size" /> - <java-symbol type="dimen" name="car_fullscreen_user_pod_image_avatar_height" /> - <java-symbol type="dimen" name="car_fullscreen_user_pod_image_avatar_width" /> - <java-symbol type="dimen" name="car_large_avatar_size" /> - <java-symbol type="layout" name="car_user_switching_dialog" /> - <java-symbol type="id" name="user_loading_avatar" /> - <java-symbol type="id" name="user_loading" /> <java-symbol type="style" name="Theme.DeviceDefault.Light.Dialog.Alert.UserSwitchingDialog" /> <java-symbol type="string" name="battery_saver_description_with_learn_more" /> @@ -3784,8 +3780,11 @@ <!-- For Auto-Brightness --> <java-symbol type="string" name="config_displayLightSensorType" /> - <java-symbol type="drawable" name="iconfactory_adaptive_icon_drawable_wrapper"/> <java-symbol type="dimen" name="notification_min_height" /> + + <java-symbol type="drawable" name="iconfactory_adaptive_icon_drawable_wrapper"/> + <java-symbol type="attr" name="iconfactoryIconSize"/> + <java-symbol type="attr" name="iconfactoryBadgeSize"/> <java-symbol type="dimen" name="resolver_icon_size"/> <java-symbol type="dimen" name="resolver_badge_size"/> <java-symbol type="dimen" name="resolver_button_bar_spacing"/> @@ -3794,6 +3793,7 @@ <java-symbol type="dimen" name="resolver_edge_margin"/> <java-symbol type="dimen" name="resolver_elevation"/> <java-symbol type="dimen" name="chooser_icon_size"/> + <java-symbol type="dimen" name="chooser_badge_size"/> <!-- For DropBox --> <java-symbol type="integer" name="config_dropboxLowPriorityBroadcastRateLimitPeriod" /> @@ -4019,4 +4019,5 @@ <java-symbol type="string" name="config_pdp_reject_user_authentication_failed" /> <java-symbol type="string" name="config_pdp_reject_service_not_subscribed" /> <java-symbol type="string" name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" /> + </resources> diff --git a/core/res/res/values/themes_device_defaults.xml b/core/res/res/values/themes_device_defaults.xml index 81ec27841aa7..1afaf4f7f184 100644 --- a/core/res/res/values/themes_device_defaults.xml +++ b/core/res/res/values/themes_device_defaults.xml @@ -1680,6 +1680,8 @@ easier. <item name="listPreferredItemPaddingEnd">?attr/dialogPreferredPadding</item> <item name="navigationBarColor">@android:color/transparent</item> <item name="tabWidgetStyle">@style/Widget.DeviceDefault.Resolver.TabWidget</item> + <item name="iconfactoryIconSize">@dimen/resolver_icon_size</item> + <item name="iconfactoryBadgeSize">@dimen/resolver_badge_size</item> </style> <style name="Widget.DeviceDefault.Resolver.TabWidget" parent="Widget.DeviceDefault.TabWidget"> @@ -1694,6 +1696,11 @@ easier. <item name="windowLightNavigationBar">true</item> </style> + <style name="Theme.DeviceDefault.Chooser" parent="Theme.DeviceDefault.Resolver"> + <item name="iconfactoryIconSize">@dimen/chooser_icon_size</item> + <item name="iconfactoryBadgeSize">@dimen/chooser_badge_size</item> + </style> + <style name="Animation.DeviceDefault.Activity.Resolver" parent="Animation.DeviceDefault.Activity"> <item name="activityOpenEnterAnimation">@anim/resolver_launch_anim</item> <item name="taskOpenEnterAnimation">@anim/resolver_launch_anim</item> diff --git a/core/tests/coretests/src/android/debug/AdbNotificationsTest.java b/core/tests/coretests/src/android/debug/AdbNotificationsTest.java index 6c187ea6e17a..3496e2c7fea3 100644 --- a/core/tests/coretests/src/android/debug/AdbNotificationsTest.java +++ b/core/tests/coretests/src/android/debug/AdbNotificationsTest.java @@ -56,8 +56,11 @@ public final class AdbNotificationsTest { // Verify that the adb notification for usb connections has the correct text. assertEquals(title, notification.extras.getCharSequence(Notification.EXTRA_TITLE, "")); assertEquals(message, notification.extras.getCharSequence(Notification.EXTRA_TEXT, "")); - // Verify the PendingIntent has an explicit intent (b/153356209). - assertFalse(TextUtils.isEmpty(notification.contentIntent.getIntent().getPackage())); + // Verify the PendingIntent has an explicit intent (b/153356209), if there is a + // PendingIntent attached. + if (notification.contentIntent != null) { + assertFalse(TextUtils.isEmpty(notification.contentIntent.getIntent().getPackage())); + } } @Test @@ -73,7 +76,10 @@ public final class AdbNotificationsTest { // Verify that the adb notification for usb connections has the correct text. assertEquals(title, notification.extras.getCharSequence(Notification.EXTRA_TITLE, "")); assertEquals(message, notification.extras.getCharSequence(Notification.EXTRA_TEXT, "")); - // Verify the PendingIntent has an explicit intent (b/153356209). - assertFalse(TextUtils.isEmpty(notification.contentIntent.getIntent().getPackage())); + // Verify the PendingIntent has an explicit intent (b/153356209), if there is a + // PendingIntent attached. + if (notification.contentIntent != null) { + assertFalse(TextUtils.isEmpty(notification.contentIntent.getIntent().getPackage())); + } } } 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 e23a3cad914b..dcecb5f32096 100644 --- a/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java +++ b/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java @@ -294,6 +294,60 @@ public class ChooserActivityTest { } @Test + public void fourOptionsStackedIntoOneTarget() throws InterruptedException { + Intent sendIntent = createSendTextIntent(); + + // create 12 unique app targets to ensure the app ranking row can be filled, otherwise + // targets will not stack + List<ResolvedComponentInfo> resolvedComponentInfos = createResolvedComponentsForTest(12); + + // next create 4 targets in a single app that should be stacked into a single target + String packageName = "xxx.yyy"; + String appName = "aaa"; + ComponentName cn = new ComponentName(packageName, appName); + Intent intent = new Intent("fakeIntent"); + List<ResolvedComponentInfo> infosToStack = new ArrayList<>(); + for (int i = 0; i < 4; i++) { + ResolveInfo resolveInfo = ResolverDataProvider.createResolveInfo(i, + UserHandle.USER_CURRENT); + resolveInfo.activityInfo.applicationInfo.name = appName; + resolveInfo.activityInfo.applicationInfo.packageName = packageName; + resolveInfo.activityInfo.packageName = packageName; + resolveInfo.activityInfo.name = "ccc" + i; + infosToStack.add(new ResolvedComponentInfo(cn, intent, resolveInfo)); + } + resolvedComponentInfos.addAll(infosToStack); + + when(sOverrides.resolverListController.getResolversForIntent(Mockito.anyBoolean(), + Mockito.anyBoolean(), + Mockito.isA(List.class))).thenReturn(resolvedComponentInfos); + + final ChooserWrapperActivity activity = mActivityRule + .launchActivity(Intent.createChooser(sendIntent, null)); + waitForIdle(); + + // expect 12 unique targets + 1 group + 4 ranked app targets + assertThat(activity.getAdapter().getCount(), is(17)); + + ResolveInfo[] chosen = new ResolveInfo[1]; + sOverrides.onSafelyStartCallback = targetInfo -> { + chosen[0] = targetInfo.getResolveInfo(); + return true; + }; + + onView(withText(appName)).perform(click()); + waitForIdle(); + + // clicking will launch a dialog to choose the activity within the app + onView(withText(appName)).check(matches(isDisplayed())); + int i = 0; + for (ResolvedComponentInfo rci: infosToStack) { + onView(withText("ccc" + i)).check(matches(isDisplayed())); + ++i; + } + } + + @Test public void updateChooserCountsAndModelAfterUserSelection() throws InterruptedException { Intent sendIntent = createSendTextIntent(); List<ResolvedComponentInfo> resolvedComponentInfos = createResolvedComponentsForTest(2); @@ -1872,6 +1926,33 @@ public class ChooserActivityTest { .check(matches(isDisplayed())); } + @Test + public void testDeduplicateCallerTargetRankedTarget() { + // Create 4 ranked app targets. + List<ResolvedComponentInfo> personalResolvedComponentInfos = + createResolvedComponentsForTest(4); + when(sOverrides.resolverListController.getResolversForIntent(Mockito.anyBoolean(), + Mockito.anyBoolean(), + Mockito.isA(List.class))) + .thenReturn(new ArrayList<>(personalResolvedComponentInfos)); + // Create caller target which is duplicate with one of app targets + Intent chooserIntent = createChooserIntent(createSendTextIntent(), + new Intent[] {new Intent("action.fake")}); + sOverrides.packageManager = mock(PackageManager.class); + ResolveInfo ri = ResolverDataProvider.createResolveInfo(0, + UserHandle.USER_CURRENT); + when(sOverrides.packageManager.resolveActivity(any(Intent.class), anyInt())).thenReturn(ri); + waitForIdle(); + + ChooserWrapperActivity activity = mActivityRule.launchActivity(chooserIntent); + waitForIdle(); + + // Total 4 targets (1 caller target, 3 ranked targets) + assertThat(activity.getAdapter().getCount(), is(4)); + assertThat(activity.getAdapter().getCallerTargetCount(), is(1)); + assertThat(activity.getAdapter().getRankedTargetCount(), is(3)); + } + private Intent createChooserIntent(Intent intent, Intent[] initialIntents) { Intent chooserIntent = new Intent(); chooserIntent.setAction(Intent.ACTION_CHOOSER); diff --git a/data/keyboards/Vendor_28de_Product_1102.kl b/data/keyboards/Vendor_28de_Product_1102.kl new file mode 100644 index 000000000000..150a17a78250 --- /dev/null +++ b/data/keyboards/Vendor_28de_Product_1102.kl @@ -0,0 +1,74 @@ +# 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. + +# +# Steam Controller - Model 1001 - USB +# + +# Mapping according to https://developer.android.com/training/game-controllers/controller-input.html + +key 304 BUTTON_A +key 305 BUTTON_B +key 307 BUTTON_X +key 308 BUTTON_Y + +key 310 BUTTON_L1 +key 311 BUTTON_R1 +key 312 BUTTON_L2 +key 313 BUTTON_R2 + +# Triggers. +axis 0x15 LTRIGGER +axis 0x14 RTRIGGER + +# Left and right stick. +axis 0x00 X +axis 0x01 Y + +# Right stick / mousepad +axis 0x03 Z +axis 0x04 RZ + +key 317 BUTTON_THUMBL +key 318 BUTTON_THUMBR + +# Hat. +axis 0x10 HAT_X +axis 0x11 HAT_Y + +# Dpad (clicks) +key 544 DPAD_UP +key 545 DPAD_DOWN +key 546 DPAD_LEFT +key 547 DPAD_RIGHT + +# Touching the dpad (light touch without pressing down) +key 289 BUTTON_1 +# Touching the "right stick" / mousepad (light touch without pressing down) +key 290 BUTTON_2 + +# Pressing the large paddle on the back, left (linux BTN_WHEEL / BTN_GEAR_DOWN) +key 336 BUTTON_3 +# Pressing the large paddle on the back, right (linux BTN_GEAR_UP) +key 337 BUTTON_4 + + +# Mapping according to https://www.kernel.org/doc/Documentation/input/gamepad.txt +# Left arrow +key 314 BUTTON_SELECT +# Right arrow +key 315 BUTTON_START + +# Steam key +key 316 BUTTON_MODE diff --git a/media/java/android/media/AudioManagerInternal.java b/media/java/android/media/AudioManagerInternal.java index 98c2d7fdd55f..357c3332fe10 100644 --- a/media/java/android/media/AudioManagerInternal.java +++ b/media/java/android/media/AudioManagerInternal.java @@ -16,6 +16,7 @@ package android.media; import android.util.IntArray; + import com.android.server.LocalServices; /** @@ -48,6 +49,18 @@ public abstract class AudioManagerInternal { public abstract void setAccessibilityServiceUids(IntArray uids); + /** + * Called by {@link com.android.server.inputmethod.InputMethodManagerService} to notify the UID + * of the currently used {@link android.inputmethodservice.InputMethodService}. + * + * <p>The caller is expected to take care of any performance implications, e.g. by using a + * background thread to call this method.</p> + * + * @param uid UID of the currently used {@link android.inputmethodservice.InputMethodService}. + * {@link android.os.Process#INVALID_UID} if no IME is active. + */ + public abstract void setInputMethodServiceUid(int uid); + public interface RingerModeDelegate { /** Called when external ringer mode is evaluated, returns the new internal ringer mode */ int onSetRingerModeExternal(int ringerModeOld, int ringerModeNew, String caller, diff --git a/packages/CarSystemUI/AndroidManifest.xml b/packages/CarSystemUI/AndroidManifest.xml index 261b9f508ccd..1dd02919a093 100644 --- a/packages/CarSystemUI/AndroidManifest.xml +++ b/packages/CarSystemUI/AndroidManifest.xml @@ -25,4 +25,6 @@ <uses-permission android:name="android.car.permission.CAR_ENROLL_TRUST"/> <!-- This permission is required to get bluetooth broadcast. --> <uses-permission android:name="android.permission.BLUETOOTH" /> + <!-- This permission is required to check the foreground user id. --> + <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" /> </manifest> diff --git a/packages/CarSystemUI/res/layout/car_user_switching_dialog.xml b/packages/CarSystemUI/res/layout/car_user_switching_dialog.xml new file mode 100644 index 000000000000..0a294246dfaa --- /dev/null +++ b/packages/CarSystemUI/res/layout/car_user_switching_dialog.xml @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2020 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> +<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:fitsSystemWindows="true" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:gravity="center" + android:background="@color/car_user_switching_dialog_background_color"> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical" + android:layout_gravity="center" + android:gravity="center_horizontal"> + <ImageView + android:id="@+id/user_loading_avatar" + android:layout_width="@dimen/car_fullscreen_user_pod_image_avatar_width" + android:layout_height="@dimen/car_fullscreen_user_pod_image_avatar_height"/> + + <TextView + android:id="@+id/user_loading" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/car_user_switching_dialog_loading_text_margin_top" + android:textSize="@dimen/car_user_switching_dialog_loading_text_font_size" + android:textColor="@color/car_user_switching_dialog_loading_text_color" + android:layout_below="@id/user_loading_avatar"/> + </LinearLayout> +</FrameLayout> diff --git a/packages/CarSystemUI/res/layout/sysui_overlay_window.xml b/packages/CarSystemUI/res/layout/sysui_overlay_window.xml index 35423231bb97..2dc499c160c6 100644 --- a/packages/CarSystemUI/res/layout/sysui_overlay_window.xml +++ b/packages/CarSystemUI/res/layout/sysui_overlay_window.xml @@ -39,4 +39,9 @@ android:layout_height="match_parent" android:layout="@layout/car_fullscreen_user_switcher"/> + <ViewStub android:id="@+id/user_switching_dialog_stub" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout="@layout/car_user_switching_dialog"/> + </FrameLayout>
\ No newline at end of file diff --git a/packages/CarSystemUI/res/values/colors.xml b/packages/CarSystemUI/res/values/colors.xml index 3e44721848a1..0e84d517759a 100644 --- a/packages/CarSystemUI/res/values/colors.xml +++ b/packages/CarSystemUI/res/values/colors.xml @@ -55,4 +55,7 @@ <color name="list_divider_color">@*android:color/car_list_divider_light</color> <color name="car_volume_item_divider_color">@*android:color/car_list_divider</color> <color name="car_volume_item_background_color">@*android:color/car_card_dark</color> + + <color name="car_user_switching_dialog_background_color">@android:color/black</color> + <color name="car_user_switching_dialog_loading_text_color">@*android:color/car_body1</color> </resources> diff --git a/packages/CarSystemUI/res/values/config.xml b/packages/CarSystemUI/res/values/config.xml index 67066d7c426f..4bf0fca445d1 100644 --- a/packages/CarSystemUI/res/values/config.xml +++ b/packages/CarSystemUI/res/values/config.xml @@ -70,11 +70,13 @@ to a constant alpha percent value using the initial alpha. --> <integer name="config_finalNotificationBackgroundAlpha">100</integer> - <!-- Car System UI's OverlayViewsMediator--> + <!-- Car System UI's OverlayViewsMediator. + Whenever a new class is added, make sure to also add that class to OverlayWindowModule. --> <string-array name="config_carSystemUIOverlayViewsMediators" translatable="false"> <item>@string/config_notificationPanelViewMediator</item> <item>com.android.systemui.car.keyguard.CarKeyguardViewMediator</item> <item>com.android.systemui.car.userswitcher.FullscreenUserSwitcherViewMediator</item> + <item>com.android.systemui.car.userswitcher.UserSwitchTransitionViewMediator</item> </string-array> <!-- diff --git a/packages/CarSystemUI/res/values/dimens.xml b/packages/CarSystemUI/res/values/dimens.xml index 9014eb15d6cf..ed0b4853994d 100644 --- a/packages/CarSystemUI/res/values/dimens.xml +++ b/packages/CarSystemUI/res/values/dimens.xml @@ -15,6 +15,32 @@ ~ limitations under the License --> <resources> + <!-- Text size for car --> + <dimen name="car_title_size">32sp</dimen> + <dimen name="car_title2_size">32sp</dimen> + <dimen name="car_headline1_size">45sp</dimen> + <dimen name="car_headline2_size">32sp</dimen> + <dimen name="car_headline3_size">24sp</dimen> + <dimen name="car_headline4_size">20sp</dimen> + <dimen name="car_body1_size">32sp</dimen> + <dimen name="car_body2_size">28sp</dimen> + <dimen name="car_body3_size">26sp</dimen> + <dimen name="car_body4_size">24sp</dimen> + <!-- car_body5_size is deprecated --> + <dimen name="car_body5_size">18sp</dimen> + <dimen name="car_label1_size">26sp</dimen> + <dimen name="car_label2_size">64sp</dimen> + <dimen name="car_action1_size">26sp</dimen> + <dimen name="car_action2_size">26sp</dimen> + <!-- Paddings --> + <dimen name="car_padding_0">4dp</dimen> + <dimen name="car_padding_1">8dp</dimen> + <dimen name="car_padding_2">16dp</dimen> + <dimen name="car_padding_3">24dp</dimen> + <dimen name="car_padding_4">32dp</dimen> + <dimen name="car_padding_5">64dp</dimen> + <dimen name="car_padding_6">96dp</dimen> + <!-- Note: status bar height and navigation bar heights are defined in frameworks/base/core package and thus will have no effect if @@ -156,4 +182,10 @@ <dimen name="car_user_switcher_container_height">420dp</dimen> <!-- This must be the negative of car_user_switcher_container_height for the animation. --> <dimen name="car_user_switcher_container_anim_height">-420dp</dimen> + + <!-- dimensions for car user switching dialog --> + <dimen name="car_fullscreen_user_pod_image_avatar_width">96dp</dimen> + <dimen name="car_fullscreen_user_pod_image_avatar_height">96dp</dimen> + <dimen name="car_user_switching_dialog_loading_text_margin_top">@*android:dimen/car_padding_4</dimen> + <dimen name="car_user_switching_dialog_loading_text_font_size">@*android:dimen/car_body1_size</dimen> </resources> diff --git a/packages/CarSystemUI/res/values/strings.xml b/packages/CarSystemUI/res/values/strings.xml index 9fae4b3e2b46..67fd5bb68521 100644 --- a/packages/CarSystemUI/res/values/strings.xml +++ b/packages/CarSystemUI/res/values/strings.xml @@ -15,7 +15,7 @@ ~ limitations under the License. --> -<resources> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <!-- String to represent lowest setting of an HVAC system [CHAR LIMIT=10]--> <string name="hvac_min_text">Min</string> <!-- String to represent largest setting of an HVAC system [CHAR LIMIT=10]--> @@ -34,4 +34,8 @@ <string name="user_add_user_message_setup">When you add a new user, that person needs to set up their space.</string> <!-- Message to inform user that the newly created user will have permissions to update apps for all other users. [CHAR LIMIT=100] --> <string name="user_add_user_message_update">Any user can update apps for all other users.</string> + <!-- Message to inform user that the new user profile is loading. [CHAR LIMIT=20] --> + <string name="car_loading_profile">Loading</string> + <!-- Message to inform user that the new user profile is loading with additional information on the previous and the next user. [CHAR LIMIT=100] --> + <string name="car_loading_profile_developer_message">Loading user (from <xliff:g id="from_user" example="10">%1$d</xliff:g> to <xliff:g id="to_user" example="12">%2$d</xliff:g>)</string> </resources> diff --git a/packages/CarSystemUI/src/com/android/systemui/CarSystemUIModule.java b/packages/CarSystemUI/src/com/android/systemui/CarSystemUIModule.java index f8729c301c32..fe2be1df44be 100644 --- a/packages/CarSystemUI/src/com/android/systemui/CarSystemUIModule.java +++ b/packages/CarSystemUI/src/com/android/systemui/CarSystemUIModule.java @@ -30,6 +30,7 @@ import com.android.systemui.car.CarDeviceProvisionedControllerImpl; import com.android.systemui.car.keyguard.CarKeyguardViewController; import com.android.systemui.car.statusbar.CarStatusBar; import com.android.systemui.car.statusbar.CarStatusBarKeyguardViewManager; +import com.android.systemui.car.statusbar.DozeServiceHost; import com.android.systemui.car.statusbar.DummyNotificationShadeWindowController; import com.android.systemui.car.volume.CarVolumeDialogComponent; import com.android.systemui.dagger.SystemUIRootComponent; @@ -37,6 +38,7 @@ import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dock.DockManager; import com.android.systemui.dock.DockManagerImpl; +import com.android.systemui.doze.DozeHost; import com.android.systemui.plugins.qs.QSFactory; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.power.EnhancedEstimates; @@ -174,4 +176,7 @@ public abstract class CarSystemUIModule { @Binds abstract NotificationShadeWindowController bindNotificationShadeWindowController( DummyNotificationShadeWindowController notificationShadeWindowController); + + @Binds + abstract DozeHost bindDozeHost(DozeServiceHost dozeServiceHost); } diff --git a/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java index aee7643b69f7..ab61b443df97 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java @@ -188,7 +188,7 @@ public class CarKeyguardViewController extends OverlayViewController implements stop(); getOverlayViewGlobalStateController().setWindowFocusable(/* focusable= */ false); mKeyguardStateController.notifyKeyguardDoneFading(); - mViewMediatorCallback.keyguardGone(); + mHandler.post(mViewMediatorCallback::keyguardGone); notifyKeyguardUpdateMonitor(); } @@ -203,6 +203,11 @@ public class CarKeyguardViewController extends OverlayViewController implements } mKeyguardUpdateMonitor.sendKeyguardReset(); notifyKeyguardUpdateMonitor(); + } else { + // This is necessary in order to address an inconsistency between the keyguard service + // and the keyguard views. + // TODO: Investigate the source of the inconsistency. + show(/* options= */ null); } } diff --git a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationBar.java b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationBar.java index 8e114142972c..5c6472ecb4ef 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationBar.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationBar.java @@ -16,8 +16,10 @@ package com.android.systemui.car.navigationbar; +import static android.view.InsetsState.ITYPE_BOTTOM_GESTURES; import static android.view.InsetsState.ITYPE_NAVIGATION_BAR; import static android.view.InsetsState.ITYPE_STATUS_BAR; +import static android.view.InsetsState.ITYPE_TOP_GESTURES; import static android.view.InsetsState.containsType; import static android.view.WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS; @@ -377,7 +379,7 @@ public class CarNavigationBar extends SystemUI implements CommandQueue.Callbacks | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH, PixelFormat.TRANSLUCENT); lp.setTitle("TopCarNavigationBar"); - lp.providesInsetsTypes = new int[]{ITYPE_STATUS_BAR}; + lp.providesInsetsTypes = new int[]{ITYPE_STATUS_BAR, ITYPE_TOP_GESTURES}; lp.setFitInsetsTypes(0); lp.windowAnimations = 0; lp.gravity = Gravity.TOP; @@ -399,7 +401,7 @@ public class CarNavigationBar extends SystemUI implements CommandQueue.Callbacks | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH, PixelFormat.TRANSLUCENT); lp.setTitle("BottomCarNavigationBar"); - lp.providesInsetsTypes = new int[]{ITYPE_NAVIGATION_BAR}; + lp.providesInsetsTypes = new int[]{ITYPE_NAVIGATION_BAR, ITYPE_BOTTOM_GESTURES}; lp.windowAnimations = 0; lp.gravity = Gravity.BOTTOM; mWindowManager.addView(mBottomNavigationBarWindow, lp); diff --git a/packages/CarSystemUI/src/com/android/systemui/car/statusbar/CarStatusBar.java b/packages/CarSystemUI/src/com/android/systemui/car/statusbar/CarStatusBar.java index e2eb3fb5ddc6..d18eadd18386 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/statusbar/CarStatusBar.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/statusbar/CarStatusBar.java @@ -425,6 +425,11 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt } @Override + public void notifyBiometricAuthModeChanged() { + // No op. + } + + @Override public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { //When executing dump() function simultaneously, we need to serialize them //to get mStackScroller's position correctly. diff --git a/packages/CarSystemUI/src/com/android/systemui/car/statusbar/DozeServiceHost.java b/packages/CarSystemUI/src/com/android/systemui/car/statusbar/DozeServiceHost.java new file mode 100644 index 000000000000..d23660c2445d --- /dev/null +++ b/packages/CarSystemUI/src/com/android/systemui/car/statusbar/DozeServiceHost.java @@ -0,0 +1,130 @@ +/* + * 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.car.statusbar; + +import com.android.systemui.doze.DozeHost; + +import javax.inject.Inject; +import javax.inject.Singleton; + +/** No-op implementation of {@link DozeHost} for use by car sysui, which does not support dozing. */ +@Singleton +public class DozeServiceHost implements DozeHost { + + @Inject + public DozeServiceHost() {} + + @Override + public void addCallback(Callback callback) { + // No op. + } + + @Override + public void removeCallback(Callback callback) { + // No op. + } + + @Override + public void startDozing() { + // No op. + } + + @Override + public void pulseWhileDozing(PulseCallback callback, int reason) { + // No op. + } + + @Override + public void stopDozing() { + // No op. + } + + @Override + public void dozeTimeTick() { + // No op. + } + + @Override + public boolean isPowerSaveActive() { + return false; + } + + @Override + public boolean isPulsingBlocked() { + return true; + } + + @Override + public boolean isProvisioned() { + return false; + } + + @Override + public boolean isBlockingDoze() { + return true; + } + + @Override + public void extendPulse(int reason) { + // No op. + } + + @Override + public void setAnimateWakeup(boolean animateWakeup) { + // No op. + } + + @Override + public void setAnimateScreenOff(boolean animateScreenOff) { + // No op. + } + + @Override + public void onSlpiTap(float x, float y) { + // No op. + } + + @Override + public void setDozeScreenBrightness(int value) { + // No op. + } + + @Override + public void prepareForGentleSleep(Runnable onDisplayOffCallback) { + // No op. + } + + @Override + public void cancelGentleSleep() { + // No op. + } + + @Override + public void onIgnoreTouchWhilePulsing(boolean ignore) { + // No op. + } + + @Override + public void stopPulsing() { + // No op. + } + + @Override + public boolean isDozeSuppressed() { + return true; + } +} diff --git a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/FullscreenUserSwitcherViewMediator.java b/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/FullscreenUserSwitcherViewMediator.java index 346c38ced766..8b399f888eb3 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/FullscreenUserSwitcherViewMediator.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/FullscreenUserSwitcherViewMediator.java @@ -34,16 +34,19 @@ public class FullscreenUserSwitcherViewMediator implements OverlayViewMediator { private final StatusBarStateController mStatusBarStateController; private final FullScreenUserSwitcherViewController mFullScreenUserSwitcherViewController; private final CarKeyguardViewController mCarKeyguardViewController; + private final UserSwitchTransitionViewController mUserSwitchTransitionViewController; @Inject public FullscreenUserSwitcherViewMediator( StatusBarStateController statusBarStateController, CarKeyguardViewController carKeyguardViewController, + UserSwitchTransitionViewController userSwitchTransitionViewController, FullScreenUserSwitcherViewController fullScreenUserSwitcherViewController) { mStatusBarStateController = statusBarStateController; - mFullScreenUserSwitcherViewController = fullScreenUserSwitcherViewController; mCarKeyguardViewController = carKeyguardViewController; + mUserSwitchTransitionViewController = userSwitchTransitionViewController; + mFullScreenUserSwitcherViewController = fullScreenUserSwitcherViewController; } @Override @@ -74,6 +77,11 @@ public class FullscreenUserSwitcherViewMediator implements OverlayViewMediator { private void onUserSelected(UserGridRecyclerView.UserRecord record) { if (record.mType != UserGridRecyclerView.UserRecord.FOREGROUND_USER) { mCarKeyguardViewController.hideKeyguardToPrepareBouncer(); + // If guest user, we cannot use record.mInfo.id and should listen to the User lifecycle + // event instead. + if (record.mType != UserGridRecyclerView.UserRecord.START_GUEST) { + mUserSwitchTransitionViewController.handleShow(record.mInfo.id); + } } hide(); diff --git a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/UserSwitchTransitionViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/UserSwitchTransitionViewController.java new file mode 100644 index 000000000000..775ef8152ca2 --- /dev/null +++ b/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/UserSwitchTransitionViewController.java @@ -0,0 +1,126 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.car.userswitcher; + +import static android.car.settings.CarSettings.Global.ENABLE_USER_SWITCH_DEVELOPER_MESSAGE; + +import android.annotation.UserIdInt; +import android.content.Context; +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.os.Handler; +import android.os.UserHandle; +import android.os.UserManager; +import android.provider.Settings; +import android.widget.ImageView; +import android.widget.TextView; + +import com.android.internal.annotations.GuardedBy; +import com.android.settingslib.drawable.CircleFramedDrawable; +import com.android.systemui.R; +import com.android.systemui.car.window.OverlayViewController; +import com.android.systemui.car.window.OverlayViewGlobalStateController; +import com.android.systemui.dagger.qualifiers.Main; + +import javax.inject.Inject; +import javax.inject.Singleton; + +/** + * Handles showing and hiding UserSwitchTransitionView that is mounted to SystemUiOverlayWindow. + */ +@Singleton +public class UserSwitchTransitionViewController extends OverlayViewController { + private static final String TAG = "UserSwitchTransitionViewController"; + private static final String ENABLE_DEVELOPER_MESSAGE_TRUE = "true"; + + private final Context mContext; + private final Handler mHandler; + private final Resources mResources; + private final UserManager mUserManager; + + @GuardedBy("this") + private boolean mShowing; + private int mPreviousUserId = UserHandle.USER_NULL; + + @Inject + public UserSwitchTransitionViewController( + Context context, + @Main Handler handler, + @Main Resources resources, + UserManager userManager, + OverlayViewGlobalStateController overlayViewGlobalStateController) { + + super(R.id.user_switching_dialog_stub, overlayViewGlobalStateController); + + mContext = context; + mHandler = handler; + mResources = resources; + mUserManager = userManager; + } + + /** + * Makes the user switch transition view appear and draws the content inside of it if a user + * that is different from the previous user is provided and if the dialog is not already + * showing. + */ + void handleShow(@UserIdInt int newUserId) { + if (mPreviousUserId == newUserId || mShowing) return; + mShowing = true; + mHandler.post(() -> { + start(); + populateDialog(mPreviousUserId, newUserId); + // next time a new user is selected, this current new user will be the previous user. + mPreviousUserId = newUserId; + }); + } + + void handleHide() { + if (!mShowing) return; + mShowing = false; + mHandler.post(this::stop); + } + + private void populateDialog(@UserIdInt int previousUserId, @UserIdInt int newUserId) { + drawUserIcon(newUserId); + populateLoadingText(previousUserId, newUserId); + } + + private void drawUserIcon(int newUserId) { + Bitmap bitmap = mUserManager.getUserIcon(newUserId); + if (bitmap != null) { + CircleFramedDrawable drawable = CircleFramedDrawable.getInstance(mContext, bitmap); + ((ImageView) getLayout().findViewById(R.id.user_loading_avatar)) + .setImageDrawable(drawable); + } + } + + private void populateLoadingText(@UserIdInt int previousUserId, @UserIdInt int newUserId) { + TextView msgView = getLayout().findViewById(R.id.user_loading); + + boolean showInfo = ENABLE_DEVELOPER_MESSAGE_TRUE.equals( + Settings.Global.getString(mContext.getContentResolver(), + ENABLE_USER_SWITCH_DEVELOPER_MESSAGE)); + + if (showInfo && mPreviousUserId != UserHandle.USER_NULL) { + msgView.setText( + mResources.getString(R.string.car_loading_profile_developer_message, + previousUserId, newUserId)); + } else { + msgView.setText(mResources.getString(R.string.car_loading_profile)); + } + } +} diff --git a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/UserSwitchTransitionViewMediator.java b/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/UserSwitchTransitionViewMediator.java new file mode 100644 index 000000000000..aea691443290 --- /dev/null +++ b/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/UserSwitchTransitionViewMediator.java @@ -0,0 +1,85 @@ +/* + * 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.car.userswitcher; + +import android.app.ActivityManager; +import android.car.Car; +import android.car.user.CarUserManager; +import android.util.Log; + +import com.android.internal.annotations.VisibleForTesting; +import com.android.systemui.car.CarServiceProvider; +import com.android.systemui.car.window.OverlayViewMediator; + +import javax.inject.Inject; + +/** + * Registers listeners that subscribe to events that show or hide CarUserSwitchingDialog that is + * mounted to SystemUiOverlayWindow. + */ +public class UserSwitchTransitionViewMediator implements OverlayViewMediator, + CarUserManager.UserSwitchUiCallback { + private static final String TAG = "UserSwitchTransitionViewMediator"; + + private final CarServiceProvider mCarServiceProvider; + private final UserSwitchTransitionViewController mUserSwitchTransitionViewController; + + @Inject + public UserSwitchTransitionViewMediator( + CarServiceProvider carServiceProvider, + UserSwitchTransitionViewController userSwitchTransitionViewController) { + mCarServiceProvider = carServiceProvider; + mUserSwitchTransitionViewController = userSwitchTransitionViewController; + } + + @Override + public void registerListeners() { + mCarServiceProvider.addListener(car -> { + CarUserManager carUserManager = + (CarUserManager) car.getCarManager(Car.CAR_USER_SERVICE); + + if (carUserManager != null) { + carUserManager.setUserSwitchUiCallback(this); + carUserManager.addListener(Runnable::run, this::handleUserLifecycleEvent); + } else { + Log.e(TAG, "registerListeners: CarUserManager could not be obtained."); + } + }); + } + + @Override + public void setupOverlayContentViewControllers() { + // no-op. + } + + @Override + public void showUserSwitchDialog(int userId) { + mUserSwitchTransitionViewController.handleShow(userId); + } + + @VisibleForTesting + void handleUserLifecycleEvent(CarUserManager.UserLifecycleEvent event) { + if (event.getEventType() == CarUserManager.USER_LIFECYCLE_EVENT_TYPE_STARTING + && ActivityManager.getCurrentUser() == event.getUserId()) { + mUserSwitchTransitionViewController.handleShow(event.getUserId()); + } + + if (event.getEventType() == CarUserManager.USER_LIFECYCLE_EVENT_TYPE_SWITCHING) { + mUserSwitchTransitionViewController.handleHide(); + } + } +} diff --git a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewMediator.java b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewMediator.java index ac574eda4c9f..3e7b4a2665ee 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewMediator.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewMediator.java @@ -23,6 +23,9 @@ public interface OverlayViewMediator { /** * Register listeners that could use ContentVisibilityAdjuster to show/hide content. + * + * Note that we do not unregister listeners because SystemUI components are expected to live + * for the lifecycle of the device. */ void registerListeners(); diff --git a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayWindowModule.java b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayWindowModule.java index 484aa63e8bda..5a16efa3dd9b 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayWindowModule.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayWindowModule.java @@ -21,6 +21,7 @@ import com.android.systemui.car.notification.BottomNotificationPanelViewMediator import com.android.systemui.car.notification.NotificationPanelViewMediator; import com.android.systemui.car.notification.TopNotificationPanelViewMediator; import com.android.systemui.car.userswitcher.FullscreenUserSwitcherViewMediator; +import com.android.systemui.car.userswitcher.UserSwitchTransitionViewMediator; import dagger.Binds; import dagger.Module; @@ -67,4 +68,11 @@ public abstract class OverlayWindowModule { @ClassKey(FullscreenUserSwitcherViewMediator.class) public abstract OverlayViewMediator bindFullscreenUserSwitcherViewsMediator( FullscreenUserSwitcherViewMediator overlayViewsMediator); + + /** Injects CarUserSwitchingDialogMediator. */ + @Binds + @IntoMap + @ClassKey(UserSwitchTransitionViewMediator.class) + public abstract OverlayViewMediator bindUserSwitchTransitionViewMediator( + UserSwitchTransitionViewMediator userSwitchTransitionViewMediator); } diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/userswitcher/UserSwitchTransitionViewControllerTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/userswitcher/UserSwitchTransitionViewControllerTest.java new file mode 100644 index 000000000000..eab381c92d98 --- /dev/null +++ b/packages/CarSystemUI/tests/src/com/android/systemui/car/userswitcher/UserSwitchTransitionViewControllerTest.java @@ -0,0 +1,145 @@ +/* + * 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.car.userswitcher; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.verify; + +import android.content.Context; +import android.content.res.Resources; +import android.os.Handler; +import android.os.UserManager; +import android.test.suitebuilder.annotation.SmallTest; +import android.testing.AndroidTestingRunner; +import android.testing.TestableLooper; +import android.testing.TestableResources; +import android.view.LayoutInflater; +import android.view.ViewGroup; + +import com.android.systemui.R; +import com.android.systemui.SysuiTestCase; +import com.android.systemui.car.window.OverlayViewGlobalStateController; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +@RunWith(AndroidTestingRunner.class) +@TestableLooper.RunWithLooper +@SmallTest +public class UserSwitchTransitionViewControllerTest extends SysuiTestCase { + private static final int TEST_USER_1 = 100; + private static final int TEST_USER_2 = 110; + + private TestableUserSwitchTransitionViewController mCarUserSwitchingDialogController; + private TestableResources mTestableResources; + @Mock + private OverlayViewGlobalStateController mOverlayViewGlobalStateController; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + mTestableResources = mContext.getOrCreateTestableResources(); + mCarUserSwitchingDialogController = new TestableUserSwitchTransitionViewController( + mContext, + Handler.getMain(), + mTestableResources.getResources(), + (UserManager) mContext.getSystemService(Context.USER_SERVICE), + mOverlayViewGlobalStateController + ); + + mCarUserSwitchingDialogController.inflate((ViewGroup) LayoutInflater.from(mContext).inflate( + R.layout.sysui_overlay_window, /* root= */ null)); + } + + @Test + public void onHandleShow_newUserSelected_showsDialog() { + mCarUserSwitchingDialogController.handleShow(/* currentUserId= */ TEST_USER_1); + + verify(mOverlayViewGlobalStateController).showView(eq(mCarUserSwitchingDialogController), + any()); + } + + @Test + public void onHandleShow_alreadyShowing_ignoresRequest() { + mCarUserSwitchingDialogController.handleShow(/* currentUserId= */ TEST_USER_1); + mCarUserSwitchingDialogController.handleShow(/* currentUserId= */ TEST_USER_2); + + // Verify that the request was processed only once. + verify(mOverlayViewGlobalStateController).showView(eq(mCarUserSwitchingDialogController), + any()); + } + + @Test + public void onHandleShow_sameUserSelected_ignoresRequest() { + mCarUserSwitchingDialogController.handleShow(/* currentUserId= */ TEST_USER_1); + mCarUserSwitchingDialogController.handleHide(); + mCarUserSwitchingDialogController.handleShow(/* currentUserId= */ TEST_USER_1); + + // Verify that the request was processed only once. + verify(mOverlayViewGlobalStateController).showView(eq(mCarUserSwitchingDialogController), + any()); + } + + @Test + public void onHide_currentlyShowing_hidesDialog() { + mCarUserSwitchingDialogController.handleShow(/* currentUserId= */ TEST_USER_1); + mCarUserSwitchingDialogController.handleHide(); + + verify(mOverlayViewGlobalStateController).hideView(eq(mCarUserSwitchingDialogController), + any()); + } + + @Test + public void onHide_notShowing_ignoresRequest() { + mCarUserSwitchingDialogController.handleShow(/* currentUserId= */ TEST_USER_1); + mCarUserSwitchingDialogController.handleHide(); + mCarUserSwitchingDialogController.handleHide(); + + // Verify that the request was processed only once. + verify(mOverlayViewGlobalStateController).hideView(eq(mCarUserSwitchingDialogController), + any()); + } + + private final class TestableUserSwitchTransitionViewController extends + UserSwitchTransitionViewController { + + private final Handler mHandler; + + TestableUserSwitchTransitionViewController(Context context, Handler handler, + Resources resources, UserManager userManager, + OverlayViewGlobalStateController overlayViewGlobalStateController) { + super(context, handler, resources, userManager, overlayViewGlobalStateController); + mHandler = handler; + } + + @Override + public void handleShow(int currentUserId) { + super.handleShow(currentUserId); + waitForIdleSync(mHandler); + } + + @Override + public void handleHide() { + super.handleHide(); + waitForIdleSync(mHandler); + } + } +} diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/userswitcher/UserSwitchTransitionViewMediatorTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/userswitcher/UserSwitchTransitionViewMediatorTest.java new file mode 100644 index 000000000000..a808e2d40e26 --- /dev/null +++ b/packages/CarSystemUI/tests/src/com/android/systemui/car/userswitcher/UserSwitchTransitionViewMediatorTest.java @@ -0,0 +1,76 @@ +/* + * 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.car.userswitcher; + +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.car.user.CarUserManager; +import android.test.suitebuilder.annotation.SmallTest; +import android.testing.AndroidTestingRunner; +import android.testing.TestableLooper; + +import com.android.systemui.car.CarServiceProvider; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +@RunWith(AndroidTestingRunner.class) +@TestableLooper.RunWithLooper +@SmallTest +public class UserSwitchTransitionViewMediatorTest { + private static final int TEST_USER = 100; + + private UserSwitchTransitionViewMediator mUserSwitchTransitionViewMediator; + @Mock + private CarServiceProvider mCarServiceProvider; + @Mock + private UserSwitchTransitionViewController mUserSwitchTransitionViewController; + @Mock + private CarUserManager.UserLifecycleEvent mUserLifecycleEvent; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + + mUserSwitchTransitionViewMediator = new UserSwitchTransitionViewMediator( + mCarServiceProvider, mUserSwitchTransitionViewController); + + } + + @Test + public void onUserLifecycleEvent_userStarting_callsHandleShow() { + when(mUserLifecycleEvent.getEventType()).thenReturn( + CarUserManager.USER_LIFECYCLE_EVENT_TYPE_STARTING); + when(mUserLifecycleEvent.getUserId()).thenReturn(TEST_USER); + mUserSwitchTransitionViewMediator.handleUserLifecycleEvent(mUserLifecycleEvent); + + verify(mUserSwitchTransitionViewController).handleShow(TEST_USER); + } + + @Test + public void onUserLifecycleEvent_userSwitching_callsHandleHide() { + when(mUserLifecycleEvent.getEventType()).thenReturn( + CarUserManager.USER_LIFECYCLE_EVENT_TYPE_SWITCHING); + mUserSwitchTransitionViewMediator.handleUserLifecycleEvent(mUserLifecycleEvent); + + verify(mUserSwitchTransitionViewController).handleHide(); + } +} diff --git a/packages/PackageInstaller/res/values-ne/strings.xml b/packages/PackageInstaller/res/values-ne/strings.xml index d5faac23de9d..60934b1e8ddb 100644 --- a/packages/PackageInstaller/res/values-ne/strings.xml +++ b/packages/PackageInstaller/res/values-ne/strings.xml @@ -24,8 +24,8 @@ <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_confirm_question_update" msgid="7942235418781274635">"तपाईं यो पहिलेदेखि नै विद्यमान अनुप्रयोगको साटो यसको अद्यावधिक संस्करण स्थापना गर्न चाहनुहुन्छ? तपाईंको विद्यमान डेटा गुम्ने छैन।"</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"तपाईं यो अन्तर्निर्मित अनुप्रयोगको साटो यसको अद्यावधिक संस्करण स्थापना गर्न चाहनुहुन्छ? तपाईंको विद्यमान डेटा गुम्ने छैन।"</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_blocked" msgid="8512284352994752094">"यो प्याकेज स्थापना गर्ने क्रममा अवरोध गरियो।"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"प्याकेजका रूपमा स्थापना नगरिएको एप विद्यमान प्याकेजसँग मेल खाँदैन।"</string> @@ -49,16 +49,16 @@ <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> - <string name="generic_error_dlg_text" msgid="5287861443265795232">"अनुप्रयोगको स्थापना रद्द गर्न सकिएन।"</string> - <string name="uninstall_application_title" msgid="4045420072401428123">"अनुप्रयोगको स्थापना रद्द गर्नु…"</string> + <string name="generic_error_dlg_text" msgid="5287861443265795232">"एपको स्थापना रद्द गर्न सकिएन।"</string> + <string name="uninstall_application_title" msgid="4045420072401428123">"एपको स्थापना रद्द गर्नु…"</string> <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_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_user" msgid="498072714173920526">"तपाईं प्रयोगकर्ता <xliff:g id="USERNAME">%1$s</xliff:g> का लागि यो अनुप्रयोगको स्थापना रद्द गर्न चाहनुहुन्छ?"</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> - <string name="uninstall_keep_data" msgid="7002379587465487550">"<xliff:g id="SIZE">%1$s</xliff:g> अनुप्रयोगको डेटा राख्नुहोस्।"</string> + <string name="uninstall_keep_data" msgid="7002379587465487550">"<xliff:g id="SIZE">%1$s</xliff:g> एपको डेटा राख्नुहोस्।"</string> <string name="uninstalling_notification_channel" msgid="840153394325714653">"चलिरहेका स्थापना रद्द गर्ने कार्यहरू"</string> <string name="uninstall_failure_notification_channel" msgid="1136405866767576588">"असफल भएका स्थापना रद्द गर्ने कार्यहरू"</string> <string name="uninstalling" msgid="8709566347688966845">"स्थापना रद्द गर्दै…"</string> @@ -67,12 +67,12 @@ <string name="uninstall_done_app" msgid="4588850984473605768">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> को स्थापना रद्द गरियो"</string> <string name="uninstall_failed" msgid="1847750968168364332">"स्थापना रद्द गर्न सकिएन।"</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> को स्थापना रद्द गर्ने कार्य असफल भयो।"</string> - <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_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="manage_device_administrators" msgid="3092696419363842816">"यन्त्रका व्यवस्थापकीय अनुप्रयोगको व्यवस्थापन गर्नु…"</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> @@ -89,7 +89,7 @@ <string name="anonymous_source_continue" msgid="4375745439457209366">"जारी राख्नुहोस्"</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="app_installed_notification_channel_description" msgid="2695385797601574123">"एपको स्थापना गरिएको सूचना"</string> <string name="notification_installation_success_message" msgid="6450467996056038442">"सफलतापूर्वक स्थापना गरियो"</string> <string name="notification_installation_success_status" msgid="3172502643504323321">"“<xliff:g id="APPNAME">%1$s</xliff:g>” सफलतापूर्वक स्थापना गरियो"</string> </resources> diff --git a/packages/Shell/res/values-ar/strings.xml b/packages/Shell/res/values-ar/strings.xml index b81a904a6f91..302971f1f90a 100644 --- a/packages/Shell/res/values-ar/strings.xml +++ b/packages/Shell/res/values-ar/strings.xml @@ -28,7 +28,7 @@ <string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"اختر لمشاركة تقرير الأخطاء بدون لقطة شاشة أو انتظر حتى انتهاء لقطة الشاشة"</string> <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"انقر لمشاركة تقرير الأخطاء بدون لقطة شاشة أو انتظر حتى انتهاء لقطة الشاشة"</string> <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"انقر لمشاركة تقرير الأخطاء بدون لقطة شاشة أو انتظر حتى انتهاء لقطة الشاشة"</string> - <string name="bugreport_confirm" msgid="5917407234515812495">"تحتوي تقارير الأخطاء على بيانات من عدة ملفات سجلات في النظام، بما في ذلك بيانات قد ترى أنها حساسة (مثل بيانات استخدام التطبيقات وبيانات الموقع). ولذلك احرص على عدم مشاركة تقارير الأخطاء إلا مع من تثق به من الأشخاص والتطبيقات."</string> + <string name="bugreport_confirm" msgid="5917407234515812495">"تحتوي تقارير الأخطاء على بيانات من عدة ملفات سجلات في النظام، بما قد يشمل بيانات تعتبرها حساسة (مثل بيانات استخدام التطبيقات وبيانات الموقع الجغرافي). ولذلك احرص على عدم مشاركة تقارير الأخطاء إلا مع من تثق به من الأشخاص والتطبيقات."</string> <string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"عدم الإظهار مرة أخرى"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"تقارير الأخطاء"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"تعذرت قراءة ملف تقرير الخطأ."</string> diff --git a/packages/Shell/res/values-az/strings.xml b/packages/Shell/res/values-az/strings.xml index 40800bb78a9d..1522f3febca6 100644 --- a/packages/Shell/res/values-az/strings.xml +++ b/packages/Shell/res/values-az/strings.xml @@ -28,7 +28,7 @@ <string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"Baq hesabatını skrinşot olmadan paylaşmaq üçün seçin, skrinşotun tamamlanması üçün isə gözləyin"</string> <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"baq hesabatınızı skrinşot olmadan paylaşmaq üçün tıklayın, skrinşotun tamamlanması üçün isə gözləyin"</string> <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"baq hesabatınızı skrinşot olmadan paylaşmaq üçün tıklayın, skrinşotun tamamlanması üçün isə gözləyin"</string> - <string name="bugreport_confirm" msgid="5917407234515812495">"Baq raportları sistemin müxtəlif jurnal fayllarından həssas təyin etdiyiniz data (tətbiq istifadəsi və məkan datası kimi) içərir. Baq raportlarını yalnız inandığınız tətbiq və adamlarla paylaşın."</string> + <string name="bugreport_confirm" msgid="5917407234515812495">"Baq hesabatları sistemin müxtəlif jurnal fayllarından həssas təyin etdiyiniz data (tətbiq istifadəsi və məkan datası kimi) içərir. Baq raportlarını yalnız inandığınız tətbiq və adamlarla paylaşın."</string> <string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"Daha göstərməyin"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Baq hesabatları"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"Baq hesabat faylı oxunmur"</string> diff --git a/packages/Shell/res/values-be/strings.xml b/packages/Shell/res/values-be/strings.xml index bea1c30d4d4a..ce369c35a8f4 100644 --- a/packages/Shell/res/values-be/strings.xml +++ b/packages/Shell/res/values-be/strings.xml @@ -28,7 +28,7 @@ <string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"Выберыце, каб абагуліць справаздачу пра памылку без здымка экрана, або чакайце атрымання здымка"</string> <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"Краніце, каб абагуліць справаздачу пра памылку без здымка экрана, або чакайце атрымання здымка."</string> <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"Краніце, каб абагуліць справаздачу пра памылку без здымка экрана, або чакайце атрымання здымка."</string> - <string name="bugreport_confirm" msgid="5917407234515812495">"Справаздачы пра памылкі ўтрымліваюць даныя з розных файлаў журналаў сістэмы, якія могуць уключаць даныя, што вы лічыце канфідэнцыяльнымі (напрыклад, пра выкарыстанне праграм і даныя аб месцазнаходжанні). Абагульвайце справаздачы пра памылкі толькі з тымі людзьмі і праграмамі, якім вы давяраеце."</string> + <string name="bugreport_confirm" msgid="5917407234515812495">"Справаздачы пра памылкі ўтрымліваюць інфармацыю з розных файлаў журналаў сістэмы, у тым ліку і канфідэнцыяльную (напрыклад, даныя, якія датычацца выкарыстання праграм і месцазнаходжання прылады). Абагульвайце справаздачы пра памылкі толькі з тымі людзьмі і праграмамі, якім вы давяраеце."</string> <string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"Не паказваць зноў"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Справадзачы пра памылкі"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"Немагчыма прачытаць файл справаздачы пра памылкі"</string> diff --git a/packages/Shell/res/values-da/strings.xml b/packages/Shell/res/values-da/strings.xml index d9bf87788aac..c23efc30e133 100644 --- a/packages/Shell/res/values-da/strings.xml +++ b/packages/Shell/res/values-da/strings.xml @@ -28,7 +28,7 @@ <string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"Vælg for at dele din fejlrapport uden et screenshot, eller vent på, at et screenshot er klar"</string> <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"Tryk for at dele din fejlrapport uden et screenshot, eller vent på, at screenshott fuldføres"</string> <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"Tryk for at dele din fejlrapport uden et screenshot, eller vent på, at screenshott fuldføres"</string> - <string name="bugreport_confirm" msgid="5917407234515812495">"Fejlrapporter indeholder data fra systemets forskellige logfiler, som kan være data, du mener er følsomme, f.eks. appforbrug og placeringsdata. Del kun fejlrapporter med personer og apps, du har tillid til."</string> + <string name="bugreport_confirm" msgid="5917407234515812495">"Fejlrapporter indeholder data fra systemets forskellige logfiler, og der kan være følsomme data imellem (f.eks. appforbrug og placeringsdata). Del kun fejlrapporter med personer og apps, du har tillid til."</string> <string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"Vis ikke igen"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Fejlrapporter"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"Fejlrapportfilen kunne ikke læses"</string> diff --git a/packages/Shell/res/values-eu/strings.xml b/packages/Shell/res/values-eu/strings.xml index 2957dab231e2..5d32cabd4ba5 100644 --- a/packages/Shell/res/values-eu/strings.xml +++ b/packages/Shell/res/values-eu/strings.xml @@ -28,7 +28,7 @@ <string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"Hautatu hau akatsen txostena argazkirik gabe partekatzeko edo itxaron pantaila-argazkia atera arte"</string> <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"Sakatu akatsen txostena argazkirik gabe partekatzeko edo itxaron pantaila-argazkia atera arte"</string> <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"Sakatu akatsen txostena argazkirik gabe partekatzeko edo itxaron pantaila-argazkia atera arte"</string> - <string name="bugreport_confirm" msgid="5917407234515812495">"Errore-txostenek sistemaren erregistro-fitxategietako datuak dauzkate eta, haietan, kontuzkotzat jotzen duzun informazioa ager daiteke (adibidez, aplikazioen erabilera eta kokapen-datuak). Errore-txostenak partekatzen badituzu, partekatu soilik pertsona eta aplikazio fidagarriekin."</string> + <string name="bugreport_confirm" msgid="5917407234515812495">"Errore-txostenek sistemaren erregistro-fitxategietako datuak dauzkate, eta, haietan, kontuzkotzat jotzen duzun informazioa ager daiteke (adibidez, aplikazioen erabilera eta kokapen-datuak). Errore-txostenak partekatzen badituzu, partekatu soilik pertsona eta aplikazio fidagarriekin."</string> <string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"Ez erakutsi berriro"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Akatsen txostenak"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"Ezin izan da irakurri akatsen txostena"</string> diff --git a/packages/Shell/res/values-fr/strings.xml b/packages/Shell/res/values-fr/strings.xml index 6fa6f6ead59d..3933557787ed 100644 --- a/packages/Shell/res/values-fr/strings.xml +++ b/packages/Shell/res/values-fr/strings.xml @@ -28,9 +28,9 @@ <string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"Sélectionner pour partager le rapport de bug sans capture d\'écran ou attendre la fin de la capture"</string> <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"Appuyer pour partager rapport de bug sans capture d\'écran ou attendre finalisation capture d\'écran"</string> <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"Appuyer pour partager rapport de bug sans capture d\'écran ou attendre finalisation capture d\'écran"</string> - <string name="bugreport_confirm" msgid="5917407234515812495">"Les rapports de bug contiennent des données des fichiers journaux du système, y compris des informations que vous considérez sensibles concernant, par exemple, la consommation par application et la localisation. Nous vous recommandons de ne partager ces rapports qu\'avec des personnes et des applications que vous estimez fiables."</string> + <string name="bugreport_confirm" msgid="5917407234515812495">"Les rapports de bugs contiennent des données des fichiers journaux du système, y compris des informations que vous considérez sensibles concernant, par exemple, la consommation par application et la localisation. Nous vous recommandons de ne partager ces rapports qu\'avec des personnes et des applications que vous estimez fiables."</string> <string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"Ne plus afficher"</string> - <string name="bugreport_storage_title" msgid="5332488144740527109">"Rapports d\'erreur"</string> + <string name="bugreport_storage_title" msgid="5332488144740527109">"Rapports de bugs"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"Impossible de lire le fichier de rapport de bug."</string> <string name="bugreport_add_details_to_zip_failed" msgid="1302931926486712371">"Impossible d\'ajouter les détails du rapport de bug au fichier .zip"</string> <string name="bugreport_unnamed" msgid="2800582406842092709">"sans nom"</string> diff --git a/packages/Shell/res/values-hr/strings.xml b/packages/Shell/res/values-hr/strings.xml index 9cbc09daf243..4764d1703a82 100644 --- a/packages/Shell/res/values-hr/strings.xml +++ b/packages/Shell/res/values-hr/strings.xml @@ -28,7 +28,7 @@ <string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"Odaberite za dijeljenje izvješća o pogrešci bez snimke zaslona ili pričekajte da se izradi snimka"</string> <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"Dodirnite za dijeljenje izvješća o pogrešci bez snimke zaslona ili pričekajte da se izradi snimka"</string> <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"Dodirnite za dijeljenje izvješća o pogrešci bez snimke zaslona ili pričekajte da se izradi snimka"</string> - <string name="bugreport_confirm" msgid="5917407234515812495">"Izvješća o programskim pogreškama sadržavaju podatke iz različitih datoteka zapisnika sustava, što može uključivati podatke koje smatrate osjetljivima (na primjer podatke o upotrebi aplikacije i lokaciji). Izvješća o programskim pogreškama dijelite samo s osobama i aplikacijama koje smatrate pouzdanima."</string> + <string name="bugreport_confirm" msgid="5917407234515812495">"Izvješća o programskim pogreškama sadržavaju podatke iz različitih datoteka zapisnika sustava, što može uključivati podatke koje smatrate osjetljivim (na primjer podatke o upotrebi aplikacije i lokaciji). Izvješća o programskim pogreškama dijelite samo s osobama i aplikacijama koje smatrate pouzdanim."</string> <string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"Ne prikazuj ponovo"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Izvj. o prog. pogreš."</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"Izvješće o programskoj pogrešci nije pročitano"</string> diff --git a/packages/Shell/res/values-is/strings.xml b/packages/Shell/res/values-is/strings.xml index b8c0412984d5..4989e8763b4d 100644 --- a/packages/Shell/res/values-is/strings.xml +++ b/packages/Shell/res/values-is/strings.xml @@ -28,7 +28,7 @@ <string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"Veldu að deila villutilkynningunni án skjámyndar eða hinkraðu þangað til skjámyndin er tilbúin"</string> <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"Ýttu til að deila villutilkynningunni án skjámyndar eða hinkraðu þangað til skjámyndin er tilbúin"</string> <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"Ýttu til að deila villutilkynningunni án skjámyndar eða hinkraðu þangað til skjámyndin er tilbúin"</string> - <string name="bugreport_confirm" msgid="5917407234515812495">"Villutilkynningar innihalda gögn úr ýmsum annálaskrám kerfisins, sem gætu innihaldið upplýsingar sem þú telur viðkvæmar (eins og um notkun forrita og staðsetningarupplýsingar). Deildu villutilkynningum bara með fólki og forritum sem þú treystir."</string> + <string name="bugreport_confirm" msgid="5917407234515812495">"Villutilkynningar innihalda gögn úr ýmsum annálaskrám kerfisins sem gætu innihaldið upplýsingar sem þú telur viðkvæmar (til dæmis notkun forrita og staðsetningarupplýsingar). Deildu villutilkynningum bara með fólki og forritum sem þú treystir."</string> <string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"Ekki sýna þetta aftur"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Villutilkynningar"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"Ekki var hægt að lesa úr villuskýrslunni"</string> diff --git a/packages/Shell/res/values-km/strings.xml b/packages/Shell/res/values-km/strings.xml index ec756874baf8..0ab3b68eb132 100644 --- a/packages/Shell/res/values-km/strings.xml +++ b/packages/Shell/res/values-km/strings.xml @@ -28,9 +28,9 @@ <string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"ជ្រើសរើសដើម្បីចែករំលែករបាយការណ៍អំពីបញ្ហារបស់អ្នកដោយមិនចាំបាច់មានរូបថតអេក្រង់ ឬរង់ចាំរូបថតអេក្រង់ដើម្បីបញ្ចប់"</string> <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"ប៉ះដើម្បីចែករំលែករបាយការណ៍កំហុសរបស់អ្នកដោយមិនចាំបាច់មានរូបថតអេក្រង់ ឬរង់ចាំការបញ្ចប់ការថតអេក្រង់"</string> <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"ប៉ះដើម្បីចែករំលែករបាយការណ៍កំហុសរបស់អ្នកដោយមិនចាំបាច់មានរូបថតអេក្រង់ ឬរង់ចាំការបញ្ចប់ការថតអេក្រង់"</string> - <string name="bugreport_confirm" msgid="5917407234515812495">"របាយការណ៍ផ្ទុកទិន្នន័យពីឯកសារកំណត់ហេតុផ្សេងៗរបស់ប្រព័ន្ធ ដែលអាចមានផ្ទុកទិន្នន័យដែលអ្នកចាត់ទុកថាជាទិន្នន័យរសើប (ដូចជាការប្រើប្រាស់កម្មវិធី និងទិន្នន័យទីតាំង)។ ចែករំលែករបាយការណ៍កំហុសជាមួយមនុស្ស និងកម្មវិធីដែលអ្នកជឿជាក់ប៉ុណ្ណោះ។"</string> + <string name="bugreport_confirm" msgid="5917407234515812495">"របាយការណ៍អំពីបញ្ហាផ្ទុកទិន្នន័យពីឯកសារកំណត់ហេតុផ្សេងៗរបស់ប្រព័ន្ធ ដែលអាចរួមបញ្ចូលទិន្នន័យដែលអ្នកចាត់ទុកថាមានលក្ខណៈរសើប (ដូចជាការប្រើប្រាស់កម្មវិធី និងទិន្នន័យទីតាំង)។ ចែករំលែករបាយការណ៍អំពីបញ្ហាជាមួយមនុស្ស និងកម្មវិធីដែលអ្នកជឿជាក់តែប៉ុណ្ណោះ។"</string> <string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"កុំបង្ហាញម្ដងទៀត"</string> - <string name="bugreport_storage_title" msgid="5332488144740527109">"រាយការណ៍ពីកំហុស"</string> + <string name="bugreport_storage_title" msgid="5332488144740527109">"របាយការណ៍អំពីបញ្ហា"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"មិនអាចអានឯកសាររបាយកាណ៍កំហុសបានទេ"</string> <string name="bugreport_add_details_to_zip_failed" msgid="1302931926486712371">"មិនអាចបន្ថែមព័ត៌មានលម្អិតនៃរបាយការណ៍កំហុសទៅឯកសារ zip បានទេ"</string> <string name="bugreport_unnamed" msgid="2800582406842092709">"គ្មានឈ្មោះ"</string> diff --git a/packages/Shell/res/values-ko/strings.xml b/packages/Shell/res/values-ko/strings.xml index 68d413992c28..545dfa73bc7f 100644 --- a/packages/Shell/res/values-ko/strings.xml +++ b/packages/Shell/res/values-ko/strings.xml @@ -28,7 +28,7 @@ <string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"스크린샷 없이 버그 신고를 공유하려면 선택하고 그렇지 않으면 스크린샷이 완료될 때까지 기다려 주세요."</string> <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"스크린샷 없이 버그 신고서를 공유하려면 탭하고 그렇지 않으면 스크린샷이 완료될 때까지 기다려 주세요."</string> <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"스크린샷 없이 버그 신고서를 공유하려면 탭하고 그렇지 않으면 스크린샷이 완료될 때까지 기다려 주세요."</string> - <string name="bugreport_confirm" msgid="5917407234515812495">"버그 신고서에는 시스템의 다양한 로그 파일 데이터가 포함되며 여기에는 사용자가 중요하다고 생각하는 데이터(예: 앱 사용 및 위치 데이터)가 포함되었을 수 있습니다. 신뢰할 수 있는 앱과 사용자에게만 버그 신고서를 공유하세요."</string> + <string name="bugreport_confirm" msgid="5917407234515812495">"버그 신고서에는 시스템의 다양한 로그 파일 데이터가 포함되며 여기에는 사용자가 민감하다고 생각하는 데이터(예: 앱 사용 및 위치 데이터)가 포함되었을 수 있습니다. 신뢰할 수 있는 앱과 사용자에게만 버그 신고서를 공유하세요."</string> <string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"다시 표시 안함"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"버그 신고"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"버그 신고 파일을 읽을 수 없습니다."</string> diff --git a/packages/Shell/res/values-ky/strings.xml b/packages/Shell/res/values-ky/strings.xml index 2499aba99ce6..969e9ed0654e 100644 --- a/packages/Shell/res/values-ky/strings.xml +++ b/packages/Shell/res/values-ky/strings.xml @@ -30,7 +30,7 @@ <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"Мүчүлүштүк тууралуу билдирүүңүздү скриншотсуз бөлүшүү үчүн таптап коюңуз же скриншот даяр болгуча күтө туруңуз"</string> <string name="bugreport_confirm" msgid="5917407234515812495">"Мүчүлүштүктөр тууралуу билдирүүлөрдө тутумдун ар кандай таржымалдарынан алынган дайындар, ошондой эле купуя маалымат камтылышы мүмкүн (мисалы, жайгашкан жер сыяктуу). Мындай билдирүүлөрдү бир гана ишеничтүү адамдар жана колдонмолор менен бөлүшүңүз."</string> <string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"Экинчи көрсөтүлбөсүн"</string> - <string name="bugreport_storage_title" msgid="5332488144740527109">"Мүчүлүштүктөрдү кабарлоолор"</string> + <string name="bugreport_storage_title" msgid="5332488144740527109">"Мүчүлүштүктөрдү кабарлоо"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"Мүчүлүштүк тууралуу кабарлаган файл окулбай койду"</string> <string name="bugreport_add_details_to_zip_failed" msgid="1302931926486712371">"Мүчүлүштүктөр жөнүндө кабардын чоо-жайы zip файлына кошулбай койду"</string> <string name="bugreport_unnamed" msgid="2800582406842092709">"аталышы жок"</string> diff --git a/packages/Shell/res/values-ml/strings.xml b/packages/Shell/res/values-ml/strings.xml index 5c1842aeb324..78b43bbe3d7b 100644 --- a/packages/Shell/res/values-ml/strings.xml +++ b/packages/Shell/res/values-ml/strings.xml @@ -28,7 +28,7 @@ <string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"സ്ക്രീൻഷോട്ട് കൂടാതെയോ സ്ക്രീൻഷോട്ട് പൂർത്തിയാകുന്നതിന് കാക്കാതെയോ ബഗ് റിപ്പോർട്ട് പങ്കിടുക"</string> <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"സ്ക്രീൻഷോട്ട് കൂടാതെയോ സ്ക്രീൻഷോട്ട് പൂർത്തിയാകുന്നതിന് കാക്കാതെയോ നിങ്ങളുടെ ബഗ് റിപ്പോർട്ട് പങ്കിടാൻ ടാപ്പുചെയ്യുക"</string> <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"സ്ക്രീൻഷോട്ട് കൂടാതെയോ സ്ക്രീൻഷോട്ട് പൂർത്തിയാകുന്നതിന് കാക്കാതെയോ നിങ്ങളുടെ ബഗ് റിപ്പോർട്ട് പങ്കിടാൻ ടാപ്പുചെയ്യുക"</string> - <string name="bugreport_confirm" msgid="5917407234515812495">"ബഗ് റിപ്പോർട്ടുകളിൽ സിസ്റ്റത്തിന്റെ നിരവധി ലോഗ് ഫയലുകളിൽ നിന്നുള്ള വിവരങ്ങൾ അടങ്ങിയിരിക്കുന്നു, ഇതിൽ നിങ്ങൾ രഹസ്വസ്വഭാവമുള്ളവയായി പരിഗണിക്കുന്ന വിവരങ്ങളും (ആപ്പ് ഉപയോഗ വിവരങ്ങൾ, ലൊക്കേഷൻ വിവരങ്ങൾ എന്നിവ പോലെ) ഉൾപ്പെടാം. നിങ്ങൾ വിശ്വസിക്കുന്ന ആപ്സിനും ആളുകൾക്കും മാത്രം ബഗ് റിപ്പോർട്ടുകൾ പങ്കിടുക."</string> + <string name="bugreport_confirm" msgid="5917407234515812495">"ബഗ് റിപ്പോർട്ടുകളിൽ സിസ്റ്റത്തിന്റെ നിരവധി ലോഗ് ഫയലുകളിൽ നിന്നുള്ള വിവരങ്ങൾ അടങ്ങിയിരിക്കുന്നു, ഇതിൽ നിങ്ങൾ രഹസ്യ സ്വഭാവമുള്ളവയായി പരിഗണിക്കുന്ന വിവരങ്ങളും (ആപ്പ് ഉപയോഗ വിവരങ്ങൾ, ലൊക്കേഷൻ വിവരങ്ങൾ എന്നിവ പോലെ) ഉൾപ്പെടാം. നിങ്ങൾ വിശ്വസിക്കുന്ന ആപ്പുകൾക്കും ആളുകൾക്കും മാത്രം ബഗ് റിപ്പോർട്ടുകൾ പങ്കിടുക."</string> <string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"വീണ്ടും കാണിക്കരുത്"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"ബഗ് റിപ്പോർട്ടുകൾ"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"ബഗ് റിപ്പോർട്ട് ഫയൽ വായിക്കാനായില്ല"</string> diff --git a/packages/Shell/res/values-ne/strings.xml b/packages/Shell/res/values-ne/strings.xml index 7cc2e6bfefba..3c58796cae3f 100644 --- a/packages/Shell/res/values-ne/strings.xml +++ b/packages/Shell/res/values-ne/strings.xml @@ -28,7 +28,7 @@ <string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"तपाईंको बग रिपोर्ट स्क्रिनसट बिना आदान प्रदान गर्नाका लागि चयन गर्नुहोस् वा स्क्रिनसट लिने प्रक्रिया पूरा हुने प्रतीक्षा गर्नुहोस्"</string> <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"तपाईँको बग रिपोर्टलाई स्क्रिनसट बिना साझेदारी गर्नाका लागि ट्याप गर्नुहोस् वा स्क्रिनसट लिने प्रक्रिया पूरा हुन प्रतीक्षा गर्नुहोस्"</string> <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"तपाईँको बग रिपोर्टलाई स्क्रिनसट बिना साझेदारी गर्नाका लागि ट्याप गर्नुहोस् वा स्क्रिनसट लिने प्रक्रिया पूरा हुन प्रतीक्षा गर्नुहोस्"</string> - <string name="bugreport_confirm" msgid="5917407234515812495">"बग रिपोर्टमा प्रणालीका विभिन्न लग फाइलहरूको डेटा हुन्छ। यस रिपोर्टमा (अनुप्रयोगको प्रयोग र स्थानसम्बन्धी डेटा जस्ता) जसमा तपाईंका संवेदनशील डेटा समावेश हुन सक्छ । आफूले विश्वास गर्ने व्यक्ति र अनुप्रयोगहरूसँग मात्र बग रिपोर्ट सेयर गर्नुहोस्।"</string> + <string name="bugreport_confirm" msgid="5917407234515812495">"बग रिपोर्टमा प्रणालीका विभिन्न लग फाइलहरूको डेटा हुन्छ। यस रिपोर्टमा (एपको प्रयोग र स्थानसम्बन्धी डेटा जस्ता) जसमा तपाईंका संवेदनशील डेटा समावेश हुन सक्छ । आफूले विश्वास गर्ने व्यक्ति र अनुप्रयोगहरूसँग मात्र बग रिपोर्ट सेयर गर्नुहोस्।"</string> <string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"फेरि नदेखाउनुहोस्"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"बग रिपोर्टहरू"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"बग रिपोर्ट फाइल पढ्न सकिएन"</string> diff --git a/packages/Shell/res/values-pa/strings.xml b/packages/Shell/res/values-pa/strings.xml index 88948143fa35..d0c29055ecc1 100644 --- a/packages/Shell/res/values-pa/strings.xml +++ b/packages/Shell/res/values-pa/strings.xml @@ -30,7 +30,7 @@ <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਦੇ ਬਿਨਾਂ ਆਪਣੀ ਬੱਗ ਰਿਪੋਰਟ ਨੂੰ ਸਾਂਝੀ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ ਜਾਂ ਸਕ੍ਰੀਨਸ਼ਾਟ ਦੇ ਪੂਰੇ ਹੋਣ ਦੀ ਉਡੀਕ ਕਰੋ"</string> <string name="bugreport_confirm" msgid="5917407234515812495">"ਬੱਗ ਰਿਪੋਰਟਾਂ ਵਿੱਚ ਸਿਸਟਮ ਦੀਆਂ ਵੱਖ-ਵੱਖ ਲੌਗ ਫ਼ਾਈਲਾਂ ਦਾ ਡਾਟਾ ਸ਼ਾਮਲ ਹੁੰਦਾ ਹੈ, ਜਿਸ ਵਿੱਚ ਉਹ ਡਾਟਾ ਸ਼ਾਮਲ ਹੋ ਸਕਦਾ ਹੈ ਜਿਸ ਨੂੰ ਤੁਸੀਂ ਸੰਵੇਦਨਸ਼ੀਲ ਮੰਨਦੇ ਹੋ (ਜਿਵੇਂ ਕਿ ਐਪ-ਵਰਤੋਂ ਅਤੇ ਟਿਕਾਣਾ ਡਾਟਾ)। ਬੱਗ ਰਿਪੋਰਟਾਂ ਨੂੰ ਸਿਰਫ਼ ਆਪਣੇ ਭਰੋਸੇਯੋਗ ਲੋਕਾਂ ਅਤੇ ਐਪਾਂ ਨਾਲ ਸਾਂਝਾ ਕਰੋ।"</string> <string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"ਦੁਬਾਰਾ ਨਾ ਦਿਖਾਓ"</string> - <string name="bugreport_storage_title" msgid="5332488144740527109">"ਬਗ ਰਿਪੋਰਟਾਂ"</string> + <string name="bugreport_storage_title" msgid="5332488144740527109">"ਬੱਗ ਰਿਪੋਰਟਾਂ"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"ਬਗ ਰਿਪੋਰਟ ਫ਼ਾਈਲ ਪੜ੍ਹੀ ਨਹੀਂ ਜਾ ਸਕੀ"</string> <string name="bugreport_add_details_to_zip_failed" msgid="1302931926486712371">"ਬੱਗ ਰਿਪੋਰਟ ਵੇਰਵਿਆਂ ਨੂੰ ਜ਼ਿਪ ਫ਼ਾਈਲ ਵਿੱਚ ਸ਼ਾਮਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ"</string> <string name="bugreport_unnamed" msgid="2800582406842092709">"ਬਿਨਾਂ-ਨਾਮ"</string> diff --git a/packages/Shell/res/values-pt-rPT/strings.xml b/packages/Shell/res/values-pt-rPT/strings.xml index 3d11d4d56cc9..34013fad5c85 100644 --- a/packages/Shell/res/values-pt-rPT/strings.xml +++ b/packages/Shell/res/values-pt-rPT/strings.xml @@ -28,7 +28,7 @@ <string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"Selecione para partilhar o relatório de erro sem uma captura de ecrã ou aguarde a conclusão da mesma"</string> <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"Toque para partilhar o relatório de erro sem uma captura de ecrã ou aguarde a conclusão da mesma"</string> <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"Toque para partilhar o relatório de erro sem uma captura de ecrã ou aguarde a conclusão da mesma"</string> - <string name="bugreport_confirm" msgid="5917407234515812495">"Os relatórios de erros contêm dados de vários ficheiros de registo do sistema, que podem incluir dados que considere confidenciais (tais como dados de utilização de aplicações e de localização). Partilhe os relatórios de erros apenas com aplicações fidedignas e pessoas em quem confia."</string> + <string name="bugreport_confirm" msgid="5917407234515812495">"Os relatórios de erros contêm dados de vários ficheiros de registo do sistema, que podem incluir dados que considere confidenciais (tais como dados de utilização de apps e de localização). Partilhe os relatórios de erros apenas com apps fidedignas e pessoas em quem confia."</string> <string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"Não mostrar de novo"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Relatórios de erros"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"Não foi possível ler o ficheiro de relatório de erro"</string> diff --git a/packages/Shell/res/values-sk/strings.xml b/packages/Shell/res/values-sk/strings.xml index 61a2467a86bb..ecceb55b2ef8 100644 --- a/packages/Shell/res/values-sk/strings.xml +++ b/packages/Shell/res/values-sk/strings.xml @@ -28,7 +28,7 @@ <string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"Klepnutím zdieľajte hlásenie chyby bez snímky obrazovky alebo počkajte na dokončenie snímky obrazovky"</string> <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"Klepnutím zdieľajte hlásenie chyby bez snímky obrazovky alebo počkajte na dokončenie snímky obrazovky"</string> <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"Klepnutím zdieľajte hlásenie chyby bez snímky obrazovky alebo počkajte na dokončenie snímky obrazovky"</string> - <string name="bugreport_confirm" msgid="5917407234515812495">"Hlásenia chýb obsahujú údaje z rôznych súborov denníkov systému, ktoré môžu zahŕňať údaje považované za citlivé (napr. údaje o využití aplikácie a polohe). Zdieľajte ich preto iba s dôveryhodnými ľuďmi a aplikáciami."</string> + <string name="bugreport_confirm" msgid="5917407234515812495">"Hlásenia chýb obsahujú údaje z rôznych denníkov systému a môžu zahŕňať údaje, ktoré považujete za citlivé (napríklad údaje o využití aplikácií a polohe). Zdieľajte hlásenia chýb iba s ľuďmi a aplikáciami, ktorým dôverujete."</string> <string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"Nabudúce nezobrazovať"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Hlásenia chýb"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"Súbor s hlásením chyby sa nepodarilo prečítať"</string> diff --git a/packages/Shell/res/values-te/strings.xml b/packages/Shell/res/values-te/strings.xml index bb0496a481ec..6050c1f0bb73 100644 --- a/packages/Shell/res/values-te/strings.xml +++ b/packages/Shell/res/values-te/strings.xml @@ -17,7 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"షెల్"</string> - <string name="bugreport_notification_channel" msgid="2574150205913861141">"బగ్ నివేదికలు"</string> + <string name="bugreport_notification_channel" msgid="2574150205913861141">"బగ్ రిపోర్ట్స్"</string> <string name="bugreport_in_progress_title" msgid="4311705936714972757">"బగ్ నివేదిక <xliff:g id="ID">#%d</xliff:g> ఉత్పాదించబడుతోంది"</string> <string name="bugreport_finished_title" msgid="4429132808670114081">"బగ్ నివేదిక <xliff:g id="ID">#%d</xliff:g> సంగ్రహించబడింది"</string> <string name="bugreport_updating_title" msgid="4423539949559634214">"బగ్ నివేదికకు వివరాలను జోడిస్తోంది"</string> @@ -28,9 +28,9 @@ <string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"స్క్రీన్షాట్ లేకుండా మీ బగ్ నివేదికను భాగస్వామ్యం చేయడానికి ఎంచుకోండి లేదా స్క్రీన్షాట్ ముగిసేదాకా వేచి ఉండండి"</string> <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"స్క్రీన్షాట్ లేకుండా మీ బగ్ నివే. భాగ. చేయడానికి నొక్కండి లేదా స్క్రీన్షాట్ ముగిసేదాకా వేచి ఉండండి"</string> <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"స్క్రీన్షాట్ లేకుండా మీ బగ్ నివే. భాగ. చేయడానికి నొక్కండి లేదా స్క్రీన్షాట్ ముగిసేదాకా వేచి ఉండండి"</string> - <string name="bugreport_confirm" msgid="5917407234515812495">"బగ్ నివేదికల్లో మీరు గోప్యమైనదిగా పరిగణించే (యాప్ వినియోగం, లొకేషన్ డేటా వంటి) డేటాతో పాటు సిస్టమ్కు సంబంధించిన విభిన్న లాగ్ ఫైల్ల డేటా ఉంటుంది. బగ్ నివేదికలను మీరు విశ్వసించే యాప్లు, వ్యక్తులతో మాత్రమే షేర్ చేయండి."</string> + <string name="bugreport_confirm" msgid="5917407234515812495">"బగ్ రిపోర్ట్స్లో మీరు గోప్యమైనదిగా పరిగణించే (యాప్ వినియోగం, లొకేషన్ డేటా వంటి) డేటాతో పాటు సిస్టమ్కు సంబంధించిన విభిన్న లాగ్ ఫైల్ల డేటా ఉంటుంది. బగ్ నివేదికలను మీరు విశ్వసించే యాప్లు, వ్యక్తులతో మాత్రమే షేర్ చేయండి."</string> <string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"మళ్లీ చూపవద్దు"</string> - <string name="bugreport_storage_title" msgid="5332488144740527109">"బగ్ నివేదికలు"</string> + <string name="bugreport_storage_title" msgid="5332488144740527109">"బగ్ రిపోర్ట్స్"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"బగ్ నివేదిక ఫైల్ను చదవడం సాధ్యపడలేదు"</string> <string name="bugreport_add_details_to_zip_failed" msgid="1302931926486712371">"బగ్ నివేదిక వివరాలను జిప్ ఫైల్కు జోడించడం సాధ్యపడలేదు"</string> <string name="bugreport_unnamed" msgid="2800582406842092709">"పేరు లేనివి"</string> diff --git a/packages/Shell/res/values-zh-rHK/strings.xml b/packages/Shell/res/values-zh-rHK/strings.xml index 8298d15ddd67..ccbea4d371cc 100644 --- a/packages/Shell/res/values-zh-rHK/strings.xml +++ b/packages/Shell/res/values-zh-rHK/strings.xml @@ -28,7 +28,7 @@ <string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"選擇以分享錯誤報告 (不包含螢幕擷取畫面),或等待螢幕畫面擷取完成"</string> <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"輕按以分享錯誤報告 (不包含螢幕擷圖),或等待螢幕畫面擷取完成"</string> <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"輕按以分享錯誤報告 (不包含螢幕擷圖),或等待螢幕畫面擷取完成"</string> - <string name="bugreport_confirm" msgid="5917407234515812495">"錯誤報告包含來自系統各個記錄檔案的資料,並可能涉及敏感資料 (例如應用程式使用情況和位置資料)。您只應與信任的人和應用程式分享錯誤報告。"</string> + <string name="bugreport_confirm" msgid="5917407234515812495">"錯誤報告包含來自系統多個記錄檔案的資料,並可能涉及對您而言敏感的資料 (例如應用程式使用情況和位置資料)。您只應與信任的人和應用程式分享錯誤報告。"</string> <string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"不要再顯示"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"錯誤報告"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"無法讀取錯誤報告檔案"</string> diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java index aeedc16ffbd4..e246917842b0 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java +++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java @@ -66,14 +66,6 @@ public interface QSTile { void destroy(); - /** - * return true if the tile supports detail views, and not - * only boolean states - */ - default boolean supportsDetailView() { - return false; - } - CharSequence getTileLabel(); State getState(); diff --git a/packages/SystemUI/res/layout-land/global_screenshot_preview.xml b/packages/SystemUI/res/layout-land/global_screenshot_preview.xml new file mode 100644 index 000000000000..b1f4cb7d70de --- /dev/null +++ b/packages/SystemUI/res/layout-land/global_screenshot_preview.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2020 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> +<ImageView + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:id="@+id/global_screenshot_preview" + android:layout_width="wrap_content" + android:layout_height="@dimen/global_screenshot_x_scale" + android:layout_gravity="center" + android:layout_marginStart="@dimen/screenshot_offset_x" + android:layout_marginBottom="@dimen/screenshot_offset_y" + android:scaleType="fitStart" + android:elevation="@dimen/screenshot_preview_elevation" + android:visibility="gone" + android:background="@drawable/screenshot_rounded_corners" + android:adjustViewBounds="true" + android:contentDescription="@string/screenshot_preview_description" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toStartOf="parent"/>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/controls_dialog_pin.xml b/packages/SystemUI/res/layout/controls_dialog_pin.xml index 832c48e509f5..170b32b6c669 100644 --- a/packages/SystemUI/res/layout/controls_dialog_pin.xml +++ b/packages/SystemUI/res/layout/controls_dialog_pin.xml @@ -26,6 +26,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:minHeight="48dp" + android:longClickable="false" android:inputType="numberPassword" /> <CheckBox android:id="@+id/controls_pin_use_alpha" diff --git a/packages/SystemUI/res/layout/global_actions_grid_item_v2.xml b/packages/SystemUI/res/layout/global_actions_grid_item_v2.xml index 477ec6a1c72c..1b42ceb50bf7 100644 --- a/packages/SystemUI/res/layout/global_actions_grid_item_v2.xml +++ b/packages/SystemUI/res/layout/global_actions_grid_item_v2.xml @@ -20,51 +20,35 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="0dp" android:layout_weight="1" - android:layout_height="wrap_content" - android:gravity="center" - android:paddingTop="@dimen/global_actions_grid_item_vertical_margin" - android:paddingBottom="@dimen/global_actions_grid_item_vertical_margin" + android:layout_height="98dp" + android:gravity="bottom|center_horizontal" + android:orientation="vertical" + android:paddingTop="12dp" + android:paddingBottom="12dp" android:paddingLeft="@dimen/global_actions_grid_item_side_margin" android:paddingRight="@dimen/global_actions_grid_item_side_margin" android:layout_marginRight="@dimen/control_base_item_margin" android:layout_marginLeft="@dimen/control_base_item_margin" android:stateListAnimator="@anim/control_state_list_animator" android:background="@drawable/control_background"> - <LinearLayout - android:layout_width="@dimen/global_actions_grid_item_width" - android:layout_height="@dimen/global_actions_grid_item_height" - android:gravity="top|center_horizontal" - android:orientation="vertical"> <ImageView android:id="@*android:id/icon" - android:layout_width="@dimen/global_actions_grid_item_icon_width" - android:layout_height="@dimen/global_actions_grid_item_icon_height" - android:layout_marginTop="@dimen/global_actions_grid_item_icon_top_margin" - android:layout_marginBottom="@dimen/global_actions_grid_item_icon_bottom_margin" - android:layout_marginLeft="@dimen/global_actions_grid_item_icon_side_margin" - android:layout_marginRight="@dimen/global_actions_grid_item_icon_side_margin" + android:layout_width="20dp" + android:layout_height="20dp" + android:layout_marginBottom="14dp" android:scaleType="centerInside" - android:tint="@color/control_default_foreground" /> - + android:tint="@color/control_primary_text" /> <TextView android:id="@*android:id/message" android:layout_width="match_parent" android:layout_height="wrap_content" android:ellipsize="marquee" android:marqueeRepeatLimit="marquee_forever" - android:singleLine="true" - android:gravity="center" - android:textSize="12dp" - android:textColor="@color/control_default_foreground" - android:textAppearance="?android:attr/textAppearanceSmall" /> - - <TextView - android:visibility="gone" - android:id="@*android:id/status" - android:layout_width="match_parent" - android:layout_height="wrap_content" + android:maxLines="2" + android:textSize="12sp" android:gravity="center" - android:textColor="@color/control_default_foreground" + android:textColor="@color/control_primary_text" + android:breakStrategy="high_quality" + android:hyphenationFrequency="full" android:textAppearance="?android:attr/textAppearanceSmall" /> - </LinearLayout> </LinearLayout> diff --git a/packages/SystemUI/res/layout/global_screenshot.xml b/packages/SystemUI/res/layout/global_screenshot.xml index 1dbb38d5dc7a..d469e0f187e0 100644 --- a/packages/SystemUI/res/layout/global_screenshot.xml +++ b/packages/SystemUI/res/layout/global_screenshot.xml @@ -71,21 +71,7 @@ android:elevation="@dimen/screenshot_preview_elevation" android:background="@drawable/screenshot_rounded_corners" android:adjustViewBounds="true"/> - <ImageView - android:id="@+id/global_screenshot_preview" - android:layout_width="@dimen/global_screenshot_x_scale" - android:layout_height="wrap_content" - android:layout_gravity="center" - android:layout_marginStart="@dimen/screenshot_offset_x" - android:layout_marginBottom="@dimen/screenshot_offset_y" - android:scaleType="fitEnd" - android:elevation="@dimen/screenshot_preview_elevation" - android:visibility="gone" - android:background="@drawable/screenshot_rounded_corners" - android:adjustViewBounds="true" - android:contentDescription="@string/screenshot_preview_description" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintStart_toStartOf="parent"/> + <include layout="@layout/global_screenshot_preview"/> <FrameLayout android:id="@+id/global_screenshot_dismiss_button" android:layout_width="@dimen/screenshot_dismiss_button_tappable_size" diff --git a/packages/SystemUI/res/layout/global_screenshot_preview.xml b/packages/SystemUI/res/layout/global_screenshot_preview.xml new file mode 100644 index 000000000000..e6295f54fcbe --- /dev/null +++ b/packages/SystemUI/res/layout/global_screenshot_preview.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2011 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. + --> +<ImageView + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:id="@+id/global_screenshot_preview" + android:layout_width="@dimen/global_screenshot_x_scale" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:layout_marginStart="@dimen/screenshot_offset_x" + android:layout_marginBottom="@dimen/screenshot_offset_y" + android:scaleType="fitEnd" + android:elevation="@dimen/screenshot_preview_elevation" + android:visibility="gone" + android:background="@drawable/screenshot_rounded_corners" + android:adjustViewBounds="true" + android:contentDescription="@string/screenshot_preview_description" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toStartOf="parent"/>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/qs_tile_detail_text.xml b/packages/SystemUI/res/layout/qs_tile_detail_text.xml deleted file mode 100644 index bcbf826b9d49..000000000000 --- a/packages/SystemUI/res/layout/qs_tile_detail_text.xml +++ /dev/null @@ -1,33 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - Copyright (C) 2019 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. ---> - -<!-- use 'dp' instead of 'sp' as we do not want the text to increase - if the user scales the font size --> -<TextView - xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="bottom|center_horizontal" - android:text="..." - android:textSize="16dp" - android:fontFamily="@*android:string/config_headlineFontFamily" - android:singleLine="true" - android:visibility="gone" - android:paddingBottom="@dimen/qs_tile_detail_padding" - android:clickable="false" - android:focusable="false" /> - diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index e341f5674cc2..4d128ceb7b79 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Maak skermkiekie toe"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Skermkiekievoorskou"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Skermopnemer"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Verwerk tans skermopname"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Deurlopende kennisgewing vir \'n skermopnamesessie"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Begin opname?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Terwyl dit opneem, kan die Android-stelsel enige sensitiewe inligting wat op jou skerm sigbaar is of wat op jou toestel gespeel word, vasvang. Dit sluit wagwoorde, betalinginligting, foto\'s, boodskappe en oudio in."</string> @@ -511,8 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Vee alles uit"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Bestuur"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Geskiedenis"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Inkomend"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Stil kennisgewings"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Opletkennisgewings"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Gesprekke"</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Titelloos"</string> <string name="restart_button_description" msgid="6916116576177456480">"Tik om hierdie program te herbegin en maak volskerm oop."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Instellings vir <xliff:g id="APP_NAME">%1$s</xliff:g>-borrels"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Oorloop"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Voeg terug op stapel"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Bestuur"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> vanaf <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> van <xliff:g id="APP_NAME">%2$s</xliff:g> en <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> meer af"</string> diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index 85e06c3727c5..f811dc76e0da 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"ቅጽበታዊ ገጽ እይታን አሰናብት"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"የቅጽበታዊ ገጽ ዕይታ ቅድመ-ዕይታ"</string> <string name="screenrecord_name" msgid="2596401223859996572">"የማያ መቅጃ"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"የማያ ገጽ ቀረጻን በማሰናዳት ላይ"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"ለአንድ የማያ ገጽ ቀረጻ ክፍለ-ጊዜ በመካሄድ ያለ ማሳወቂያ"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"መቅረጽ ይጀመር?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"እየቀረጹ ሳለ የAndroid ስርዓት በማያ ገጽዎ ላይ የሚታይ ወይም በመሣሪያዎ ላይ የሚጫወት ማንኛውም ሚስጥራዊነት ያለው መረጃን መያዝ ይችላል። ይህ የይለፍ ቃላትን፣ የክፍያ መረጃን፣ ፎቶዎችን፣ መልዕክቶችን እና ኦዲዮን ያካትታል።"</string> @@ -511,8 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"ሁሉንም አጽዳ"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"ያቀናብሩ"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"ታሪክ"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"ገቢ"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"ጸጥ ያሉ ማሳወቂያዎች"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"የማንቂያ ማሳወቂያዎች"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"ውይይቶች"</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"ርዕስ የለም"</string> <string name="restart_button_description" msgid="6916116576177456480">"ይህን መተግበሪያ እንደገና ለማስጀመር መታ ያድርጉ እና ወደ ሙሉ ማያ ገጽ ይሂዱ።"</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"ቅንብሮች ለ <xliff:g id="APP_NAME">%1$s</xliff:g> አረፋዎች"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"ትርፍ ፍሰት"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"ወደ ቁልል መልሰው ያክሉ"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"ያቀናብሩ"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ከ<xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ከ <xliff:g id="APP_NAME">%2$s</xliff:g> እና <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> ተጨማሪ"</string> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index e6388e99c1a1..749241da097a 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"إغلاق لقطة الشاشة"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"معاينة لقطة الشاشة"</string> <string name="screenrecord_name" msgid="2596401223859996572">"مسجّل الشاشة"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"جارٍ معالجة تسجيل الشاشة"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"إشعار مستمر لجلسة تسجيل شاشة"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"هل تريد بدء التسجيل؟"</string> <string name="screenrecord_description" msgid="1123231719680353736">"أثناء التسجيل، يمكن أن يسجّل نظام Android أي معلومات حساسة مرئية على شاشتك أو يتم تشغيلها على جهازك. ويشمل ذلك كلمات المرور ومعلومات الدفع والصور والرسائل والمقاطع الصوتية."</string> @@ -523,8 +522,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"محو الكل"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"إدارة"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"السجلّ"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"الإشعارات الواردة"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"الإشعارات الصامتة"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"إشعارات التنبيه"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"المحادثات"</string> @@ -1011,10 +1009,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"بلا عنوان"</string> <string name="restart_button_description" msgid="6916116576177456480">"انقر لإعادة تشغيل هذا التطبيق والانتقال إلى وضع ملء الشاشة."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"إعدادات فقاعات المحادثات على <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"القائمة الكاملة"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"إضافة دعم إلى الحزم"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"إدارة"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> من <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> من <xliff:g id="APP_NAME">%2$s</xliff:g> و<xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> أيضًا"</string> @@ -1063,10 +1059,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"تعذّر تحميل قائمة كل عناصر التحكّم."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"غير ذلك"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"إضافة إلى أدوات التحكم بالجهاز"</string> - <!-- no translation found for controls_dialog_ok (2770230012857881822) --> - <skip /> - <!-- no translation found for controls_dialog_message (342066938390663844) --> - <skip /> + <string name="controls_dialog_ok" msgid="2770230012857881822">"إضافة"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"اقتراح من <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"تم تعديل عناصر التحكّم."</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"يشتمل رقم التعريف الشخصي على أحرف أو رموز."</string> <string name="controls_pin_verify" msgid="3452778292918877662">"إثبات ملكية <xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index df62189c5f3b..92be0fef3eb6 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"স্ক্ৰীনশ্বট অগ্ৰাহ্য কৰক"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"স্ক্ৰীনশ্বটৰ পূৰ্বদৰ্শন"</string> <string name="screenrecord_name" msgid="2596401223859996572">"স্ক্ৰীন ৰেকৰ্ডাৰ"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"স্ক্রীন ৰেকৰ্ডিঙৰ প্ৰক্ৰিয়াকৰণ হৈ আছে"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"স্ক্রীণ ৰেকৰ্ডিং ছেশ্বন চলি থকা সময়ত পোৱা জাননী"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"ৰেকৰ্ড কৰা আৰম্ভ কৰিবনে?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"ৰেকৰ্ড কৰি থাকোঁতে, Android Systemএ আপোনাৰ স্ক্রীনত দৃশ্যমান হোৱা অথবা আপোনাৰ ডিভাইচত প্লে’ হৈ থকা যিকোনো সংবেনদশীল তথ্য কেপচাৰ কৰিব পাৰে। এইটোত পাছৱর্ড, পৰিশোধৰ তথ্য, ফট’, বার্তাসমূহ আৰু অডিঅ’ অন্তর্ভুক্ত হয়।"</string> @@ -511,8 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"সকলো মচক"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"পৰিচালনা"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"ইতিহাস"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"অন্তৰ্গামী"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"নীৰৱ জাননীসমূহ"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"সতৰ্কতামূলক জাননীসমূহ"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"বাৰ্তালাপ"</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"কোনো শিৰোনাম নাই"</string> <string name="restart_button_description" msgid="6916116576177456480">"এপ্টো ৰিষ্টাৰ্ট কৰক আৰু পূৰ্ণ স্ক্ৰীণ ব্যৱহাৰ কৰক।"</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g>ৰ bubblesৰ ছেটিংসমূহ"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"অভাৰফ্ল’"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"ষ্টেকত পুনৰ যোগ দিয়ক"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"পৰিচালনা কৰক"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g>ৰ পৰা <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> আৰু<xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>টাৰ পৰা <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index f09a6d621c60..9230d4ca12c7 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Ekran şəklini ötürün"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Ekran şəklinə önbaxış"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Ekran Yazıcısı"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Ekran çəkilişi emal edilir"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Ekranın video çəkimi ərzində silinməyən bildiriş"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Yazmağa başlanılsın?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Yazarkən Android Sistemi ekranınızda görünən və ya cihazınızda göstərilən istənilən həssas məlumatı qeydə ala bilər. Buraya parollar, ödəniş məlumatı, fotolar, mesajlar və audio daxildir."</string> @@ -511,8 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Hamısını silin"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"İdarə edin"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Tarixçə"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Gələn"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Səssiz bildirişlər"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Xəbərdarlıq bildirişləri"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Söhbətlər"</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Başlıq yoxdur"</string> <string name="restart_button_description" msgid="6916116576177456480">"Bu tətbiqi sıfırlayaraq tam ekrana keçmək üçün klikləyin."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> yumrucuqları üçün ayarlar"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Kənara çıxma"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Yenidən dəstəyə əlavə edin"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"İdarə edin"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g> tətbiqindən <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> tətbiqindən <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> və daha <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> qabarcıq"</string> diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index b9af5e99b3ee..b633bb6804ee 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Odbacite snimak ekrana"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Pregled snimka ekrana"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Snimač ekrana"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Obrađujemo video snimka ekrana"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Obaveštenje o sesiji snimanja ekrana je aktivno"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Želite da započnete snimanje?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Tokom snimanja Android sistem može da snimi osetljive informacije koje su vidljive na ekranu ili koje se puštaju na uređaju. To obuhvata lozinke, informacije o plaćanju, slike, poruke i zvuk."</string> @@ -514,8 +513,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Obriši sve"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Upravljajte"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Istorija"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Dolazno"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Nečujna obaveštenja"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Obaveštenja koja privlače pažnju"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Konverzacije"</string> @@ -996,10 +994,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Bez naslova"</string> <string name="restart_button_description" msgid="6916116576177456480">"Dodirnite da biste restartovali aplikaciju i prešli u režim celog ekrana."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Podešavanja za <xliff:g id="APP_NAME">%1$s</xliff:g> oblačiće"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Preklapanje"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Dodaj ponovo u grupu"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Upravljajte"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> iz aplikacije <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> iz aplikacije <xliff:g id="APP_NAME">%2$s</xliff:g> i još <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string> @@ -1019,10 +1015,10 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Navigacija sistema je ažurirana. Da biste uneli izmene, idite u Podešavanja."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Idite u Podešavanja da biste ažurirali navigaciju sistema"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Stanje pripravnosti"</string> - <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Prikazuju se u vrhu odeljka za konverzacije"</string> - <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Prikazuju sliku profila na zaključanom ekranu"</string> + <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Prikazuje se u vrhu odeljka za konverzacije"</string> + <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Prikazuje sliku profila na zaključanom ekranu"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Prikazuju se plutajući oblačići preko aplikacija"</string> - <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Ometaju podešavanje Ne uznemiravaj"</string> + <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Ometa podešavanje Ne uznemiravaj"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Važi"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Preklopni prozor za uvećanje"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Prozor za uvećanje"</string> diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index 0f3f537a27ec..df9a660c6d13 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Адхіліць здымак экрана"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Перадпрагляд здымка экрана"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Запіс экрана"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Апрацоўваецца запіс экрана"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Бягучае апавяшчэнне для сеанса запісу экрана"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Пачаць запіс?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Падчас запісу сістэма Android можа збіраць канфідэнцыяльную інфармацыю, якая адлюстроўваецца на экране вашай прылады ці прайграецца на ёй. Гэта могуць быць паролі, плацежная інфармацыя, фота, паведамленні і аўдыяданыя."</string> @@ -517,8 +516,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Ачысціць усё"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Кіраваць"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Гісторыя"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Уваходныя"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Апавяшчэнні без гуку"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Апавяшчэнні з абвесткамі"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Размовы"</string> @@ -1001,10 +999,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Без назвы"</string> <string name="restart_button_description" msgid="6916116576177456480">"Націсніце, каб перазапусціць гэту праграму і перайсці ў поўнаэкранны рэжым."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Налады ўсплывальных апавяшчэнняў у праграме \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Дадатковае меню"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Зноў дадаць у стос"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Кіраваць"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ад праграмы \"<xliff:g id="APP_NAME">%2$s</xliff:g>\""</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ад праграмы \"<xliff:g id="APP_NAME">%2$s</xliff:g>\" і яшчэ <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index 50781e138d5f..31e47da6baeb 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Отхвърляне на екранната снимка"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Визуализация на екранната снимка"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Запис на екрана"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Записът на екрана се обработва"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Текущо известие за сесия за записване на екрана"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Да се стартира ли записът?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"По време на записване системата Android може да прихване поверителна информация, която е показана на екрана или възпроизвеждана на устройството ви. Това включва пароли, данни за плащане, снимки, съобщения и аудио."</string> @@ -511,8 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Изчистване на всички"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Управление"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"История"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Входящи"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Беззвучни известия"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Известия за сигнализиране"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Разговори"</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Няма заглавие"</string> <string name="restart_button_description" msgid="6916116576177456480">"Докоснете, за да рестартирате това приложение в режим на цял екран."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Настройки за балончетата за <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Препълване"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Добавяне обратно към стека"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Управление"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> от <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"„<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>“ от<xliff:g id="APP_NAME">%2$s</xliff:g> и още <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index 50a88f25660f..08826e46ab22 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"স্ক্রিনশট বাতিল করুন"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"স্ক্রিনশটের প্রিভিউ"</string> <string name="screenrecord_name" msgid="2596401223859996572">"স্ক্রিন রেকর্ডার"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"স্ক্রিন রেকর্ডিং প্রসেস হচ্ছে"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"স্ক্রিন রেকর্ডিং সেশন চলার বিজ্ঞপ্তি"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"রেকর্ডিং শুরু করবেন?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"রেকর্ড করার সময়, আপনার স্ক্রিনে দেখানো বা ডিভাইসে চালানো যেকোনও ধরনের সংবেদনশীল তথ্য Android সিস্টেম ক্যাপচার করতে পারে। এর মধ্যে পাসওয়ার্ড, পেমেন্টের তথ্য, ফটো, মেসেজ এবং অডিও সম্পর্কিত তথ্য থাকে।"</string> @@ -511,8 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"সবকিছু সাফ করুন"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"পরিচালনা করুন"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"ইতিহাস"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"ইনকামিং"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"নীরব বিজ্ঞপ্তি"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"বিজ্ঞপ্তি সংক্রান্ত সতর্কতা"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"কথোপকথন"</string> @@ -969,7 +967,7 @@ <string name="running_foreground_services_title" msgid="5137313173431186685">"পটভূমিতে অ্যাপ চালু আছে"</string> <string name="running_foreground_services_msg" msgid="3009459259222695385">"ব্যাটারি এবং ডেটার ব্যবহারের বিশদ বিবরণের জন্য ট্যাপ করুন"</string> <string name="mobile_data_disable_title" msgid="5366476131671617790">"মোবাইল ডেটা বন্ধ করবেন?"</string> - <string name="mobile_data_disable_message" msgid="8604966027899770415">"আপনি <xliff:g id="CARRIER">%s</xliff:g>-এর মাধ্যমে ডেটা অথবা ইন্টারনেট অ্যাক্সেস করতে পারবেন না। শুধুমাত্র ওয়াই-ফাইয়ের মাধ্যমেই ইন্টারনেট অ্যাক্সেস করা যাবে।"</string> + <string name="mobile_data_disable_message" msgid="8604966027899770415">"আপনি \'<xliff:g id="CARRIER">%s</xliff:g>\'-এর মাধ্যমে ডেটা অথবা ইন্টারনেট অ্যাক্সেস করতে পারবেন না। শুধুমাত্র ওয়াই-ফাইয়ের মাধ্যমেই ইন্টারনেট অ্যাক্সেস করা যাবে।"</string> <string name="mobile_data_disable_message_default_carrier" msgid="6496033312431658238">"আপনার পরিষেবা প্রদানকারী"</string> <string name="touch_filtered_warning" msgid="8119511393338714836">"একটি অ্যাপ কোনও অনুমোদনের অনুরোধকে ঢেকে দিচ্ছে, তাই সেটিংস থেকে আপনার প্রতিক্রিয়া যাচাই করা যাচ্ছে না।"</string> <string name="slice_permission_title" msgid="3262615140094151017">"<xliff:g id="APP_0">%1$s</xliff:g> অ্যাপটিকে <xliff:g id="APP_2">%2$s</xliff:g> এর অংশ দেখানোর অনুমতি দেবেন?"</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"কোনও শীর্ষক নেই"</string> <string name="restart_button_description" msgid="6916116576177456480">"এই অ্যাপ রিস্টার্ট করতে ট্যাপ করুন ও ফুল-স্ক্রিন ব্যবহার করুন।"</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> বাবলের জন্য সেটিংস"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"ওভারফ্লো"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"স্ট্যাকে আবার যোগ করুন"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"ম্যানেজ করা"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g> অ্যাপ থেকে <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> অ্যাপ এবং আরও <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>টি থেকে <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> @@ -1039,10 +1035,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"সব কন্ট্রোলের তালিকা লোড করা যায়নি।"</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"অন্য"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"ডিভাইস কন্ট্রোলে যোগ করুন"</string> - <!-- no translation found for controls_dialog_ok (2770230012857881822) --> - <skip /> - <!-- no translation found for controls_dialog_message (342066938390663844) --> - <skip /> + <string name="controls_dialog_ok" msgid="2770230012857881822">"যোগ করুন"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"<xliff:g id="APP">%s</xliff:g> সাজেস্ট করেছে"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"কন্ট্রোল আপডেট করা হয়েছে"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"পিন-এ অক্ষর বা চিহ্ন রয়েছে"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"<xliff:g id="DEVICE">%s</xliff:g> যাচাই করুন"</string> diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index d334f3ceab78..28a2930c522e 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -89,10 +89,10 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Odbacite snimak ekrana"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Pregled snimka ekrana"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Snimač ekrana"</string> - <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Obrada snimanja zaslona"</string> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Obrađivanje snimka ekrana"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Obavještenje za sesiju snimanja ekrana je u toku"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Započeti snimanje?"</string> - <string name="screenrecord_description" msgid="1123231719680353736">"Prilikom snimanja, Android sistem može snimiti sve osjetljive informacije koje su vidljive na vašem ekranu ili koje reproducirate na uređaju. To uključuje lozinke, informacije za plaćanje, fotografije, poruke i zvuk."</string> + <string name="screenrecord_description" msgid="1123231719680353736">"Prilikom snimanja, sistem Android može snimiti sve osjetljive informacije koje su vidljive na vašem ekranu ili koje reproducirate na uređaju. To uključuje lozinke, informacije za plaćanje, fotografije, poruke i zvuk."</string> <string name="screenrecord_audio_label" msgid="6183558856175159629">"Snimi zvučni zapis"</string> <string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Zvuk uređaja"</string> <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"Zvuk s vašeg uređaja, naprimjer muzika, pozivi i melodije zvona"</string> @@ -974,7 +974,7 @@ <string name="running_foreground_services_title" msgid="5137313173431186685">"Aplikacije koje rade u pozadini"</string> <string name="running_foreground_services_msg" msgid="3009459259222695385">"Dodirnite za detalje o potrošnji baterije i prijenosa podataka"</string> <string name="mobile_data_disable_title" msgid="5366476131671617790">"Isključiti prijenos podataka na mobilnoj mreži?"</string> - <string name="mobile_data_disable_message" msgid="8604966027899770415">"Nećete imati pristup podacima ili internetu putem mobilnog operatera <xliff:g id="CARRIER">%s</xliff:g>. Internet će biti dostupan samo putem WiFi mreže."</string> + <string name="mobile_data_disable_message" msgid="8604966027899770415">"Nećete imati pristup podacima ni internetu putem mobilnog operatera <xliff:g id="CARRIER">%s</xliff:g>. Internet će biti dostupan samo putem WiFi mreže."</string> <string name="mobile_data_disable_message_default_carrier" msgid="6496033312431658238">"vaš operater"</string> <string name="touch_filtered_warning" msgid="8119511393338714836">"Postavke ne mogu potvrditi vaš odgovor jer aplikacija zaklanja zahtjev za odobrenje."</string> <string name="slice_permission_title" msgid="3262615140094151017">"Dozvoliti aplikaciji <xliff:g id="APP_0">%1$s</xliff:g> prikazivanje isječaka aplikacije <xliff:g id="APP_2">%2$s</xliff:g>?"</string> @@ -996,8 +996,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Bez naslova"</string> <string name="restart_button_description" msgid="6916116576177456480">"Dodirnite da ponovo pokrenete ovu aplikaciju i aktivirate prikaz preko cijelog ekrana."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Postavke za oblačiće aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> - <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Dodatno"</string> - <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Dodajte natrag u nizove"</string> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Preklapanje"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Dodaj nazad u grupu"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Upravljaj"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> od aplikacije <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"Obavještenje <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> aplikacije <xliff:g id="APP_NAME">%2$s</xliff:g> i još <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index ed3bb8db81f2..15cc8d39bb7a 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Ignora la captura de pantalla"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Previsualització de la captura de pantalla"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Gravació de pantalla"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Processant gravació de pantalla"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notificació en curs d\'una sessió de gravació de la pantalla"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Vols iniciar la gravació?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Quan graves contingut, el sistema Android pot capturar qualsevol informació sensible que es mostri a la pantalla o que es reprodueixi al dispositiu. Això inclou les contrasenyes, la informació de pagament, les fotos, els missatges i l\'àudio."</string> @@ -511,8 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Esborra-ho tot"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Gestiona"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Historial"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Entrants"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Notificacions silencioses"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Notificacions d\'alerta"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Converses"</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Sense títol"</string> <string name="restart_button_description" msgid="6916116576177456480">"Toca per reiniciar l\'aplicació i passar a pantalla completa."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Configuració de les bombolles: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Menú addicional"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Torna a afegir a la pila"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Gestiona"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de: <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> (<xliff:g id="APP_NAME">%2$s</xliff:g>) i <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> més"</string> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index 73378ddd01d9..e3d9e384ed31 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Zavřít snímek obrazovky"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Náhled snímku obrazovky"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Rekordér obrazovky"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Záznam obrazovky se zpracovává"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Trvalé oznámení o relaci nahrávání"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Spustit nahrávání?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Při nahrávání může systém Android zaznamenávat citlivé údaje, které jsou viditelné na obrazovce nebo které jsou přehrávány na zařízení. Týká se to hesel, údajů o platbě, fotek, zpráv a zvuků."</string> @@ -402,7 +401,7 @@ <string name="quick_settings_tethering_label" msgid="5257299852322475780">"Sdílené připojení"</string> <string name="quick_settings_hotspot_label" msgid="1199196300038363424">"Hotspot"</string> <string name="quick_settings_hotspot_secondary_label_transient" msgid="7585604088079160564">"Zapínání…"</string> - <string name="quick_settings_hotspot_secondary_label_data_saver_enabled" msgid="1280433136266439372">"Spořič dat je zapnutý"</string> + <string name="quick_settings_hotspot_secondary_label_data_saver_enabled" msgid="1280433136266439372">"Spořič dat zapnut"</string> <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="3142308865165871976"> <item quantity="few">%d zařízení</item> <item quantity="many">%d zařízení</item> @@ -517,8 +516,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Smazat vše"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Spravovat"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Historie"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Příchozí"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Tichá oznámení"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Oznámení s upozorněním"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Konverzace"</string> @@ -1001,10 +999,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Bez názvu"</string> <string name="restart_button_description" msgid="6916116576177456480">"Klepnutím aplikaci restartujete a přejdete na režim celé obrazovky"</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Nastavení bublin aplikace <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Rozbalovací nabídka"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Přidat zpět do sady"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Spravovat"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"Oznámení <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> z aplikace <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> z aplikace <xliff:g id="APP_NAME">%2$s</xliff:g> a dalších (<xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>)"</string> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index 88b74de6b2f9..3d244cc60817 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Luk screenshot"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Forhåndsvisning af screenshot"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Skærmoptagelse"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Behandler skærmoptagelse"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Konstant notifikation om skærmoptagelse"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Vil du starte optagelse?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Når du optager, kan Android-systemet registrere følsomme oplysninger, der er synlige på din skærm, eller som afspilles på din enhed. Dette inkluderer adgangskoder, betalingsoplysninger, fotos, meddelelser og lyd."</string> @@ -511,8 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Ryd alle"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Administrer"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Historik"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Indgående"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Lydløse notifikationer"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Notifikationer med vibration eller lyd"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Samtaler"</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Ingen titel"</string> <string name="restart_button_description" msgid="6916116576177456480">"Tryk for at genstarte denne app, og gå til fuld skærm."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Indstillinger for <xliff:g id="APP_NAME">%1$s</xliff:g>-bobler"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Overløb"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Føj til stak igen"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Administrer"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> fra <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> fra <xliff:g id="APP_NAME">%2$s</xliff:g> og <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> andre"</string> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index acfdd47fadeb..8ef83bdb47a1 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Screenshot schließen"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Screenshotvorschau"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Bildschirmaufzeichnung"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Bildschirmaufzeichnung…"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Fortlaufende Benachrichtigung für eine Bildschirmaufzeichnung"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Aufzeichnung starten?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Beim Aufnehmen kann das Android-System vertrauliche Informationen erfassen, die auf deinem Bildschirm angezeigt oder von deinem Gerät wiedergegeben werden. Das können Passwörter, Zahlungsinformationen, Fotos, Nachrichten und Audioinhalte sein."</string> @@ -511,8 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Alle löschen"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Verwalten"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Verlauf"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Neue Benachrichtigungen"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Lautlose Benachrichtigungen"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Laut gestellte Benachrichtigungen"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Unterhaltungen"</string> @@ -821,7 +819,7 @@ <string name="accessibility_long_click_tile" msgid="210472753156768705">"Einstellungen öffnen"</string> <string name="accessibility_status_bar_headphones" msgid="1304082414912647414">"Mit Kopfhörer verbunden"</string> <string name="accessibility_status_bar_headset" msgid="2699275863720926104">"Mit Headset verbunden"</string> - <string name="data_saver" msgid="3484013368530820763">"Datenverbrauch reduzieren"</string> + <string name="data_saver" msgid="3484013368530820763">"Datensparmodus"</string> <string name="accessibility_data_saver_on" msgid="5394743820189757731">"Datensparmodus aktiviert"</string> <string name="accessibility_data_saver_off" msgid="58339669022107171">"Datensparmodus deaktiviert"</string> <string name="switch_bar_on" msgid="1770868129120096114">"An"</string> @@ -854,7 +852,7 @@ <string name="right_keycode" msgid="2480715509844798438">"Rechter Keycode"</string> <string name="left_icon" msgid="5036278531966897006">"Linkes Symbol"</string> <string name="right_icon" msgid="1103955040645237425">"Rechtes Symbol"</string> - <string name="drag_to_add_tiles" msgid="8933270127508303672">"Zum Hinzufügen von Kacheln Kachel halten und ziehen"</string> + <string name="drag_to_add_tiles" msgid="8933270127508303672">"Zum Hinzufügen Kachel halten und ziehen"</string> <string name="drag_to_rearrange_tiles" msgid="2143204300089638620">"Zum Verschieben Kachel halten und ziehen"</string> <string name="drag_to_remove_tiles" msgid="4682194717573850385">"Zum Entfernen hierher ziehen"</string> <string name="drag_to_remove_disabled" msgid="933046987838658850">"Du brauchst mindestens <xliff:g id="MIN_NUM_TILES">%1$d</xliff:g> Kacheln"</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Kein Titel"</string> <string name="restart_button_description" msgid="6916116576177456480">"Tippe, um die App im Vollbildmodus neu zu starten."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Einstellungen für <xliff:g id="APP_NAME">%1$s</xliff:g>-Bubbles"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Mehr anzeigen"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Wieder dem Stapel hinzufügen"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Verwalten"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> von <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> aus <xliff:g id="APP_NAME">%2$s</xliff:g> und <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> weiteren"</string> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index 7ef57f85366c..e7d6878dd186 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -89,10 +89,9 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Descartar captura de pantalla"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Vista previa de la captura de pantalla"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Grabadora de pantalla"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Procesando grabación pantalla"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notificación constante para una sesión de grabación de pantalla"</string> - <string name="screenrecord_start_label" msgid="1750350278888217473">"¿Comenzar grabación?"</string> + <string name="screenrecord_start_label" msgid="1750350278888217473">"¿Comenzar a grabar?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Durante la grabación, el sistema de Android puede capturar la información sensible que aparezca en la pantalla o que se reproduzca en el dispositivo. Se incluyen contraseñas, información de pago, fotos, mensajes y audio."</string> <string name="screenrecord_audio_label" msgid="6183558856175159629">"Grabar audio"</string> <string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Audio del dispositivo"</string> @@ -511,8 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Borrar todo"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Administrar"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Historial"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Entrante"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Notificaciones silenciosas"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Notificaciones de alerta"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversaciones"</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Sin título"</string> <string name="restart_button_description" msgid="6916116576177456480">"Presiona para reiniciar esta app y acceder al modo de pantalla completa."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Configuración para burbujas de <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Menú ampliado"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Volver a agregar a la pila"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Administrar"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g> y <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> más"</string> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 1c59325a8227..d1f5198801b8 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Cerrar captura de pantalla"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Vista previa de captura de pantalla"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Grabación de pantalla"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Procesando grabación de pantalla"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notificación continua de una sesión de grabación de la pantalla"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"¿Empezar a grabar?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Mientras grabas, el sistema Android puede capturar información sensible que se muestre o se reproduzca en tu dispositivo, como contraseñas, datos de pago, fotos, mensajes y audio."</string> @@ -400,7 +399,7 @@ <string name="quick_settings_tethering_label" msgid="5257299852322475780">"Compartir conexión"</string> <string name="quick_settings_hotspot_label" msgid="1199196300038363424">"Zona Wi-Fi"</string> <string name="quick_settings_hotspot_secondary_label_transient" msgid="7585604088079160564">"Activando…"</string> - <string name="quick_settings_hotspot_secondary_label_data_saver_enabled" msgid="1280433136266439372">"Ahorro de datos: sí"</string> + <string name="quick_settings_hotspot_secondary_label_data_saver_enabled" msgid="1280433136266439372">"Ahorro de datos activado"</string> <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="3142308865165871976"> <item quantity="other">%d dispositivos</item> <item quantity="one">%d dispositivo</item> @@ -430,8 +429,8 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"El NFC está desactivado"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"El NFC está activado"</string> - <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Grabación de la pantalla"</string> - <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Inicio"</string> + <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Grabar pantalla"</string> + <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Iniciar"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Detener"</string> <string name="media_seamless_remote_device" msgid="177033467332920464">"Dispositivo"</string> <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Desliza el dedo hacia arriba para cambiar de aplicación"</string> @@ -511,8 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Borrar todo"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Gestionar"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Historial"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Entrantes"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Notificaciones silenciadas"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Notificaciones de alerta"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversaciones"</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Sin título"</string> <string name="restart_button_description" msgid="6916116576177456480">"Toca para reiniciar esta aplicación e ir a la pantalla completa."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Ajustes de las burbujas de <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Menú adicional"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Volver a añadir a la pila"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Gestionar"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g> y <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> más"</string> @@ -1014,10 +1010,10 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Se ha actualizado la navegación del sistema. Para hacer cambios, ve a Ajustes."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Ve a Ajustes para actualizar la navegación del sistema"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"En espera"</string> - <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Aparecen arriba de la sección de conversaciones"</string> - <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Muestran imagen de perfil en pantalla de bloqueo"</string> + <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Se muestran en la parte superior de la sección de conversaciones"</string> + <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Muestran tu imagen de perfil en la pantalla de bloqueo"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Aparecen como burbuja sobre las aplicaciones"</string> - <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Interrumpen No molestar"</string> + <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Interrumpen el modo No molestar"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Entendido"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Ventana de superposición de ampliación"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Ventana de ampliación"</string> diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml index dce209c007a8..c1b4b79d2089 100644 --- a/packages/SystemUI/res/values-et/strings.xml +++ b/packages/SystemUI/res/values-et/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Sule ekraanipilt"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Ekraanipildi eelvaade"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Ekraanisalvesti"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Ekraanisalvestuse töötlemine"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Pooleli märguanne ekraanikuva salvestamise seansi puhul"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Kas alustada salvestamist?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Heli salvestamise ajal võib Androidi süsteem jäädvustada tundlikku teavet, mis on ekraanikuval nähtav või mida seadmes esitatakse. See hõlmab paroole, makseteavet, fotosid, sõnumeid ja heli."</string> @@ -511,8 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Tühjenda kõik"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Haldamine"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Ajalugu"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Sissetulevad"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Hääletud märguanded"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Hoiatusmärguanded"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Vestlused"</string> @@ -717,7 +715,7 @@ <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Hoiab teie tähelepanu hõljuva otseteega selle sisu juurde."</string> <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Kuvatakse vestluste jaotise ülaosas mullina."</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Seaded"</string> - <string name="notification_priority_title" msgid="2079708866333537093">"Prioriteet"</string> + <string name="notification_priority_title" msgid="2079708866333537093">"Prioriteetne"</string> <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> ei toeta vestluspõhiseid seadeid"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Hiljutisi mulle pole"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Siin kuvatakse hiljutised ja suletud mullid."</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Pealkiri puudub"</string> <string name="restart_button_description" msgid="6916116576177456480">"Puudutage rakenduse taaskäivitamiseks ja täisekraanrežiimi aktiveerimiseks."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Rakenduse <xliff:g id="APP_NAME">%1$s</xliff:g> mullide seaded"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Ületäide"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Lisa tagasi virna"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Halda"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> rakendusest <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> rakenduselt <xliff:g id="APP_NAME">%2$s</xliff:g> ja veel <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string> @@ -1017,7 +1013,7 @@ <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Kuvatakse vestluste jaotise kohal"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Lukustuskuval kuvatakse profiilipilt"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Kuvatakse rakenduste kohal hõljuva mullina"</string> - <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Funktsiooni Mitte segada katkestamine"</string> + <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Funktsioon Mitte segada katkestatakse"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Selge"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Suurendamisakna ülekate"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Suurendamisaken"</string> diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index 6172462912a2..944b07b94227 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -65,7 +65,7 @@ <string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Gailu honetan saioa hasita daukan erabiltzaileak ezin du aktibatu USB bidezko arazketa. Eginbide hori erabiltzeko, aldatu erabiltzaile nagusira."</string> <string name="wifi_debugging_title" msgid="7300007687492186076">"Hari gabeko arazketa onartu nahi duzu sare honetan?"</string> <string name="wifi_debugging_message" msgid="5461204211731802995">"Sarearen izena (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWifi-helbidea (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string> - <string name="wifi_debugging_always" msgid="2968383799517975155">"Onartu beti sare honetan"</string> + <string name="wifi_debugging_always" msgid="2968383799517975155">"Baimendu beti sare honetan"</string> <string name="wifi_debugging_allow" msgid="4573224609684957886">"Baimendu"</string> <string name="wifi_debugging_secondary_user_title" msgid="2493201475880517725">"Ez da onartzen hari gabeko arazketa"</string> <string name="wifi_debugging_secondary_user_message" msgid="4492383073970079751">"Gailu honetan saioa hasita daukan erabiltzaileak ezin du aktibatu hari gabeko arazketa. Eginbide hori erabiltzeko, aldatu erabiltzaile nagusira."</string> @@ -852,8 +852,8 @@ <string name="right_keycode" msgid="2480715509844798438">"Eskuineko teklaren kodea"</string> <string name="left_icon" msgid="5036278531966897006">"Ezkerreko ikonoa"</string> <string name="right_icon" msgid="1103955040645237425">"Eskuineko ikonoa"</string> - <string name="drag_to_add_tiles" msgid="8933270127508303672">"Lauzak gehitzeko, eduki sakatuta eta arrastatu"</string> - <string name="drag_to_rearrange_tiles" msgid="2143204300089638620">"Lauzak antolatzeko, eduki sakatuta eta arrastatu"</string> + <string name="drag_to_add_tiles" msgid="8933270127508303672">"Lauzak gehitzeko, eduki itzazu sakatuta, eta arrastatu"</string> + <string name="drag_to_rearrange_tiles" msgid="2143204300089638620">"Lauzak antolatzeko, eduki itzazu sakatuta, eta arrastatu"</string> <string name="drag_to_remove_tiles" msgid="4682194717573850385">"Kentzeko, arrastatu hona"</string> <string name="drag_to_remove_disabled" msgid="933046987838658850">"<xliff:g id="MIN_NUM_TILES">%1$d</xliff:g> lauza behar dituzu gutxienez"</string> <string name="qs_edit" msgid="5583565172803472437">"Editatu"</string> @@ -990,7 +990,7 @@ <string name="restart_button_description" msgid="6916116576177456480">"Berrabiarazi aplikazio hau eta ezarri pantaila osoko modua."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioaren ezarpenen burbuilak"</string> <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Gainezkatzea"</string> - <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Gehitu berriro sortan"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Gehitu berriro errenkadan"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Kudeatu"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> (<xliff:g id="APP_NAME">%2$s</xliff:g>)"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> aplikazioaren \"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>\" jakinarazpena, eta beste <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index 17e3ad716144..64b3f8caef1f 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"رد کردن نماگرفت"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"پیشنمایش نماگرفت"</string> <string name="screenrecord_name" msgid="2596401223859996572">"ضبطکننده صفحهنمایش"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"درحال پردازش ضبط صفحهنمایش"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"اعلان درحال انجام برای جلسه ضبط صفحهنمایش"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"ضبط شروع شود؟"</string> <string name="screenrecord_description" msgid="1123231719680353736">"هنگام ضبط، «سیستم Android» میتواند هر اطلاعات حساسی را که روی صفحهنمایش شما نشان داده میشود یا روی دستگاه شما پخش میشود ضبط کند. این شامل گذرواژهها، اطلاعات پرداخت، عکسها، پیامها، و صدا میشود."</string> @@ -196,7 +195,7 @@ <string name="accessibility_data_signal_full" msgid="283507058258113551">"قدرت سیگنال داده کامل است."</string> <string name="accessibility_wifi_name" msgid="4863440268606851734">"به <xliff:g id="WIFI">%s</xliff:g> متصل شد."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"به <xliff:g id="BLUETOOTH">%s</xliff:g> متصل شد."</string> - <string name="accessibility_cast_name" msgid="7344437925388773685">"متصل به <xliff:g id="CAST">%s</xliff:g>."</string> + <string name="accessibility_cast_name" msgid="7344437925388773685">"به <xliff:g id="CAST">%s</xliff:g> متصل شد."</string> <string name="accessibility_no_wimax" msgid="2014864207473859228">"WiMAX وجود ندارد."</string> <string name="accessibility_wimax_one_bar" msgid="2996915709342221412">"WiMAX یک نوار دارد."</string> <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX دو نوار دارد."</string> @@ -511,8 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"پاک کردن همه موارد"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"مدیریت"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"سابقه"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"ورودی"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"اعلانهای بیصدا"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"اعلانهای هشداردهنده"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"مکالمهها"</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"بدون عنوان"</string> <string name="restart_button_description" msgid="6916116576177456480">"برای بازراهاندازی این برنامه و تغییر به حالت تمامصفحه، ضربه بزنید."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"تنظیم برای ابزارکهای اعلان <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"لبریزشده"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"افزودن برگشت به پشته"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"مدیریت"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> از <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> از <xliff:g id="APP_NAME">%2$s</xliff:g> و <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> مورد بیشتر"</string> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 62779904b30c..a3c1e5e77bb2 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Hylkää kuvakaappaus"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Kuvakaappauksen esikatselu"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Näytön tallentaja"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Näytön tallennusta käsitellään"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Pysyvä ilmoitus näytön tallentamisesta"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Aloitetaanko tallennus?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Tallennuksen aikana Android-järjestelmä voi tallentaa mitä tahansa näytöllä näkyvää tai laitteen toistamaa arkaluontoista tietoa. Näitä tietoja ovat esimerkiksi salasanat, maksutiedot, kuvat, viestit ja äänisisältö."</string> @@ -430,7 +429,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC on poistettu käytöstä"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC on käytössä"</string> - <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Näytön tallentaminen"</string> + <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Tallennus"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Aloita"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Lopeta"</string> <string name="media_seamless_remote_device" msgid="177033467332920464">"Laite"</string> @@ -511,8 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Poista kaikki"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Muuta asetuksia"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Historia"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Saapuvat"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Hiljaiset ilmoitukset"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Ääni-ilmoitukset"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Keskustelut"</string> @@ -855,7 +853,7 @@ <string name="left_icon" msgid="5036278531966897006">"Vasen kuvake"</string> <string name="right_icon" msgid="1103955040645237425">"Oikea kuvake"</string> <string name="drag_to_add_tiles" msgid="8933270127508303672">"Lisää osioita koskettamalla pitkään ja vetämällä"</string> - <string name="drag_to_rearrange_tiles" msgid="2143204300089638620">"Järjestele osioita koskettamalla pitkään ja vetämällä"</string> + <string name="drag_to_rearrange_tiles" msgid="2143204300089638620">"Järjestele koskettamalla pitkään ja vetämällä"</string> <string name="drag_to_remove_tiles" msgid="4682194717573850385">"Poista vetämällä tähän."</string> <string name="drag_to_remove_disabled" msgid="933046987838658850">"<xliff:g id="MIN_NUM_TILES">%1$d</xliff:g> kiekkoa on vähimmäismäärä"</string> <string name="qs_edit" msgid="5583565172803472437">"Muokkaa"</string> @@ -968,8 +966,8 @@ <string name="qs_dnd_replace" msgid="7712119051407052689">"Korvaa"</string> <string name="running_foreground_services_title" msgid="5137313173431186685">"Sovelluksia käynnissä taustalla"</string> <string name="running_foreground_services_msg" msgid="3009459259222695385">"Katso lisätietoja akun ja datan käytöstä napauttamalla"</string> - <string name="mobile_data_disable_title" msgid="5366476131671617790">"Poistetaanko mobiilidata käytöstä?"</string> - <string name="mobile_data_disable_message" msgid="8604966027899770415">"<xliff:g id="CARRIER">%s</xliff:g> ei voi enää tarjota sinulle internetyhteyttä. Internetyhteys voidaan muodostaa vain Wi-Fi-verkossa."</string> + <string name="mobile_data_disable_title" msgid="5366476131671617790">"Laitetaanko mobiilidata pois päältä?"</string> + <string name="mobile_data_disable_message" msgid="8604966027899770415">"<xliff:g id="CARRIER">%s</xliff:g> ei enää tarjoa pääsyä dataan eikä internetyhteyttä, joka on saatavilla vain Wi-Fin kautta."</string> <string name="mobile_data_disable_message_default_carrier" msgid="6496033312431658238">"operaattorisi"</string> <string name="touch_filtered_warning" msgid="8119511393338714836">"Sovellus peittää käyttöoikeuspyynnön, joten Asetukset ei voi vahvistaa valintaasi."</string> <string name="slice_permission_title" msgid="3262615140094151017">"Saako <xliff:g id="APP_0">%1$s</xliff:g> näyttää osia sovelluksesta <xliff:g id="APP_2">%2$s</xliff:g>?"</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Ei nimeä"</string> <string name="restart_button_description" msgid="6916116576177456480">"Napauta, niin sovellus käynnistyy uudelleen ja siirtyy koko näytön tilaan."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Kuplien asetukset: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Ylivuoto"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Lisää takaisin pinoon"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Ylläpidä"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g>: <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> (<xliff:g id="APP_NAME">%2$s</xliff:g>) ja <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> muuta"</string> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index 7140c5b3784f..1ec0411f7526 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -36,7 +36,7 @@ <string name="battery_saver_confirmation_title" msgid="1234998463717398453">"Activer l\'économiseur de batterie ?"</string> <string name="battery_saver_confirmation_title_generic" msgid="2299231884234959849">"À propos de l\'économiseur de batterie"</string> <string name="battery_saver_confirmation_ok" msgid="5042136476802816494">"Activer"</string> - <string name="battery_saver_start_action" msgid="4553256017945469937">"Activer l\'économiseur de batterie ?"</string> + <string name="battery_saver_start_action" msgid="4553256017945469937">"Activer l\'économiseur de batterie"</string> <string name="status_bar_settings_settings_button" msgid="534331565185171556">"Paramètres"</string> <string name="status_bar_settings_wifi_button" msgid="7243072479837270946">"Wi-Fi"</string> <string name="status_bar_settings_auto_rotation" msgid="8329080442278431708">"Rotation automatique de l\'écran"</string> @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Fermer la capture d\'écran"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Aperçu de la capture d\'écran"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Enregistreur d\'écran"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Enregistrement de l\'écran…"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notification en cours pour une session d\'enregistrement de l\'écran"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Démarrer l\'enregistrement ?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Pendant l\'enregistrement, le système Android peut capturer toute information sensible affichée à l\'écran ou lue sur votre appareil. Ceci inclut les mots de passe, les informations de paiement, les photos, les messages et les contenus audio."</string> @@ -102,7 +101,7 @@ <string name="screenrecord_start" msgid="330991441575775004">"Démarrer"</string> <string name="screenrecord_ongoing_screen_only" msgid="4459670242451527727">"Enregistrement de l\'écran"</string> <string name="screenrecord_ongoing_screen_and_audio" msgid="5351133763125180920">"Enregistrement de l\'écran et des contenus audio"</string> - <string name="screenrecord_taps_label" msgid="1595690528298857649">"Afficher les points de l\'écran touchés"</string> + <string name="screenrecord_taps_label" msgid="1595690528298857649">"Afficher les points touchés sur l\'écran"</string> <string name="screenrecord_stop_text" msgid="6549288689506057686">"Appuyez ici pour arrêter"</string> <string name="screenrecord_stop_label" msgid="72699670052087989">"Arrêter"</string> <string name="screenrecord_pause_label" msgid="6004054907104549857">"Pause"</string> @@ -400,7 +399,7 @@ <string name="quick_settings_tethering_label" msgid="5257299852322475780">"Partage de connexion"</string> <string name="quick_settings_hotspot_label" msgid="1199196300038363424">"Point d\'accès"</string> <string name="quick_settings_hotspot_secondary_label_transient" msgid="7585604088079160564">"Activation…"</string> - <string name="quick_settings_hotspot_secondary_label_data_saver_enabled" msgid="1280433136266439372">"Économ. données activé"</string> + <string name="quick_settings_hotspot_secondary_label_data_saver_enabled" msgid="1280433136266439372">"Écon. données activé"</string> <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="3142308865165871976"> <item quantity="one">%d appareil</item> <item quantity="other">%d appareils</item> @@ -511,8 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Tout effacer"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Gérer"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Historique"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Notifications entrantes"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Notifications silencieuses"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Notifications d\'alerte"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversations"</string> @@ -702,7 +700,7 @@ <string name="inline_block_button" msgid="479892866568378793">"Bloquer"</string> <string name="inline_keep_button" msgid="299631874103662170">"Continuer d\'afficher les notifications"</string> <string name="inline_minimize_button" msgid="1474436209299333445">"Réduire"</string> - <string name="inline_silent_button_silent" msgid="525243786649275816">"Mode silencieux"</string> + <string name="inline_silent_button_silent" msgid="525243786649275816">"Silencieux"</string> <string name="inline_silent_button_stay_silent" msgid="2129254868305468743">"Notifications silencieuses"</string> <string name="inline_silent_button_alert" msgid="5705343216858250354">"Alertes"</string> <string name="inline_silent_button_keep_alerting" msgid="6577845442184724992">"Continuer de m\'avertir"</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Sans titre"</string> <string name="restart_button_description" msgid="6916116576177456480">"Appuyez pour redémarrer cette application et activer le mode plein écran."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Paramètres des bulles de <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Dépassement"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Ajouter à nouveau l\'élément à la pile"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Gérer"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de l\'application <xliff:g id="APP_NAME">%2$s</xliff:g> et <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> autres"</string> diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index a86c768c6717..0095bcc6b127 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -76,7 +76,7 @@ <string name="learn_more" msgid="4690632085667273811">"Máis información"</string> <string name="compat_mode_on" msgid="4963711187149440884">"Ampliar ata ocupar todo"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Estirar ata ocupar todo"</string> - <string name="global_action_screenshot" msgid="2760267567509131654">"Crear captura"</string> + <string name="global_action_screenshot" msgid="2760267567509131654">"Facer captura"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"enviou unha imaxe"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Gardando captura de pantalla…"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Gardando captura de pantalla…"</string> @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Ignora a captura de pantalla"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Vista previa da captura de pantalla"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Gravadora da pantalla"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Procesando gravación pantalla"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notificación en curso sobre unha sesión de gravación de pantalla"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Queres iniciar a gravación?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Durante a gravación, o sistema Android pode captar información confidencial visible na pantalla ou reproducila no dispositivo. Isto inclúe contrasinais, información de pago, fotos, mensaxes e audio."</string> @@ -382,7 +381,7 @@ <string name="quick_settings_wifi_on_label" msgid="2489928193654318511">"Wifi activada"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="483130889414601732">"Non hai redes wifi dispoñibles"</string> <string name="quick_settings_wifi_secondary_label_transient" msgid="7501659015509357887">"Activando…"</string> - <string name="quick_settings_cast_title" msgid="2279220930629235211">"Emisión da pantalla"</string> + <string name="quick_settings_cast_title" msgid="2279220930629235211">"Emitir pantalla"</string> <string name="quick_settings_casting" msgid="1435880708719268055">"Emitindo"</string> <string name="quick_settings_cast_device_default_name" msgid="6988469571141331700">"Dispositivo sen nome"</string> <string name="quick_settings_cast_device_default_description" msgid="2580520859212250265">"Listo para emitir"</string> @@ -511,8 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Eliminar todas"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Xestionar"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Historial"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Entrantes"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Notificacións silenciadas"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Notificación de alerta"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversas"</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Sen título"</string> <string name="restart_button_description" msgid="6916116576177456480">"Toca o botón para reiniciar esta aplicación e abrila en pantalla completa."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Configuración das burbullas de <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Mostrar menú adicional"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Engadir de novo á pilla"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Xestionar"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g> e <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> máis"</string> diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index e38155154608..6d2dec85b860 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"સ્ક્રીનશૉટ છોડી દો"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"સ્ક્રીનશૉટનો પ્રીવ્યૂ"</string> <string name="screenrecord_name" msgid="2596401223859996572">"સ્ક્રીન રેકૉર્ડર"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"સ્ક્રીન રેકૉર્ડિંગ ચાલુ છે"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"સ્ક્રીન રેકોર્ડિંગ સત્ર માટે ચાલુ નોટિફિકેશન"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"રેકૉર્ડિંગ શરૂ કરીએ?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"રેકૉર્ડ કરતી વખતે, Android System તમારી સ્ક્રીન પર દેખાતી હોય અથવા તમારા ડિવાઇસ પર ચલાવવામાં આવતી હોય તેવી કોઈપણ સંવેદનશીલ માહિતીને કૅપ્ચર કરી શકે છે. આમાં પાસવર્ડ, ચુકવણીની માહિતી, ફોટા, સંદેશા અને ઑડિયોનો સમાવેશ થાય છે."</string> @@ -511,8 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"બધુ સાફ કરો"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"મેનેજ કરો"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"ઇતિહાસ"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"ઇનકમિંગ"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"સાઇલન્ટ નોટિફિકેશન"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"નોટિફિકેશન બદલી રહ્યાં છીએ"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"વાતચીત"</string> @@ -805,7 +803,7 @@ <string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"ઍપ્લિકેશનો"</string> <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"સહાય"</string> <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"બ્રાઉઝર"</string> - <string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"સંપર્કો"</string> + <string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Contacts"</string> <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"ઇમેઇલ"</string> <string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string> <string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"સંગીત"</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"કોઈ શીર્ષક નથી"</string> <string name="restart_button_description" msgid="6916116576177456480">"આ ઍપ ફરીથી ચાલુ કરવા માટે ટૅપ કરીને પૂર્ણ સ્ક્રીન કરો."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> બબલ માટેનાં સેટિંગ"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"ઓવરફ્લો"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"સ્ટૅકમાં ફરી ઉમેરો"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"મેનેજ કરો"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g> તરફથી <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> અને વધુ <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> તરફથી <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> @@ -1039,10 +1035,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"બધા નિયંત્રણોની સૂચિ લોડ કરી શકાઈ નથી."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"અન્ય"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"ડિવાઇસનાં નિયંત્રણોમાં ઉમેરો"</string> - <!-- no translation found for controls_dialog_ok (2770230012857881822) --> - <skip /> - <!-- no translation found for controls_dialog_message (342066938390663844) --> - <skip /> + <string name="controls_dialog_ok" msgid="2770230012857881822">"ઉમેરો"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"<xliff:g id="APP">%s</xliff:g> દ્વારા સૂચન કરેલા"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"નિયંત્રણ અપડેટ કર્યા"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"પિનમાં અક્ષરો અથવા પ્રતીકોનો સમાવેશ થાય છે"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"<xliff:g id="DEVICE">%s</xliff:g>ને ચકાસો"</string> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index 3e4beacd8605..c7211f78d2a8 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"स्क्रीनशॉट खारिज करें"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"स्क्रीनशॉट की झलक"</string> <string name="screenrecord_name" msgid="2596401223859996572">"स्क्रीन रिकॉर्डर"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"स्क्रीन रिकॉर्डिंग को प्रोसेस किया जा रहा है"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"स्क्रीन रिकॉर्ड सेशन के लिए जारी सूचना"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"रिकॉर्डिंग शुरू करना चाहते हैं?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"रिकॉर्ड करते समय, Android सिस्टम आपकी स्क्रीन पर दिखने वाली या चलाई जाने वाली संवेदनशील जानकारी को कैप्चर कर सकता है. इसमें पासवर्ड, पैसे चुकाने से जुड़ी जानकारी, फ़ोटो, मैसेज, और ऑडियो शामिल हैं."</string> @@ -357,7 +356,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"ऑडियो"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"हेडसेट"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="3887552721233148132">"इनपुट"</string> - <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="3003338571871392293">"सुनने में मददगार डिवाइस"</string> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="3003338571871392293">"कान की मशीन"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="3882884317600669650">"ब्लूटूथ चालू हो रहा है…"</string> <string name="quick_settings_brightness_label" msgid="680259653088849563">"स्क्रीन की रोशनी"</string> <string name="quick_settings_rotation_unlocked_label" msgid="2359922767950346112">"अपने-आप घूमना"</string> @@ -513,8 +512,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"सभी को हटाएं"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"प्रबंधित करें"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"इतिहास"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"हाल ही में मिली सूचनाएं"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"बिना आवाज़ या वाइब्रेशन वाली सूचनाएं"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"आवाज़ या वाइब्रेशन वाली सूचनाएं"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"बातचीत"</string> @@ -590,7 +588,7 @@ <string name="accessibility_volume_settings" msgid="1458961116951564784">"साउंड सेटिंग"</string> <string name="accessibility_volume_expand" msgid="7653070939304433603">"विस्तार करें"</string> <string name="accessibility_volume_collapse" msgid="2746845391013829996">"छोटा करें"</string> - <string name="volume_odi_captions_tip" msgid="8825655463280990941">"ऑडियो-वीडियो पहचानकर अपने-आप कैप्शन बनना"</string> + <string name="volume_odi_captions_tip" msgid="8825655463280990941">"ऑडियो-वीडियो से अपने-आप कैप्शन बनना"</string> <string name="accessibility_volume_close_odi_captions_tip" msgid="8924753283621160480">"कैप्शन सलाह बंद करें"</string> <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"कैप्शन ऊपर लगाएं"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"चालू करें"</string> @@ -993,10 +991,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"कोई शीर्षक नहीं"</string> <string name="restart_button_description" msgid="6916116576177456480">"इस ऐप्लिकेशन को रीस्टार्ट करने और फ़ुल स्क्रीन चालू करने के लिए टैप करें."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> बबल्स की सेटिंग"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"ओवरफ़्लो"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"स्टैक में वापस जोड़ें"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"प्रबंधित करें"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g> से <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> और <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> अन्य ऐप्लिकेशन से <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> @@ -1042,7 +1038,7 @@ <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"अन्य"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"डिवाइस कंट्रोल में जोड़ें"</string> <string name="controls_dialog_ok" msgid="2770230012857881822">"जोड़ें"</string> - <string name="controls_dialog_message" msgid="342066938390663844">"<xliff:g id="APP">%s</xliff:g> ने सुझाव दिया"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"<xliff:g id="APP">%s</xliff:g> से मिला सुझाव"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"कंट्रोल अपडेट किए गए"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"पिन में अक्षर या चिह्न शामिल होते हैं"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"<xliff:g id="DEVICE">%s</xliff:g> की पुष्टि करें"</string> diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index 0c0f4de7bb1e..34f9b7a2294f 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -63,7 +63,7 @@ <string name="usb_debugging_allow" msgid="1722643858015321328">"Dopusti"</string> <string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Otklanjanje pogrešaka putem USB-a nije dopušteno"</string> <string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Korisnik koji je trenutačno prijavljen na ovaj uređaj ne može uključiti otklanjanje pogrešaka putem USB-a. Da biste upotrebljavali tu značajku, prijeđite na primarnog korisnika."</string> - <string name="wifi_debugging_title" msgid="7300007687492186076">"Želite li dopustiti bežično otklanjanje pogrešaka na ovoj mreži?"</string> + <string name="wifi_debugging_title" msgid="7300007687492186076">"Dopuštate li bežično otklanjanje pogrešaka na ovoj mreži?"</string> <string name="wifi_debugging_message" msgid="5461204211731802995">"Naziv mreže (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nAdresa Wi‑Fija (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string> <string name="wifi_debugging_always" msgid="2968383799517975155">"Uvijek dopusti na ovoj mreži"</string> <string name="wifi_debugging_allow" msgid="4573224609684957886">"Dopusti"</string> @@ -416,7 +416,7 @@ <string name="quick_settings_cellular_detail_data_used" msgid="6798849610647988987">"<xliff:g id="DATA_USED">%s</xliff:g> iskorišteno"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="1791389609409211628">"Ograničenje od <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="7957253810481086455">"Upozorenje <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> - <string name="quick_settings_work_mode_label" msgid="2754212289804324685">"Radni profil"</string> + <string name="quick_settings_work_mode_label" msgid="2754212289804324685">"Poslovni profil"</string> <string name="quick_settings_night_display_label" msgid="8180030659141778180">"Noćno svjetlo"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="3358706312129866626">"Uključuje se u suton"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4063448287758262485">"Do izlaska sunca"</string> @@ -654,7 +654,7 @@ <string name="show_demo_mode" msgid="3677956462273059726">"Prikaži demo način"</string> <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string> <string name="status_bar_alarm" msgid="87160847643623352">"Alarm"</string> - <string name="status_bar_work" msgid="5238641949837091056">"Radni profil"</string> + <string name="status_bar_work" msgid="5238641949837091056">"Poslovni profil"</string> <string name="status_bar_airplane" msgid="4848702508684541009">"Način rada u zrakoplovu"</string> <string name="add_tile" msgid="6239678623873086686">"Dodavanje pločice"</string> <string name="broadcast_tile" msgid="5224010633596487481">"Emitiranje pločice"</string> @@ -664,7 +664,7 @@ <string name="alarm_template_far" msgid="3561752195856839456">"u <xliff:g id="WHEN">%1$s</xliff:g>"</string> <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Brze postavke, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Žarišna točka"</string> - <string name="accessibility_managed_profile" msgid="4703836746209377356">"Radni profil"</string> + <string name="accessibility_managed_profile" msgid="4703836746209377356">"Poslovni profil"</string> <string name="tuner_warning_title" msgid="7721976098452135267">"Zabava za neke, ali ne za sve"</string> <string name="tuner_warning" msgid="1861736288458481650">"Ugađanje korisničkog sučelja sustava pruža vam dodatne načine za prilagodbu korisničkog sučelja Androida. Te se eksperimentalne značajke mogu promijeniti, prekinuti ili nestati u budućim izdanjima. Nastavite uz oprez."</string> <string name="tuner_persistent_warning" msgid="230466285569307806">"Te se eksperimentalne značajke mogu promijeniti, prekinuti ili nestati u budućim izdanjima. Nastavite uz oprez."</string> diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index 63f0f3f319f9..45462d4cd3f7 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Képernyőkép elvetése"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Képernyőkép előnézete"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Képernyőrögzítő"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Képernyőrögzítés feldolgozása"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Folyamatban lévő értesítés képernyőrögzítési munkamenethez"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Elindítja a felvételt?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"A felvétel készítése során az Android rendszer rögzítheti az eszközön lejátszott, illetve a képernyőjén megjelenő bizalmas információkat. Ide tartoznak például a jelszavak, a fizetési információk, a fotók, az üzenetek és az audiotartalmak is."</string> @@ -511,8 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Az összes törlése"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Kezelés"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Előzmények"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Bejövő"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Néma értesítések"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Figyelemfelkeltő értesítések"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Beszélgetések"</string> @@ -969,7 +967,7 @@ <string name="running_foreground_services_title" msgid="5137313173431186685">"A háttérben még futnak alkalmazások"</string> <string name="running_foreground_services_msg" msgid="3009459259222695385">"Koppintson az akkumulátor- és adathasználat részleteinek megtekintéséhez"</string> <string name="mobile_data_disable_title" msgid="5366476131671617790">"Kikapcsolja a mobiladatokat?"</string> - <string name="mobile_data_disable_message" msgid="8604966027899770415">"Nem lesz adat-, illetve internet-hozzáférése a(z) <xliff:g id="CARRIER">%s</xliff:g> szolgáltatón keresztül. Az internethez csak Wi-Fi-n keresztül csatlakozhat."</string> + <string name="mobile_data_disable_message" msgid="8604966027899770415">"Nem lesz adat-, illetve internet-hozzáférése a <xliff:g id="CARRIER">%s</xliff:g> szolgáltatón keresztül. Az internethez csak Wi-Fi-n keresztül csatlakozhat."</string> <string name="mobile_data_disable_message_default_carrier" msgid="6496033312431658238">"saját mobilszolgáltató"</string> <string name="touch_filtered_warning" msgid="8119511393338714836">"Mivel az egyik alkalmazás eltakarja az engedélykérést, a Beállítások alkalmazás nem tudja ellenőrizni az Ön válaszát."</string> <string name="slice_permission_title" msgid="3262615140094151017">"Engedélyezi a(z) <xliff:g id="APP_0">%1$s</xliff:g> alkalmazásnak, hogy részleteket mutasson a(z) <xliff:g id="APP_2">%2$s</xliff:g> alkalmazásból?"</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Nincs cím"</string> <string name="restart_button_description" msgid="6916116576177456480">"Koppintson az alkalmazás újraindításához és a teljes képernyős mód elindításához."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g>-buborékok beállításai"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"További elemeket tartalmazó menü"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Visszaküldés a verembe"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Kezelés"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>, <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> a(z) <xliff:g id="APP_NAME">%2$s</xliff:g> alkalmazásból és <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> további"</string> diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index b7343be97439..33cf2a3280f0 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Փակել սքրինշոթը"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Սքրինշոթի նախադիտում"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Էկրանի տեսագրիչ"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Էկրանի տեսագրության մշակում"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Էկրանի տեսագրման աշխատաշրջանի ընթացիկ ծանուցում"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Սկսե՞լ տեսագրումը"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Տեսագրման ընթացքում Android-ի համակարգը կարող է գրանցել անձնական տեղեկություններ, որոնք տեսանելի են էկրանին կամ նվագարկվում են ձեր սարքում։ Սա ներառում է այնպիսի տեղեկություններ, ինչպիսիք են, օրինակ, գաղտնաբառերը, վճարային տվյալները, լուսանկարները, հաղորդագրությունները և նվագարկվող աուդիո ֆայլերը։"</string> @@ -511,8 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Մաքրել բոլորը"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Կառավարել"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Պատմություն"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Մուտքային"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Անձայն ծանուցումներ"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Նախազգուշացնող ծանուցումներ"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Խոսակցություններ"</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Անանուն"</string> <string name="restart_button_description" msgid="6916116576177456480">"Հպեք՝ հավելվածը վերագործարկելու և լիաէկրան ռեժիմին անցնելու համար։"</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g>-ի ամպիկների կարգավորումներ"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Լրացուցիչ ընտրացանկ"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Նորից ավելացնել զտիչներում"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Կառավարել"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>՝ <xliff:g id="APP_NAME">%2$s</xliff:g>-ից"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>` <xliff:g id="APP_NAME">%2$s</xliff:g>-ից ու ևս <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> ամպիկ"</string> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index f3ac8d1f0192..35aabc73fa93 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Menutup screenshot"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Pratinjau screenshot"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Perekam Layar"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Memproses perekaman layar"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notifikasi yang sedang berjalan untuk sesi rekaman layar"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Mulai Merekam?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Saat merekam, Sistem Android dapat ikut merekam informasi sensitif yang terlihat di layar atau diputar di perangkat Anda. Informasi ini mencakup sandi, info pembayaran, foto, pesan, dan audio."</string> @@ -511,8 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Hapus semua"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Kelola"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Histori"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Masuk"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Notifikasi senyap"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Notifikasi aktif"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Percakapan"</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Tanpa judul"</string> <string name="restart_button_description" msgid="6916116576177456480">"Ketuk untuk memulai ulang aplikasi ini dan membuka layar penuh."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Setelan untuk balon <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Tambahan"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Tambahkan kembali ke stack"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Kelola"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> dari <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> dari <xliff:g id="APP_NAME">%2$s</xliff:g> dan <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> lainnya"</string> diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml index d133ed04e221..52d63b0eb5e0 100644 --- a/packages/SystemUI/res/values-is/strings.xml +++ b/packages/SystemUI/res/values-is/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Loka skjámynd"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Forskoðun skjámyndar"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Skjáupptaka"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Vinnur úr skjáupptöku"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Áframhaldandi tilkynning fyrir skjáupptökulotu"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Hefja upptöku?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Á meðan tekið er upp getur Android kerfið fangað viðkvæmar upplýsingar sem sjást á skjánum eða spilast í tækinu. Þar á meðal eru upplýsingar á borð við aðgangsorð, greiðsluupplýsingar, myndir, skilaboð og hljóð."</string> @@ -511,8 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Hreinsa allt"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Stjórna"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Ferill"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Mótteknar"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Þöglar tilkynningar"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Viðvörunartilkynningar"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Samtöl"</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Enginn titill"</string> <string name="restart_button_description" msgid="6916116576177456480">"Ýttu til að endurræsa forritið og sýna það á öllum skjánum."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Stillingar fyrir blöðrur frá <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Yfirflæði"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Bæta aftur í stafla"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Stjórna"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> frá <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"„<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>“ frá <xliff:g id="APP_NAME">%2$s</xliff:g> og <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> í viðbót"</string> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index 2ca52dff8bee..1a71d91afb65 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Ignora screenshot"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Anteprima screenshot"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Registrazione dello schermo"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Elaboraz. registraz. schermo"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notifica costante per una sessione di registrazione dello schermo"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Avviare la registrazione?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Durante la registrazione, il sistema Android può acquisire dati sensibili visibili sullo schermo o riprodotti sul tuo dispositivo, tra cui password, dati di pagamento, foto, messaggi e audio."</string> @@ -299,8 +298,8 @@ <string name="accessibility_quick_settings_flashlight_on" msgid="3785616827729850766">"Torcia accesa."</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Torcia disattivata."</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Torcia attivata."</string> - <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Inversione colori disattivata."</string> - <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Inversione colori attivata."</string> + <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Inversione dei colori disattivata."</string> + <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Inversione dei colori attivata."</string> <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Hotspot mobile disattivato."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Hotspot mobile attivato."</string> <string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Trasmissione dello schermo interrotta."</string> @@ -511,8 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Cancella tutto"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Gestisci"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Cronologia"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"In arrivo"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Notifiche silenziose"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Notifiche di avviso"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversazioni"</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Senza titolo"</string> <string name="restart_button_description" msgid="6916116576177456480">"Tocca per riavviare l\'app e passare a schermo intero."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Impostazioni per bolle <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Altre"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Aggiungi di nuovo all\'elenco"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Gestisci"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> da <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> da <xliff:g id="APP_NAME">%2$s</xliff:g> e altre <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index 9dfadfb2c7dd..121f9bb9f18c 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"סגירת צילום מסך"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"תצוגה מקדימה של צילום מסך"</string> <string name="screenrecord_name" msgid="2596401223859996572">"מקליט המסך"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"מתבצע עיבוד של הקלטת מסך"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"התראה מתמשכת לסשן הקלטת מסך"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"להתחיל את ההקלטה?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"בזמן ההקלטה, מערכת Android יכולה לתעד מידע רגיש שגלוי במסך או מופעל במכשיר שלך. מידע זה כולל סיסמאות, פרטי תשלום, תמונות, הודעות ואודיו."</string> @@ -517,8 +516,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"ניקוי הכל"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"ניהול"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"היסטוריה"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"התקבלו"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"התראות שקטות"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"התראות עם צלילים או רטט"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"שיחות"</string> @@ -1001,10 +999,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"ללא שם"</string> <string name="restart_button_description" msgid="6916116576177456480">"צריך להקיש כדי להפעיל מחדש את האפליקציה הזו ולעבור למסך מלא."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"הגדרות בשביל בועות של <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"גלישה"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"הוספה בחזרה לערימה"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"ניהול"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> מהאפליקציה <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> מ-<xliff:g id="APP_NAME">%2$s</xliff:g> ועוד <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index 15508ac75eee..42ecb6403665 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"スクリーンショットを閉じます"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"スクリーンショットのプレビュー"</string> <string name="screenrecord_name" msgid="2596401223859996572">"スクリーン レコーダー"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"画面の録画を処理しています"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"画面の録画セッション中の通知"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"録画を開始しますか?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"録画中に機密情報が画面に表示されたりデバイスで再生されたりした場合、Android システムでキャプチャされることがあります。これには、パスワード、お支払い情報、写真、メッセージ、音声などが含まれます。"</string> @@ -511,8 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"すべて消去"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"管理"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"履歴"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"新着"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"サイレント通知"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"バイブレーションまたは音を伴う通知"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"会話"</string> @@ -969,7 +967,7 @@ <string name="running_foreground_services_title" msgid="5137313173431186685">"バックグラウンドで実行中のアプリ"</string> <string name="running_foreground_services_msg" msgid="3009459259222695385">"タップして電池やデータの使用量を確認"</string> <string name="mobile_data_disable_title" msgid="5366476131671617790">"モバイルデータを OFF にしますか?"</string> - <string name="mobile_data_disable_message" msgid="8604966027899770415">"<xliff:g id="CARRIER">%s</xliff:g> でデータやインターネットにアクセスできなくなります。インターネットには Wi-Fi からのみ接続できます。"</string> + <string name="mobile_data_disable_message" msgid="8604966027899770415">"<xliff:g id="CARRIER">%s</xliff:g>でデータやインターネットにアクセスできなくなります。インターネットには Wi-Fi からのみ接続できます。"</string> <string name="mobile_data_disable_message_default_carrier" msgid="6496033312431658238">"携帯通信会社"</string> <string name="touch_filtered_warning" msgid="8119511393338714836">"アプリが許可リクエストを隠しているため、設定側でユーザーの応答を確認できません。"</string> <string name="slice_permission_title" msgid="3262615140094151017">"「<xliff:g id="APP_2">%2$s</xliff:g>」のスライスの表示を「<xliff:g id="APP_0">%1$s</xliff:g>」に許可しますか?"</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"タイトルなし"</string> <string name="restart_button_description" msgid="6916116576177456480">"タップしてこのアプリを再起動すると、全画面表示になります。"</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> のバブルの設定"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"オーバーフロー"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"スタックに戻す"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"管理"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>(<xliff:g id="APP_NAME">%2$s</xliff:g>)"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>(<xliff:g id="APP_NAME">%2$s</xliff:g>)、他 <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> 件"</string> @@ -1032,7 +1028,7 @@ <item quantity="one"><xliff:g id="NUMBER_0">%s</xliff:g> 件のコントロールを追加しました。</item> </plurals> <string name="controls_favorite_default_title" msgid="967742178688938137">"コントロール"</string> - <string name="controls_favorite_subtitle" msgid="6604402232298443956">"電源メニューからアクセスするコントロールを選択する"</string> + <string name="controls_favorite_subtitle" msgid="6604402232298443956">"電源ボタン メニューからアクセスするコントロールを選択する"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"コントロールを並べ替えるには長押ししてドラッグします"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"すべてのコントロールを削除しました"</string> <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"変更が保存されていません"</string> diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index 4f248284b85d..53ead8e5c77c 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Скриншотты жабу"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Скриншотты алдын ала қарау"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Экран жазғыш"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Экран жазғыш бейнесін өңдеу"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Экранды бейнеге жазудың ағымдағы хабарландыруы"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Жазу басталсын ба?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Жазу кезінде Android жүйесі экранда көрсетілетін немесе құрылғыда ойнатылатын құпия ақпаратты пайдалана алады. Ол ақпаратқа құпия сөздер, төлеу ақпараты, фотосуреттер, хабарлар және аудио жатады."</string> @@ -511,8 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Барлығын тазалау"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Басқару"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Тарих"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Кіріс"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Дыбыссыз хабарландырулар"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Ескертуші хабарландлырулар"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Әңгімелер"</string> @@ -588,7 +586,7 @@ <string name="accessibility_volume_settings" msgid="1458961116951564784">"Дыбыс параметрлері"</string> <string name="accessibility_volume_expand" msgid="7653070939304433603">"Жаю"</string> <string name="accessibility_volume_collapse" msgid="2746845391013829996">"Жию"</string> - <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Автоматты субтитр медиасы"</string> + <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Автоматты субтитр қосу"</string> <string name="accessibility_volume_close_odi_captions_tip" msgid="8924753283621160480">"Субтитрлер кеңесі"</string> <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Субтитр қою"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"қосу"</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Атауы жоқ"</string> <string name="restart_button_description" msgid="6916116576177456480">"Бұл қолданбаны қайта қосып, толық экранға өту үшін түртіңіз."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> қалқыма хабарларының параметрлері"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Қосымша мәзір"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Стекке қайта енгізу"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Басқару"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g> жіберген хабарландыру: <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> қолданбасы жіберген <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> және тағы <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml index 11b7514c9129..a33b9f536ead 100644 --- a/packages/SystemUI/res/values-km/strings.xml +++ b/packages/SystemUI/res/values-km/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"ច្រានចោលរូបថតអេក្រង់"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"ការមើលរូបថតអេក្រង់សាកល្បង"</string> <string name="screenrecord_name" msgid="2596401223859996572">"មុខងារថតអេក្រង់"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"កំពុងដំណើរការការថតអេក្រង់"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"ការជូនដំណឹងដែលកំពុងដំណើរការសម្រាប់រយៈពេលប្រើការថតសកម្មភាពអេក្រង់"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"ចាប់ផ្តើមថតឬ?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"នៅពេលកំពុងថត ប្រព័ន្ធ Android អាចថតព័ត៌មានរសើបដែលអាចមើលឃើញនៅលើអេក្រង់របស់អ្នក ឬដែលបានចាក់នៅលើឧបករណ៍របស់អ្នក។ ព័ត៌មាននេះរួមមានពាក្យសម្ងាត់ ព័ត៌មានអំពីការបង់ប្រាក់ រូបថត សារ និងសំឡេង។"</string> @@ -369,7 +368,7 @@ <string name="quick_settings_location_off_label" msgid="7923929131443915919">"ទីតាំងបានបិទ"</string> <string name="quick_settings_media_device_label" msgid="8034019242363789941">"ឧបករណ៍មេឌៀ"</string> <string name="quick_settings_rssi_label" msgid="3397615415140356701">"RSSI"</string> - <string name="quick_settings_rssi_emergency_only" msgid="7499207215265078598">"សម្រាប់តែការហៅពេលអាសន្ន"</string> + <string name="quick_settings_rssi_emergency_only" msgid="7499207215265078598">"ការហៅទៅលេខសង្គ្រោះបន្ទាន់តែប៉ុណ្ណោះ"</string> <string name="quick_settings_settings_label" msgid="2214639529565474534">"ការកំណត់"</string> <string name="quick_settings_time_label" msgid="3352680970557509303">"ពេលវេលា"</string> <string name="quick_settings_user_label" msgid="1253515509432672496">"ខ្ញុំ"</string> @@ -382,7 +381,7 @@ <string name="quick_settings_wifi_on_label" msgid="2489928193654318511">"Wi-Fi បានបើក"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="483130889414601732">"គ្មានបណ្តាញ Wi-Fi ទេ"</string> <string name="quick_settings_wifi_secondary_label_transient" msgid="7501659015509357887">"កំពុងបើក..."</string> - <string name="quick_settings_cast_title" msgid="2279220930629235211">"ការថតវីដេអូនៅលើអេក្រង់"</string> + <string name="quick_settings_cast_title" msgid="2279220930629235211">"ការបញ្ចាំងអេក្រង់"</string> <string name="quick_settings_casting" msgid="1435880708719268055">"ការចាត់ថ្នាក់"</string> <string name="quick_settings_cast_device_default_name" msgid="6988469571141331700">"ឧបករណ៍ដែលមិនមានឈ្មោះ"</string> <string name="quick_settings_cast_device_default_description" msgid="2580520859212250265">"ត្រៀមរួចរាល់ដើម្បីចាត់ថ្នាក់"</string> @@ -511,8 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"សម្អាតទាំងអស់"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"គ្រប់គ្រង"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"ប្រវត្តិ"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"មកដល់"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"ការជូនដំណឹងស្ងាត់"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"ការជូនដំណឹងញ័រ ឬរោទ៍"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"ការសន្ទនា"</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"គ្មានចំណងជើង"</string> <string name="restart_button_description" msgid="6916116576177456480">"ចុចដើម្បីចាប់ផ្ដើមកម្មវិធីនេះឡើងវិញ រួចចូលប្រើពេញអេក្រង់។"</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"ការកំណត់សម្រាប់ពពុះ <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"ម៉ឺនុយបន្ថែម"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"បញ្ចូលទៅក្នុងគំនរវិញ"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"គ្រប់គ្រង"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ពី <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ពី <xliff:g id="APP_NAME">%2$s</xliff:g> និង <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> ទៀត"</string> diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index fc0844a6cc0c..cca8c6b76dd2 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"ಸ್ಕ್ರೀನ್ಶಾಟ್ ಅನ್ನು ವಜಾಗೊಳಿಸಿ"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"ಸ್ಕ್ರೀನ್ಶಾಟ್ನ ಪೂರ್ವವೀಕ್ಷಣೆ"</string> <string name="screenrecord_name" msgid="2596401223859996572">"ಸ್ಕ್ರೀನ್ ರೆಕಾರ್ಡರ್"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"ಸ್ಕ್ರೀನ್ ರೆಕಾರ್ಡಿಂಗ್ ಆಗುತ್ತಿದೆ"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"ಸ್ಕ್ರೀನ್ ರೆಕಾರ್ಡಿಂಗ್ ಸೆಶನ್ಗಾಗಿ ಚಾಲ್ತಿಯಲ್ಲಿರುವ ಅಧಿಸೂಚನೆ"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"ರೆಕಾರ್ಡಿಂಗ್ ಪ್ರಾರಂಭಿಸಬೇಕೆ?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"ರೆಕಾರ್ಡಿಂಗ್ ಸಮಯದಲ್ಲಿ, ಸ್ಕ್ರೀನ್ನಲ್ಲಿ ಗೋಚರಿಸುವ ಅಥವಾ ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಪ್ಲೇ ಮಾಡಲಾದ ಸೂಕ್ಷ್ಮ ಮಾಹಿತಿಯನ್ನು Android ಸಿಸ್ಟಂ ಕ್ಯಾಪ್ಚರ್ ಮಾಡಬಹುದು. ಇದು ಪಾಸ್ವರ್ಡ್ಗಳು, ಪಾವತಿ ಮಾಹಿತಿ, ಫೋಟೋಗಳು, ಸಂದೇಶಗಳು ಮತ್ತು ಆಡಿಯೋವನ್ನು ಒಳಗೊಂಡಿದೆ."</string> @@ -511,8 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"ಎಲ್ಲವನ್ನೂ ತೆರವುಗೊಳಿಸಿ"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"ನಿರ್ವಹಿಸಿ"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"ಇತಿಹಾಸ"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"ಒಳಬರುವ"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"ನಿಶ್ಶಬ್ಧ ಅಧಿಸೂಚನೆಗಳು"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"ಎಚ್ಚರಿಸುವ ಅಧಿಸೂಚನೆಗಳು"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"ಸಂಭಾಷಣೆಗಳು"</string> @@ -985,16 +983,14 @@ <string name="auto_saver_enabled_text" msgid="7889491183116752719">"ಬ್ಯಾಟರಿ <xliff:g id="PERCENTAGE">%d</xliff:g>%% ಗಿಂತ ಕಡಿಮೆ ಆದಾಗ ಬ್ಯಾಟರಿ ಸೇವರ್ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಆನ್ ಆಗುತ್ತದೆ."</string> <string name="open_saver_setting_action" msgid="2111461909782935190">"ಸೆಟ್ಟಿಂಗ್ಗಳು"</string> <string name="auto_saver_okay_action" msgid="7815925750741935386">"ಅರ್ಥವಾಯಿತು"</string> - <string name="heap_dump_tile_name" msgid="2464189856478823046">"SysUI ಹೀಪ್ ಡಂಪ್ ಮಾಡಿ"</string> + <string name="heap_dump_tile_name" msgid="2464189856478823046">"Dump SysUI Heap"</string> <string name="sensor_privacy_mode" msgid="4462866919026513692">"ಸೆನ್ಸರ್ಗಳು ಆಫ್"</string> <string name="device_services" msgid="1549944177856658705">"ಸಾಧನ ಸೇವೆಗಳು"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"ಯಾವುದೇ ಶೀರ್ಷಿಕೆಯಿಲ್ಲ"</string> <string name="restart_button_description" msgid="6916116576177456480">"ಈ ಆ್ಯಪ್ ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಲು ಮತ್ತು ಪೂರ್ಣ ಸ್ಕ್ರೀನ್ನಲ್ಲಿ ನೋಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಬಬಲ್ಸ್ಗಾಗಿ ಸೆಟ್ಟಿಂಗ್ಗಳು"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"ಓವರ್ಫ್ಲೋ"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"ಸ್ಟ್ಯಾಕ್ಗೆ ಪುನಃ ಸೇರಿಸಿ"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"ನಿರ್ವಹಿಸಿ"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g> ಆ್ಯಪ್ನ <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> ಮತ್ತು <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> ಹೆಚ್ಚಿನವುಗಳ <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index cca8adbc440b..60ecdb7357c2 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"스크린샷 닫기"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"스크린샷 미리보기"</string> <string name="screenrecord_name" msgid="2596401223859996572">"화면 녹화"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"화면 녹화 처리 중"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"화면 녹화 세션에 관한 지속적인 알림"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"녹화를 시작하시겠습니까?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Android 시스템이 녹화 중에 화면에 표시되거나 기기에서 재생되는 민감한 정보를 캡처할 수 있습니다. 여기에는 비밀번호, 결제 정보, 사진, 메시지 및 오디오가 포함됩니다."</string> @@ -400,7 +399,7 @@ <string name="quick_settings_tethering_label" msgid="5257299852322475780">"테더링"</string> <string name="quick_settings_hotspot_label" msgid="1199196300038363424">"핫스팟"</string> <string name="quick_settings_hotspot_secondary_label_transient" msgid="7585604088079160564">"켜는 중..."</string> - <string name="quick_settings_hotspot_secondary_label_data_saver_enabled" msgid="1280433136266439372">"데이터 절약 모드 사용 중"</string> + <string name="quick_settings_hotspot_secondary_label_data_saver_enabled" msgid="1280433136266439372">"데이터 절약 모드"</string> <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="3142308865165871976"> <item quantity="other">기기 %d대</item> <item quantity="one">기기 %d대</item> @@ -490,7 +489,7 @@ <string name="user_logout_notification_title" msgid="3644848998053832589">"사용자 로그아웃"</string> <string name="user_logout_notification_text" msgid="7441286737342997991">"현재 사용자 로그아웃"</string> <string name="user_logout_notification_action" msgid="7974458760719361881">"사용자 로그아웃"</string> - <string name="user_add_user_title" msgid="4172327541504825032">"새 사용자를 추가할까요?"</string> + <string name="user_add_user_title" msgid="4172327541504825032">"신규 사용자를 추가할까요?"</string> <string name="user_add_user_message_short" msgid="2599370307878014791">"추가된 새로운 사용자는 자신의 공간을 설정해야 합니다.\n\n모든 사용자는 다른 사용자들을 위하여 앱을 업데이트할 수 있습니다."</string> <string name="user_limit_reached_title" msgid="2429229448830346057">"사용자 제한 도달"</string> <plurals name="user_limit_reached_message" formatted="false" msgid="2573535787802908398"> @@ -511,13 +510,12 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"모두 지우기"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"관리"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"기록"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"최근 알림"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"무음 알림"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"소리 알림"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"대화"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"무음 알림 모두 삭제"</string> - <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"방해 금지 모드로 일시중지된 알림"</string> + <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"방해 금지 모드로 알림이 일시중지됨"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"시작하기"</string> <string name="empty_shade_text" msgid="8935967157319717412">"알림 없음"</string> <string name="profile_owned_footer" msgid="2756770645766113964">"프로필이 모니터링될 수 있음"</string> @@ -969,7 +967,7 @@ <string name="running_foreground_services_title" msgid="5137313173431186685">"백그라운드에서 실행 중인 앱"</string> <string name="running_foreground_services_msg" msgid="3009459259222695385">"탭하여 배터리 및 데이터 사용량 확인"</string> <string name="mobile_data_disable_title" msgid="5366476131671617790">"모바일 데이터를 사용 중지하시겠습니까?"</string> - <string name="mobile_data_disable_message" msgid="8604966027899770415">"<xliff:g id="CARRIER">%s</xliff:g>을(를) 통해 데이터 또는 인터넷에 액세스할 수 없습니다. 인터넷은 Wi-Fi를 통해서만 사용할 수 있습니다."</string> + <string name="mobile_data_disable_message" msgid="8604966027899770415">"<xliff:g id="CARRIER">%s</xliff:g>을(를) 통해 데이터 또는 인터넷에 액세스할 수 없게 됩니다. 인터넷은 Wi-Fi를 통해서만 사용할 수 있습니다."</string> <string name="mobile_data_disable_message_default_carrier" msgid="6496033312431658238">"이동통신사"</string> <string name="touch_filtered_warning" msgid="8119511393338714836">"앱이 권한 요청을 가리고 있기 때문에 설정에서 내 응답을 확인할 수 없습니다."</string> <string name="slice_permission_title" msgid="3262615140094151017">"<xliff:g id="APP_0">%1$s</xliff:g>에서 <xliff:g id="APP_2">%2$s</xliff:g>의 슬라이스를 표시하도록 허용하시겠습니까?"</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"제목 없음"</string> <string name="restart_button_description" msgid="6916116576177456480">"탭하여 이 앱을 다시 시작하고 전체 화면으로 이동합니다."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> 대화창 설정"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"더보기"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"스택에 다시 추가"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"관리"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g>의 <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> 외 <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>개의 <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index 15e53cd5d8c3..6893e8f9bc5d 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Скриншотту четке кагуу"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Скриншотту алдын ала көрүү"</string> <string name="screenrecord_name" msgid="2596401223859996572">"экрандан видео жаздырып алуу"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Экрандан жаздырылып алынган видео иштетилүүдө"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Экранды жаздыруу сеансы боюнча учурдагы билдирме"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Жаздырып баштайсызбы?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Жаздыруу учурунда Android тутуму экраныңызда көрүнүп турган жана түзмөктө ойноп жаткан бардык купуя маалыматты жаздырып алат. Буга сырсөздөр, төлөм маалыматы, сүрөттөр, билдирүүлөр жана аудио файлдар кирет."</string> @@ -511,8 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Баарын тазалап салуу"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Башкаруу"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Таржымал"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Кирүүчү"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Үнсүз билдирмелер"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Эскертүүлөр"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Жазышуулар"</string> @@ -711,7 +709,7 @@ <string name="notification_silence_title" msgid="8608090968400832335">"Үнсүз"</string> <string name="notification_alert_title" msgid="7629202599338071971">"Шашылыш билдирүү"</string> <string name="notification_bubble_title" msgid="8330481035191903164">"Көбүк"</string> - <string name="notification_channel_summary_low" msgid="7300447764759926720">"Үн же дирилдөөсүз ой топтоого жардам берет."</string> + <string name="notification_channel_summary_low" msgid="7300447764759926720">"Билдирмелер келгенде, үн чыкпайт же дирилдебейт."</string> <string name="notification_channel_summary_default" msgid="3539949463907902037">"Билдирүүдөн үн чыгат же дирилдейт."</string> <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Билдирүүдөн үн чыгат же дирилдейт. <xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосундагы жазышуулар демейки жөндөө боюнча калкып чыкма билдирмелер болуп көрүнөт."</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Калкыма ыкчам баскыч менен көңүлүңүздү бул мазмунга буруп турат."</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Аталышы жок"</string> <string name="restart_button_description" msgid="6916116576177456480">"Бул колдонмону өчүрүп күйгүзүп, толук экранга өтүү үчүн, таптап коюңуз."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> калкып чыкма билдирмелер жөндөөлөрү"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Кошумча меню"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Кайра топтомго кошуу"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Башкаруу"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g> колдонмосунан <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> жана дагы <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> колдонмодон <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml index 0c403db2e845..2514b3eb09dc 100644 --- a/packages/SystemUI/res/values-lo/strings.xml +++ b/packages/SystemUI/res/values-lo/strings.xml @@ -19,7 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="4811759950673118541">"ສ່ວນຕິດຕໍ່ຜູ່ໃຊ້ຂອງລະບົບ"</string> + <string name="app_label" msgid="4811759950673118541">"ສ່ວນຕິດຕໍ່ຜູ້ໃຊ້ຂອງລະບົບ"</string> <string name="status_bar_clear_all_button" msgid="2491321682873657397">"ລຶບ"</string> <string name="status_bar_no_notifications_title" msgid="7812479124981107507">"ບໍ່ມີການແຈ້ງເຕືອນ"</string> <string name="status_bar_ongoing_events_title" msgid="3986169317496615446">"ດຳເນີນຢູ່"</string> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index 95570bc157b2..4f016d33fa2e 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Praleisti ekrano kopiją"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Ekrano kopijos peržiūra"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Ekrano vaizdo įrašytuvas"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Apdorojam. ekrano vaizdo įraš."</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Šiuo metu rodomas ekrano įrašymo sesijos pranešimas"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Pradėti įrašymą?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Įrašant „Android“ sistema gali fiksuoti bet kokią neskelbtiną informaciją, rodomą ekrane ar leidžiamą įrenginyje. Tai apima slaptažodžius, išsamią mokėjimo informaciją, nuotraukas, pranešimus ir garso įrašus."</string> @@ -517,8 +516,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Viską išvalyti"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Tvarkyti"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Istorija"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Gaunami"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Tylieji pranešimai"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Įspėjamieji pranešimai"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Pokalbiai"</string> @@ -1001,10 +999,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Nėra pavadinimo"</string> <string name="restart_button_description" msgid="6916116576177456480">"Palieskite, kad paleistumėte iš naujo šią programą arba įjungtumėte viso ekrano režimą."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"„<xliff:g id="APP_NAME">%1$s</xliff:g>“ burbulų nustatymai"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Perpildymas"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Pridėti atgal į krūvą"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Tvarkyti"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"„<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>“ iš „<xliff:g id="APP_NAME">%2$s</xliff:g>“"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"„<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>“ iš „<xliff:g id="APP_NAME">%2$s</xliff:g>“ ir dar <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index 3a01e0ea74aa..5cc696c98a7e 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Nerādīt ekrānuzņēmumu"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Ekrānuzņēmuma priekšskatījums"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Ekrāna ierakstītājs"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Ekrāna ieraksta apstrāde"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Aktīvs paziņojums par ekrāna ierakstīšanas sesiju"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Vai sākt ierakstīšanu?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Ierakstīšanas laikā Android sistēmā var tikt tverta jebkura sensitīvā informācija, kas ir redzama jūsu ekrānā vai tiek atskaņota jūsu ierīcē. Šī informācija ir paroles, maksājumu informācija, fotoattēli, ziņojumi un audio."</string> @@ -514,8 +513,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Dzēst visu"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Pārvaldīt"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Vēsture"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Ienākošie"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Klusie paziņojumi"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Paziņojumi ar skaņu vai vibrāciju"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Sarunas"</string> @@ -996,10 +994,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Nav nosaukuma"</string> <string name="restart_button_description" msgid="6916116576177456480">"Pieskarieties, lai restartētu šo lietotni un pārietu pilnekrāna režīmā."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Lietotnes <xliff:g id="APP_NAME">%1$s</xliff:g> burbuļu iestatījumi"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Pārpilde"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Pievienot atpakaļ kopai"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Pārvaldīt"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> no: <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> no lietotnes “<xliff:g id="APP_NAME">%2$s</xliff:g>” un vēl <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml index 7aab7f6d979e..64f614f09b9a 100644 --- a/packages/SystemUI/res/values-mk/strings.xml +++ b/packages/SystemUI/res/values-mk/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Отфрлете ја сликата од екранот"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Преглед на слика од екранот"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Снимач на екран"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Се обработува снимка од екран"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Тековно известување за сесија за снимање на екранот"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Да се започне со снимање?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"При снимањето, системот Android може да ги сними сите чувствителни податоци што се видливи на вашиот екран или пуштени на уредот. Ова вклучува лозинки, податоци за плаќање, фотографии, пораки и аудио."</string> @@ -511,8 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Избриши сѐ"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Управувајте"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Историја"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Дојдовни"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Тивки известувања"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Известувања за предупредување"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Разговори"</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Без наслов"</string> <string name="restart_button_description" msgid="6916116576177456480">"Допрете за да ја рестартирате апликацијава и да ја отворите на цел екран."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Поставки за балончињата за <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Прелевање"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Додајте назад во stack"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Управување"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> од <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> од <xliff:g id="APP_NAME">%2$s</xliff:g> и уште <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index 466d6d4466e8..bee7e919947f 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"സ്ക്രീൻഷോട്ട് ഡിസ്മിസ് ചെയ്യുക"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"സ്ക്രീൻഷോട്ട് പ്രിവ്യു"</string> <string name="screenrecord_name" msgid="2596401223859996572">"സ്ക്രീൻ റെക്കോർഡർ"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"സ്ക്രീൻ റെക്കോർഡിംഗ് പ്രോസസുചെയ്യുന്നു"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"ഒരു സ്ക്രീൻ റെക്കോർഡിംഗ് സെഷനായി നിലവിലുള്ള അറിയിപ്പ്"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"റെക്കോർഡിംഗ് ആരംഭിക്കണോ?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"റെക്കോർഡ് ചെയ്യുമ്പോൾ, നിങ്ങളുടെ സ്ക്രീനിൽ ദൃശ്യമാകുന്നതോ ഉപകരണത്തിൽ പ്ലേ ചെയ്യുന്നതോ ആയ ഏത് തന്ത്രപ്രധാന വിവരങ്ങളും Android സിസ്റ്റത്തിന് പകർത്താനാവും. പാസ്വേഡുകൾ, പേയ്മെന്റ് വിവരം, ഫോട്ടോകൾ, സന്ദേശങ്ങൾ, ഓഡിയോ എന്നിവ ഇതിൽ ഉൾപ്പെടുന്നു."</string> @@ -511,8 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"എല്ലാം മായ്ക്കുക"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"മാനേജ് ചെയ്യുക"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"ചരിത്രം"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"ഇൻകമിംഗ്"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"നിശബ്ദ അറിയിപ്പുകൾ"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"മുന്നറിയിപ്പ് നൽകുന്ന അറിയിപ്പുകൾ"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"സംഭാഷണങ്ങൾ"</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"പേരില്ല"</string> <string name="restart_button_description" msgid="6916116576177456480">"ഈ ആപ്പ് റീസ്റ്റാർട്ട് ചെയ്യാനും പൂർണ്ണ സ്ക്രീനാവാനും ടാപ്പ് ചെയ്യുക."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> ബബിളുകളുടെ ക്രമീകരണം"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"ഓവർഫ്ലോ"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"അടുക്കുകളിലേക്ക് തിരിച്ച് ചേർക്കുക"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"മാനേജ് ചെയ്യുക"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g>-ൽ നിന്നുള്ള <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> എന്നതിൽ നിന്നുള്ള <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>, <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> കൂടുതലും"</string> @@ -1039,10 +1035,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"എല്ലാ നിയന്ത്രണങ്ങളുടെയും ലിസ്റ്റ് ലോഡ് ചെയ്യാനായില്ല."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"മറ്റുള്ളവ"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"ഉപകരണ നിയന്ത്രണങ്ങളിലേക്ക് ചേർക്കുക"</string> - <!-- no translation found for controls_dialog_ok (2770230012857881822) --> - <skip /> - <!-- no translation found for controls_dialog_message (342066938390663844) --> - <skip /> + <string name="controls_dialog_ok" msgid="2770230012857881822">"ചേർക്കുക"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"<xliff:g id="APP">%s</xliff:g> നിർദ്ദേശിച്ചത്"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"നിയന്ത്രണങ്ങൾ അപ്ഡേറ്റ് ചെയ്തു"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"പിന്നിൽ അക്ഷരങ്ങളോ ചിഹ്നങ്ങളോ അടങ്ങിയിരിക്കുന്നു"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"<xliff:g id="DEVICE">%s</xliff:g> പരിശോധിച്ചുറപ്പിക്കുക"</string> diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml index dcff60062647..9e915e0443e4 100644 --- a/packages/SystemUI/res/values-mn/strings.xml +++ b/packages/SystemUI/res/values-mn/strings.xml @@ -45,7 +45,7 @@ <string name="status_bar_settings_notifications" msgid="5285316949980621438">"Мэдэгдэл"</string> <string name="bluetooth_tethered" msgid="4171071193052799041">"Блютүүтыг модем болгож байна"</string> <string name="status_bar_input_method_settings_configure_input_methods" msgid="2972273031043777851">"Оруулах аргыг тохируулах"</string> - <string name="status_bar_use_physical_keyboard" msgid="4849251850931213371">"Бодит гар"</string> + <string name="status_bar_use_physical_keyboard" msgid="4849251850931213371">"Биет гар"</string> <string name="usb_device_permission_prompt" msgid="4414719028369181772">"<xliff:g id="APPLICATION">%1$s</xliff:g>-г <xliff:g id="USB_DEVICE">%2$s</xliff:g>-д хандахыг зөвшөөрөх үү?"</string> <string name="usb_device_permission_prompt_warn" msgid="2309129784984063656">"<xliff:g id="APPLICATION">%1$s</xliff:g>-д <xliff:g id="USB_DEVICE">%2$s</xliff:g>-д хандахыг зөвшөөрөх үү?\nЭнэ аппад бичих зөвшөөрөл олгогдоогүй ч USB төхөөрөмжөөр дамжуулан аудио бичиж чадсан."</string> <string name="usb_accessory_permission_prompt" msgid="717963550388312123">"<xliff:g id="APPLICATION">%1$s</xliff:g>-г <xliff:g id="USB_ACCESSORY">%2$s</xliff:g>-д хандахыг зөвшөөрөх үү?"</string> @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Дэлгэцийн агшныг хаах"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Дэлгэцийн агшныг урьдчилан үзэх"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Дэлгэцийн үйлдэл бичигч"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Дэлгэц бичлэг боловсруулж байна"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Дэлгэц бичих горимын үргэлжилж буй мэдэгдэл"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Бичлэгийг эхлүүлэх үү?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Бичих үед Андройд систем нь таны дэлгэц дээр харагдах эсвэл төхөөрөмж дээрээ тоглуулсан аливаа эмзэг мэдээллийг авах боломжтой. Үүнд нууц үг, төлбөрийн мэдээлэл, зураг, зурвас болон аудио багтана."</string> @@ -299,8 +298,8 @@ <string name="accessibility_quick_settings_flashlight_on" msgid="3785616827729850766">"Флаш гэрэл ассан."</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Флаш гэрлийг унтраасан."</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Флаш гэрлийг асаасан."</string> - <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Өнгө урвуулагчийг унтраасан."</string> - <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Өнгө урвуулагчийг асаасан."</string> + <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Өнгө хувиргалтыг унтраасан."</string> + <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Өнгө хувиргалтыг асаасан."</string> <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Мобайл хотспотыг унтраасан."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Мобайл хотспотыг асаасан."</string> <string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Дэлгэц дамжуулалт зогссон."</string> @@ -511,8 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Бүгдийг арилгах"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Удирдах"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Түүх"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Ирж буй"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Чимээгүй мэдэгдэл"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Сэрэмжлүүлэх мэдэгдэл"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Харилцан яриа"</string> @@ -695,7 +693,7 @@ <string name="notification_channel_unsilenced" msgid="94878840742161152">"Эдгээр мэдэгдлийг танд мэдэгдэнэ"</string> <string name="inline_blocking_helper" msgid="2891486013649543452">"Та эдгээр мэдэгдлийг ихэвчлэн хаадаг. \nЭдгээрийг харуулсан хэвээр байх уу?"</string> <string name="inline_done_button" msgid="6043094985588909584">"Болсон"</string> - <string name="inline_ok_button" msgid="603075490581280343">"Хаах"</string> + <string name="inline_ok_button" msgid="603075490581280343">"Ашиглах"</string> <string name="inline_keep_showing" msgid="8736001253507073497">"Эдгээр мэдэгдлийг харуулсан хэвээр байх уу?"</string> <string name="inline_stop_button" msgid="2453460935438696090">"Мэдэгдлийг зогсоох"</string> <string name="inline_deliver_silently_button" msgid="2714314213321223286">"Дуугүй хүргэх"</string> @@ -712,7 +710,7 @@ <string name="notification_alert_title" msgid="7629202599338071971">"Дуутай"</string> <string name="notification_bubble_title" msgid="8330481035191903164">"Бөмбөлөг"</string> <string name="notification_channel_summary_low" msgid="7300447764759926720">"Дуу эсвэл чичиргээгүйгээр танд төвлөрөхөд тусална."</string> - <string name="notification_channel_summary_default" msgid="3539949463907902037">"Дуу эсвэл чичиргээгүйгээр таны анхаарлыг татна."</string> + <string name="notification_channel_summary_default" msgid="3539949463907902037">"Дуу эсвэл чичиргээгээр таны анхаарлыг татна."</string> <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Дуу эсвэл чичиргээгээр таны анхаарлыг татна. <xliff:g id="APP_NAME">%1$s</xliff:g>-н харилцан яриаг өгөгдмөл тохиргоогоор бөмбөлөг болгоно."</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Энэ контентын хөвөн гарч ирэх товчлолтойгоор таны анхаарлыг татдаг."</string> <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Харилцан ярианы хэсгийн дээд талд, бөмбөлөг хэлбэрээр харагдана."</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Гарчиггүй"</string> <string name="restart_button_description" msgid="6916116576177456480">"Энэ аппыг дахин эхлүүлж, бүтэн дэлгэцэд орохын тулд товшино уу."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g>-н бөмбөлгүүдийн тохиргоо"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Халих"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Өрөлтөд буцааж нэмэх"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Удирдах"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g>-н <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g>-н <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> болон бусад <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index 5497d70ca5b8..d0730c099198 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -22,7 +22,7 @@ <string name="app_label" msgid="4811759950673118541">"सिस्टम UI"</string> <string name="status_bar_clear_all_button" msgid="2491321682873657397">"साफ करा"</string> <string name="status_bar_no_notifications_title" msgid="7812479124981107507">"सूचना नाहीत"</string> - <string name="status_bar_ongoing_events_title" msgid="3986169317496615446">"सुरु असलेले"</string> + <string name="status_bar_ongoing_events_title" msgid="3986169317496615446">"सुरू असलेले"</string> <string name="status_bar_latest_events_title" msgid="202755896454005436">"सूचना"</string> <string name="battery_low_title" msgid="6891106956328275225">"बॅटरी लवकर संपू शकते"</string> <string name="battery_low_percent_format" msgid="4276661262843170964">"<xliff:g id="PERCENTAGE">%s</xliff:g> शिल्लक"</string> @@ -35,7 +35,7 @@ <string name="battery_low_why" msgid="2056750982959359863">"सेटिंग्ज"</string> <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_confirmation_ok" msgid="5042136476802816494">"सुरू करा"</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> @@ -62,7 +62,7 @@ <string name="usb_debugging_always" msgid="4003121804294739548">"या संगणकावरून नेहमी अनुमती द्या"</string> <string name="usb_debugging_allow" msgid="1722643858015321328">"अनुमती द्या"</string> <string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB डीबग करण्यास अनुमती नाही"</string> - <string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"सध्या या डीव्हाइसमध्ये साइन इन केलेला वापरकर्ता USB डीबग करणे चालू करू शकत नाही. हे वैशिष्ट्य वापरण्यासाठी, प्राथमिक वापरकर्त्यावर स्विच करा."</string> + <string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"सध्या या डीव्हाइसमध्ये साइन इन केलेला वापरकर्ता USB डीबग करणे सुरू करू शकत नाही. हे वैशिष्ट्य वापरण्यासाठी, प्राथमिक वापरकर्त्यावर स्विच करा."</string> <string name="wifi_debugging_title" msgid="7300007687492186076">"या नेटवर्कवर वायरलेस डीबगिंग करण्याला अनुमती द्यायची का?"</string> <string name="wifi_debugging_message" msgid="5461204211731802995">"नेटवर्कचे नाव (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nवाय-फाय ॲड्रेस (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string> <string name="wifi_debugging_always" msgid="2968383799517975155">"या नेटवर्कवर नेहमी अनुमती द्या"</string> @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"स्क्रीनशॉट डिसमिस करा"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"स्क्रीनशॉटचे पूर्वावलोकन"</string> <string name="screenrecord_name" msgid="2596401223859996572">"स्क्रीन रेकॉर्डर"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"स्क्रीन रेकॉर्डिंग प्रोसेस सुरू"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"स्क्रीन रेकॉर्ड सत्रासाठी सुरू असलेली सूचना"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"रेकॉर्डिंग सुरू करायचे आहे का?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"रेकॉर्डिंग करताना, Android सिस्टम तुमच्या स्क्रीनवर दिसणारी किंवा तुमच्या डिव्हाइसवर प्ले केलेली कोणतीही संवेदनशील माहिती कॅप्चर करू शकते. यात पासवर्ड, पेमेंट माहिती, फोटो, मेसेज आणि ऑडिओचा समावेश आहे."</string> @@ -211,7 +210,7 @@ <string name="accessibility_two_bars" msgid="1335676987274417121">"दोन बार."</string> <string name="accessibility_three_bars" msgid="819417766606501295">"तीन बार."</string> <string name="accessibility_signal_full" msgid="5920148525598637311">"सिग्नल पूर्ण."</string> - <string name="accessibility_desc_on" msgid="2899626845061427845">"चालू."</string> + <string name="accessibility_desc_on" msgid="2899626845061427845">"सुरू."</string> <string name="accessibility_desc_off" msgid="8055389500285421408">"बंद."</string> <string name="accessibility_desc_connected" msgid="3082590384032624233">"कनेक्ट केले."</string> <string name="accessibility_desc_connecting" msgid="8011433412112903614">"कनेक्ट करत आहे."</string> @@ -236,7 +235,7 @@ <string name="cell_data_off" msgid="4886198950247099526">"बंद"</string> <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"ब्लूटूथ टेदरिंग."</string> <string name="accessibility_airplane_mode" msgid="1899529214045998505">"विमान मोड."</string> - <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN चालू."</string> + <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN सुरू."</string> <string name="accessibility_no_sims" msgid="5711270400476534667">"सिम कार्ड नाही."</string> <string name="carrier_network_change_mode" msgid="5174141476991149918">"वाहक नेटवर्क बदलत आहे"</string> <string name="accessibility_battery_details" msgid="6184390274150865789">"बॅटरी तपशील उघडा"</string> @@ -267,13 +266,13 @@ <string name="accessibility_desc_close" msgid="8293708213442107755">"बंद करा"</string> <string name="accessibility_quick_settings_wifi" msgid="167707325133803052">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wifi बंद झाले."</string> - <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wifi चालू झाले."</string> + <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wifi सुरू झाले."</string> <string name="accessibility_quick_settings_mobile" msgid="1817825313718492906">"मोबाईल <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string> <string name="accessibility_quick_settings_battery" msgid="533594896310663853">"बॅटरी <xliff:g id="STATE">%s</xliff:g>."</string> <string name="accessibility_quick_settings_airplane_off" msgid="1275658769368793228">"विमान मोड बंद."</string> - <string name="accessibility_quick_settings_airplane_on" msgid="8106176561295294255">"विमान मोड चालू."</string> + <string name="accessibility_quick_settings_airplane_on" msgid="8106176561295294255">"विमान मोड सुरू."</string> <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"विमान मोड बंद केला."</string> - <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"विमान मोड चालू केला."</string> + <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"विमान मोड सुरू केला."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"संपूर्ण शांतता"</string> <string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"फक्त अलार्म"</string> <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"व्यत्यय आणू नका."</string> @@ -281,35 +280,35 @@ <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"व्यत्यय आणू नका सुरू केले आहे."</string> <string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"ब्लूटूथ."</string> <string name="accessibility_quick_settings_bluetooth_off" msgid="3795983516942423240">"ब्लूटूथ बंद."</string> - <string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"ब्लूटूथ चालू."</string> + <string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"ब्लूटूथ सुरू."</string> <string name="accessibility_quick_settings_bluetooth_connecting" msgid="7362294657419149294">"ब्लूटूथ कनेक्ट करत आहे."</string> <string name="accessibility_quick_settings_bluetooth_connected" msgid="5237625393869747261">"ब्लूटूथ कनेक्ट केले."</string> <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"ब्लूटूथ बंद केले."</string> - <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"ब्लूटूथ चालू केले."</string> + <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"ब्लूटूथ सुरू केले."</string> <string name="accessibility_quick_settings_location_off" msgid="6122523378294740598">"स्थान अहवाल बंद."</string> - <string name="accessibility_quick_settings_location_on" msgid="6869947200325467243">"स्थान अहवाल चालू."</string> + <string name="accessibility_quick_settings_location_on" msgid="6869947200325467243">"स्थान अहवाल सुरू."</string> <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"स्थान अहवाल बंद केला."</string> - <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"स्थान अहवाल चालू केला."</string> + <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"स्थान अहवाल सुरू केला."</string> <string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"<xliff:g id="TIME">%s</xliff:g> साठी अलार्म सेट केला."</string> <string name="accessibility_quick_settings_close" msgid="2974895537860082341">"पॅनेल बंद करा."</string> <string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"अधिक वेळ."</string> <string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"कमी वेळ."</string> <string name="accessibility_quick_settings_flashlight_off" msgid="7606563260714825190">"फ्लॅशलाइट बंद."</string> <string name="accessibility_quick_settings_flashlight_unavailable" msgid="7458591827288347635">"फ्लॅशलाइट अनुपलब्ध आहे."</string> - <string name="accessibility_quick_settings_flashlight_on" msgid="3785616827729850766">"फ्लॅशलाइट चालू."</string> + <string name="accessibility_quick_settings_flashlight_on" msgid="3785616827729850766">"फ्लॅशलाइट सुरू."</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"फ्लॅशलाइट बंद केला."</string> - <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"फ्लॅशलाइट चालू केला."</string> + <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"फ्लॅशलाइट सुरू केला."</string> <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"रंग उत्क्रमण बंद केले."</string> - <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"रंग उत्क्रमण चालू केले."</string> + <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"रंग उत्क्रमण सुरू केले."</string> <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"मोबाईल हॉटस्पॉट बंद केला."</string> - <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"मोबाईल हॉटस्पॉट चालू केला."</string> + <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"मोबाईल हॉटस्पॉट सुरू केला."</string> <string name="accessibility_casting_turned_off" msgid="1387906158563374962">"स्क्रीन कास्ट करणे थांबले."</string> <string name="accessibility_quick_settings_work_mode_off" msgid="562749867895549696">"कार्य मोड बंद."</string> - <string name="accessibility_quick_settings_work_mode_on" msgid="2779253456042059110">"कार्य मोड चालू."</string> + <string name="accessibility_quick_settings_work_mode_on" msgid="2779253456042059110">"कार्य मोड सुरू."</string> <string name="accessibility_quick_settings_work_mode_changed_off" msgid="6256690740556798683">"कार्य मोड बंद केला."</string> - <string name="accessibility_quick_settings_work_mode_changed_on" msgid="1105258550138313384">"कार्य मोड चालू केला."</string> + <string name="accessibility_quick_settings_work_mode_changed_on" msgid="1105258550138313384">"कार्य मोड सुरू केला."</string> <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"डेटा सर्व्हर बंद केला."</string> - <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"डेटा सर्व्हर चालू केला."</string> + <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"डेटा सर्व्हर सुरू केला."</string> <string name="accessibility_quick_settings_sensor_privacy_changed_off" msgid="7608378211873807353">"सेन्सर गोपनीयता बंद केली आहे."</string> <string name="accessibility_quick_settings_sensor_privacy_changed_on" msgid="4267393685085328801">"सेन्सर गोपनीयता सुरू केली आहे."</string> <string name="accessibility_brightness" msgid="5391187016177823721">"डिस्प्ले चमक"</string> @@ -319,7 +318,7 @@ <string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"मोबाइल डेटा थांबवला आहे"</string> <string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"डेटास विराम दिला आहे"</string> <string name="data_usage_disabled_dialog" msgid="7933201635215099780">"तुम्ही सेट केलेली डेटा मर्यादा संपली. आता तुमचे मोबाइल डेटा वापरणे बंद आहे.\n\nतुम्ही ते पुन्हा सुरू केल्यास, डेटा वापरासाठी शुल्क लागू होईल."</string> - <string name="data_usage_disabled_dialog_enable" msgid="2796648546086408937">"पुन्हा सुरु करा"</string> + <string name="data_usage_disabled_dialog_enable" msgid="2796648546086408937">"पुन्हा सुरू करा"</string> <string name="gps_notification_searching_text" msgid="231304732649348313">"GPS शोधत आहे"</string> <string name="gps_notification_found_text" msgid="3145873880174658526">"GPS द्वारे स्थान सेट केले"</string> <string name="accessibility_location_active" msgid="2845747916764660369">"स्थान विनंत्या सक्रिय"</string> @@ -379,7 +378,7 @@ <string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"कनेक्ट केले नाही"</string> <string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"नेटवर्क नाही"</string> <string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"वाय-फाय बंद"</string> - <string name="quick_settings_wifi_on_label" msgid="2489928193654318511">"वाय-फाय चालू"</string> + <string name="quick_settings_wifi_on_label" msgid="2489928193654318511">"वाय-फाय सुरू"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="483130889414601732">"वाय-फाय नेटवर्क उपलब्ध नाहीत"</string> <string name="quick_settings_wifi_secondary_label_transient" msgid="7501659015509357887">"सुरू करत आहे…"</string> <string name="quick_settings_cast_title" msgid="2279220930629235211">"स्क्रीन कास्ट करा"</string> @@ -417,9 +416,9 @@ <string name="quick_settings_cellular_detail_data_warning" msgid="7957253810481086455">"<xliff:g id="DATA_LIMIT">%s</xliff:g> चेतावणी"</string> <string name="quick_settings_work_mode_label" msgid="2754212289804324685">"कार्य प्रोफाइल"</string> <string name="quick_settings_night_display_label" msgid="8180030659141778180">"रात्रीचा प्रकाश"</string> - <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="3358706312129866626">"संध्याकाळी चालू असते"</string> + <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="3358706312129866626">"संध्याकाळी सुरू असते"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4063448287758262485">"सूर्योदयापर्यंत"</string> - <string name="quick_settings_night_secondary_label_on_at" msgid="3584738542293528235">"<xliff:g id="TIME">%s</xliff:g> वाजता चालू"</string> + <string name="quick_settings_night_secondary_label_on_at" msgid="3584738542293528235">"<xliff:g id="TIME">%s</xliff:g> वाजता सुरू"</string> <string name="quick_settings_secondary_label_until" msgid="1883981263191927372">"<xliff:g id="TIME">%s</xliff:g> पर्यंत"</string> <string name="quick_settings_ui_mode_night_label" msgid="1398928270610780470">"गडद थीम"</string> <string name="quick_settings_dark_mode_secondary_label_battery_saver" msgid="4990712734503013251">"बॅटरी सेव्हर"</string> @@ -481,9 +480,9 @@ <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"या सत्रातील सर्व अॅप्स आणि डेटा हटवला जाईल."</string> <string name="guest_exit_guest_dialog_remove" msgid="7505817591242703757">"काढा"</string> <string name="guest_wipe_session_title" msgid="7147965814683990944">"अतिथी, तुमचे पुन्हा स्वागत आहे!"</string> - <string name="guest_wipe_session_message" msgid="3393823610257065457">"तुम्ही तुमचे सत्र सुरु ठेवू इच्छिता?"</string> + <string name="guest_wipe_session_message" msgid="3393823610257065457">"तुम्ही तुमचे सत्र सुरू ठेवू इच्छिता?"</string> <string name="guest_wipe_session_wipe" msgid="8056836584445473309">"येथून सुरू करा"</string> - <string name="guest_wipe_session_dontwipe" msgid="3211052048269304205">"होय, सुरु ठेवा"</string> + <string name="guest_wipe_session_dontwipe" msgid="3211052048269304205">"होय, सुरू ठेवा"</string> <string name="guest_notification_title" msgid="4434456703930764167">"अतिथी वापरकर्ता"</string> <string name="guest_notification_text" msgid="4202692942089571351">"अॅप्स आणि डेटा हटविण्यासाठी, अतिथी वापरकर्ता काढा"</string> <string name="guest_notification_remove_action" msgid="4153019027696868099">"अतिथी काढा"</string> @@ -511,10 +510,9 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"सर्व साफ करा"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"व्यवस्थापित करा"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"इतिहास"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"आलेल्या"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"सायलंट सूचना"</string> - <string name="notification_section_header_alerting" msgid="3168140660646863240">"लक्ष वेधून घेणाऱ्या सूचना"</string> + <string name="notification_section_header_alerting" msgid="3168140660646863240">"इशारा देणाऱ्या सूचना"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"संभाषणे"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"सर्व सायलंट सूचना साफ करा"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"व्यत्यय आणून नकाद्वारे सूचना थांबवल्या"</string> @@ -552,7 +550,7 @@ <string name="monitoring_description_management_ca_certificate" msgid="7785013130658110130">"आपल्या संस्थेने या डिव्हाइसवर प्रमाणपत्र अधिकार इंस्टॉल केला आहे. आपल्या सुरक्षित नेटवर्क रहदारीचे परीक्षण केले जाऊ शकते किंवा ती सुधारली जाऊ शकते."</string> <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"आपल्या संस्थेने आपल्या कार्य प्रोफाइलवर प्रमाणपत्र अधिकार इंस्टॉल केला आहे. आपल्या सुरक्षित नेटवर्क रहदारीचे परीक्षण केले जाऊ शकते किंवा ती सुधारली जाऊ शकते."</string> <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"या डिव्हाइसवर प्रमाणपत्र अधिकार इंस्टॉल केला आहे. आपल्या सुरक्षित नेटवर्क रहदारीचे परीक्षण केले जाऊ शकते किंवा ती सुधारली जाऊ शकते."</string> - <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"आपल्या प्रशासकाने नेटवर्क लॉगिंग चालू केले आहे, जे आपल्या डिव्हाइसवरील रहदारीचे परीक्षण करते."</string> + <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"आपल्या प्रशासकाने नेटवर्क लॉगिंग सुरू केले आहे, जे आपल्या डिव्हाइसवरील रहदारीचे परीक्षण करते."</string> <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"तुम्ही <xliff:g id="VPN_APP">%1$s</xliff:g> शी कनेक्ट केले आहे, जे ईमेल, अॅप्स आणि वेबसाइटसहित आपल्या नेटवर्क क्रिया मॉनिटर करू शकते."</string> <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"तुम्ही <xliff:g id="VPN_APP_0">%1$s</xliff:g> आणि <xliff:g id="VPN_APP_1">%2$s</xliff:g> शी कनेक्ट केले आहे, जे ईमेल, अॅप्स आणि वेबसाइटसहित आपल्या नेटवर्क क्रिया मॉनिटर करू शकते."</string> <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"तुमचे कार्य प्रोफाइल <xliff:g id="VPN_APP">%1$s</xliff:g> शी कनेक्ट केले आहे, जे ईमेल, अॅप्स आणि वेबसाइटसह आपल्या नेटवर्क क्रियाकलापाचे परीक्षण करू शकते."</string> @@ -567,7 +565,7 @@ <string name="monitoring_description_vpn_settings" msgid="5264167033247632071">"VPN सेटिंग्ज उघडा"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="7107390013344435439">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="8329781950135541003">"विश्वासू क्रेडेंशियल उघडा"</string> - <string name="monitoring_description_network_logging" msgid="577305979174002252">"आपल्या प्रशासकाने नेटवर्क लॉगिंग चालू केले आहे, जे आपल्या डिव्हाइसवरील रहदारीचे निरीक्षण करते.\n\nअधिक माहितीसाठी आपल्या प्रशासकाशी संपर्क साधा."</string> + <string name="monitoring_description_network_logging" msgid="577305979174002252">"आपल्या प्रशासकाने नेटवर्क लॉगिंग सुरू केले आहे, जे आपल्या डिव्हाइसवरील रहदारीचे निरीक्षण करते.\n\nअधिक माहितीसाठी आपल्या प्रशासकाशी संपर्क साधा."</string> <string name="monitoring_description_vpn" msgid="1685428000684586870">"तुम्ही VPN कनेक्शन सेट करण्यासाठी अॅपला परवानगी दिली.\n\nहा अॅप ईमेल, अॅप्स आणि वेबसाइटसह, तुमच्या डिव्हाइस आणि नेटवर्क ॲक्टिव्हिटीचे परीक्षण करू शकतो."</string> <string name="monitoring_description_vpn_profile_owned" msgid="4964237035412372751">"तुमचे कार्य प्रोफाइल <xliff:g id="ORGANIZATION">%1$s</xliff:g> द्वारे व्यवस्थापित केले जाते.\n\nतुमचा प्रशासक ईमेल, अॅप्स आणि वेबसाइटसह आपल्या नेटवर्क ॲक्टिव्हिटीचे निरीक्षण करण्यास सक्षम आहे.\n\nअधिक माहितीसाठी आपल्या प्रशासकाशी संपर्क साधा.\n\nतुम्ही VPN शी देखील कनेक्ट आहात, जे आपल्या नेटवर्क ॲक्टिव्हिटीचे निरीक्षण करू शकते."</string> <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string> @@ -608,7 +606,7 @@ <string name="screen_pinning_start" msgid="5695091877402422575">"स्क्रीन पिन केला"</string> <string name="screen_pinning_exit" msgid="5114993350662745840">"स्क्रीन अनपिन केला"</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> लपवायचे?"</string> - <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"तुम्ही सेटिंग्जमध्ये ते पुढील वेळी चालू कराल तेव्हा ते पुन्हा दिसेल."</string> + <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"तुम्ही सेटिंग्जमध्ये ते पुढील वेळी सुरू कराल तेव्हा ते पुन्हा दिसेल."</string> <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"लपवा"</string> <string name="stream_voice_call" msgid="7468348170702375660">"कॉल करा"</string> <string name="stream_system" msgid="7663148785370565134">"सिस्टम"</string> @@ -638,7 +636,7 @@ <string name="output_title" msgid="3938776561655668350">"मीडिया आउटपुट"</string> <string name="output_calls_title" msgid="7085583034267889109">"फोन कॉल आउटपुट"</string> <string name="output_none_found" msgid="5488087293120982770">"कोणतीही डिव्हाइस सापडली नाहीत"</string> - <string name="output_none_found_service_off" msgid="935667567681386368">"कोणतीही डिव्हाइस सापडली नाहीत. <xliff:g id="SERVICE">%1$s</xliff:g> चालू करून पाहा"</string> + <string name="output_none_found_service_off" msgid="935667567681386368">"कोणतीही डिव्हाइस सापडली नाहीत. <xliff:g id="SERVICE">%1$s</xliff:g> सुरू करून पाहा"</string> <string name="output_service_bt" msgid="4315362133973911687">"ब्लूटूथ"</string> <string name="output_service_wifi" msgid="9003667810868222134">"वाय-फाय"</string> <string name="output_service_bt_wifi" msgid="7186882540475524124">"ब्लूटूथ आणि वाय-फाय"</string> @@ -665,7 +663,7 @@ <string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"हॉटस्पॉट"</string> <string name="accessibility_managed_profile" msgid="4703836746209377356">"कार्य प्रोफाईल"</string> <string name="tuner_warning_title" msgid="7721976098452135267">"सर्वांसाठी नाही तर काहींसाठी मजेदार असू शकते"</string> - <string name="tuner_warning" msgid="1861736288458481650">"सिस्टम UI ट्युनर आपल्याला Android वापरकर्ता इंटरफेस ट्विक आणि कस्टमाइझ करण्याचे अनेक प्रकार देते. ही प्रयोगात्मक वैशिष्ट्ये बदलू शकतात, खंडित होऊ शकतात किंवा भविष्यातील रिलीज मध्ये कदाचित दिसणार नाहीत. सावधगिरी बाळगून पुढे सुरु ठेवा."</string> + <string name="tuner_warning" msgid="1861736288458481650">"सिस्टम UI ट्युनर आपल्याला Android वापरकर्ता इंटरफेस ट्विक आणि कस्टमाइझ करण्याचे अनेक प्रकार देते. ही प्रयोगात्मक वैशिष्ट्ये बदलू शकतात, खंडित होऊ शकतात किंवा भविष्यातील रिलीज मध्ये कदाचित दिसणार नाहीत. सावधगिरी बाळगून पुढे सुरू ठेवा."</string> <string name="tuner_persistent_warning" msgid="230466285569307806">"ही प्रयोगात्मक वैशिष्ट्ये बदलू शकतात, खंडित होऊ शकतात किंवा भविष्यातील रिलीज मध्ये कदाचित दिसणार नाहीत."</string> <string name="got_it" msgid="477119182261892069">"समजले"</string> <string name="tuner_toast" msgid="3812684836514766951">"अभिनंदन! सिस्टम UI ट्युनर सेटिंग्जमध्ये जोडले गेले आहे"</string> @@ -678,14 +676,14 @@ <string name="show_brightness" msgid="6700267491672470007">"द्रुत सेटिंग्जमध्ये चमक दर्शवा"</string> <string name="experimental" msgid="3549865454812314826">"प्रायोगिक"</string> <string name="enable_bluetooth_title" msgid="866883307336662596">"ब्लूटूथ सुरू करायचे?"</string> - <string name="enable_bluetooth_message" msgid="6740938333772779717">"तुमचा कीबोर्ड तुमच्या टॅबलेटसह कनेक्ट करण्यासाठी, तुम्ही प्रथम ब्लूटूथ चालू करणे आवश्यक आहे."</string> - <string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"चालू करा"</string> + <string name="enable_bluetooth_message" msgid="6740938333772779717">"तुमचा कीबोर्ड तुमच्या टॅबलेटसह कनेक्ट करण्यासाठी, तुम्ही प्रथम ब्लूटूथ सुरू करणे आवश्यक आहे."</string> + <string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"सुरू करा"</string> <string name="show_silently" msgid="5629369640872236299">"सूचना शांतपणे दर्शवा"</string> <string name="block" msgid="188483833983476566">"सर्व सूचना ब्लॉक करा"</string> <string name="do_not_silence" msgid="4982217934250511227">"शांत करू नका"</string> <string name="do_not_silence_block" msgid="4361847809775811849">"शांत किंवा अवरोधित करू नका"</string> <string name="tuner_full_importance_settings" msgid="1388025816553459059">"पॉवर सूचना नियंत्रणे"</string> - <string name="tuner_full_importance_settings_on" msgid="917981436602311547">"चालू"</string> + <string name="tuner_full_importance_settings_on" msgid="917981436602311547">"सुरू"</string> <string name="tuner_full_importance_settings_off" msgid="5580102038749680829">"बंद"</string> <string name="power_notification_controls_description" msgid="1334963837572708952">"पॉवर सूचना नियंत्रणांच्या साहाय्याने तुम्ही अॅप सूचनांसाठी 0 ते 5 असे महत्त्व स्तर सेट करू शकता. \n\n"<b>"स्तर 5"</b>" \n- सूचना सूचीच्या शीर्षस्थानी दाखवा \n- फुल स्क्रीन व्यत्ययास अनुमती द्या \n- नेहमी डोकावून पहा \n\n"<b>"स्तर 4"</b>\n" - फुल स्क्रीन व्यत्ययास प्रतिबंधित करा \n- नेहमी डोकावून पहा \n\n"<b>"स्तर 3"</b>" \n- फुल स्क्रीन व्यत्ययास प्रतिबंधित करा \n- कधीही डोकावून पाहू नका \n\n"<b>"स्तर 2"</b>" \n- फुल स्क्रीन व्यत्ययास प्रतिबंधित करा \n- कधीही डोकावून पाहू नका \n- कधीही ध्वनी किंवा व्हायब्रेट करू नका \n\n"<b>"स्तर 1"</b>\n"- फुल स्क्रीन व्यत्ययास प्रतिबंधित करा \n- कधीही डोकावून पाहू नका \n- कधीही ध्वनी किंवा व्हायब्रेट करू नका \n- लॉक स्क्रीन आणि स्टेटस बार मधून लपवा \n- सूचना सूचीच्या तळाशी दर्शवा \n\n"<b>"स्तर 0"</b>" \n- अॅपमधील सर्व सूचना ब्लॉक करा"</string> <string name="notification_header_default_channel" msgid="225454696914642444">"सूचना"</string> @@ -921,7 +919,7 @@ <string name="pip_skip_to_prev" msgid="3742589641443049237">"डावलून मागे जा"</string> <string name="thermal_shutdown_title" msgid="2702966892682930264">"तापल्यामुळे फोन बंद झाला"</string> <string name="thermal_shutdown_message" msgid="7432744214105003895">"तुमचा फोन आता व्यवस्थित सुरू आहे"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"तुमचा फोन खूप तापलाय, म्हणून तो थंड होण्यासाठी बंद झाला आहे. तुमचा फोन आता व्यवस्थित सुरू आहे.\n\nतुम्ही असे केल्यास तुमचा फोन खूप तापेल:\n •संसाधन केंद्रित अॅप वापरणे (गेमिंग, व्हिडिओ किंवा नेव्हिगेशन अॅप यासारखे)\n •मोठ्या फायली डाउनलोड किंवा अपलोड करणे\n •उच्च तापमानामध्ये तुमचा फोन वापरणे"</string> + <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"तुमचा फोन खूप तापलाय, म्हणून तो थंड होण्यासाठी बंद झाला आहे. तुमचा फोन आता व्यवस्थित सुरू आहे.\n\nतुम्ही असे केल्यास तुमचा फोन खूप तापेल:\n •संसाधन केंद्रित अॅप वापरणे (गेमिंग, व्हिडिओ किंवा नेव्हिगेशन अॅप यासारखे)\n •मोठ्या फाइल डाउनलोड किंवा अपलोड करणे\n •उच्च तापमानामध्ये तुमचा फोन वापरणे"</string> <string name="high_temp_title" msgid="2218333576838496100">"फोन ऊष्ण होत आहे"</string> <string name="high_temp_notif_message" msgid="163928048626045592">"फोन थंड होत असताना काही वैशिष्ट्ये मर्यादित असतात"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"तुमचा फोन स्वयंचलितपणे थंड होईल. तुम्ही अद्यापही तुमचा फोन वापरू शकता परंतु तो कदाचित धीमेपणे कार्य करेल.\n\nतुमचा फोन एकदा थंड झाला की, तो सामान्यपणे कार्य करेल."</string> @@ -960,9 +958,9 @@ <string name="wifi_is_off" msgid="5389597396308001471">"वाय-फाय बंद आहे"</string> <string name="bt_is_off" msgid="7436344904889461591">"ब्लूटूथ बंद आहे"</string> <string name="dnd_is_off" msgid="3185706903793094463">"व्यत्यय आणू नका बंद आहे"</string> - <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"व्यत्यय आणू नका एका <xliff:g id="ID_1">%s</xliff:g> स्वयंचलित नियमाने चालू केले."</string> - <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"व्यत्यय आणू नका (<xliff:g id="ID_1">%s</xliff:g>) ॲपने चालू केले."</string> - <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"व्यत्यय आणू नका एका स्वयंचलित नियमाने किंवा ॲपने चालू केले."</string> + <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"व्यत्यय आणू नका एका <xliff:g id="ID_1">%s</xliff:g> स्वयंचलित नियमाने सुरू केले."</string> + <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"व्यत्यय आणू नका (<xliff:g id="ID_1">%s</xliff:g>) ॲपने सुरू केले."</string> + <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"व्यत्यय आणू नका एका स्वयंचलित नियमाने किंवा ॲपने सुरू केले."</string> <string name="qs_dnd_until" msgid="7844269319043747955">"<xliff:g id="ID_1">%s</xliff:g> पर्यंत"</string> <string name="qs_dnd_keep" msgid="3829697305432866434">"ठेवा"</string> <string name="qs_dnd_replace" msgid="7712119051407052689">"पुनर्स्थित करा"</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"शीर्षक नाही"</string> <string name="restart_button_description" msgid="6916116576177456480">"हे अॅप रीस्टार्ट करण्यासाठी आणि फुल स्क्रीन करण्यासाठी टॅप करा."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> बबलसाठी सेटिंग्ज"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"ओव्हरफ्लो"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"स्टॅकमध्ये परत जोडा"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"व्यवस्थापित करा"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g> कडून <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> आणि आणखी <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> कडून <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> @@ -1039,10 +1035,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"सर्व नियंत्रणांची सूची लोड करता आली नाही."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"इतर"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"डिव्हाइस नियंत्रणांमध्ये जोडा"</string> - <!-- no translation found for controls_dialog_ok (2770230012857881822) --> - <skip /> - <!-- no translation found for controls_dialog_message (342066938390663844) --> - <skip /> + <string name="controls_dialog_ok" msgid="2770230012857881822">"जोडा"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"<xliff:g id="APP">%s</xliff:g> ने सुचवले आहे"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"नियंत्रणे अपडेट केली आहेत"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"पिनमध्ये अक्षरांचा किंवा चिन्हांचा समावेश असतो"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"<xliff:g id="DEVICE">%s</xliff:g> ची पडताळणी करा"</string> diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index e39448067aa5..94b5ad356f89 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Ketepikan tangkapan skrin"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Pratonton tangkapan skrin"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Perakam Skrin"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Memproses rakaman skrin"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Pemberitahuan breterusan untuk sesi rakaman skrin"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Mula Merakam?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Semasa merakam, Sistem Android dapat menangkap mana-mana maklumat sensitif yang kelihatan pada skrin anda atau yang dimainkan pada peranti anda. Ini termasuklah kata laluan, maklumat pembayaran, foto, mesej dan audio."</string> @@ -390,7 +389,7 @@ <string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Wi-Fi tidak disambungkan"</string> <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Kecerahan"</string> <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="2325362583903258677">"AUTO"</string> - <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Terbalikkan warna"</string> + <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Songsangkan warna"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Mod pembetulan warna"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Lagi tetapan"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Selesai"</string> @@ -511,8 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Kosongkan semua"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Urus"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Sejarah"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Masuk"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Pemberitahuan senyap"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Pemberitahuan memaklumi"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Perbualan"</string> @@ -588,7 +586,7 @@ <string name="accessibility_volume_settings" msgid="1458961116951564784">"Tetapan bunyi"</string> <string name="accessibility_volume_expand" msgid="7653070939304433603">"Kembangkan"</string> <string name="accessibility_volume_collapse" msgid="2746845391013829996">"Runtuhkan"</string> - <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Kapsyen media automatik"</string> + <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Sari kata media automatik"</string> <string name="accessibility_volume_close_odi_captions_tip" msgid="8924753283621160480">"Petua sari kata"</string> <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Tindanan kapsyen"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"dayakan"</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Tiada tajuk"</string> <string name="restart_button_description" msgid="6916116576177456480">"Ketik untuk memulakan semula apl ini dan menggunakan skrin penuh."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Tetapan untuk gelembung <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Limpahan"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Tambah kembali pada tindanan"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Urus"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> daripada <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> daripada <xliff:g id="APP_NAME">%2$s</xliff:g> dan <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> lagi"</string> diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml index 8a0a615e862a..58160fc22825 100644 --- a/packages/SystemUI/res/values-my/strings.xml +++ b/packages/SystemUI/res/values-my/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"ဖန်သားပြင်ဓာတ်ပုံ ပယ်ရန်"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"ဖန်သားပြင်ဓာတ်ပုံ အစမ်းကြည့်ရှုခြင်း"</string> <string name="screenrecord_name" msgid="2596401223859996572">"ဖန်သားပြင် ရိုက်ကူးမှု"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"ဖန်သားပြင်ရိုက်ကူးနေသည်"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"ဖန်သားပြင် ရိုက်ကူးသည့် စက်ရှင်အတွက် ဆက်တိုက်လာနေသော အကြောင်းကြားချက်"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"စတင် ရိုက်ကူးမလား။"</string> <string name="screenrecord_description" msgid="1123231719680353736">"ရိုက်ကူးနေစဉ်အတွင်း Android စနစ်သည် သင့်မျက်နှာပြင်ပေါ်တွင် မြင်နိုင်သော သို့မဟုတ် သင့်စက်ပစ္စည်းတွင် ဖွင့်ထားသော အရေးကြီးသည့် အချက်အလက်မှန်သမျှကို ရိုက်ကူးနိုင်သည်။ ၎င်းတွင် စကားဝှက်များ၊ ငွေပေးချေမှု အချက်အလက်၊ ဓာတ်ပုံများ၊ မက်ဆေ့ဂျ်များနှင့် အသံများ ပါဝင်သည်။"</string> @@ -511,8 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"အားလုံး ဖယ်ရှားရန်"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"စီမံရန်"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"မှတ်တမ်း"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"အဝင်"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"အကြောင်းကြားချက်များကို အသံတိတ်ခြင်း"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"အကြောင်းကြားချက်များကို သတိပေးခြင်း"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"စကားဝိုင်းများ"</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"ခေါင်းစဉ် မရှိပါ"</string> <string name="restart_button_description" msgid="6916116576177456480">"ဤအက်ပ်ကို ပြန်စတင်ပြီး မျက်နှာပြင်အပြည့်လုပ်ရန် တို့ပါ။"</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> ပူဖောင်းကွက်အတွက် ဆက်တင်များ"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"အပိုများပြရန်"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"ပူဖေါင်းတန်းသို့ ပြန်ထည့်ရန်"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"စီမံရန်"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g> မှ <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> နှင့် နောက်ထပ် <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> ခုမှ <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index 2c57ed2ce0be..0c21879d132f 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Avvis skjermdumpen"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Forhåndsvisning av skjermdump"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Skjermopptaker"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Behandler skjermopptaket"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Vedvarende varsel for et skjermopptak"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Vil du starte opptaket?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Under opptak kan Android-systemet registrere all sensitiv informasjon som er synlig på skjermen eller spilles av på enheten. Dette inkluderer passord, betalingsinformasjon, bilder, meldinger og lyd."</string> @@ -511,8 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Fjern alt"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Administrer"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Logg"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Innkommende"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Lydløse varsler"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Varsler med varsling"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Samtaler"</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Ingen tittel"</string> <string name="restart_button_description" msgid="6916116576177456480">"Trykk for å starte denne appen på nytt og vise den i fullskjerm."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Innstillinger for <xliff:g id="APP_NAME">%1$s</xliff:g>-bobler"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Overflyt"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Legg tilbake i stabelen"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Administrer"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> fra <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> fra <xliff:g id="APP_NAME">%2$s</xliff:g> og <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> flere"</string> diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index 8d0adc0b4f2d..6a0423c7fa30 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"स्क्रिनसट हटाउनुहोस्"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"स्क्रिनसटको पूर्वावलोकन"</string> <string name="screenrecord_name" msgid="2596401223859996572">"स्क्रिन रेकर्डर"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"स्क्रिन रेकर्डिङको प्रक्रिया अघि बढाइँदै"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"कुनै स्क्रिन रेकर्ड गर्ने सत्रका लागि चलिरहेको सूचना"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"रेकर्ड गर्न थाल्ने हो?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"रेकर्ड गर्दा, Android प्रणालीले तपाईंको स्क्रिनमा देखिने वा तपाईंको यन्त्रमा प्ले गरिने सबै संवेदनशील जानकारी रेकर्ड गर्न सक्छ। यो जानकारीमा पासवर्ड, भुक्तानीसम्बन्धी जानकारी, फोटो, सन्देश र अडियो समावेश हुन्छ।"</string> @@ -511,8 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"सबै हटाउनुहोस्"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"व्यवस्थित गर्नुहोस्"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"इतिहास"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"हालसालै प्राप्त भएका सूचनाहरू"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"मौन सूचनाहरू"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"कम्पन वा आवाजसहितका सूचनाहरू"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"वार्तालापहरू"</string> @@ -971,7 +969,7 @@ <string name="mobile_data_disable_title" msgid="5366476131671617790">"मोबाइल डेटा निष्क्रिय पार्ने हो?"</string> <string name="mobile_data_disable_message" msgid="8604966027899770415">"तपाईं <xliff:g id="CARRIER">%s</xliff:g> मार्फत डेटा वा इन्टरनेट प्रयोग गर्न सक्नुहुने छैन। Wi-Fi मार्फत मात्र इन्टरनेट उपलब्ध हुने छ।"</string> <string name="mobile_data_disable_message_default_carrier" msgid="6496033312431658238">"तपाईंको सेवा प्रदायक"</string> - <string name="touch_filtered_warning" msgid="8119511393338714836">"कुनै अनुप्रयोगको कारणले अनुमतिसम्बन्धी अनुरोध बुझ्न गाह्रो भइरहेकोले सेटिङहरूले तपाईंको प्रतिक्रिया प्रमाणित गर्न सक्दैनन्।"</string> + <string name="touch_filtered_warning" msgid="8119511393338714836">"कुनै एपको कारणले अनुमतिसम्बन्धी अनुरोध बुझ्न गाह्रो भइरहेकोले सेटिङहरूले तपाईंको प्रतिक्रिया प्रमाणित गर्न सक्दैनन्।"</string> <string name="slice_permission_title" msgid="3262615140094151017">"<xliff:g id="APP_0">%1$s</xliff:g> लाई <xliff:g id="APP_2">%2$s</xliff:g> का स्लाइसहरू देखाउन अनुमति दिने हो?"</string> <string name="slice_permission_text_1" msgid="6675965177075443714">"- यसले <xliff:g id="APP">%1$s</xliff:g> बाट जानकारी पढ्न सक्छ"</string> <string name="slice_permission_text_2" msgid="6758906940360746983">"- यसले <xliff:g id="APP">%1$s</xliff:g> भित्र कारबाही गर्न सक्छ"</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"शीर्षक छैन"</string> <string name="restart_button_description" msgid="6916116576177456480">"यो एप पुनः सुरु गर्न ट्याप गर्नुहोस् र फुल स्क्रिन मोडमा जानुहोस्।"</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> का बबलसम्बन्धी सेटिङहरू"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"ओभरफ्लो देखाउनुहोस्"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"स्ट्याकमा फेरि थप्नुहोस्"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"व्यवस्थापन गर्नुहोस्"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g> को <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> का <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> र थप <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string> @@ -1039,10 +1035,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"सबै नियन्त्रणहरूको सूची लोड गर्न सकिएन।"</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"अन्य"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"यन्त्र नियन्त्रण गर्ने विजेटहरूको सूचीमा थप्नुहोस्"</string> - <!-- no translation found for controls_dialog_ok (2770230012857881822) --> - <skip /> - <!-- no translation found for controls_dialog_message (342066938390663844) --> - <skip /> + <string name="controls_dialog_ok" msgid="2770230012857881822">"थप्नुहोस्"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"<xliff:g id="APP">%s</xliff:g> ले सिफारिस गरेको"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"नियन्त्रण सुविधाहरू अद्यावधिक गरिए"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN मा अक्षर वा चिन्हहरू समाविष्ट हुन्छन्"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"<xliff:g id="DEVICE">%s</xliff:g> पुष्टि गर्नुहोस्"</string> diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml index 13798af1ad8f..ef753b8c097d 100644 --- a/packages/SystemUI/res/values-or/strings.xml +++ b/packages/SystemUI/res/values-or/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"ସ୍କ୍ରିନସଟ୍ ଖାରଜ କରନ୍ତୁ"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"ସ୍କ୍ରିନସଟର ପ୍ରିଭ୍ୟୁ"</string> <string name="screenrecord_name" msgid="2596401223859996572">"ସ୍କ୍ରିନ୍ ରେକର୍ଡର୍"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"ସ୍କ୍ରିନ ରେକର୍ଡିଂର ପ୍ରକ୍ରିୟାକରଣ"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"ଏକ ସ୍କ୍ରିନ୍ ରେକର୍ଡ୍ ସେସନ୍ ପାଇଁ ଚାଲୁଥିବା ବିଜ୍ଞପ୍ତି"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"ରେକର୍ଡିଂ ଆରମ୍ଭ କରିବେ?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"ରେକର୍ଡିଂ ସମୟରେ, Android ସିଷ୍ଟମ୍ ଆପଣଙ୍କ ସ୍କ୍ରିନରେ ଦେଖାଯାଉଥିବା ବା ଆପଣଙ୍କ ଡିଭାଇସରେ ଚାଲୁଥିବା ଯେ କୌଣସି ସମ୍ବେଦନଶୀଳ ସୂଚନାକୁ କ୍ୟାପଚର୍ କରିପାରିବ। ଏଥିରେ ପାସୱାର୍ଡ, ପେମେଣ୍ଟ ସୂଚନା, ଫଟୋ, ମେସେଜ ଏବଂ ଅଡିଓ ଅନ୍ତର୍ଭୁକ୍ତ।"</string> @@ -511,8 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"ସମସ୍ତ ଖାଲି କରନ୍ତୁ"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"ପରିଚାଳନା କରନ୍ତୁ"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"ଇତିହାସ"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"ଇନକମିଂ"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"ନୀରବ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"ଆଲର୍ଟ କରିବା ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"ବାର୍ତ୍ତାଳାପଗୁଡ଼ିକ"</string> @@ -977,7 +975,7 @@ <string name="slice_permission_text_2" msgid="6758906940360746983">"- ଏହା <xliff:g id="APP">%1$s</xliff:g> ଭିତରେ କାମ କରିପାରିବ"</string> <string name="slice_permission_checkbox" msgid="4242888137592298523">"ଯେକୌଣସି ଆପ୍ରେ ସ୍ଲାଇସ୍କୁ ଦେଖାଇବା ପାଇଁ <xliff:g id="APP">%1$s</xliff:g>କୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string> <string name="slice_permission_allow" msgid="6340449521277951123">"ଅନୁମତି ଦିଅନ୍ତୁ"</string> - <string name="slice_permission_deny" msgid="6870256451658176895">"ଅସ୍ଵୀକାର କରନ୍ତୁ"</string> + <string name="slice_permission_deny" msgid="6870256451658176895">"ଅଗ୍ରାହ୍ୟ କରନ୍ତୁ"</string> <string name="auto_saver_title" msgid="6873691178754086596">"ବ୍ୟାଟେରୀ ସେଭର୍ ଅନ୍ ହେବାର ସମୟ ସେଟ୍ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ"</string> <string name="auto_saver_text" msgid="3214960308353838764">"ବ୍ୟାଟେରୀ ସରିବାକୁ ଥିବା ସମୟରେ ଚାଲୁ କରନ୍ତୁ"</string> <string name="no_auto_saver_action" msgid="7467924389609773835">"ନାହିଁ, ଥାଉ"</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"କୌଣସି ଶୀର୍ଷକ ନାହିଁ"</string> <string name="restart_button_description" msgid="6916116576177456480">"ଏହି ଆପ୍କୁ ରିଷ୍ଟାର୍ଟ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ ଏବଂ ଫୁଲ୍ସ୍କ୍ରିନ୍କୁ ଯାଆନ୍ତୁ।"</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> ବବଲ୍ଗୁଡ଼ିକ ପାଇଁ ସେଟିଂସ୍"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"ଓଭରଫ୍ଲୋ"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"ଷ୍ଟାକରେ ପୁଣି ଯୋଗ କରନ୍ତୁ"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"ପରିଚାଳନା କରନ୍ତୁ"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g>ରୁ <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> ଏବଂ ଅଧିକ <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>ଟିରୁ <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> @@ -1017,7 +1013,7 @@ <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"ବାର୍ତ୍ତାଳାପ ବିଭାଗର ଶୀର୍ଷରେ ଦେଖାନ୍ତୁ"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"ଲକ୍ ସ୍କ୍ରିନରେ ପ୍ରୋଫାଇଲ୍ ଛବି ଦେଖାନ୍ତୁ"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"ଆପଗୁଡ଼ିକ ଉପରେ ଫ୍ଲୋଟିଂ ବବଲ୍ ପରି ଦେଖାଯିବ"</string> - <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"\'ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\' ମୋଡରେ ବାଧା ଉପୁଯାଇପାରିବ"</string> + <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"\'ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\' ମୋଡରେ ବାଧା"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"ବୁଝିଗଲି"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"ମ୍ୟାଗ୍ନିଫିକେସନ୍ ଓଭର୍ଲେ ୱିଣ୍ଡୋ"</string> <string name="magnification_window_title" msgid="4863914360847258333">"ମ୍ୟାଗ୍ନିଫିକେସନ୍ ୱିଣ୍ଡୋ"</string> @@ -1039,10 +1035,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"ସବୁ ନିୟନ୍ତ୍ରଣର ତାଲିକା ଲୋଡ୍ କରିପାରିଲା ନାହିଁ।"</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"ଅନ୍ୟ"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"ଡିଭାଇସ୍ ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକରେ ଯୋଗ କରନ୍ତୁ"</string> - <!-- no translation found for controls_dialog_ok (2770230012857881822) --> - <skip /> - <!-- no translation found for controls_dialog_message (342066938390663844) --> - <skip /> + <string name="controls_dialog_ok" msgid="2770230012857881822">"ଯୋଗ କରନ୍ତୁ"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"<xliff:g id="APP">%s</xliff:g> ଦ୍ଵାରା ପ୍ରସ୍ତାବିତ"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକ ଅପଡେଟ୍ କରାଯାଇଛି"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PINରେ ଅକ୍ଷର କିମ୍ୱା ସଙ୍କେତଗୁଡ଼ିକ ଥାଏ"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"<xliff:g id="DEVICE">%s</xliff:g> ଯାଞ୍ଚ କରନ୍ତୁ"</string> diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index 0981f3c3bcd3..b9db02a48180 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਖਾਰਜ ਕਰੋ"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਪੂਰਵ-ਝਲਕ"</string> <string name="screenrecord_name" msgid="2596401223859996572">"ਸਕ੍ਰੀਨ ਰਿਕਾਰਡਰ"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"ਸਕ੍ਰੀਨ ਰਿਕਾਰਡਿੰਗ ਜਾਰੀ ਹੈ"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"ਕਿਸੇ ਸਕ੍ਰੀਨ ਰਿਕਾਰਡ ਸੈਸ਼ਨ ਲਈ ਚੱਲ ਰਹੀ ਸੂਚਨਾ"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"ਕੀ ਰਿਕਾਰਡਿੰਗ ਸ਼ੁਰੂ ਕਰਨੀ ਹੈ?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"ਰਿਕਾਰਡਿੰਗ ਕਰਨ ਵੇਲੇ, Android ਸਿਸਟਮ ਕੋਈ ਵੀ ਅਜਿਹੀ ਸੰਵੇਦਨਸ਼ੀਲ ਜਾਣਕਾਰੀ ਕੈਪਚਰ ਕਰ ਸਕਦਾ ਹੈ ਜੋ ਤੁਹਾਡੀ ਸਕ੍ਰੀਨ \'ਤੇ ਦਿਖਣਯੋਗ ਹੈ ਜਾਂ ਤੁਹਾਡੇ ਡੀਵਾਈਸ \'ਤੇ ਚਲਾਈ ਜਾਂਦੀ ਹੈ। ਇਸ ਵਿੱਚ ਪਾਸਵਰਡ, ਭੁਗਤਾਨ ਵੇਰਵੇ, ਫ਼ੋਟੋਆਂ, ਸੁਨੇਹੇ ਅਤੇ ਆਡੀਓ ਸ਼ਾਮਲ ਹਨ।"</string> @@ -358,7 +357,7 @@ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="3003338571871392293">"ਸੁਣਨ ਦੇ ਸਾਧਨ"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="3882884317600669650">"ਚਾਲੂ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…"</string> <string name="quick_settings_brightness_label" msgid="680259653088849563">"ਚਮਕ"</string> - <string name="quick_settings_rotation_unlocked_label" msgid="2359922767950346112">"ਸਵੈ-ਘੁੰਮਾਓ"</string> + <string name="quick_settings_rotation_unlocked_label" msgid="2359922767950346112">"ਸਵੈ-ਘੁਮਾਓ"</string> <string name="accessibility_quick_settings_rotation" msgid="4800050198392260738">"ਸਕ੍ਰੀਨ ਨੂੰ ਆਪਣੇ ਆਪ ਘੁੰਮਾਓ"</string> <string name="accessibility_quick_settings_rotation_value" msgid="2916484894750819251">"<xliff:g id="ID_1">%s</xliff:g> ਮੋਡ"</string> <string name="quick_settings_rotation_locked_label" msgid="4420863550666310319">"ਰੋਟੇਸ਼ਨ ਲਾਕ ਕੀਤੀ"</string> @@ -369,7 +368,7 @@ <string name="quick_settings_location_off_label" msgid="7923929131443915919">"ਨਿਰਧਾਰਿਤ ਸਥਾਨ ਬੰਦ"</string> <string name="quick_settings_media_device_label" msgid="8034019242363789941">"ਮੀਡੀਆ ਡੀਵਾਈਸ"</string> <string name="quick_settings_rssi_label" msgid="3397615415140356701">"RSSI"</string> - <string name="quick_settings_rssi_emergency_only" msgid="7499207215265078598">"ਕੇਵਲ ਐਮਰਜੈਂਸੀ ਕਾਲਾਂ"</string> + <string name="quick_settings_rssi_emergency_only" msgid="7499207215265078598">"ਸਿਰਫ਼ ਸੰਕਟਕਾਲੀਨ ਕਾਲਾਂ"</string> <string name="quick_settings_settings_label" msgid="2214639529565474534">"ਸੈਟਿੰਗਾਂ"</string> <string name="quick_settings_time_label" msgid="3352680970557509303">"ਸਮਾਂ"</string> <string name="quick_settings_user_label" msgid="1253515509432672496">"ਮੈਂ"</string> @@ -511,8 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"ਸਭ ਕਲੀਅਰ ਕਰੋ"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"ਪ੍ਰਬੰਧਨ ਕਰੋ"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"ਇਤਿਹਾਸ"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"ਇਨਕਮਿੰਗ"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"ਸ਼ਾਂਤ ਸੂਚਨਾਵਾਂ"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"ਸੁਚੇਤ ਕਰਨ ਵਾਲੀਆਂ ਸੂਚਨਾਵਾਂ"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"ਗੱਲਾਂਬਾਤਾਂ"</string> @@ -854,7 +852,7 @@ <string name="right_keycode" msgid="2480715509844798438">"ਸੱਜਾ ਕੀ-ਕੋਡ"</string> <string name="left_icon" msgid="5036278531966897006">"ਖੱਬਾ ਪ੍ਰਤੀਕ"</string> <string name="right_icon" msgid="1103955040645237425">"ਸੱਜਾ ਪ੍ਰਤੀਕ"</string> - <string name="drag_to_add_tiles" msgid="8933270127508303672">"ਟਾਇਲਾਂ ਸ਼ਾਮਲ ਕਰਨ ਲਈ ਫੜ੍ਹ ਕੇ ਰੱਖੋ ਅਤੇ ਘਸੀਟੋ"</string> + <string name="drag_to_add_tiles" msgid="8933270127508303672">"ਟਾਇਲਾਂ ਸ਼ਾਮਲ ਕਰਨ ਲਈ ਫੜ੍ਹ ਕੇ ਘਸੀਟੋ"</string> <string name="drag_to_rearrange_tiles" msgid="2143204300089638620">"ਟਾਇਲਾਂ ਨੂੰ ਮੁੜ-ਵਿਵਸਥਿਤ ਕਰਨ ਲਈ ਫੜ੍ਹ ਕੇ ਘਸੀਟੋ"</string> <string name="drag_to_remove_tiles" msgid="4682194717573850385">"ਹਟਾਉਣ ਲਈ ਇੱਥੇ ਘਸੀਟੋ"</string> <string name="drag_to_remove_disabled" msgid="933046987838658850">"ਤੁਹਾਨੂੰ ਘੱਟੋ-ਘੱਟ <xliff:g id="MIN_NUM_TILES">%1$d</xliff:g> ਟਾਇਲਾਂ ਦੀ ਲੋੜ ਪਵੇਗੀ"</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"ਕੋਈ ਸਿਰਲੇਖ ਨਹੀਂ"</string> <string name="restart_button_description" msgid="6916116576177456480">"ਇਸ ਐਪ ਨੂੰ ਮੁੜ-ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ ਅਤੇ ਪੂਰੀ-ਸਕ੍ਰੀਨ ਮੋਡ \'ਤੇ ਜਾਓ।"</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਬਬਲ ਲਈ ਸੈਟਿੰਗਾਂ"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"ਓਵਰਫ਼ਲੋ"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"ਸਟੈਕ ਵਿੱਚ ਵਾਪਸ ਸ਼ਾਮਲ ਕਰੋ"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"ਪ੍ਰਬੰਧਨ ਕਰੋ"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g> ਤੋਂ <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> ਅਤੇ <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> ਹੋਰਾਂ ਤੋਂ <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index e510b0e792f0..19d9a6e2bc0c 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Zamknij zrzut ekranu"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Podgląd zrzutu ekranu"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Nagrywanie ekranu"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Przetwarzam nagrywanie ekranu"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Stałe powiadomienie o sesji rejestrowania zawartości ekranu"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Rozpocząć nagrywanie?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Podczas nagrywania system Android może rejestrować wszelkie informacje poufne wyświetlane na ekranie lub odtwarzane na urządzeniu. Dotyczy to m.in. haseł, szczegółów płatności, zdjęć, wiadomości i odtwarzanych dźwięków."</string> @@ -419,7 +418,7 @@ <string name="quick_settings_cellular_detail_data_used" msgid="6798849610647988987">"Wykorzyst.: <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="1791389609409211628">"Limit <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="7957253810481086455">"Ostrzeżenie: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> - <string name="quick_settings_work_mode_label" msgid="2754212289804324685">"Profil do pracy"</string> + <string name="quick_settings_work_mode_label" msgid="2754212289804324685">"Profil służbowy"</string> <string name="quick_settings_night_display_label" msgid="8180030659141778180">"Podświetlenie nocne"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="3358706312129866626">"Włącz o zachodzie"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4063448287758262485">"Do wschodu słońca"</string> @@ -517,8 +516,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Usuń wszystkie"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Zarządzaj"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Historia"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Przychodzące"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Ciche powiadomienia"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Alerty"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Rozmowy"</string> @@ -659,7 +657,7 @@ <string name="show_demo_mode" msgid="3677956462273059726">"Pokaż tryb demonstracyjny"</string> <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string> <string name="status_bar_alarm" msgid="87160847643623352">"Alarm"</string> - <string name="status_bar_work" msgid="5238641949837091056">"Profil do pracy"</string> + <string name="status_bar_work" msgid="5238641949837091056">"Profil służbowy"</string> <string name="status_bar_airplane" msgid="4848702508684541009">"Tryb samolotowy"</string> <string name="add_tile" msgid="6239678623873086686">"Dodaj nazwę"</string> <string name="broadcast_tile" msgid="5224010633596487481">"Rozgłaszana nazwa"</string> @@ -669,7 +667,7 @@ <string name="alarm_template_far" msgid="3561752195856839456">"w: <xliff:g id="WHEN">%1$s</xliff:g>"</string> <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Szybkie ustawienia, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Hotspot"</string> - <string name="accessibility_managed_profile" msgid="4703836746209377356">"Profil do pracy"</string> + <string name="accessibility_managed_profile" msgid="4703836746209377356">"Profil służbowy"</string> <string name="tuner_warning_title" msgid="7721976098452135267">"Dobra zabawa, ale nie dla każdego"</string> <string name="tuner_warning" msgid="1861736288458481650">"Kalibrator System UI udostępnia dodatkowe sposoby dostrajania i dostosowywania interfejsu Androida. Te eksperymentalne funkcje mogą się zmienić, popsuć lub zniknąć w przyszłych wersjach. Zachowaj ostrożność."</string> <string name="tuner_persistent_warning" msgid="230466285569307806">"Te eksperymentalne funkcje mogą się zmienić, popsuć lub zniknąć w przyszłych wersjach. Zachowaj ostrożność."</string> @@ -1001,10 +999,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Bez tytułu"</string> <string name="restart_button_description" msgid="6916116576177456480">"Kliknij, by uruchomić tę aplikację ponownie i przejść w tryb pełnoekranowy."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Ustawienia dymków aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Przepełnienie"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Dodaj ponownie do stosu"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Zarządzaj"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> z aplikacji <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> z aplikacji <xliff:g id="APP_NAME">%2$s</xliff:g> i jeszcze <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index 8388b48cef25..ce8b05f47a8e 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Închideți captura de ecran"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Previzualizare a capturii de ecran"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Recorder pentru ecran"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Se procesează înregistrarea"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notificare în curs pentru o sesiune de înregistrare a ecranului"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Începeți înregistrarea?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"În timpul înregistrării, sistemul Android poate captura informațiile sensibile vizibile pe ecran sau redate pe dispozitiv. Aici sunt incluse parole, informații de plată, fotografii, mesaje și conținut audio."</string> @@ -514,8 +513,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Ștergeți toate notificările"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Gestionați"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Istoric"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Primite"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Notificări silențioase"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Notificări de alertare"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversații"</string> @@ -996,10 +994,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Fără titlu"</string> <string name="restart_button_description" msgid="6916116576177456480">"Atingeți ca să reporniți aplicația și să treceți în modul ecran complet."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Setări pentru baloanele <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Suplimentar"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Adăugați înapoi în stivă"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Gestionați"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de la <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de la <xliff:g id="APP_NAME">%2$s</xliff:g> și încă <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index 2832d89f8ce5..38d8874e02ea 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -88,9 +88,8 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Не удалось сделать скриншот: нет разрешения от приложения или организации."</string> <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Закрыть скриншот"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Предварительный просмотр скриншота"</string> - <string name="screenrecord_name" msgid="2596401223859996572">"Создание скриншотов"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_name" msgid="2596401223859996572">"Запись видео с экрана"</string> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Обработка записи с экрана…"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Текущее уведомление для записи видео с экрана"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Начать запись?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Во время записи система Android может получить доступ к конфиденциальной информации, которая видна на экране или воспроизводится на устройстве, в том числе к паролям, сведениям о платежах, фотографиям, сообщениям и аудиозаписям."</string> @@ -101,7 +100,7 @@ <string name="screenrecord_device_audio_and_mic_label" msgid="1831323771978646841">"Звук с устройства и микрофон"</string> <string name="screenrecord_start" msgid="330991441575775004">"Начать"</string> <string name="screenrecord_ongoing_screen_only" msgid="4459670242451527727">"Идет запись видео с экрана."</string> - <string name="screenrecord_ongoing_screen_and_audio" msgid="5351133763125180920">"Идет запись видео с экрана и звука."</string> + <string name="screenrecord_ongoing_screen_and_audio" msgid="5351133763125180920">"Идет запись видео с экрана и звука"</string> <string name="screenrecord_taps_label" msgid="1595690528298857649">"Показывать прикосновения к экрану"</string> <string name="screenrecord_stop_text" msgid="6549288689506057686">"Нажмите, чтобы остановить"</string> <string name="screenrecord_stop_label" msgid="72699670052087989">"Остановить"</string> @@ -517,8 +516,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Очистить все"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Настроить"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"История"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Входящие"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Беззвучные уведомления"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Оповещения"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Разговоры"</string> @@ -1001,10 +999,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Без названия"</string> <string name="restart_button_description" msgid="6916116576177456480">"Нажмите, чтобы перезапустить приложение и перейти в полноэкранный режим."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Настройки всплывающих чатов от приложения \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"."</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Дополнительное меню"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Добавить обратно в стек"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Настроить"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> из приложения \"<xliff:g id="APP_NAME">%2$s</xliff:g>\""</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> от приложения \"<xliff:g id="APP_NAME">%2$s</xliff:g>\" и ещё <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml index fb87a0b9ccae..abe2dc26b81e 100644 --- a/packages/SystemUI/res/values-si/strings.xml +++ b/packages/SystemUI/res/values-si/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"තිර රුව ඉවත ලන්න"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"තිර රූ පෙර දසුන"</string> <string name="screenrecord_name" msgid="2596401223859996572">"තිර රෙකෝඩරය"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"තිර පටිගත කිරීම සකසමින්"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"තිර පටිගත කිරීමේ සැසියක් සඳහා කෙරෙන දැනුම් දීම"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"පටිගත කිරීම ආරම්භ කරන්නද?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"පටිගත කරන අතරතුර, Android පද්ධතියට ඔබේ තිරයේ පෙනෙන හෝ ඔබේ උපාංගයේ වාදනය කරන ඕනෑම සංවේදී තොරතුරක් ග්රහණය කර ගැනීමට හැකිය. මෙයට මුරපද, ගෙවීම් තොරතුරු, ඡායාරූප, පණිවිඩ සහ ඕඩියෝ ඇතුළත් වේ."</string> @@ -511,8 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"සියල්ල හිස් කරන්න"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"කළමනාකරණය කරන්න"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"ඉතිහාසය"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"එන"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"නිහඬ දැනුම්දීම්"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"ඇඟවීමේ දැනුම් දීම්"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"සංවාද"</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"මාතෘකාවක් නැත"</string> <string name="restart_button_description" msgid="6916116576177456480">"මෙම යෙදුම යළි ඇරඹීමට සහ පූර්ණ තිරයට යාමට තට්ටු කරන්න"</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> බුබුළු සඳහා සැකසීම්"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"පිටාර යාම"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"අට්ටිය වෙත ආපසු එක් කරන්න"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"කළමනා කරන්න"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g> වෙතින් <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> වෙතින් <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> සහ තවත් <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> ක්"</string> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index c835809533d3..f9535fa55a26 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Zavrieť snímku obrazovky"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Ukážka snímky obrazovky"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Rekordér obrazovky"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Spracúva sa záznam obrazovky"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Zobrazuje sa upozornenie týkajúce sa relácie záznamu obrazovky"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Chcete spustiť nahrávanie?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Počas nahrávania zaznamená systém Android všetky citlivé údaje, ktoré sa zobrazia na obrazovke alebo prehrajú v zariadení. Zahrnuje to heslá, platobné údaje, fotky, správy a zvuky."</string> @@ -517,8 +516,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Vymazať všetko"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Spravovať"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"História"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Prichádzajúce"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Tiché upozornenia"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Varovné upozornenia"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Konverzácie"</string> @@ -1001,10 +999,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Bez názvu"</string> <string name="restart_button_description" msgid="6916116576177456480">"Klepnutím reštartujete túto aplikáciu a prejdete do režimu celej obrazovky."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Nastavenia bublín aplikácie <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Rozšírená ponuka"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Pridať späť do zásobníka"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Spravovať"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> z aplikácie <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> z aplikácie <xliff:g id="APP_NAME">%2$s</xliff:g> a ďalšie (<xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>)"</string> @@ -1032,9 +1028,9 @@ <string name="magnification_overlay_title" msgid="6584179429612427958">"Okno prekrytia priblíženia"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Okno priblíženia"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Ovládacie prvky okna priblíženia"</string> - <string name="quick_controls_title" msgid="6839108006171302273">"Ovládanie zariadenia"</string> + <string name="quick_controls_title" msgid="6839108006171302273">"Ovládanie zariadení"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"Pridajte ovládacie prvky pre svoje pripojené zariadenia"</string> - <string name="quick_controls_setup_title" msgid="8901436655997849822">"Nastavenie ovládania zariadenia"</string> + <string name="quick_controls_setup_title" msgid="8901436655997849822">"Nastavenie ovládania zariadení"</string> <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"Pridržaním vypínača získate prístup k ovládacím prvkom"</string> <string name="controls_providers_title" msgid="6879775889857085056">"Výberom aplikácie pridajte ovládacie prvky"</string> <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380"> @@ -1050,7 +1046,7 @@ <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Zmeny neboli uložené"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Zoznam všetkých ovl. prvkov sa nepodarilo načítať."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Iné"</string> - <string name="controls_dialog_title" msgid="2343565267424406202">"Pridanie do ovládania zariadenia"</string> + <string name="controls_dialog_title" msgid="2343565267424406202">"Pridanie do ovládania zariadení"</string> <string name="controls_dialog_ok" msgid="2770230012857881822">"Pridať"</string> <string name="controls_dialog_message" msgid="342066938390663844">"Navrhuje <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Ovládanie bolo aktualizované"</string> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index 038b3b663cb6..cbfee80df294 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -391,7 +391,7 @@ <string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Povezava Wi-Fi ni vzpostavljena"</string> <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Svetlost"</string> <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="2325362583903258677">"SAMODEJNO"</string> - <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Obrni barve"</string> + <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Inverzija barv"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Način popravljanja barv"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Več nastavitev"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Končano"</string> @@ -977,7 +977,7 @@ <string name="running_foreground_services_title" msgid="5137313173431186685">"Aplikacije, ki se izvajajo v ozadju"</string> <string name="running_foreground_services_msg" msgid="3009459259222695385">"Dotaknite se za prikaz podrobnosti porabe baterije in prenosa podatkov"</string> <string name="mobile_data_disable_title" msgid="5366476131671617790">"Želite izklopiti prenos podatkov v mobilnih omrežjih?"</string> - <string name="mobile_data_disable_message" msgid="8604966027899770415">"Prek operaterja <xliff:g id="CARRIER">%s</xliff:g> ne boste imeli dostopa do podatkovne povezave ali interneta. Internet bo na voljo samo prek povezave Wi-Fi."</string> + <string name="mobile_data_disable_message" msgid="8604966027899770415">"Prek operaterja »<xliff:g id="CARRIER">%s</xliff:g>« ne boste imeli dostopa do podatkovne povezave ali interneta. Internet bo na voljo samo prek povezave Wi-Fi."</string> <string name="mobile_data_disable_message_default_carrier" msgid="6496033312431658238">"svojega operaterja"</string> <string name="touch_filtered_warning" msgid="8119511393338714836">"Ker aplikacija zakriva zahtevo za dovoljenje, z nastavitvami ni mogoče preveriti vašega odziva."</string> <string name="slice_permission_title" msgid="3262615140094151017">"Želite dovoliti, da aplikacija <xliff:g id="APP_0">%1$s</xliff:g> prikaže izreze aplikacije <xliff:g id="APP_2">%2$s</xliff:g>?"</string> diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index f7e2bf24309d..ea6652639dda 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Hiq pamjen e ekranit"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Pamja paraprake e imazhit"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Regjistruesi i ekranit"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Regjistrimi i ekranit po përpunohet"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Njoftim i vazhdueshëm për një seancë regjistrimi të ekranit"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Të nis regjistrimi?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Gjatë regjistrimit, sistemi Android mund të regjistrojë çdo informacion delikat që është i dukshëm në ekranin tënd ose që luhet në pajisje. Kjo përfshin fjalëkalimet, informacionin e pagesave, fotografitë, mesazhet dhe audion."</string> @@ -511,8 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Pastroji të gjitha"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Menaxho"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Historiku"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Hyrëse"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Njoftimet në heshtje"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Njoftimet sinjalizuese"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Bisedat"</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Pa titull"</string> <string name="restart_button_description" msgid="6916116576177456480">"Trokit për ta rinisur këtë aplikacion dhe për të kaluar në ekranin e plotë."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Cilësimet për flluskat e <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Tejkalo"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Shto përsëri te stiva"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Menaxho"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> nga <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> nga <xliff:g id="APP_NAME">%2$s</xliff:g> dhe <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> të tjera"</string> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index d61b36c1e1eb..17a01b223bb0 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Одбаците снимак екрана"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Преглед снимка екрана"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Снимач екрана"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Обрађујемо видео снимка екрана"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Обавештење о сесији снимања екрана је активно"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Желите да започнете снимање?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Током снимања Android систем може да сними осетљиве информације које су видљиве на екрану или које се пуштају на уређају. То обухвата лозинке, информације о плаћању, слике, поруке и звук."</string> @@ -514,8 +513,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Обриши све"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Управљајте"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Историја"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Долазно"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Нечујна обавештења"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Обавештења која привлаче пажњу"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Конверзације"</string> @@ -996,10 +994,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Без наслова"</string> <string name="restart_button_description" msgid="6916116576177456480">"Додирните да бисте рестартовали апликацију и прешли у режим целог екрана."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Подешавања за <xliff:g id="APP_NAME">%1$s</xliff:g> облачиће"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Преклапање"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Додај поново у групу"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Управљајте"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> из апликације <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> из апликације <xliff:g id="APP_NAME">%2$s</xliff:g> и још <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string> @@ -1019,10 +1015,10 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Навигација система је ажурирана. Да бисте унели измене, идите у Подешавања."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Идите у Подешавања да бисте ажурирали навигацију система"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Стање приправности"</string> - <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Приказују се у врху одељка за конверзације"</string> - <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Приказују слику профила на закључаном екрану"</string> + <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Приказује се у врху одељка за конверзације"</string> + <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Приказује слику профила на закључаном екрану"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Приказују се плутајући облачићи преко апликација"</string> - <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Ометају подешавање Не узнемиравај"</string> + <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Омета подешавање Не узнемиравај"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Важи"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Преклопни прозор за увећање"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Прозор за увећање"</string> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index a2ef8b673a34..7ff1f84d1668 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Stäng skärmdump"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Förhandsgranskning av skärmdump"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Skärminspelare"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Behandlar skärminspelning"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Avisering om att skärminspelning pågår"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Vill du starta inspelningen?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"När du spelar in kan Android-systemet registrera alla känsliga uppgifter som visas på skärmen eller spelas upp på enheten. Detta omfattar lösenord, betalningsuppgifter, foton, meddelanden och ljud."</string> @@ -400,7 +399,7 @@ <string name="quick_settings_tethering_label" msgid="5257299852322475780">"Internetdelning"</string> <string name="quick_settings_hotspot_label" msgid="1199196300038363424">"Surfzon"</string> <string name="quick_settings_hotspot_secondary_label_transient" msgid="7585604088079160564">"Aktiverar …"</string> - <string name="quick_settings_hotspot_secondary_label_data_saver_enabled" msgid="1280433136266439372">"Databesparing är på"</string> + <string name="quick_settings_hotspot_secondary_label_data_saver_enabled" msgid="1280433136266439372">"Databesparing på"</string> <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="3142308865165871976"> <item quantity="other">%d enheter</item> <item quantity="one">%d enhet</item> @@ -511,8 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Rensa alla"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Hantera"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Historik"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Inkommande"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Ljudlösa aviseringar"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Aviseringar med vibration eller ljud"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Konversationer"</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Ingen titel"</string> <string name="restart_button_description" msgid="6916116576177456480">"Tryck för att starta om appen i helskärmsläge."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Inställningar för <xliff:g id="APP_NAME">%1$s</xliff:g>-bubblor"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Fler menyalternativ"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Lägg tillbaka på stack"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Hantera"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> från <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> från <xliff:g id="APP_NAME">%2$s</xliff:g> och <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> fler"</string> diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index cc9d9b288fa0..51d1a172f83e 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -89,11 +89,10 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Ondoa picha ya skrini"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Onyesho la kukagua picha ya skrini"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Kinasa Skrini"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Inachakata rekodi ya skrini"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Arifa inayoendelea ya kipindi cha kurekodi skrini"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Ungependa kuanza kurekodi?"</string> - <string name="screenrecord_description" msgid="1123231719680353736">"Inaporekodi, Mfumo wa Android unaweza kurekodi maelezo yoyote nyeti yanayoonekana kwenye skrini au yanayochezwa kwenye kifaa chako. Hii ni pamoja na manenosiri, maelezo ya malipo, picha, ujumbe na sauti."</string> + <string name="screenrecord_description" msgid="1123231719680353736">"Wakati wa kurekodi, Mfumo wa Android unaweza kusana maelezo yoyote nyeti yanayoonekana kwenye skrini au yanayochezwa kwenye kifaa chako. Hii ni pamoja na manenosiri, maelezo ya malipo, picha, ujumbe na sauti."</string> <string name="screenrecord_audio_label" msgid="6183558856175159629">"Rekodi sauti"</string> <string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Sauti ya kifaa"</string> <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"Sauti kutoka kwenye kifaa chako, kama vile muziki, simu na milio ya simu"</string> @@ -511,10 +510,9 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Futa zote"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Dhibiti"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Historia"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Simu inayoingia"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Arifa zisizo na sauti"</string> - <string name="notification_section_header_alerting" msgid="3168140660646863240">"Arifa za ilani"</string> + <string name="notification_section_header_alerting" msgid="3168140660646863240">"Arifa za kuarifu"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Mazungumzo"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Futa arifa zote zisizo na sauti"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Kipengele cha Usinisumbue kimesitisha arifa"</string> @@ -712,7 +710,7 @@ <string name="notification_alert_title" msgid="7629202599338071971">"Kutoa arifa"</string> <string name="notification_bubble_title" msgid="8330481035191903164">"Kiputo"</string> <string name="notification_channel_summary_low" msgid="7300447764759926720">"Hukusaidia kuwa makini bila sauti au mtetemo."</string> - <string name="notification_channel_summary_default" msgid="3539949463907902037">"Hupata umakinifu wako kwa sauti na mtetemo."</string> + <string name="notification_channel_summary_default" msgid="3539949463907902037">"Hupata umakinifu wako kwa sauti au mtetemo."</string> <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Hupata umakinifu wako kwa sauti au mtetemo. Mazungumzo kutoka kiputo cha <xliff:g id="APP_NAME">%1$s</xliff:g> kwa chaguomsingi."</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Huweka umakinifu wako kwenye maudhui haya kwa kutumia njia ya mkato ya kuelea."</string> <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Huonyeshwa sehemu ya juu ya mazungumzo na huonekana kama kiputo."</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Wimbo hauna jina"</string> <string name="restart_button_description" msgid="6916116576177456480">"Gusa ili uzime na uwashe upya programu hii kisha nenda kwenye skrini nzima."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Mipangilio ya viputo vya <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Vipengee vya ziada"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Rejesha kwenye rafu"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Dhibiti"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> kutoka kwa <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> kutoka kwa <xliff:g id="APP_NAME">%2$s</xliff:g> na nyingine<xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index fc19d6e05940..1bea16e9b260 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"ஸ்கிரீன்ஷாட்டை நிராகரி"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"ஸ்கிரீன்ஷாட்டின் மாதிரிக்காட்சி"</string> <string name="screenrecord_name" msgid="2596401223859996572">"ஸ்கிரீன் ரெக்கார்டர்"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"ஸ்க்ரீன் ரெக்கார்டிங் செயலாக்கப்படுகிறது"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"திரை ரெக்கார்டிங் அமர்விற்கான தொடர் அறிவிப்பு"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"ரெக்கார்டிங்கைத் தொடங்கவா?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"ரெக்கார்டு செய்யும்போது, உங்கள் திரையில் தோன்றக்கூடிய அல்லது சாதனத்தில் பிளே ஆகக்கூடிய ஏதேனும் அதிமுக்கியத் தகவலை Android சிஸ்டம் படமெடுக்க முடியும். கடவுச்சொற்கள், பேமெண்ட் தகவல், படங்கள், மெசேஜ்கள், ஆடியோ ஆகியவை இதில் அடங்கும்."</string> @@ -511,8 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"எல்லாவற்றையும் அழி"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"அறிவிப்புகளை நிர்வகி"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"வரலாறு"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"உள்வருவது"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"ஒலியில்லாத அறிவிப்புகள்"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"விழிப்பூட்டல் அறிவிப்புகள்"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"உரையாடல்கள்"</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"தலைப்பு இல்லை"</string> <string name="restart_button_description" msgid="6916116576177456480">"தட்டுவதன் மூலம் இந்த ஆப்ஸை மீண்டும் தொடங்கலாம், முழுத்திரையில் பார்க்கலாம்."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> குமிழ்களுக்கான அமைப்புகள்"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"ஓவர்ஃப்லோ"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"மீண்டும் ஸ்டேக்கில் சேர்க்கவும்"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"நிர்வகி"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g> இலிருந்து <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> மற்றும் மேலும் <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> ஆப்ஸிலிருந்து வந்துள்ள அறிவிப்பு: <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index a2b3dec2dabd..42afdcfce94b 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -63,8 +63,8 @@ <string name="usb_debugging_allow" msgid="1722643858015321328">"అనుమతించు"</string> <string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB డీబగ్గింగ్కి అనుమతి లేదు"</string> <string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"ఈ పరికరానికి ప్రస్తుతం సైన్ ఇన్ చేసిన వినియోగదారు USB డీబగ్గింగ్ ఆన్ చేయలేరు. ఈ ఫీచర్ ఉపయోగించడానికి, ప్రాథమిక వినియోగదారుకి మారాలి."</string> - <string name="wifi_debugging_title" msgid="7300007687492186076">"ఈ నెట్వర్క్ పై వైర్లెస్ డీబగ్గింగ్ను అనుమతిస్తారా?"</string> - <string name="wifi_debugging_message" msgid="5461204211731802995">"నెట్వర్క్ పేరు (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi చిరునామా (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string> + <string name="wifi_debugging_title" msgid="7300007687492186076">"ఈ నెట్వర్క్ ద్వారా వైర్లెస్ డీబగ్గింగ్ను అనుమతించాలా?"</string> + <string name="wifi_debugging_message" msgid="5461204211731802995">"నెట్వర్క్ పేరు (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi అడ్రస్ (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string> <string name="wifi_debugging_always" msgid="2968383799517975155">"ఈ నెట్వర్క్ నుండి ఎల్లప్పుడూ అనుమతించు"</string> <string name="wifi_debugging_allow" msgid="4573224609684957886">"అనుమతించు"</string> <string name="wifi_debugging_secondary_user_title" msgid="2493201475880517725">"వైర్లెస్ డీబగ్గింగ్కి అనుమతి లేదు"</string> @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"స్క్రీన్షాట్ను మూసివేస్తుంది"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"స్క్రీన్షాట్ ప్రివ్యూ"</string> <string name="screenrecord_name" msgid="2596401223859996572">"స్క్రీన్ రికార్డర్"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"స్క్రీన్ రికార్డింగ్ అవుతోంది"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"స్క్రీన్ రికార్డ్ సెషన్ కోసం ఆన్గోయింగ్ నోటిఫికేషన్"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"రికార్డింగ్ను ప్రారంభించాలా?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"రికార్డ్ చేస్తున్నప్పుడు, Android సిస్టమ్ మీ స్క్రీన్పై ప్రదర్శించబడిన లేదా మీ పరికరం నుండి ప్లే చేయబడిన ఏ సున్నితమైన సమాచారాన్నైనా క్యాప్చర్ చేయగలదు. ఈ సమాచారంలో, పాస్వర్డ్లు, చెల్లింపు వివరాలు, ఫోటోలు, మెసేజ్లు, ఆడియో ఉంటాయి."</string> @@ -99,7 +98,7 @@ <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"మీ పరికరం నుండి వచ్చే సంగీతం, కాల్లు, రింగ్టోన్ల వంటి ధ్వనులు"</string> <string name="screenrecord_mic_label" msgid="2111264835791332350">"మైక్రోఫోన్"</string> <string name="screenrecord_device_audio_and_mic_label" msgid="1831323771978646841">"పరికరం ఆడియో, మైక్రోఫోన్"</string> - <string name="screenrecord_start" msgid="330991441575775004">"ప్రారంభం"</string> + <string name="screenrecord_start" msgid="330991441575775004">"ప్రారంభించు"</string> <string name="screenrecord_ongoing_screen_only" msgid="4459670242451527727">"స్క్రీన్ రికార్డింగ్ చేయబడుతోంది"</string> <string name="screenrecord_ongoing_screen_and_audio" msgid="5351133763125180920">"స్క్రీన్, ఆడియో రికార్డింగ్ చేయబడుతున్నాయి"</string> <string name="screenrecord_taps_label" msgid="1595690528298857649">"స్క్రీన్పై తాకే స్థానాలను చూపు"</string> @@ -369,7 +368,7 @@ <string name="quick_settings_location_off_label" msgid="7923929131443915919">"స్థానం ఆఫ్లో ఉంది"</string> <string name="quick_settings_media_device_label" msgid="8034019242363789941">"ప్రసార మాధ్యమ పరికరం"</string> <string name="quick_settings_rssi_label" msgid="3397615415140356701">"RSSI"</string> - <string name="quick_settings_rssi_emergency_only" msgid="7499207215265078598">"అత్యవసర కాల్లు మాత్రమే"</string> + <string name="quick_settings_rssi_emergency_only" msgid="7499207215265078598">"ఎమర్జెన్సీ కాల్స్ మాత్రమే"</string> <string name="quick_settings_settings_label" msgid="2214639529565474534">"సెట్టింగ్లు"</string> <string name="quick_settings_time_label" msgid="3352680970557509303">"సమయం"</string> <string name="quick_settings_user_label" msgid="1253515509432672496">"నేను"</string> @@ -390,7 +389,7 @@ <string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Wi‑Fi కనెక్ట్ కాలేదు"</string> <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"ప్రకాశం"</string> <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="2325362583903258677">"ఆటోమేటిక్"</string> - <string name="quick_settings_inversion_label" msgid="5078769633069667698">"రంగులను అటుఇటు మార్చు"</string> + <string name="quick_settings_inversion_label" msgid="5078769633069667698">"కలర్ మార్పిడి"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"రంగు సవరణ మోడ్"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"మరిన్ని సెట్టింగ్లు"</string> <string name="quick_settings_done" msgid="2163641301648855793">"పూర్తయింది"</string> @@ -421,7 +420,7 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4063448287758262485">"సూర్యోదయం వరకు"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="3584738542293528235">"<xliff:g id="TIME">%s</xliff:g>కి"</string> <string name="quick_settings_secondary_label_until" msgid="1883981263191927372">"<xliff:g id="TIME">%s</xliff:g> వరకు"</string> - <string name="quick_settings_ui_mode_night_label" msgid="1398928270610780470">"ముదురు రంగు థీమ్"</string> + <string name="quick_settings_ui_mode_night_label" msgid="1398928270610780470">"ముదురు రంగు రూపం"</string> <string name="quick_settings_dark_mode_secondary_label_battery_saver" msgid="4990712734503013251">"బ్యాటరీ సేవర్"</string> <string name="quick_settings_dark_mode_secondary_label_on_at_sunset" msgid="6017379738102015710">"సూర్యాస్తమయానికి"</string> <string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"సూర్యోదయం వరకు"</string> @@ -511,8 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"అన్నీ క్లియర్ చేయండి"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"నిర్వహించండి"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"చరిత్ర"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"ఇన్కమింగ్"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"నిశ్శబ్ద నోటిఫికేషన్లు"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"అలర్ట్ చేసే నోటిఫికేషన్లు"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"సంభాషణలు"</string> @@ -858,7 +856,7 @@ <string name="drag_to_rearrange_tiles" msgid="2143204300089638620">"టైల్ల క్రమం మార్చడానికి వాటిని పట్టుకుని, లాగండి"</string> <string name="drag_to_remove_tiles" msgid="4682194717573850385">"తీసివేయడానికి ఇక్కడికి లాగండి"</string> <string name="drag_to_remove_disabled" msgid="933046987838658850">"మీ వద్ద కనీసం <xliff:g id="MIN_NUM_TILES">%1$d</xliff:g> టైల్లు ఉండాలి"</string> - <string name="qs_edit" msgid="5583565172803472437">"సవరించు"</string> + <string name="qs_edit" msgid="5583565172803472437">"ఎడిట్ చేయండి"</string> <string name="tuner_time" msgid="2450785840990529997">"సమయం"</string> <string-array name="clock_options"> <item msgid="3986445361435142273">"గంటలు, నిమిషాలు మరియు సెకన్లను చూపు"</item> @@ -969,7 +967,7 @@ <string name="running_foreground_services_title" msgid="5137313173431186685">"నేపథ్యంలో అమలు అవుతున్న ఆప్లు"</string> <string name="running_foreground_services_msg" msgid="3009459259222695385">"బ్యాటరీ మరియు డేటా వినియోగ వివరాల కోసం నొక్కండి"</string> <string name="mobile_data_disable_title" msgid="5366476131671617790">"మొబైల్ డేటాను ఆఫ్ చేయాలా?"</string> - <string name="mobile_data_disable_message" msgid="8604966027899770415">"మీకు <xliff:g id="CARRIER">%s</xliff:g> ద్వారా డేటా లేదా ఇంటర్నెట్కు యాక్సెస్ ఉండదు. Wi-Fi ద్వారా మాత్రమే ఇంటర్నెట్ అందుబాటులో ఉంటుంది."</string> + <string name="mobile_data_disable_message" msgid="8604966027899770415">"\"<xliff:g id="CARRIER">%s</xliff:g>\" ద్వారా మీకు డేటా లేదా ఇంటర్నెట్కు యాక్సెస్ ఉండదు. Wi-Fi ద్వారా మాత్రమే ఇంటర్నెట్ అందుబాటులో ఉంటుంది."</string> <string name="mobile_data_disable_message_default_carrier" msgid="6496033312431658238">"మీ క్యారియర్"</string> <string name="touch_filtered_warning" msgid="8119511393338714836">"అనుమతి అభ్యర్థనకు ఒక యాప్ అడ్డు తగులుతున్నందున సెట్టింగ్లు మీ ప్రతిస్పందనను ధృవీకరించలేకపోయాయి."</string> <string name="slice_permission_title" msgid="3262615140094151017">"<xliff:g id="APP_2">%2$s</xliff:g> స్లైస్లను చూపించడానికి <xliff:g id="APP_0">%1$s</xliff:g>ని అనుమతించండి?"</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"శీర్షిక లేదు"</string> <string name="restart_button_description" msgid="6916116576177456480">"ఈ యాప్ను పునఃప్రారంభించేలా నొక్కి, ఆపై పూర్తి స్క్రీన్లోకి వెళ్లండి."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> బబుల్స్ సెట్టింగ్లు"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"ఓవర్ఫ్లో"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"స్ట్యాక్కు తిరిగి జోడించండి"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"నిర్వహించండి"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g> నుండి <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> నుండి <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> మరియు మరో <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-te/strings_tv.xml b/packages/SystemUI/res/values-te/strings_tv.xml index ded2f505c70c..df8b06d6705a 100644 --- a/packages/SystemUI/res/values-te/strings_tv.xml +++ b/packages/SystemUI/res/values-te/strings_tv.xml @@ -19,7 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="notification_channel_tv_pip" msgid="844249465483874817">"చిత్రంలో చిత్రం"</string> + <string name="notification_channel_tv_pip" msgid="844249465483874817">"పిక్చర్-ఇన్-పిక్చర్"</string> <string name="pip_notification_unknown_title" msgid="4413256731340767259">"(శీర్షిక లేని ప్రోగ్రామ్)"</string> <string name="pip_close" msgid="5775212044472849930">"PIPని మూసివేయి"</string> <string name="pip_fullscreen" msgid="3877997489869475181">"పూర్తి స్క్రీన్"</string> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index 8d9d1518c1cf..ee6b42262ce0 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -38,7 +38,7 @@ <string name="battery_saver_confirmation_ok" msgid="5042136476802816494">"เปิด"</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">"WiFi"</string> + <string name="status_bar_settings_wifi_button" msgid="7243072479837270946">"Wi-Fi"</string> <string name="status_bar_settings_auto_rotation" msgid="8329080442278431708">"หมุนหน้าจออัตโนมัติ"</string> <string name="status_bar_settings_mute_label" msgid="914392730086057522">"ปิดเสียง"</string> <string name="status_bar_settings_auto_brightness_label" msgid="2151934479226017725">"อัตโนมัติ"</string> @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"ปิดภาพหน้าจอ"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"ตัวอย่างภาพหน้าจอ"</string> <string name="screenrecord_name" msgid="2596401223859996572">"โปรแกรมอัดหน้าจอ"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"กำลังประมวลผลการอัดหน้าจอ"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"การแจ้งเตือนต่อเนื่องสำหรับเซสชันการบันทึกหน้าจอ"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"เริ่มบันทึกเลยไหม"</string> <string name="screenrecord_description" msgid="1123231719680353736">"ขณะบันทึก ระบบ Android จะบันทึกข้อมูลที่ละเอียดอ่อนที่ปรากฏบนหน้าจอหรือเล่นในอุปกรณ์ได้ ซึ่งรวมถึงรหัสผ่าน ข้อมูลการชำระเงิน รูปภาพ ข้อความ และเสียง"</string> @@ -375,7 +374,7 @@ <string name="quick_settings_user_label" msgid="1253515509432672496">"ฉัน"</string> <string name="quick_settings_user_title" msgid="8673045967216204537">"ผู้ใช้"</string> <string name="quick_settings_user_new_user" msgid="3347905871336069666">"ผู้ใช้ใหม่"</string> - <string name="quick_settings_wifi_label" msgid="2879507532983487244">"WiFi"</string> + <string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string> <string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"ไม่ได้เชื่อมต่อ"</string> <string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"ไม่มีเครือข่าย"</string> <string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"ปิด WiFi"</string> @@ -390,7 +389,7 @@ <string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"ไม่ได้เชื่อมต่อ Wi-Fi"</string> <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"ความสว่าง"</string> <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="2325362583903258677">"อัตโนมัติ"</string> - <string name="quick_settings_inversion_label" msgid="5078769633069667698">"สลับสี"</string> + <string name="quick_settings_inversion_label" msgid="5078769633069667698">"กลับสี"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"โหมดการแก้ไขสี"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"การตั้งค่าเพิ่มเติม"</string> <string name="quick_settings_done" msgid="2163641301648855793">"เสร็จสิ้น"</string> @@ -511,8 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"ล้างทั้งหมด"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"จัดการ"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"ประวัติ"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"เข้ามาใหม่"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"การแจ้งเตือนแบบไม่มีเสียง"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"มีการแจ้งเตือน"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"การสนทนา"</string> @@ -969,7 +967,7 @@ <string name="running_foreground_services_title" msgid="5137313173431186685">"แอปที่กำลังทำงานในเบื้องหลัง"</string> <string name="running_foreground_services_msg" msgid="3009459259222695385">"แตะเพื่อดูรายละเอียดเกี่ยวกับแบตเตอรี่และปริมาณการใช้อินเทอร์เน็ต"</string> <string name="mobile_data_disable_title" msgid="5366476131671617790">"ปิดอินเทอร์เน็ตมือถือไหม"</string> - <string name="mobile_data_disable_message" msgid="8604966027899770415">"คุณจะใช้เน็ตมือถือหรืออินเทอร์เน็ตผ่าน <xliff:g id="CARRIER">%s</xliff:g> ไม่ได้ แต่จะใช้ผ่าน Wi-Fi ได้เท่านั้น"</string> + <string name="mobile_data_disable_message" msgid="8604966027899770415">"คุณจะใช้เน็ตมือถือหรืออินเทอร์เน็ตผ่าน \"<xliff:g id="CARRIER">%s</xliff:g>\" ไม่ได้ แต่จะใช้ผ่าน Wi-Fi ได้เท่านั้น"</string> <string name="mobile_data_disable_message_default_carrier" msgid="6496033312431658238">"ผู้ให้บริการของคุณ"</string> <string name="touch_filtered_warning" msgid="8119511393338714836">"เนื่องจากแอปหนึ่งได้บดบังคำขอสิทธิ์ ระบบจึงไม่สามารถยืนยันคำตอบของคุณสำหรับการตั้งค่าได้"</string> <string name="slice_permission_title" msgid="3262615140094151017">"อนุญาตให้ <xliff:g id="APP_0">%1$s</xliff:g> แสดงส่วนต่างๆ ของ <xliff:g id="APP_2">%2$s</xliff:g>"</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"ไม่มีชื่อ"</string> <string name="restart_button_description" msgid="6916116576177456480">"แตะเพื่อรีสตาร์ทแอปนี้และแสดงแบบเต็มหน้าจอ"</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"การตั้งค่าบับเบิล <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"รายการเพิ่มเติม"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"เพิ่มกลับไปที่สแต็ก"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"จัดการ"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> จาก <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> จาก <xliff:g id="APP_NAME">%2$s</xliff:g> และอีก <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> รายการ"</string> diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index cfb8d54e4efe..db26407d03a0 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"I-dismiss ang screenshot"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Preview ng screenshot"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Recorder ng Screen"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Pinoproseso screen recording"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Kasalukuyang notification para sa session ng pag-record ng screen"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Simulang Mag-record?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Habang nagre-record, puwedeng ma-capture ng Android System ang anumang sensitibong impormasyong nakikita sa iyong screen o nagpe-play sa device mo. Kasama dito ang mga password, impormasyon sa pagbabayad, mga larawan, mensahe, at audio."</string> @@ -511,8 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"I-clear lahat"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Pamahalaan"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"History"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Papasok"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Mga silent na notification"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Mga nag-aalertong notification"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Mga Pag-uusap"</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Walang pamagat"</string> <string name="restart_button_description" msgid="6916116576177456480">"I-tap para i-restart ang app na ito at mag-full screen."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Mga setting para sa mga bubble ng <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Overflow"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Idagdag ulit sa stack"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Pamahalaan"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> mula sa <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> mula sa <xliff:g id="APP_NAME">%2$s</xliff:g> at <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> pa"</string> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index 3b6ad40168d7..10779050d350 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Ekran görüntüsünü kapat"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Ekran görüntüsü önizlemesi"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Ekran Kaydedicisi"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Ekran kaydı işleniyor"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Ekran kaydı oturumu için devam eden bildirim"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Kayıt Başlatılsın mı?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Kayıt sırasında Android Sistemi, ekranınızda görünen veya cihazınızda oynatılan hassas bilgileri yakalayabilir. Buna şifreler, ödeme bilgileri, fotoğraflar, mesajlar ve sesler dahildir."</string> @@ -511,8 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Tümünü temizle"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Yönet"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Geçmiş"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Gelen"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Sessiz bildirimler"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Uyaran bildirimler"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Görüşmeler"</string> @@ -954,7 +952,7 @@ <string name="instant_apps_message_with_help" msgid="1816952263531203932">"Uygulama yüklenmeden açıldı. Daha fazla bilgi için dokunun."</string> <string name="app_info" msgid="5153758994129963243">"Uygulama bilgisi"</string> <string name="go_to_web" msgid="636673528981366511">"Tarayıcıya git"</string> - <string name="mobile_data" msgid="4564407557775397216">"Mobil veriler"</string> + <string name="mobile_data" msgid="4564407557775397216">"Mobil veri"</string> <string name="mobile_data_text_format" msgid="6806501540022589786">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>, <xliff:g id="CARRIER_NAME">%1$s</xliff:g>"</string> <string name="wifi_is_off" msgid="5389597396308001471">"Kablosuz bağlantı kapalı"</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Başlıksız"</string> <string name="restart_button_description" msgid="6916116576177456480">"Bu uygulamayı yeniden başlatmak ve tam ekrana geçmek için dokunun."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> baloncukları için ayarlar"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Taşma"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Yığına geri ekle"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Yönet"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g> uygulamasından <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> uygulamasından <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ve diğer <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index 11aba0bec73b..2ad54653d1a8 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -88,9 +88,8 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Додаток або адміністратор вашої організації не дозволяють робити знімки екрана"</string> <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Закрити знімок екрана"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Перегляд знімка екрана"</string> - <string name="screenrecord_name" msgid="2596401223859996572">"Створення знімків екрана"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_name" msgid="2596401223859996572">"Відеозапис екрана"</string> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Обробка записування екрана"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Сповіщення про сеанс запису екрана"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Почати запис?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Під час запису система Android може фіксувати будь-яку конфіденційну інформацію, яка з\'являється на екрані або відтворюється на пристрої, зокрема паролі, платіжну інформацію, фотографії, повідомлення та звуки."</string> @@ -517,8 +516,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Очистити все"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Керувати"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Історія"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Нові"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Беззвучні сповіщення"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Сповіщення зі звуком чи вібрацією"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Розмови"</string> @@ -1001,10 +999,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Без назви"</string> <string name="restart_button_description" msgid="6916116576177456480">"Натисніть, щоб перезапустити додаток і перейти в повноекранний режим."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Налаштування спливаючих чатів від додатка <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Додаткове меню"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Додати в список"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Налаштувати"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"Cповіщення \"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>\" від додатка <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"Сповіщення \"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>\" від додатка <xliff:g id="APP_NAME">%2$s</xliff:g> (і ще <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>)"</string> diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml index cacfb3e16fbf..b8c01720f9f3 100644 --- a/packages/SystemUI/res/values-ur/strings.xml +++ b/packages/SystemUI/res/values-ur/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"اسکرین شاٹ برخاست کریں"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"اسکرین شاٹ کا پیش منظر"</string> <string name="screenrecord_name" msgid="2596401223859996572">"سکرین ریکارڈر"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"سکرین ریکارڈنگ پروسیس ہورہی ہے"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"اسکرین ریکارڈ سیشن کیلئے جاری اطلاع"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"ریکارڈنگ شروع کریں؟"</string> <string name="screenrecord_description" msgid="1123231719680353736">"ریکارڈ کرنے کے دوران، Android سسٹم آپ کی اسکرین پر نظر آنے والی یا آپ کے آلہ پر چلنے والی کسی بھی حساس معلومات کو کیپچر کر سکتا ہے۔ اس میں پاس ورڈز، ادائیگی کی معلومات، تصاویر، پیغامات اور آڈیو شامل ہیں۔"</string> @@ -101,7 +100,7 @@ <string name="screenrecord_device_audio_and_mic_label" msgid="1831323771978646841">"آلہ کا آڈیو اور مائیکروفون"</string> <string name="screenrecord_start" msgid="330991441575775004">"شروع کریں"</string> <string name="screenrecord_ongoing_screen_only" msgid="4459670242451527727">"ریکارڈنگ اسکرین"</string> - <string name="screenrecord_ongoing_screen_and_audio" msgid="5351133763125180920">"ریکارڈنگ اسکرین اور آڈیو"</string> + <string name="screenrecord_ongoing_screen_and_audio" msgid="5351133763125180920">"اسکرین اور آڈیو کی ریکارڈنگ ہو رہی ہے"</string> <string name="screenrecord_taps_label" msgid="1595690528298857649">"اسکرین پر کئے گئے ٹچز دکھائیں"</string> <string name="screenrecord_stop_text" msgid="6549288689506057686">"روکنے کے لیے تھپتھپائیں"</string> <string name="screenrecord_stop_label" msgid="72699670052087989">"روکیں"</string> @@ -511,8 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"سبھی کو صاف کریں"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"نظم کریں"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"سرگزشت"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"اِن کمنگ"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"اطلاعات خاموش کریں"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"متنبہ کرنے کی اطلاعات"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"گفتگوئیں"</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"کوئی عنوان نہیں ہے"</string> <string name="restart_button_description" msgid="6916116576177456480">"یہ ایپ دوبارہ شروع کرنے کے لیے تھپتھپائیں اور پوری اسکرین پر جائیں۔"</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> بلبلوں کے لیے ترتیبات"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"اوورفلو"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"انبار میں واپس شامل کریں"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"نظم کریں"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g> کی جانب سے <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> اور <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> مزید سے <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> @@ -1039,10 +1035,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"تمام کنٹرولز کی فہرست لوڈ نہیں کی جا سکی۔"</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"دیگر"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"آلہ کے کنٹرولز میں شامل کریں"</string> - <!-- no translation found for controls_dialog_ok (2770230012857881822) --> - <skip /> - <!-- no translation found for controls_dialog_message (342066938390663844) --> - <skip /> + <string name="controls_dialog_ok" msgid="2770230012857881822">"شامل کریں"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"<xliff:g id="APP">%s</xliff:g> کی طرف سے تجویز کردہ"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"کنٹرولز اپ ڈیٹ کیے گئے"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN میں حروف یا علامات شامل ہیں"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"<xliff:g id="DEVICE">%s</xliff:g> کی تصدیق کریں"</string> diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml index 9ec17d710cbc..1d91bb79267f 100644 --- a/packages/SystemUI/res/values-uz/strings.xml +++ b/packages/SystemUI/res/values-uz/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Skrinshotni yopish"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Skrinshotga razm solish"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Ekrandan yozib olish"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Ekran yozib olinmoqda"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Ekrandan yozib olish seansi uchun joriy bildirishnoma"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Yozib olish boshlansinmi?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Yozib olishda Android tizimi ekraningizda koʻringan yoki qurilmangizda ijro etilgan maxfiy axborotni ham yozib olishi mumkin. Bunga parollar, toʻlovga oid axborot, suratlar, xabarlar va audio kiradi."</string> @@ -511,8 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Hammasini tozalash"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Boshqarish"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Tarix"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Kiruvchi"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Sokin bildirishnomalar"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Bildirishnomalarning yuborilishi"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Suhbatlar"</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Nomsiz"</string> <string name="restart_button_description" msgid="6916116576177456480">"Bu ilovani qaytadan ishga tushirish va butun ekranga ochish uchun bosing."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> bulutchalari uchun sozlamalar"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Kengaytirilgan"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Yana toʻplamga kiritish"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Boshqarish"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>, <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> ilovasidan <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> va yana <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> ta bildirishnoma"</string> @@ -1040,7 +1036,7 @@ <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Boshqa"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Qurilma boshqaruv elementlariga kiritish"</string> <string name="controls_dialog_ok" msgid="2770230012857881822">"Kiritish"</string> - <string name="controls_dialog_message" msgid="342066938390663844">"<xliff:g id="APP">%s</xliff:g> tomonidan taklif etilgan"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"<xliff:g id="APP">%s</xliff:g> taklif etgan"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Boshqaruv elementlari yangilandi"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN kod harflar va belgilardan iborat boʻladi"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"Tekshirish: <xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 73101b2dfaa0..44f1497fd358 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Đóng ảnh chụp màn hình"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Xem trước ảnh chụp màn hình"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Trình ghi màn hình"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Đang xử lý video ghi màn hình"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Thông báo đang diễn ra về phiên ghi màn hình"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Bắt đầu ghi?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Trong khi ghi, Hệ thống Android có thể ghi lại mọi thông tin nhạy cảm hiển thị trên màn hình hoặc phát trên thiết bị của bạn. Những thông tin này bao gồm mật khẩu, thông tin thanh toán, ảnh, thông báo và âm thanh."</string> @@ -511,8 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Xóa tất cả"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Quản lý"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Lịch sử"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Hiển thị gần đây"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Thông báo im lặng"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Thông báo cảnh báo"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Cuộc trò chuyện"</string> @@ -969,7 +967,7 @@ <string name="running_foreground_services_title" msgid="5137313173431186685">"Ứng dụng đang chạy trong nền"</string> <string name="running_foreground_services_msg" msgid="3009459259222695385">"Nhấn để biết chi tiết về mức sử dụng dữ liệu và pin"</string> <string name="mobile_data_disable_title" msgid="5366476131671617790">"Tắt dữ liệu di động?"</string> - <string name="mobile_data_disable_message" msgid="8604966027899770415">"Bạn sẽ không có quyền sử dụng dữ liệu hoặc truy cập Internet thông qua <xliff:g id="CARRIER">%s</xliff:g>. Bạn chỉ có thể truy cập Internet thông qua Wi-Fi."</string> + <string name="mobile_data_disable_message" msgid="8604966027899770415">"Bạn sẽ không có quyền sử dụng dữ liệu hoặc truy cập Internet thông qua chế độ <xliff:g id="CARRIER">%s</xliff:g>. Bạn chỉ có thể truy cập Internet thông qua Wi-Fi."</string> <string name="mobile_data_disable_message_default_carrier" msgid="6496033312431658238">"nhà mạng của bạn"</string> <string name="touch_filtered_warning" msgid="8119511393338714836">"Vì ứng dụng đang che khuất yêu cầu cấp quyền nên Cài đặt không thể xác minh câu trả lời của bạn."</string> <string name="slice_permission_title" msgid="3262615140094151017">"Cho phép <xliff:g id="APP_0">%1$s</xliff:g> hiển thị các lát của <xliff:g id="APP_2">%2$s</xliff:g>?"</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Không có tiêu đề"</string> <string name="restart_button_description" msgid="6916116576177456480">"Nhấn để khởi động lại ứng dụng này và xem ở chế độ toàn màn hình."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Tùy chọn cài đặt cho bong bóng trò chuyện <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Trình đơn mục bổ sung"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Thêm lại vào ngăn xếp"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Quản lý"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> của <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> từ <xliff:g id="APP_NAME">%2$s</xliff:g> và <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> bong bóng khác"</string> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index 8ea00aef86e5..0ed76b7f2082 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -63,7 +63,7 @@ <string name="usb_debugging_allow" msgid="1722643858015321328">"允许"</string> <string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"不允许使用 USB 调试功能"</string> <string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"目前已登录此设备的用户无法开启 USB 调试功能。要使用此功能,请切换为主要用户的帐号。"</string> - <string name="wifi_debugging_title" msgid="7300007687492186076">"要在此网络上允许无线调试吗?"</string> + <string name="wifi_debugging_title" msgid="7300007687492186076">"要允许在此网络上进行无线调试吗?"</string> <string name="wifi_debugging_message" msgid="5461204211731802995">"网络名称 (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWLAN 地址 (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string> <string name="wifi_debugging_always" msgid="2968383799517975155">"在此网络上始终允许"</string> <string name="wifi_debugging_allow" msgid="4573224609684957886">"允许"</string> @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"关闭屏幕截图"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"屏幕截图预览"</string> <string name="screenrecord_name" msgid="2596401223859996572">"屏幕录制器"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"正在处理屏幕录制视频"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"持续显示屏幕录制会话通知"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"要开始录制吗?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"在录制内容时,Android 系统可以捕捉到您屏幕上显示或设备中播放的敏感信息,其中包括密码、付款信息、照片、消息和音频。"</string> @@ -511,8 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"全部清除"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"管理"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"历史记录"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"收到的通知"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"无声通知"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"提醒通知"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"对话"</string> @@ -717,7 +715,7 @@ <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"通过可链接到这项内容的浮动快捷方式吸引您的注意。"</string> <string name="notification_channel_summary_priority" msgid="7415770044553264622">"以对话泡形式显示在对话部分顶部。"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"设置"</string> - <string name="notification_priority_title" msgid="2079708866333537093">"优先级"</string> + <string name="notification_priority_title" msgid="2079708866333537093">"优先"</string> <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g>不支持对话专用设置"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"最近没有对话泡"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"此处会显示最近的对话泡和已关闭的对话泡"</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"无标题"</string> <string name="restart_button_description" msgid="6916116576177456480">"点按即可重启此应用并进入全屏模式。"</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g>对话泡的设置"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"菜单"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"重新加入叠放"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"管理"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g>:<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g>和另外 <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> 个应用:<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index 751767ac5a91..9a7d951f61c1 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -65,7 +65,7 @@ <string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"目前登入此裝置的使用者無法啟用 USB 偵錯功能。如要使用此功能,請切換至主要使用者。"</string> <string name="wifi_debugging_title" msgid="7300007687492186076">"要在此網絡上允許無線偵錯功能嗎?"</string> <string name="wifi_debugging_message" msgid="5461204211731802995">"網絡名稱 (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi 地址 (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string> - <string name="wifi_debugging_always" msgid="2968383799517975155">"在此網絡上永遠允許"</string> + <string name="wifi_debugging_always" msgid="2968383799517975155">"一律允許在此網絡上執行"</string> <string name="wifi_debugging_allow" msgid="4573224609684957886">"允許"</string> <string name="wifi_debugging_secondary_user_title" msgid="2493201475880517725">"不允許無線偵錯功能"</string> <string name="wifi_debugging_secondary_user_message" msgid="4492383073970079751">"目前登入此裝置的使用者無法啟用無線偵錯功能。如要使用此功能,請切換至主要使用者。"</string> @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"關閉螢幕截圖"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"螢幕截圖預覽"</string> <string name="screenrecord_name" msgid="2596401223859996572">"螢幕畫面錄影工具"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"正在處理螢幕錄影內容"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"持續顯示錄影畫面工作階段通知"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"要開始錄影嗎?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"錄影時,Android 系統可擷取螢幕上顯示或裝置播放的任何敏感資料,包括密碼、付款資料、相片、訊息和音訊。"</string> @@ -101,7 +100,7 @@ <string name="screenrecord_device_audio_and_mic_label" msgid="1831323771978646841">"裝置音訊和麥克風"</string> <string name="screenrecord_start" msgid="330991441575775004">"開始"</string> <string name="screenrecord_ongoing_screen_only" msgid="4459670242451527727">"正在錄影螢幕畫面"</string> - <string name="screenrecord_ongoing_screen_and_audio" msgid="5351133763125180920">"錄影螢幕畫面和音訊"</string> + <string name="screenrecord_ongoing_screen_and_audio" msgid="5351133763125180920">"正在錄製螢幕畫面和音訊"</string> <string name="screenrecord_taps_label" msgid="1595690528298857649">"顯示輕觸螢幕的位置"</string> <string name="screenrecord_stop_text" msgid="6549288689506057686">"輕按即可停止"</string> <string name="screenrecord_stop_label" msgid="72699670052087989">"停止"</string> @@ -511,8 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"全部清除"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"管理"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"記錄"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"收到的通知"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"靜音通知"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"提醒通知"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"對話"</string> @@ -969,7 +967,7 @@ <string name="running_foreground_services_title" msgid="5137313173431186685">"正在背景中執行的應用程式"</string> <string name="running_foreground_services_msg" msgid="3009459259222695385">"輕按即可查看電池和數據用量詳情"</string> <string name="mobile_data_disable_title" msgid="5366476131671617790">"要關閉流動數據嗎?"</string> - <string name="mobile_data_disable_message" msgid="8604966027899770415">"您將無法透過「<xliff:g id="CARRIER">%s</xliff:g>」使用流動數據或互聯網,只可透過 Wi-Fi 才能連接互聯網。"</string> + <string name="mobile_data_disable_message" msgid="8604966027899770415">"您無法透過「<xliff:g id="CARRIER">%s</xliff:g>」使用流動數據或互聯網。如要使用互聯網,您必須連接 Wi-Fi。"</string> <string name="mobile_data_disable_message_default_carrier" msgid="6496033312431658238">"您的流動網絡供應商"</string> <string name="touch_filtered_warning" msgid="8119511393338714836">"由於某個應用程式已阻擋權限要求畫面,因此「設定」應用程式無法驗證您的回應。"</string> <string name="slice_permission_title" msgid="3262615140094151017">"要允許「<xliff:g id="APP_0">%1$s</xliff:g>」顯示「<xliff:g id="APP_2">%2$s</xliff:g>」的快訊嗎?"</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"無標題"</string> <string name="restart_button_description" msgid="6916116576177456480">"輕按即可重新開啟此應用程式並放大至全螢幕。"</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」小視窗設定"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"顯示更多"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"加回堆疊"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"管理"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"來自「<xliff:g id="APP_NAME">%2$s</xliff:g>」的 <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"來自「<xliff:g id="APP_NAME">%2$s</xliff:g>」及另外 <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> 個應用程式的<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index 6f825dea4ee5..b1ba86abd8d1 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"關閉螢幕截圖"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"螢幕截圖預覽"</string> <string name="screenrecord_name" msgid="2596401223859996572">"螢幕錄影器"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"處理螢幕錄影內容"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"持續顯示螢幕畫面錄製工作階段通知"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"要開始錄製嗎?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"錄製螢幕畫面時,Android 系統可擷取螢幕上顯示或裝置播放的任何機密資訊,包括密碼、付款資訊、相片、訊息和音訊。"</string> @@ -511,8 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"全部清除"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"管理"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"記錄"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"收到的通知"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"靜音通知"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"快訊通知"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"對話"</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"無標題"</string> <string name="restart_button_description" msgid="6916116576177456480">"輕觸即可重新啟動這個應用程式並進入全螢幕模式。"</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」對話框的設定"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"溢位"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"重新加入堆疊"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"管理"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g>:<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"「<xliff:g id="APP_NAME">%2$s</xliff:g>」和其他 <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> 個應用程式:<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index a02cfa22949f..2fe904a1ffba 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Cashisa isithombe-skrini"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Ukubuka kuqala isithombe-skrini"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Irekhoda yesikrini"</string> - <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> - <skip /> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Icubungula okokuqopha iskrini"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Isaziso esiqhubekayo seseshini yokurekhoda isikrini"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Qala ukurekhoda?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Ngenkathi irekhoda, Isistimu ye-Android ingathatha noma iluphi ulwazi olubucayi olubonakal kusikrini sakho noma oludlalwa kudivayisi yakho. Lokhu kufaka phakathi amaphasiwedi, ulwazi lokukhokha, izithombe, imilayezo, nomsindo."</string> @@ -511,8 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Sula konke"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Phatha"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Umlando"</string> - <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> - <skip /> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Okungenayo"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Thulisa izaziso"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Izaziso zokuxwayisa"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Izingxoxo"</string> @@ -991,10 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Asikho isihloko"</string> <string name="restart_button_description" msgid="6916116576177456480">"Thepha ukuze uqale kabusha lolu hlelo lokusebenza uphinde uye kusikrini esigcwele."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Izilungiselelo zamabhamuza e-<xliff:g id="APP_NAME">%1$s</xliff:g>"</string> - <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> - <skip /> - <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> - <skip /> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Ukuphuphuma"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Engeza emuva kusitaki"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Phatha"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"I-<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> kusuka ku-<xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"I-<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> kusukela ku-<xliff:g id="APP_NAME">%2$s</xliff:g> nokungu-<xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> ngaphezulu"</string> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index a2e11a795749..a3d32c12d1c0 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -314,7 +314,7 @@ <dimen name="screenshot_dismiss_button_margin">8dp</dimen> <dimen name="screenshot_action_container_offset_y">32dp</dimen> <dimen name="screenshot_action_container_corner_radius">10dp</dimen> - <dimen name="screenshot_action_container_padding_vertical">10dp</dimen> + <dimen name="screenshot_action_container_padding_vertical">16dp</dimen> <dimen name="screenshot_action_container_margin_horizontal">8dp</dimen> <dimen name="screenshot_action_container_padding_left">96dp</dimen> <dimen name="screenshot_action_container_padding_right">8dp</dimen> @@ -502,7 +502,6 @@ <dimen name="qs_page_indicator_width">16dp</dimen> <dimen name="qs_page_indicator_height">8dp</dimen> <dimen name="qs_tile_icon_size">24dp</dimen> - <dimen name="qs_tile_detail_padding">3dp</dimen> <dimen name="qs_tile_text_size">12sp</dimen> <dimen name="qs_tile_divider_height">1dp</dimen> <dimen name="qs_panel_padding">16dp</dimen> diff --git a/packages/SystemUI/res/values/integers.xml b/packages/SystemUI/res/values/integers.xml index f35f3513d530..b1e91c8a86c6 100644 --- a/packages/SystemUI/res/values/integers.xml +++ b/packages/SystemUI/res/values/integers.xml @@ -33,11 +33,6 @@ <!-- Maximum number of bubbles we allow in overflow before we dismiss the oldest one. --> <integer name="bubbles_max_overflow">16</integer> - <!-- Ratio of "left" end of status bar that will swipe to QQS. --> - <integer name="qqs_split_fraction">3</integer> - <!-- Ratio of "right" end of status bar that will swipe to QS. --> - <integer name="qs_split_fraction">2</integer> - <integer name="magnification_default_scale">2</integer> <!-- The position of the volume dialog on the screen. diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java index 25bc7959a6cd..8707d389858b 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java @@ -911,6 +911,7 @@ public class BubbleController implements ConfigurationController.ConfigurationLi // Update the state in NotificationManagerService try { int flags = Notification.BubbleMetadata.FLAG_SUPPRESS_NOTIFICATION; + flags |= Notification.BubbleMetadata.FLAG_AUTO_EXPAND_BUBBLE; mBarService.onNotificationBubbleChanged(entry.getKey(), shouldBubble, flags); } catch (RemoteException e) { } diff --git a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsEditingActivity.kt b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsEditingActivity.kt index 3a4e82c3793f..ff40a8a883ae 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsEditingActivity.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsEditingActivity.kt @@ -130,6 +130,7 @@ class ControlsEditingActivity @Inject constructor( inflate() } requireViewById<TextView>(R.id.title).text = structure + setTitle(structure) subtitle = requireViewById<TextView>(R.id.subtitle).apply { setText(SUBTITLE_ID) } diff --git a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsFavoritingActivity.kt b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsFavoritingActivity.kt index eb15262acf74..496b21b612fe 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsFavoritingActivity.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsFavoritingActivity.kt @@ -208,7 +208,7 @@ class ControlsFavoritingActivity @Inject constructor( val name = listOfStructures[position].structureName val title = if (!TextUtils.isEmpty(name)) name else appName titleView.text = title - setTitle(title) + titleView.requestFocus() } override fun onPageScrolled( diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ChallengeDialogs.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ChallengeDialogs.kt index b6c09f124f77..6c28d11df655 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/ChallengeDialogs.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ChallengeDialogs.kt @@ -124,7 +124,7 @@ object ChallengeDialogs { } val builder = AlertDialog.Builder(cvh.context, STYLE).apply { val res = cvh.context.resources - setMessage(res.getString( + setTitle(res.getString( R.string.controls_confirmation_message, cvh.title.getText())) setPositiveButton( android.R.string.ok, diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt index 1bcf10c36767..17e423416064 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt @@ -145,8 +145,7 @@ class ControlViewHolder( } behavior = bindBehavior(behavior, findBehaviorClass(controlStatus, template, deviceType)) - - layout.setContentDescription("${title.text} ${subtitle.text} ${status.text}") + updateContentDescription() } fun actionResponse(@ControlAction.ResponseResult response: Int) { @@ -191,11 +190,16 @@ class ControlViewHolder( cancelUpdate = uiExecutor.executeDelayed({ status.setText(previousText) + updateContentDescription() }, UPDATE_DELAY_IN_MILLIS) status.setText(tempStatus) + updateContentDescription() } + private fun updateContentDescription() = + layout.setContentDescription("${title.text} ${subtitle.text} ${status.text}") + fun action(action: ControlAction) { lastAction = action controlsController.action(cws.componentName, cws.ci, action) diff --git a/packages/SystemUI/src/com/android/systemui/dagger/DependencyBinder.java b/packages/SystemUI/src/com/android/systemui/dagger/DependencyBinder.java index 82ccb17a52c6..e2a6d6c51d4d 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/DependencyBinder.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/DependencyBinder.java @@ -21,7 +21,6 @@ import com.android.systemui.appops.AppOpsController; import com.android.systemui.appops.AppOpsControllerImpl; import com.android.systemui.classifier.FalsingManagerProxy; import com.android.systemui.controls.dagger.ControlsModule; -import com.android.systemui.doze.DozeHost; import com.android.systemui.globalactions.GlobalActionsComponent; import com.android.systemui.globalactions.GlobalActionsImpl; import com.android.systemui.plugins.ActivityStarter; @@ -38,7 +37,6 @@ import com.android.systemui.statusbar.NotificationRemoteInputManager; import com.android.systemui.statusbar.StatusBarStateControllerImpl; import com.android.systemui.statusbar.SysuiStatusBarStateController; import com.android.systemui.statusbar.phone.DarkIconDispatcherImpl; -import com.android.systemui.statusbar.phone.DozeServiceHost; import com.android.systemui.statusbar.phone.ManagedProfileController; import com.android.systemui.statusbar.phone.ManagedProfileControllerImpl; import com.android.systemui.statusbar.phone.StatusBarIconController; @@ -259,11 +257,6 @@ public abstract class DependencyBinder { /** */ @Binds - public abstract DozeHost provideDozeHost(DozeServiceHost dozeServiceHost); - - /** - */ - @Binds public abstract VolumeComponent provideVolumeComponent( VolumeDialogComponent volumeDialogComponent); diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIDefaultModule.java b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIDefaultModule.java index 6d1bf72f4913..3bb953ab9da3 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIDefaultModule.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIDefaultModule.java @@ -31,6 +31,7 @@ import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dock.DockManager; import com.android.systemui.dock.DockManagerImpl; +import com.android.systemui.doze.DozeHost; import com.android.systemui.plugins.qs.QSFactory; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.power.EnhancedEstimates; @@ -43,6 +44,7 @@ import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.NotificationLockscreenUserManager; import com.android.systemui.statusbar.NotificationLockscreenUserManagerImpl; import com.android.systemui.statusbar.notification.NotificationEntryManager; +import com.android.systemui.statusbar.phone.DozeServiceHost; import com.android.systemui.statusbar.phone.HeadsUpManagerPhone; import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.KeyguardEnvironmentImpl; @@ -148,4 +150,7 @@ public abstract class SystemUIDefaultModule { @Binds abstract KeyguardViewController bindKeyguardViewController( StatusBarKeyguardViewManager statusBarKeyguardViewManager); + + @Binds + abstract DozeHost provideDozeHost(DozeServiceHost dozeServiceHost); } diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java b/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java index 8117bbb0de1d..5e367046bd2b 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java @@ -33,7 +33,6 @@ import com.android.systemui.keyguard.WakefulnessLifecycle; import com.android.systemui.plugins.FalsingManager; import com.android.systemui.statusbar.phone.BiometricUnlockController; import com.android.systemui.statusbar.phone.DozeParameters; -import com.android.systemui.statusbar.phone.DozeServiceHost; import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.util.sensors.AsyncSensorManager; import com.android.systemui.util.sensors.ProximitySensor; @@ -59,7 +58,7 @@ public class DozeFactory { private final Handler mHandler; private final BiometricUnlockController mBiometricUnlockController; private final BroadcastDispatcher mBroadcastDispatcher; - private final DozeServiceHost mDozeServiceHost; + private final DozeHost mDozeHost; @Inject public DozeFactory(FalsingManager falsingManager, DozeLog dozeLog, @@ -70,7 +69,7 @@ public class DozeFactory { ProximitySensor proximitySensor, DelayedWakeLock.Builder delayedWakeLockBuilder, Handler handler, BiometricUnlockController biometricUnlockController, - BroadcastDispatcher broadcastDispatcher, DozeServiceHost dozeServiceHost) { + BroadcastDispatcher broadcastDispatcher, DozeHost dozeHost) { mFalsingManager = falsingManager; mDozeLog = dozeLog; mDozeParameters = dozeParameters; @@ -86,7 +85,7 @@ public class DozeFactory { mHandler = handler; mBiometricUnlockController = biometricUnlockController; mBroadcastDispatcher = broadcastDispatcher; - mDozeServiceHost = dozeServiceHost; + mDozeHost = dozeHost; } /** Creates a DozeMachine with its parts for {@code dozeService}. */ @@ -95,7 +94,7 @@ public class DozeFactory { WakeLock wakeLock = mDelayedWakeLockBuilder.setHandler(mHandler).setTag("Doze").build(); DozeMachine.Service wrappedService = dozeService; - wrappedService = new DozeBrightnessHostForwarder(wrappedService, mDozeServiceHost); + wrappedService = new DozeBrightnessHostForwarder(wrappedService, mDozeHost); wrappedService = DozeScreenStatePreventingAdapter.wrapIfNeeded( wrappedService, mDozeParameters); wrappedService = DozeSuspendScreenStatePreventingAdapter.wrapIfNeeded( @@ -103,19 +102,19 @@ public class DozeFactory { DozeMachine machine = new DozeMachine(wrappedService, config, wakeLock, mWakefulnessLifecycle, mBatteryController, mDozeLog, mDockManager, - mDozeServiceHost); + mDozeHost); machine.setParts(new DozeMachine.Part[]{ new DozePauser(mHandler, machine, mAlarmManager, mDozeParameters.getPolicy()), new DozeFalsingManagerAdapter(mFalsingManager), - createDozeTriggers(dozeService, mAsyncSensorManager, mDozeServiceHost, + createDozeTriggers(dozeService, mAsyncSensorManager, mDozeHost, mAlarmManager, config, mDozeParameters, mHandler, wakeLock, machine, mDockManager, mDozeLog), - createDozeUi(dozeService, mDozeServiceHost, wakeLock, machine, mHandler, + createDozeUi(dozeService, mDozeHost, wakeLock, machine, mHandler, mAlarmManager, mDozeParameters, mDozeLog), - new DozeScreenState(wrappedService, mHandler, mDozeServiceHost, mDozeParameters, + new DozeScreenState(wrappedService, mHandler, mDozeHost, mDozeParameters, wakeLock), createDozeScreenBrightness(dozeService, wrappedService, mAsyncSensorManager, - mDozeServiceHost, mDozeParameters, mHandler), + mDozeHost, mDozeParameters, mHandler), new DozeWallpaperState(mWallpaperManager, mBiometricUnlockController, mDozeParameters), new DozeDockHandler(config, machine, mDockManager), diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java index f93c169ee44b..8e1854a469f1 100644 --- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java +++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java @@ -2362,6 +2362,14 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, } public void refreshDialog() { + // ensure dropdown menus are dismissed before re-initializing the dialog + dismissPanel(); + dismissOverflow(true); + if (mControlsUiController != null) { + mControlsUiController.hide(); + } + + // re-create dialog initializeLayout(); mGlobalActionsLayout.updateList(); if (mControlsUiController != null) { diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt b/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt index 07ce9e4a6226..90c558a1ee97 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt @@ -54,7 +54,7 @@ private const val DEFAULT_LUMINOSITY = 0.25f private const val LUMINOSITY_THRESHOLD = 0.05f private const val SATURATION_MULTIPLIER = 0.8f -private val LOADING = MediaData(false, 0, null, null, null, null, null, +private val LOADING = MediaData(false, 0, null, null, null, null, null, emptyList(), emptyList(), null, null, null) /** @@ -191,12 +191,14 @@ class MediaDataManager @Inject constructor( // TODO: b/153736623 look into creating actions when this isn't a media style notification val packageContext: Context = sbn.getPackageContext(context) - for (action in actions) { - val mediaAction = MediaAction( - action.getIcon().loadDrawable(packageContext), - action.actionIntent, - action.title) - actionIcons.add(mediaAction) + if (actions != null) { + for (action in actions) { + val mediaAction = MediaAction( + action.getIcon().loadDrawable(packageContext), + action.actionIntent, + action.title) + actionIcons.add(mediaAction) + } } foregroundExcecutor.execute { diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaViewManager.kt b/packages/SystemUI/src/com/android/systemui/media/MediaViewManager.kt index d72c3691c34b..8db9dcc1ecec 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaViewManager.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaViewManager.kt @@ -299,7 +299,7 @@ class MediaViewManager @Inject constructor( firstPlayer.measure(input) // Relayouting is necessary in motionlayout to obtain its size properly .... it.layout(0, 0, it.measuredWidth, it.measuredHeight) - val result = MeasurementOutput(it.measuredWidth, it.measuredHeight) + result = MeasurementOutput(it.measuredWidth, it.measuredHeight) it.progress = previousProgress if (desiredState != null) { // remeasure it to the old size again! diff --git a/packages/SystemUI/src/com/android/systemui/model/SysUiState.java b/packages/SystemUI/src/com/android/systemui/model/SysUiState.java index f900f1e1db63..ccf58ba5daa8 100644 --- a/packages/SystemUI/src/com/android/systemui/model/SysUiState.java +++ b/packages/SystemUI/src/com/android/systemui/model/SysUiState.java @@ -39,7 +39,7 @@ import javax.inject.Singleton; public class SysUiState implements Dumpable { private static final String TAG = SysUiState.class.getSimpleName(); - public static final boolean DEBUG = true; + public static final boolean DEBUG = false; private @QuickStepContract.SystemUiStateFlags int mFlags; private final List<SysUiStateCallback> mCallbacks = new ArrayList<>(); diff --git a/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java b/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java index bb627bc9db99..78d2d9857628 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java +++ b/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java @@ -709,7 +709,7 @@ public class PipTaskOrganizer extends TaskOrganizer { * @return {@code true} if destinationBounds is altered for split screen */ private boolean syncWithSplitScreenBounds(Rect destinationBoundsOut) { - if (mSplitDivider == null || !mSplitDivider.inSplitMode()) { + if (mSplitDivider == null || !mSplitDivider.isDividerVisible()) { // bail early if system is not in split screen mode return false; } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java index dfd385dda8e5..2f06c4b1fed0 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java @@ -32,7 +32,6 @@ import com.android.systemui.Dependency; import com.android.systemui.R; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dump.DumpManager; -import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.media.MediaHierarchyManager; import com.android.systemui.media.MediaHost; import com.android.systemui.plugins.qs.QSTile; @@ -228,6 +227,11 @@ public class QuickQSPanel extends QSPanel { } @Override + protected boolean shouldShowDetail() { + return !mExpanded; + } + + @Override protected void drawTile(TileRecord r, State state) { if (state instanceof SignalState) { SignalState copy = new SignalState(); diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileBaseView.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileBaseView.java index f821b1914658..9e2bb984776d 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileBaseView.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileBaseView.java @@ -36,7 +36,6 @@ import android.text.TextUtils; import android.util.Log; import android.util.PathParser; import android.view.Gravity; -import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.accessibility.AccessibilityEvent; @@ -44,7 +43,6 @@ import android.view.accessibility.AccessibilityNodeInfo; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.Switch; -import android.widget.TextView; import com.android.settingslib.Utils; import com.android.systemui.R; @@ -70,7 +68,6 @@ public class QSTileBaseView extends com.android.systemui.plugins.qs.QSTileView { private float mStrokeWidthInactive; private final ImageView mBg; - private final TextView mDetailText; private final int mColorActive; private final int mColorInactive; private final int mColorDisabled; @@ -112,12 +109,6 @@ public class QSTileBaseView extends com.android.systemui.plugins.qs.QSTileView { ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.CENTER); mIconFrame.addView(mIcon, params); - - // "..." afforadance below icon - mDetailText = (TextView) LayoutInflater.from(context).inflate(R.layout.qs_tile_detail_text, - mIconFrame, false); - mIconFrame.addView(mDetailText); - mIconFrame.setClipChildren(false); mIconFrame.setClipToPadding(false); @@ -173,10 +164,6 @@ public class QSTileBaseView extends com.android.systemui.plugins.qs.QSTileView { tile.longClick(); return true; }); - - if (tile.supportsDetailView()) { - mDetailText.setVisibility(View.VISIBLE); - } } public void init(OnClickListener click, OnClickListener secondaryClick, @@ -254,8 +241,6 @@ public class QSTileBaseView extends com.android.systemui.plugins.qs.QSTileView { mCircleColor = circleColor; } - mDetailText.setTextColor(QSTileImpl.getColorForState(getContext(), state.state)); - mShowRippleEffect = state.showRippleEffect; setClickable(state.state != Tile.STATE_UNAVAILABLE); setLongClickable(state.handlesLongClick); @@ -400,4 +385,4 @@ public class QSTileBaseView extends com.android.systemui.plugins.qs.QSTileView { } } } -} +}
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java index 7e5f2e1961e1..87faaccf2063 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java @@ -68,8 +68,6 @@ import com.android.systemui.qs.QSEvent; import com.android.systemui.qs.QSHost; import com.android.systemui.qs.QuickStatusBarHeader; import com.android.systemui.qs.logging.QSLogger; -import com.android.systemui.qs.tiles.QSSettingsControllerKt; -import com.android.systemui.qs.tiles.QSSettingsPanel; import java.io.FileDescriptor; import java.io.PrintWriter; @@ -152,19 +150,12 @@ public abstract class QSTileImpl<TState extends State> implements QSTile, Lifecy */ abstract public int getMetricsCategory(); - /** - * Experimental option on whether to use settings panels. Only loaded on creation, so the tile - * needs to be removed and added for this to take effect. - */ - protected final QSSettingsPanel mQSSettingsPanelOption; - protected QSTileImpl(QSHost host) { mHost = host; mContext = host.getContext(); mInstanceId = host.getNewInstanceId(); mState = newTileState(); mTmpState = newTileState(); - mQSSettingsPanelOption = QSSettingsControllerKt.getQSSettingsPanelOption(); mQSLogger = host.getQSLogger(); mUiEventLogger = host.getUiEventLogger(); } @@ -366,10 +357,6 @@ public abstract class QSTileImpl<TState extends State> implements QSTile, Lifecy * {@link QSTileImpl#getLongClickIntent} */ protected void handleLongClick() { - if (mQSSettingsPanelOption == QSSettingsPanel.USE_DETAIL) { - showDetail(true); - return; - } Dependency.get(ActivityStarter.class).postStartActivityDismissingKeyguard( getLongClickIntent(), 0); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/QSSettingsController.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/QSSettingsController.kt deleted file mode 100644 index c7ef0be508aa..000000000000 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/QSSettingsController.kt +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2019 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.qs.tiles - -import android.provider.DeviceConfig -import com.android.internal.config.sysui.SystemUiDeviceConfigFlags - -enum class QSSettingsPanel { - DEFAULT, - OPEN_LONG_PRESS, - OPEN_CLICK, - USE_DETAIL -} - -fun getQSSettingsPanelOption(): QSSettingsPanel = - when (DeviceConfig.getInt(DeviceConfig.NAMESPACE_SYSTEMUI, - SystemUiDeviceConfigFlags.QS_USE_SETTINGS_PANELS, 0)) { - 1 -> QSSettingsPanel.OPEN_LONG_PRESS - 2 -> QSSettingsPanel.OPEN_CLICK - 3 -> QSSettingsPanel.USE_DETAIL - else -> QSSettingsPanel.DEFAULT - }
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java index f1695017a883..1279d42eb64d 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java @@ -56,7 +56,6 @@ import javax.inject.Inject; /** Quick settings tile: Wifi **/ public class WifiTile extends QSTileImpl<SignalState> { private static final Intent WIFI_SETTINGS = new Intent(Settings.ACTION_WIFI_SETTINGS); - private static final Intent WIFI_PANEL = new Intent(Settings.Panel.ACTION_WIFI); protected final NetworkController mController; private final AccessPointController mWifiController; @@ -109,21 +108,11 @@ public class WifiTile extends QSTileImpl<SignalState> { @Override public Intent getLongClickIntent() { - if (mQSSettingsPanelOption == QSSettingsPanel.OPEN_LONG_PRESS) return WIFI_PANEL; - else return WIFI_SETTINGS; - } - - @Override - public boolean supportsDetailView() { - return getDetailAdapter() != null && mQSSettingsPanelOption == QSSettingsPanel.OPEN_CLICK; + return WIFI_SETTINGS; } @Override protected void handleClick() { - if (mQSSettingsPanelOption == QSSettingsPanel.OPEN_CLICK) { - mActivityStarter.postStartActivityDismissingKeyguard(WIFI_PANEL, 0); - return; - } // Secondary clicks are header clicks, just toggle. mState.copyTo(mStateBeforeClick); boolean wifiEnabled = mState.value; diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java index 414828953778..9cfb1b27cbf3 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java @@ -16,6 +16,8 @@ package com.android.systemui.screenshot; +import static android.content.res.Configuration.ORIENTATION_LANDSCAPE; +import static android.content.res.Configuration.ORIENTATION_PORTRAIT; import static android.provider.DeviceConfig.NAMESPACE_SYSTEMUI; import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; @@ -61,16 +63,19 @@ import android.util.Slog; import android.view.Display; import android.view.LayoutInflater; import android.view.MotionEvent; +import android.view.Surface; import android.view.SurfaceControl; import android.view.View; import android.view.ViewGroup; import android.view.ViewOutlineProvider; import android.view.ViewTreeObserver; import android.view.WindowManager; +import android.view.accessibility.AccessibilityManager; import android.view.animation.AccelerateInterpolator; import android.view.animation.AnimationUtils; import android.view.animation.Interpolator; import android.widget.FrameLayout; +import android.widget.HorizontalScrollView; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.Toast; @@ -169,7 +174,7 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset private static final long SCREENSHOT_DISMISS_ALPHA_OFFSET_MS = 50; // delay before starting fade 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 SCREENSHOT_CORNER_DEFAULT_TIMEOUT_MILLIS = 6000; private static final int MESSAGE_CORNER_TIMEOUT = 2; private final Interpolator mAccelerateInterpolator = new AccelerateInterpolator(); @@ -183,24 +188,25 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset private final Display mDisplay; private final DisplayMetrics mDisplayMetrics; - private final View mScreenshotLayout; - private final ScreenshotSelectorView mScreenshotSelectorView; - private final ImageView mScreenshotAnimatedView; - private final ImageView mScreenshotPreview; - private final ImageView mScreenshotFlash; - private final ImageView mActionsContainerBackground; - private final FrameLayout mActionsContainer; - private final LinearLayout mActionsView; - private final ImageView mBackgroundProtection; - private final FrameLayout mDismissButton; - private final ImageView mDismissImage; + private View mScreenshotLayout; + private ScreenshotSelectorView mScreenshotSelectorView; + private ImageView mScreenshotAnimatedView; + private ImageView mScreenshotPreview; + private ImageView mScreenshotFlash; + private ImageView mActionsContainerBackground; + private HorizontalScrollView mActionsContainer; + private LinearLayout mActionsView; + private ImageView mBackgroundProtection; + private FrameLayout mDismissButton; private Bitmap mScreenBitmap; private SaveImageInBackgroundTask mSaveInBgTask; private Animator mScreenshotAnimation; private Runnable mOnCompleteRunnable; - private boolean mInDarkMode = false; private Animator mDismissAnimation; + private boolean mInDarkMode = false; + private boolean mDirectionLTR = true; + private boolean mOrientationPortrait = true; private float mScreenshotOffsetXPx; private float mScreenshotOffsetYPx; @@ -232,57 +238,18 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset */ @Inject public GlobalScreenshot( - Context context, @Main Resources resources, LayoutInflater layoutInflater, + Context context, @Main Resources resources, ScreenshotNotificationsController screenshotNotificationsController, UiEventLogger uiEventLogger) { mContext = context; mNotificationsController = screenshotNotificationsController; mUiEventLogger = uiEventLogger; - // Inflate the screenshot layout - mScreenshotLayout = layoutInflater.inflate(R.layout.global_screenshot, null); - mScreenshotAnimatedView = - mScreenshotLayout.findViewById(R.id.global_screenshot_animated_view); - mScreenshotAnimatedView.setClipToOutline(true); - mScreenshotAnimatedView.setOutlineProvider(new ViewOutlineProvider() { - @Override - public void getOutline(View view, Outline outline) { - outline.setRoundRect(new Rect(0, 0, view.getWidth(), view.getHeight()), - ROUNDED_CORNER_RADIUS * view.getWidth()); - } - }); - mScreenshotPreview = mScreenshotLayout.findViewById(R.id.global_screenshot_preview); - mScreenshotPreview.setClipToOutline(true); - mScreenshotPreview.setOutlineProvider(new ViewOutlineProvider() { - @Override - public void getOutline(View view, Outline outline) { - outline.setRoundRect(new Rect(0, 0, view.getWidth(), view.getHeight()), - ROUNDED_CORNER_RADIUS * view.getWidth()); - } - }); - - mActionsContainerBackground = mScreenshotLayout.findViewById( - R.id.global_screenshot_actions_container_background); - mActionsContainer = mScreenshotLayout.findViewById( - R.id.global_screenshot_actions_container); - mActionsView = mScreenshotLayout.findViewById(R.id.global_screenshot_actions); - mBackgroundProtection = mScreenshotLayout.findViewById( - R.id.global_screenshot_actions_background); - mDismissButton = mScreenshotLayout.findViewById(R.id.global_screenshot_dismiss_button); - mDismissButton.setOnClickListener(view -> { - mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_EXPLICIT_DISMISSAL); - dismissScreenshot("dismiss_button", false); - mOnCompleteRunnable.run(); - }); - mDismissImage = mDismissButton.findViewById(R.id.global_screenshot_dismiss_image); - - mScreenshotFlash = mScreenshotLayout.findViewById(R.id.global_screenshot_flash); - mScreenshotSelectorView = mScreenshotLayout.findViewById(R.id.global_screenshot_selector); - mScreenshotLayout.setFocusable(true); - mScreenshotSelectorView.setFocusable(true); - mScreenshotSelectorView.setFocusableInTouchMode(true); - mScreenshotAnimatedView.setPivotX(0); - mScreenshotAnimatedView.setPivotY(0); + reloadAssets(); + Configuration config = mContext.getResources().getConfiguration(); + mInDarkMode = config.isNightModeActive(); + mDirectionLTR = config.getLayoutDirection() == View.LAYOUT_DIRECTION_LTR; + mOrientationPortrait = config.orientation == ORIENTATION_PORTRAIT; // Setup the window that we are going to use mWindowLayoutParams = new WindowManager.LayoutParams( @@ -333,6 +300,121 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset inoutInfo.touchableRegion.set(touchRegion); } + private void onConfigChanged(Configuration newConfig) { + boolean needsUpdate = false; + // dark mode + if (newConfig.isNightModeActive()) { + // Night mode is active, we're using dark theme + if (!mInDarkMode) { + mInDarkMode = true; + needsUpdate = true; + } + } else { + // Night mode is not active, we're using the light theme + if (mInDarkMode) { + mInDarkMode = false; + needsUpdate = true; + } + } + + // RTL configuration + switch (newConfig.getLayoutDirection()) { + case View.LAYOUT_DIRECTION_LTR: + if (!mDirectionLTR) { + mDirectionLTR = true; + needsUpdate = true; + } + break; + case View.LAYOUT_DIRECTION_RTL: + if (mDirectionLTR) { + mDirectionLTR = false; + needsUpdate = true; + } + break; + } + + // portrait/landscape orientation + switch (newConfig.orientation) { + case ORIENTATION_PORTRAIT: + if (!mOrientationPortrait) { + mOrientationPortrait = true; + needsUpdate = true; + } + break; + case ORIENTATION_LANDSCAPE: + if (mOrientationPortrait) { + mOrientationPortrait = false; + needsUpdate = true; + } + break; + } + + if (needsUpdate) { + reloadAssets(); + } + } + + /** + * Update assets (called when the dark theme status changes). We only need to update the dismiss + * button and the actions container background, since the buttons are re-inflated on demand. + */ + private void reloadAssets() { + boolean wasAttached = mScreenshotLayout != null && mScreenshotLayout.isAttachedToWindow(); + if (wasAttached) { + mWindowManager.removeView(mScreenshotLayout); + } + + // Inflate the screenshot layout + mScreenshotLayout = LayoutInflater.from(mContext).inflate(R.layout.global_screenshot, null); + mScreenshotAnimatedView = + mScreenshotLayout.findViewById(R.id.global_screenshot_animated_view); + mScreenshotAnimatedView.setClipToOutline(true); + mScreenshotAnimatedView.setOutlineProvider(new ViewOutlineProvider() { + @Override + public void getOutline(View view, Outline outline) { + outline.setRoundRect(new Rect(0, 0, view.getWidth(), view.getHeight()), + ROUNDED_CORNER_RADIUS * view.getWidth()); + } + }); + mScreenshotPreview = mScreenshotLayout.findViewById(R.id.global_screenshot_preview); + mScreenshotPreview.setClipToOutline(true); + mScreenshotPreview.setOutlineProvider(new ViewOutlineProvider() { + @Override + public void getOutline(View view, Outline outline) { + outline.setRoundRect(new Rect(0, 0, view.getWidth(), view.getHeight()), + ROUNDED_CORNER_RADIUS * view.getWidth()); + } + }); + + mActionsContainerBackground = mScreenshotLayout.findViewById( + R.id.global_screenshot_actions_container_background); + mActionsContainer = mScreenshotLayout.findViewById( + R.id.global_screenshot_actions_container); + mActionsView = mScreenshotLayout.findViewById(R.id.global_screenshot_actions); + mBackgroundProtection = mScreenshotLayout.findViewById( + R.id.global_screenshot_actions_background); + mDismissButton = mScreenshotLayout.findViewById(R.id.global_screenshot_dismiss_button); + mDismissButton.setOnClickListener(view -> { + mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_EXPLICIT_DISMISSAL); + dismissScreenshot("dismiss_button", false); + mOnCompleteRunnable.run(); + }); + + mScreenshotFlash = mScreenshotLayout.findViewById(R.id.global_screenshot_flash); + mScreenshotSelectorView = mScreenshotLayout.findViewById(R.id.global_screenshot_selector); + mScreenshotLayout.setFocusable(true); + mScreenshotSelectorView.setFocusable(true); + mScreenshotSelectorView.setFocusableInTouchMode(true); + mScreenshotAnimatedView.setPivotX(0); + mScreenshotAnimatedView.setPivotY(0); + mActionsContainer.setScrollX(0); + + if (wasAttached) { + mWindowManager.addView(mScreenshotLayout, mWindowLayoutParams); + } + } + + /** * Creates a new worker thread and saves the screenshot to the media store. */ @@ -382,10 +464,8 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset mScreenBitmap.setHasAlpha(false); mScreenBitmap.prepareToDraw(); - updateDarkTheme(); + onConfigChanged(mContext.getResources().getConfiguration()); - mWindowManager.addView(mScreenshotLayout, mWindowLayoutParams); - mScreenshotLayout.getViewTreeObserver().addOnComputeInternalInsetsListener(this); if (mDismissAnimation != null && mDismissAnimation.isRunning()) { mDismissAnimation.cancel(); @@ -395,7 +475,6 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset } void takeScreenshot(Consumer<Uri> finisher, Runnable onComplete) { - dismissScreenshot("new screenshot requested", true); mOnCompleteRunnable = onComplete; mDisplay.getRealMetrics(mDisplayMetrics); @@ -407,7 +486,6 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset void handleImageAsScreenshot(Bitmap screenshot, Rect screenshotScreenBounds, Insets visibleInsets, int taskId, Consumer<Uri> finisher, Runnable onComplete) { // TODO use taskId and visibleInsets - dismissScreenshot("new screenshot requested", true); mOnCompleteRunnable = onComplete; takeScreenshot(screenshot, finisher, screenshotScreenBounds); } @@ -513,41 +591,6 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset } /** - * Update assets (called when the dark theme status changes). We only need to update the - * dismiss - * button and the actions container background, since the buttons are re-inflated on demand. - */ - private void reloadAssets() { - mDismissImage.setImageDrawable(mContext.getDrawable(R.drawable.screenshot_cancel)); - mActionsContainerBackground.setBackground( - mContext.getDrawable(R.drawable.action_chip_container_background)); - } - - /** - * Checks the current dark theme status and updates if it has changed. - */ - private void updateDarkTheme() { - int currentNightMode = mContext.getResources().getConfiguration().uiMode - & Configuration.UI_MODE_NIGHT_MASK; - switch (currentNightMode) { - case Configuration.UI_MODE_NIGHT_NO: - // Night mode is not active, we're using the light theme - if (mInDarkMode) { - mInDarkMode = false; - reloadAssets(); - } - break; - case Configuration.UI_MODE_NIGHT_YES: - // Night mode is active, we're using dark theme - if (!mInDarkMode) { - mInDarkMode = true; - reloadAssets(); - } - break; - } - } - - /** * Starts the animation after taking the screenshot */ private void startAnimation(final Consumer<Uri> finisher, int w, int h, @@ -588,26 +631,48 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset } else { createScreenshotActionsShadeAnimation(imageData).start(); } + AccessibilityManager accessibilityManager = (AccessibilityManager) + mContext.getSystemService(Context.ACCESSIBILITY_SERVICE); + long timeoutMs = accessibilityManager.getRecommendedTimeoutMillis( + SCREENSHOT_CORNER_DEFAULT_TIMEOUT_MILLIS, + AccessibilityManager.FLAG_CONTENT_CONTROLS); + mScreenshotHandler.removeMessages(MESSAGE_CORNER_TIMEOUT); mScreenshotHandler.sendMessageDelayed( mScreenshotHandler.obtainMessage(MESSAGE_CORNER_TIMEOUT), - SCREENSHOT_CORNER_TIMEOUT_MILLIS); + timeoutMs); }); } } }); mScreenshotHandler.post(() -> { - // Play the shutter sound to notify that we've taken a screenshot - mCameraSound.play(MediaActionSound.SHUTTER_CLICK); + if (!mScreenshotLayout.isAttachedToWindow()) { + mWindowManager.addView(mScreenshotLayout, mWindowLayoutParams); + } + mScreenshotLayout.getViewTreeObserver().addOnComputeInternalInsetsListener(this); + + mScreenshotHandler.post(() -> { + + // Play the shutter sound to notify that we've taken a screenshot + mCameraSound.play(MediaActionSound.SHUTTER_CLICK); + + mScreenshotPreview.setLayerType(View.LAYER_TYPE_HARDWARE, null); + mScreenshotPreview.buildLayer(); + mScreenshotAnimation.start(); + }); - mScreenshotPreview.setLayerType(View.LAYER_TYPE_HARDWARE, null); - mScreenshotPreview.buildLayer(); - mScreenshotAnimation.start(); }); + } private AnimatorSet createScreenshotDropInAnimation(int width, int height, Rect bounds) { - float cornerScale = mCornerSizeX / (float) width; + int rotation = mContext.getDisplay().getRotation(); + float cornerScale; + if (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270) { + cornerScale = (mCornerSizeX / (float) height); + } else { + cornerScale = (mCornerSizeX / (float) width); + } mScreenshotAnimatedView.setScaleX(1); mScreenshotAnimatedView.setScaleY(1); @@ -632,8 +697,7 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset final PointF startPos = new PointF(bounds.centerX(), bounds.centerY()); float finalX; - if (mContext.getResources().getConfiguration().getLayoutDirection() - == View.LAYOUT_DIRECTION_LTR) { + if (mDirectionLTR) { finalX = mScreenshotOffsetXPx + width * cornerScale / 2f; } else { finalX = width - mScreenshotOffsetXPx - width * cornerScale / 2f; @@ -713,7 +777,6 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset private ValueAnimator createScreenshotActionsShadeAnimation(SavedImageData imageData) { LayoutInflater inflater = LayoutInflater.from(mContext); mActionsView.removeAllViews(); - mActionsContainer.setScrollX(0); mScreenshotLayout.invalidate(); mScreenshotLayout.requestLayout(); mScreenshotLayout.getViewTreeObserver().dispatchOnGlobalLayout(); @@ -803,14 +866,11 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset animator.setDuration(SCREENSHOT_ACTIONS_EXPANSION_DURATION_MS); float alphaFraction = (float) SCREENSHOT_ACTIONS_ALPHA_DURATION_MS / SCREENSHOT_ACTIONS_EXPANSION_DURATION_MS; - mActionsContainer.setVisibility(View.VISIBLE); mActionsContainer.setAlpha(0f); mActionsContainerBackground.setAlpha(0f); + mActionsContainer.setVisibility(View.VISIBLE); mActionsContainerBackground.setVisibility(View.VISIBLE); - mActionsContainer.setPivotX(0); - mActionsContainerBackground.setPivotX(0); - animator.addUpdateListener(animation -> { float t = animation.getAnimatedFraction(); mBackgroundProtection.setAlpha(t); @@ -825,6 +885,10 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset chip.setAlpha(t); chip.setScaleX(1 / containerScale); // invert to keep size of children constant } + mActionsContainer.setScrollX(mDirectionLTR ? 0 : mActionsContainer.getWidth()); + mActionsContainer.setPivotX(mDirectionLTR ? 0 : mActionsContainer.getWidth()); + mActionsContainerBackground.setPivotX( + mDirectionLTR ? 0 : mActionsContainerBackground.getWidth()); }); return animator; } diff --git a/packages/SystemUI/src/com/android/systemui/shortcut/ShortcutKeyDispatcher.java b/packages/SystemUI/src/com/android/systemui/shortcut/ShortcutKeyDispatcher.java index 4f20492c60a3..f7f12239c6db 100644 --- a/packages/SystemUI/src/com/android/systemui/shortcut/ShortcutKeyDispatcher.java +++ b/packages/SystemUI/src/com/android/systemui/shortcut/ShortcutKeyDispatcher.java @@ -92,7 +92,7 @@ public class ShortcutKeyDispatcher extends SystemUI } private void handleDockKey(long shortcutCode) { - if (mDivider == null || !mDivider.inSplitMode()) { + if (mDivider == null || !mDivider.isDividerVisible()) { // Split the screen mRecents.splitPrimaryTask((shortcutCode == SC_DOCK_LEFT) ? SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java b/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java index db33c79be773..cdd1280dd86c 100644 --- a/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java +++ b/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java @@ -16,6 +16,7 @@ package com.android.systemui.stackdivider; +import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED; import static android.content.res.Configuration.ORIENTATION_LANDSCAPE; import static android.content.res.Configuration.SCREEN_HEIGHT_DP_UNDEFINED; import static android.content.res.Configuration.SCREEN_WIDTH_DP_UNDEFINED; @@ -123,14 +124,17 @@ public class Divider extends SystemUI implements DividerView.DividerCallbacks, SplitDisplayLayout sdl = new SplitDisplayLayout(mContext, displayLayout, mSplits); sdl.rotateTo(toRotation); mRotateSplitLayout = sdl; - int position = mMinimized ? mView.mSnapTargetBeforeMinimized.position - : mView.getCurrentPosition(); + final int position = isDividerVisible() + ? (mMinimized ? mView.mSnapTargetBeforeMinimized.position + : mView.getCurrentPosition()) + // snap resets to middle target when not in split-mode + : sdl.getSnapAlgorithm().getMiddleTarget().position; DividerSnapAlgorithm snap = sdl.getSnapAlgorithm(); final DividerSnapAlgorithm.SnapTarget target = snap.calculateNonDismissingSnapTarget(position); sdl.resizeSplits(target.position, t); - if (inSplitMode()) { + if (isSplitActive()) { WindowManagerProxy.applyHomeTasksMinimized(sdl, mSplits.mSecondary.token, t); } }; @@ -199,7 +203,7 @@ public class Divider extends SystemUI implements DividerView.DividerCallbacks, @Override public void onImeStartPositioning(int displayId, int hiddenTop, int shownTop, boolean imeShouldShow, SurfaceControl.Transaction t) { - if (!inSplitMode()) { + if (!isDividerVisible()) { return; } final boolean splitIsVisible = !mView.isHidden(); @@ -298,7 +302,7 @@ public class Divider extends SystemUI implements DividerView.DividerCallbacks, @Override public void onImePositionChanged(int displayId, int imeTop, SurfaceControl.Transaction t) { - if (mAnimation != null || !inSplitMode() || mPaused) { + if (mAnimation != null || !isDividerVisible() || mPaused) { // Not synchronized with IME anymore, so return. return; } @@ -310,7 +314,7 @@ public class Divider extends SystemUI implements DividerView.DividerCallbacks, @Override public void onImeEndPositioning(int displayId, boolean cancelled, SurfaceControl.Transaction t) { - if (mAnimation != null || !inSplitMode() || mPaused) { + if (mAnimation != null || !isDividerVisible() || mPaused) { // Not synchronized with IME anymore, so return. return; } @@ -479,7 +483,7 @@ public class Divider extends SystemUI implements DividerView.DividerCallbacks, @Override public void onKeyguardShowingChanged() { - if (!inSplitMode() || mView == null) { + if (!isDividerVisible() || mView == null) { return; } mView.setHidden(mKeyguardStateController.isShowing()); @@ -559,10 +563,20 @@ public class Divider extends SystemUI implements DividerView.DividerCallbacks, } /** {@code true} if this is visible */ - public boolean inSplitMode() { + public boolean isDividerVisible() { return mView != null && mView.getVisibility() == View.VISIBLE; } + /** + * This indicates that at-least one of the splits has content. This differs from + * isDividerVisible because the divider is only visible once *everything* is in split mode + * while this only cares if some things are (eg. while entering/exiting as well). + */ + private boolean isSplitActive() { + return mSplits.mPrimary.topActivityType != ACTIVITY_TYPE_UNDEFINED + || mSplits.mSecondary.topActivityType != ACTIVITY_TYPE_UNDEFINED; + } + private void addDivider(Configuration configuration) { Context dctx = mDisplayController.getDisplayContext(mContext.getDisplayId()); mView = (DividerView) @@ -635,8 +649,8 @@ public class Divider extends SystemUI implements DividerView.DividerCallbacks, } void onSplitDismissed() { - mMinimized = false; updateVisibility(false /* visible */); + mMinimized = false; removeDivider(); } @@ -655,7 +669,8 @@ public class Divider extends SystemUI implements DividerView.DividerCallbacks, private void setHomeMinimized(final boolean minimized, boolean homeStackResizable) { if (DEBUG) { Slog.d(TAG, "setHomeMinimized min:" + mMinimized + "->" + minimized + " hrsz:" - + mHomeStackResizable + "->" + homeStackResizable + " split:" + inSplitMode()); + + mHomeStackResizable + "->" + homeStackResizable + + " split:" + isDividerVisible()); } WindowContainerTransaction wct = new WindowContainerTransaction(); final boolean minimizedChanged = mMinimized != minimized; @@ -670,7 +685,7 @@ public class Divider extends SystemUI implements DividerView.DividerCallbacks, final boolean homeResizableChanged = mHomeStackResizable != homeStackResizable; if (homeResizableChanged) { mHomeStackResizable = homeStackResizable; - if (inSplitMode()) { + if (isDividerVisible()) { WindowManagerProxy.applyHomeTasksMinimized( mSplitLayout, mSplits.mSecondary.token, wct); } @@ -780,7 +795,7 @@ public class Divider extends SystemUI implements DividerView.DividerCallbacks, /** Register a listener that gets called whenever the existence of the divider changes */ public void registerInSplitScreenListener(Consumer<Boolean> listener) { - listener.accept(inSplitMode()); + listener.accept(isDividerVisible()); synchronized (mDockedStackExistsListeners) { mDockedStackExistsListeners.add(new WeakReference<>(listener)); } @@ -795,7 +810,7 @@ public class Divider extends SystemUI implements DividerView.DividerCallbacks, void ensureMinimizedSplit() { setHomeMinimized(true /* minimized */, mSplits.mSecondary.isResizable()); - if (!inSplitMode()) { + if (!isDividerVisible()) { // Wasn't in split-mode yet, so enter now. if (DEBUG) { Slog.d(TAG, " entering split mode with minimized=true"); @@ -806,7 +821,7 @@ public class Divider extends SystemUI implements DividerView.DividerCallbacks, void ensureNormalSplit() { setHomeMinimized(false /* minimized */, mHomeStackResizable); - if (!inSplitMode()) { + if (!isDividerVisible()) { // Wasn't in split-mode, so enter now. if (DEBUG) { Slog.d(TAG, " enter split mode unminimized "); diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java index 060760a2f940..db89cea385b7 100644 --- a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java +++ b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java @@ -28,12 +28,14 @@ import android.animation.ValueAnimator; import android.annotation.Nullable; import android.content.Context; import android.content.res.Configuration; +import android.graphics.Matrix; import android.graphics.Rect; import android.graphics.Region; import android.graphics.Region.Op; import android.hardware.display.DisplayManager; import android.os.Bundle; import android.os.Handler; +import android.os.RemoteException; import android.util.AttributeSet; import android.util.Slog; import android.view.Display; @@ -164,6 +166,9 @@ public class DividerView extends FrameLayout implements OnTouchListener, int mDividerPositionX; int mDividerPositionY; + private final Matrix mTmpMatrix = new Matrix(); + private final float[] mTmpValues = new float[9]; + // The view is removed or in the process of been removed from the system. private boolean mRemoved; @@ -249,6 +254,22 @@ public class DividerView extends FrameLayout implements OnTouchListener, } }; + private Runnable mUpdateEmbeddedMatrix = () -> { + if (getViewRootImpl() == null) { + return; + } + if (isHorizontalDivision()) { + mTmpMatrix.setTranslate(0, mDividerPositionY - mDividerInsets); + } else { + mTmpMatrix.setTranslate(mDividerPositionX - mDividerInsets, 0); + } + mTmpMatrix.getValues(mTmpValues); + try { + getViewRootImpl().getAccessibilityEmbeddedConnection().setScreenMatrix(mTmpValues); + } catch (RemoteException e) { + } + }; + public DividerView(Context context) { this(context, null); } @@ -1084,6 +1105,10 @@ public class DividerView extends FrameLayout implements OnTouchListener, t.setPosition(dividerCtrl, mDividerPositionX - mDividerInsets, 0); } } + if (getViewRootImpl() != null) { + mHandler.removeCallbacks(mUpdateEmbeddedMatrix); + mHandler.post(mUpdateEmbeddedMatrix); + } } void setResizeDimLayer(Transaction t, boolean primary, float alpha) { diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/SplitScreenTaskOrganizer.java b/packages/SystemUI/src/com/android/systemui/stackdivider/SplitScreenTaskOrganizer.java index 2862c836942f..c496d2280222 100644 --- a/packages/SystemUI/src/com/android/systemui/stackdivider/SplitScreenTaskOrganizer.java +++ b/packages/SystemUI/src/com/android/systemui/stackdivider/SplitScreenTaskOrganizer.java @@ -193,7 +193,7 @@ class SplitScreenTaskOrganizer extends TaskOrganizer { Log.d(TAG, " at-least one split empty " + mPrimary.topActivityType + " " + mSecondary.topActivityType); } - if (mDivider.inSplitMode()) { + if (mDivider.isDividerVisible()) { // Was in split-mode, which means we are leaving split, so continue that. // This happens when the stack in the primary-split is dismissed. if (DEBUG) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java index 2647c04ff586..2baab61d861b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java @@ -19,8 +19,8 @@ import static android.app.Notification.VISIBILITY_SECRET; import static android.app.admin.DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED; import static com.android.systemui.DejankUtils.whitelistIpcs; -import static com.android.systemui.statusbar.notification.stack.NotificationSectionsManager.BUCKET_MEDIA_CONTROLS; -import static com.android.systemui.statusbar.notification.stack.NotificationSectionsManager.BUCKET_SILENT; +import static com.android.systemui.statusbar.notification.stack.NotificationSectionsManagerKt.BUCKET_MEDIA_CONTROLS; +import static com.android.systemui.statusbar.notification.stack.NotificationSectionsManagerKt.BUCKET_SILENT; import android.app.ActivityManager; import android.app.KeyguardManager; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationSectionsFeatureManager.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationSectionsFeatureManager.kt index d7b391ff03e4..ce6013f776af 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationSectionsFeatureManager.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationSectionsFeatureManager.kt @@ -21,12 +21,12 @@ import android.provider.DeviceConfig import com.android.internal.annotations.VisibleForTesting import com.android.internal.config.sysui.SystemUiDeviceConfigFlags.NOTIFICATIONS_USE_PEOPLE_FILTERING -import com.android.systemui.statusbar.notification.stack.NotificationSectionsManager.BUCKET_ALERTING -import com.android.systemui.statusbar.notification.stack.NotificationSectionsManager.BUCKET_FOREGROUND_SERVICE -import com.android.systemui.statusbar.notification.stack.NotificationSectionsManager.BUCKET_HEADS_UP -import com.android.systemui.statusbar.notification.stack.NotificationSectionsManager.BUCKET_MEDIA_CONTROLS -import com.android.systemui.statusbar.notification.stack.NotificationSectionsManager.BUCKET_PEOPLE -import com.android.systemui.statusbar.notification.stack.NotificationSectionsManager.BUCKET_SILENT +import com.android.systemui.statusbar.notification.stack.BUCKET_ALERTING +import com.android.systemui.statusbar.notification.stack.BUCKET_FOREGROUND_SERVICE +import com.android.systemui.statusbar.notification.stack.BUCKET_HEADS_UP +import com.android.systemui.statusbar.notification.stack.BUCKET_MEDIA_CONTROLS +import com.android.systemui.statusbar.notification.stack.BUCKET_PEOPLE +import com.android.systemui.statusbar.notification.stack.BUCKET_SILENT import com.android.systemui.util.DeviceConfigProxy import com.android.systemui.util.Utils diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java index 634872d9d761..22ac1a2e5cf9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java @@ -31,7 +31,7 @@ import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_PEEK; import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_STATUS_BAR; import static com.android.systemui.statusbar.notification.collection.NotifCollection.REASON_NOT_CANCELED; -import static com.android.systemui.statusbar.notification.stack.NotificationSectionsManager.BUCKET_ALERTING; +import static com.android.systemui.statusbar.notification.stack.NotificationSectionsManagerKt.BUCKET_ALERTING; import static java.util.Objects.requireNonNull; @@ -68,7 +68,7 @@ import com.android.systemui.statusbar.notification.icon.IconPack; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRowController; import com.android.systemui.statusbar.notification.row.NotificationGuts; -import com.android.systemui.statusbar.notification.stack.NotificationSectionsManager; +import com.android.systemui.statusbar.notification.stack.PriorityBucket; import java.util.ArrayList; import java.util.List; @@ -409,12 +409,12 @@ public final class NotificationEntry extends ListEntry { return wasBubble != isBubble(); } - @NotificationSectionsManager.PriorityBucket + @PriorityBucket public int getBucket() { return mBucket; } - public void setBucket(@NotificationSectionsManager.PriorityBucket int bucket) { + public void setBucket(@PriorityBucket int bucket) { mBucket = bucket; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationRankingManager.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationRankingManager.kt index 9ac42298e539..cbf680c5b782 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationRankingManager.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationRankingManager.kt @@ -28,12 +28,11 @@ import com.android.systemui.statusbar.notification.NotificationSectionsFeatureMa import com.android.systemui.statusbar.notification.collection.provider.HighPriorityProvider import com.android.systemui.statusbar.notification.people.PeopleNotificationIdentifier import com.android.systemui.statusbar.notification.people.PeopleNotificationIdentifier.Companion.TYPE_NON_PERSON -import com.android.systemui.statusbar.notification.stack.NotificationSectionsManager.BUCKET_ALERTING -import com.android.systemui.statusbar.notification.stack.NotificationSectionsManager.BUCKET_FOREGROUND_SERVICE -import com.android.systemui.statusbar.notification.stack.NotificationSectionsManager.BUCKET_HEADS_UP -import com.android.systemui.statusbar.notification.stack.NotificationSectionsManager.BUCKET_PEOPLE -import com.android.systemui.statusbar.notification.stack.NotificationSectionsManager.BUCKET_SILENT -import com.android.systemui.statusbar.notification.stack.NotificationSectionsManager.PriorityBucket +import com.android.systemui.statusbar.notification.stack.BUCKET_ALERTING +import com.android.systemui.statusbar.notification.stack.BUCKET_FOREGROUND_SERVICE +import com.android.systemui.statusbar.notification.stack.BUCKET_PEOPLE +import com.android.systemui.statusbar.notification.stack.BUCKET_SILENT +import com.android.systemui.statusbar.notification.stack.PriorityBucket import com.android.systemui.statusbar.phone.NotificationGroupManager import com.android.systemui.statusbar.policy.HeadsUpManager import dagger.Lazy @@ -138,23 +137,8 @@ open class NotificationRankingManager @Inject constructor( .filterNot(notifFilter::shouldFilterOut) .sortedWith(rankingComparator) .toList() - assignBuckets(filtered) - return filtered - } - - private fun assignBuckets(entries: List<NotificationEntry>) { entries.forEach { it.bucket = getBucketForEntry(it) } - if (!usePeopleFiltering) { - // If we don't have a Conversation section, just assign buckets normally based on the - // content. - return - } - // If HUNs are not continuous with the top section, break out into a new Incoming section. - entries.asReversed().asSequence().zipWithNext().forEach { (next, entry) -> - if (entry.isRowHeadsUp && entry.bucket > next.bucket) { - entry.bucket = BUCKET_HEADS_UP - } - } + return filtered } @PriorityBucket diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSection.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSection.java index 9d456ef785a8..bad36bf3de64 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSection.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSection.java @@ -32,8 +32,8 @@ import com.android.systemui.statusbar.notification.row.ActivatableNotificationVi * Represents the bounds of a section of the notification shade and handles animation when the * bounds change. */ -class NotificationSection { - private @NotificationSectionsManager.PriorityBucket int mBucket; +public class NotificationSection { + private @PriorityBucket int mBucket; private View mOwningView; private Rect mBounds = new Rect(); private Rect mCurrentBounds = new Rect(-1, -1, -1, -1); @@ -44,7 +44,7 @@ class NotificationSection { private ActivatableNotificationView mFirstVisibleChild; private ActivatableNotificationView mLastVisibleChild; - NotificationSection(View owningView, @NotificationSectionsManager.PriorityBucket int bucket) { + NotificationSection(View owningView, @PriorityBucket int bucket) { mOwningView = owningView; mBucket = bucket; } @@ -74,7 +74,7 @@ class NotificationSection { return mBottomAnimator != null || mTopAnimator != null; } - @NotificationSectionsManager.PriorityBucket + @PriorityBucket public int getBucket() { return mBucket; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsLogger.kt index 9cf1f74ea418..17b414379f8d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsLogger.kt @@ -36,14 +36,52 @@ class NotificationSectionsLogger @Inject constructor( { "Updating section boundaries: $reason" } ) - fun logStr(str: String) = logBuffer.log( + fun logIncomingHeader(position: Int) = logPosition(position, "INCOMING HEADER") + fun logMediaControls(position: Int) = logPosition(position, "MEDIA CONTROLS") + fun logConversationsHeader(position: Int) = logPosition(position, "CONVERSATIONS HEADER") + fun logAlertingHeader(position: Int) = logPosition(position, "ALERTING HEADER") + fun logSilentHeader(position: Int) = logPosition(position, "SILENT HEADER") + + fun logOther(position: Int, clazz: Class<*>) = logBuffer.log( TAG, LogLevel.DEBUG, - { str1 = str }, - { str1 ?: "" } + { + int1 = position + str1 = clazz.name + }, + { "$int1: other ($str1)" } ) - fun logPosition(position: Int, label: String) = logBuffer.log( + fun logHeadsUp(position: Int, isHeadsUp: Boolean) = + logPosition(position, "Heads Up", isHeadsUp) + fun logConversation(position: Int, isHeadsUp: Boolean) = + logPosition(position, "Conversation", isHeadsUp) + fun logAlerting(position: Int, isHeadsUp: Boolean) = + logPosition(position, "Alerting", isHeadsUp) + fun logSilent(position: Int, isHeadsUp: Boolean) = + logPosition(position, "Silent", isHeadsUp) + fun logForegroundService(position: Int, isHeadsUp: Boolean) = + logPosition(position, "Foreground Service", isHeadsUp) + + fun logStr(str: String) = logBuffer.log(TAG, LogLevel.DEBUG, { str1 = str }, { "$str1" }) + + private fun logPosition(position: Int, label: String, isHeadsUp: Boolean) { + val headsUpTag = if (isHeadsUp) " (HUN)" else "" + logBuffer.log( + TAG, + LogLevel.DEBUG, + { + int1 = position + str1 = label + str2 = headsUpTag + }, + { + "$int1: $str1$str2" + } + ) + } + + private fun logPosition(position: Int, label: String) = logBuffer.log( TAG, LogLevel.DEBUG, { @@ -52,4 +90,4 @@ class NotificationSectionsLogger @Inject constructor( }, { "$int1: $str1" } ) -}
\ No newline at end of file +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManager.java deleted file mode 100644 index b5ba3a84fe0f..000000000000 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManager.java +++ /dev/null @@ -1,692 +0,0 @@ -/* - * Copyright (C) 2019 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.stack; - -import static com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout.ROWS_GENTLE; - -import static java.lang.annotation.RetentionPolicy.SOURCE; - -import android.annotation.ColorInt; -import android.annotation.IntDef; -import android.annotation.LayoutRes; -import android.annotation.NonNull; -import android.annotation.Nullable; -import android.content.Intent; -import android.provider.Settings; -import android.view.LayoutInflater; -import android.view.View; - -import com.android.internal.annotations.VisibleForTesting; -import com.android.systemui.R; -import com.android.systemui.media.KeyguardMediaController; -import com.android.systemui.plugins.ActivityStarter; -import com.android.systemui.plugins.statusbar.StatusBarStateController; -import com.android.systemui.statusbar.StatusBarState; -import com.android.systemui.statusbar.notification.NotificationSectionsFeatureManager; -import com.android.systemui.statusbar.notification.people.DataListener; -import com.android.systemui.statusbar.notification.people.PeopleHubViewAdapter; -import com.android.systemui.statusbar.notification.people.PeopleHubViewBoundary; -import com.android.systemui.statusbar.notification.people.PersonViewModel; -import com.android.systemui.statusbar.notification.people.Subscription; -import com.android.systemui.statusbar.notification.row.ActivatableNotificationView; -import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; -import com.android.systemui.statusbar.notification.row.ExpandableView; -import com.android.systemui.statusbar.notification.row.StackScrollerDecorView; -import com.android.systemui.statusbar.policy.ConfigurationController; -import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener; - -import java.lang.annotation.Retention; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; - -import javax.inject.Inject; - -import kotlin.sequences.Sequence; - -/** - * Manages the boundaries of the two notification sections (high priority and low priority). Also - * shows/hides the headers for those sections where appropriate. - * - * TODO: Move remaining sections logic from NSSL into this class. - */ -public class NotificationSectionsManager implements StackScrollAlgorithm.SectionProvider { - - private static final String TAG = "NotifSectionsManager"; - private static final boolean DEBUG = false; - private static final boolean ENABLE_SNOOZED_CONVERSATION_HUB = false; - - private final ActivityStarter mActivityStarter; - private final StatusBarStateController mStatusBarStateController; - private final ConfigurationController mConfigurationController; - private final PeopleHubViewAdapter mPeopleHubViewAdapter; - private final NotificationSectionsFeatureManager mSectionsFeatureManager; - private final KeyguardMediaController mKeyguardMediaController; - private final int mNumberOfSections; - private final NotificationSectionsLogger mLogger; - private final PeopleHubViewBoundary mPeopleHubViewBoundary = new PeopleHubViewBoundary() { - @Override - public void setVisible(boolean isVisible) { - if (mPeopleHubVisible != isVisible) { - mPeopleHubVisible = isVisible; - if (mInitialized) { - updateSectionBoundaries("PeopleHub visibility changed"); - } - } - } - - @NonNull - @Override - public View getAssociatedViewForClickAnimation() { - return mPeopleHubView; - } - - @NonNull - @Override - public Sequence<DataListener<PersonViewModel>> getPersonViewAdapters() { - return mPeopleHubView.getPersonViewAdapters(); - } - }; - - private NotificationStackScrollLayout mParent; - private boolean mInitialized = false; - - private SectionHeaderView mGentleHeader; - @Nullable private View.OnClickListener mOnClearGentleNotifsClickListener; - - private SectionHeaderView mAlertingHeader; - private SectionHeaderView mIncomingHeader; - - private PeopleHubView mPeopleHubView; - private boolean mPeopleHubVisible = false; - @Nullable private Subscription mPeopleHubSubscription; - - private MediaHeaderView mMediaControlsView; - - @Inject - NotificationSectionsManager( - ActivityStarter activityStarter, - StatusBarStateController statusBarStateController, - ConfigurationController configurationController, - PeopleHubViewAdapter peopleHubViewAdapter, - KeyguardMediaController keyguardMediaController, - NotificationSectionsFeatureManager sectionsFeatureManager, - NotificationSectionsLogger logger) { - - mActivityStarter = activityStarter; - mStatusBarStateController = statusBarStateController; - mConfigurationController = configurationController; - mPeopleHubViewAdapter = peopleHubViewAdapter; - mSectionsFeatureManager = sectionsFeatureManager; - mNumberOfSections = mSectionsFeatureManager.getNumberOfBuckets(); - mKeyguardMediaController = keyguardMediaController; - mLogger = logger; - } - - NotificationSection[] createSectionsForBuckets() { - int[] buckets = mSectionsFeatureManager.getNotificationBuckets(); - NotificationSection[] sections = new NotificationSection[buckets.length]; - for (int i = 0; i < buckets.length; i++) { - sections[i] = new NotificationSection(mParent, buckets[i] /* bucket */); - } - - return sections; - } - - /** Must be called before use. */ - void initialize( - NotificationStackScrollLayout parent, LayoutInflater layoutInflater) { - if (mInitialized) { - throw new IllegalStateException("NotificationSectionsManager already initialized"); - } - mInitialized = true; - mParent = parent; - reinflateViews(layoutInflater); - mConfigurationController.addCallback(mConfigurationListener); - } - - private <T extends ExpandableView> T reinflateView( - T view, LayoutInflater layoutInflater, @LayoutRes int layoutResId) { - int oldPos = -1; - if (view != null) { - if (view.getTransientContainer() != null) { - view.getTransientContainer().removeView(mGentleHeader); - } else if (view.getParent() != null) { - oldPos = mParent.indexOfChild(view); - mParent.removeView(view); - } - } - - view = (T) layoutInflater.inflate(layoutResId, mParent, false); - - if (oldPos != -1) { - mParent.addView(view, oldPos); - } - - return view; - } - - /** - * Reinflates the entire notification header, including all decoration views. - */ - void reinflateViews(LayoutInflater layoutInflater) { - mGentleHeader = reinflateView( - mGentleHeader, layoutInflater, R.layout.status_bar_notification_section_header); - mGentleHeader.setHeaderText(R.string.notification_section_header_gentle); - mGentleHeader.setOnHeaderClickListener(this::onGentleHeaderClick); - mGentleHeader.setOnClearAllClickListener(this::onClearGentleNotifsClick); - - mAlertingHeader = reinflateView( - mAlertingHeader, layoutInflater, R.layout.status_bar_notification_section_header); - mAlertingHeader.setHeaderText(R.string.notification_section_header_alerting); - mAlertingHeader.setOnHeaderClickListener(this::onGentleHeaderClick); - - if (mPeopleHubSubscription != null) { - mPeopleHubSubscription.unsubscribe(); - } - mPeopleHubView = reinflateView(mPeopleHubView, layoutInflater, R.layout.people_strip); - if (ENABLE_SNOOZED_CONVERSATION_HUB) { - mPeopleHubSubscription = mPeopleHubViewAdapter.bindView(mPeopleHubViewBoundary); - } - - mIncomingHeader = reinflateView( - mIncomingHeader, layoutInflater, R.layout.status_bar_notification_section_header); - mIncomingHeader.setHeaderText(R.string.notification_section_header_incoming); - mIncomingHeader.setOnHeaderClickListener(this::onGentleHeaderClick); - - mMediaControlsView = reinflateView(mMediaControlsView, layoutInflater, - R.layout.keyguard_media_header); - mKeyguardMediaController.attach(mMediaControlsView); - } - - /** Listener for when the "clear all" button is clicked on the gentle notification header. */ - void setOnClearGentleNotifsClickListener(View.OnClickListener listener) { - mOnClearGentleNotifsClickListener = listener; - } - - @Override - public boolean beginsSection(@NonNull View view, @Nullable View previous) { - return view == mGentleHeader - || view == mMediaControlsView - || view == mPeopleHubView - || view == mAlertingHeader - || view == mIncomingHeader - || !Objects.equals(getBucket(view), getBucket(previous)); - } - - private boolean isUsingMultipleSections() { - return mNumberOfSections > 1; - } - - @Nullable - private Integer getBucket(View view) { - if (view == mGentleHeader) { - return BUCKET_SILENT; - } else if (view == mIncomingHeader) { - return BUCKET_HEADS_UP; - } else if (view == mMediaControlsView) { - return BUCKET_MEDIA_CONTROLS; - } else if (view == mPeopleHubView) { - return BUCKET_PEOPLE; - } else if (view == mAlertingHeader) { - return BUCKET_ALERTING; - } else if (view instanceof ExpandableNotificationRow) { - return ((ExpandableNotificationRow) view).getEntry().getBucket(); - } - return null; - } - - private void logShadeContents() { - final int childCount = mParent.getChildCount(); - for (int i = 0; i < childCount; i++) { - View child = mParent.getChildAt(i); - if (child == mIncomingHeader) { - mLogger.logPosition(i, "INCOMING HEADER"); - continue; - } - if (child == mMediaControlsView) { - mLogger.logPosition(i, "MEDIA CONTROLS"); - continue; - } - if (child == mPeopleHubView) { - mLogger.logPosition(i, "CONVERSATIONS HEADER"); - continue; - } - if (child == mAlertingHeader) { - mLogger.logPosition(i, "ALERTING HEADER"); - continue; - } - if (child == mGentleHeader) { - mLogger.logPosition(i, "SILENT HEADER"); - continue; - } - - if (!(child instanceof ExpandableNotificationRow)) { - mLogger.logPosition(i, "other:" + child.getClass().getName()); - continue; - } - ExpandableNotificationRow row = (ExpandableNotificationRow) child; - // Once we enter a new section, calculate the target position for the header. - switch (row.getEntry().getBucket()) { - case BUCKET_HEADS_UP: - mLogger.logPosition(i, "Heads Up"); - break; - case BUCKET_PEOPLE: - mLogger.logPosition(i, "Conversation"); - break; - case BUCKET_ALERTING: - mLogger.logPosition(i, "Alerting"); - break; - case BUCKET_SILENT: - mLogger.logPosition(i, "Silent"); - break; - } - } - } - - @VisibleForTesting - void updateSectionBoundaries() { - updateSectionBoundaries("test"); - } - - /** - * Should be called whenever notifs are added, removed, or updated. Updates section boundary - * bookkeeping and adds/moves/removes section headers if appropriate. - */ - void updateSectionBoundaries(String reason) { - if (!isUsingMultipleSections()) { - return; - } - - mLogger.logStartSectionUpdate(reason); - - // The overall strategy here is to iterate over the current children of mParent, looking - // for where the sections headers are currently positioned, and where each section begins. - // Then, once we find the start of a new section, we track that position as the "target" for - // the section header, adjusted for the case where existing headers are in front of that - // target, but won't be once they are moved / removed after the pass has completed. - - final boolean showHeaders = mStatusBarStateController.getState() != StatusBarState.KEYGUARD; - final boolean usingPeopleFiltering = mSectionsFeatureManager.isFilteringEnabled(); - final boolean usingMediaControls = mSectionsFeatureManager.isMediaControlsEnabled(); - - boolean peopleNotifsPresent = false; - - int currentMediaControlsIdx = -1; - int mediaControlsTarget = usingMediaControls ? 0 : -1; - int currentIncomingHeaderIdx = -1; - int incomingHeaderTarget = -1; - int currentPeopleHeaderIdx = -1; - int peopleHeaderTarget = -1; - int currentAlertingHeaderIdx = -1; - int alertingHeaderTarget = -1; - int currentGentleHeaderIdx = -1; - int gentleHeaderTarget = -1; - - int lastNotifIndex = 0; - - final int childCount = mParent.getChildCount(); - for (int i = 0; i < childCount; i++) { - View child = mParent.getChildAt(i); - - // Track the existing positions of the headers - if (child == mIncomingHeader) { - mLogger.logPosition(i, "INCOMING HEADER"); - currentIncomingHeaderIdx = i; - continue; - } - if (child == mMediaControlsView) { - mLogger.logPosition(i, "MEDIA CONTROLS"); - currentMediaControlsIdx = i; - continue; - } - if (child == mPeopleHubView) { - mLogger.logPosition(i, "CONVERSATIONS HEADER"); - currentPeopleHeaderIdx = i; - continue; - } - if (child == mAlertingHeader) { - mLogger.logPosition(i, "ALERTING HEADER"); - currentAlertingHeaderIdx = i; - continue; - } - if (child == mGentleHeader) { - mLogger.logPosition(i, "SILENT HEADER"); - currentGentleHeaderIdx = i; - continue; - } - - if (!(child instanceof ExpandableNotificationRow)) { - mLogger.logPosition(i, "other"); - continue; - } - lastNotifIndex = i; - ExpandableNotificationRow row = (ExpandableNotificationRow) child; - // Once we enter a new section, calculate the target position for the header. - switch (row.getEntry().getBucket()) { - case BUCKET_HEADS_UP: - mLogger.logPosition(i, "Heads Up"); - if (showHeaders && incomingHeaderTarget == -1) { - incomingHeaderTarget = i; - // Offset the target if there are other headers before this that will be - // moved. - if (currentIncomingHeaderIdx != -1) { - incomingHeaderTarget--; - } - if (currentMediaControlsIdx != -1) { - incomingHeaderTarget--; - } - if (currentPeopleHeaderIdx != -1) { - incomingHeaderTarget--; - } - if (currentAlertingHeaderIdx != -1) { - incomingHeaderTarget--; - } - if (currentGentleHeaderIdx != -1) { - incomingHeaderTarget--; - } - } - if (mediaControlsTarget != -1) { - mediaControlsTarget++; - } - break; - case BUCKET_FOREGROUND_SERVICE: - if (mediaControlsTarget != -1) { - mediaControlsTarget++; - } - break; - case BUCKET_PEOPLE: - mLogger.logPosition(i, "Conversation"); - peopleNotifsPresent = true; - if (showHeaders && peopleHeaderTarget == -1) { - peopleHeaderTarget = i; - // Offset the target if there are other headers before this that will be - // moved. - if (currentPeopleHeaderIdx != -1) { - peopleHeaderTarget--; - } - if (currentAlertingHeaderIdx != -1) { - peopleHeaderTarget--; - } - if (currentGentleHeaderIdx != -1) { - peopleHeaderTarget--; - } - } - break; - case BUCKET_ALERTING: - mLogger.logPosition(i, "Alerting"); - if (showHeaders && usingPeopleFiltering && alertingHeaderTarget == -1) { - alertingHeaderTarget = i; - // Offset the target if there are other headers before this that will be - // moved. - if (currentAlertingHeaderIdx != -1) { - alertingHeaderTarget--; - } - if (currentGentleHeaderIdx != -1) { - alertingHeaderTarget--; - } - } - break; - case BUCKET_SILENT: - mLogger.logPosition(i, "Silent"); - if (showHeaders && gentleHeaderTarget == -1) { - gentleHeaderTarget = i; - // Offset the target if there are other headers before this that will be - // moved. - if (currentGentleHeaderIdx != -1) { - gentleHeaderTarget--; - } - } - break; - default: - throw new IllegalStateException("Cannot find section bucket for view"); - } - } - if (showHeaders && usingPeopleFiltering && mPeopleHubVisible && peopleHeaderTarget == -1) { - // Insert the people header even if there are no people visible, in order to show - // the hub. Put it directly above the next header. - if (alertingHeaderTarget != -1) { - peopleHeaderTarget = alertingHeaderTarget; - } else if (gentleHeaderTarget != -1) { - peopleHeaderTarget = gentleHeaderTarget; - } else { - // Put it at the end of the list. - peopleHeaderTarget = lastNotifIndex; - } - // Offset the target to account for the current position of the people header. - if (currentPeopleHeaderIdx != -1 && currentPeopleHeaderIdx < peopleHeaderTarget) { - peopleHeaderTarget--; - } - } - - mLogger.logStr("New header target positions:"); - - mLogger.logPosition(incomingHeaderTarget, "INCOMING HEADER"); - mLogger.logPosition(mediaControlsTarget, "MEDIA CONTROLS"); - mLogger.logPosition(peopleHeaderTarget, "CONVERSATIONS HEADER"); - mLogger.logPosition(alertingHeaderTarget, "ALERTING HEADER"); - mLogger.logPosition(gentleHeaderTarget, "SILENT HEADER"); - - // Add headers in reverse order to preserve indices - adjustHeaderVisibilityAndPosition( - gentleHeaderTarget, mGentleHeader, currentGentleHeaderIdx); - adjustHeaderVisibilityAndPosition( - alertingHeaderTarget, mAlertingHeader, currentAlertingHeaderIdx); - adjustHeaderVisibilityAndPosition( - peopleHeaderTarget, mPeopleHubView, currentPeopleHeaderIdx); - adjustViewPosition(mediaControlsTarget, mMediaControlsView, currentMediaControlsIdx); - adjustHeaderVisibilityAndPosition(incomingHeaderTarget, mIncomingHeader, - currentIncomingHeaderIdx); - - - mLogger.logStr("Final order:"); - - logShadeContents(); - - mLogger.logStr("Section boundary update complete"); - - // Update headers to reflect state of section contents - mGentleHeader.setAreThereDismissableGentleNotifs( - mParent.hasActiveClearableNotifications(ROWS_GENTLE)); - mPeopleHubView.setCanSwipe(showHeaders && mPeopleHubVisible && !peopleNotifsPresent); - if (peopleHeaderTarget != currentPeopleHeaderIdx) { - mPeopleHubView.resetTranslation(); - } - } - - private void adjustHeaderVisibilityAndPosition( - int targetPosition, StackScrollerDecorView header, int currentPosition) { - adjustViewPosition(targetPosition, header, currentPosition); - if (targetPosition != -1 && currentPosition == -1) { - header.setContentVisible(true); - } - } - - private void adjustViewPosition(int targetPosition, ExpandableView view, int currentPosition) { - if (targetPosition == -1) { - if (currentPosition != -1) { - mParent.removeView(view); - } - } else { - if (currentPosition == -1) { - // If the header is animating away, it will still have a parent, so detach it first - // TODO: We should really cancel the active animations here. This will happen - // automatically when the view's intro animation starts, but it's a fragile link. - if (view.getTransientContainer() != null) { - view.getTransientContainer().removeTransientView(view); - view.setTransientContainer(null); - } - mParent.addView(view, targetPosition); - } else { - mParent.changeViewPosition(view, targetPosition); - } - } - } - - /** - * Updates the boundaries (as tracked by their first and last views) of the priority sections. - * - * @return {@code true} If the last view in the top section changed (so we need to animate). - */ - boolean updateFirstAndLastViewsForAllSections( - NotificationSection[] sections, - List<ActivatableNotificationView> children) { - - if (sections.length <= 0 || children.size() <= 0) { - for (NotificationSection s : sections) { - s.setFirstVisibleChild(null); - s.setLastVisibleChild(null); - } - return false; - } - - boolean changed = false; - ArrayList<ActivatableNotificationView> viewsInBucket = new ArrayList<>(); - for (NotificationSection s : sections) { - int filter = s.getBucket(); - viewsInBucket.clear(); - - //TODO: do this in a single pass, and more better - for (ActivatableNotificationView v : children) { - Integer bucket = getBucket(v); - if (bucket == null) { - throw new IllegalArgumentException("Cannot find section bucket for view"); - } - - if (bucket == filter) { - viewsInBucket.add(v); - } - - if (viewsInBucket.size() >= 1) { - changed |= s.setFirstVisibleChild(viewsInBucket.get(0)); - changed |= s.setLastVisibleChild(viewsInBucket.get(viewsInBucket.size() - 1)); - } else { - changed |= s.setFirstVisibleChild(null); - changed |= s.setLastVisibleChild(null); - } - } - } - - if (DEBUG) { - logSections(sections); - } - - return changed; - } - - private void logSections(NotificationSection[] sections) { - for (int i = 0; i < sections.length; i++) { - NotificationSection s = sections[i]; - ActivatableNotificationView first = s.getFirstVisibleChild(); - String fs = first == null ? "(null)" - : (first instanceof ExpandableNotificationRow) - ? ((ExpandableNotificationRow) first).getEntry().getKey() - : Integer.toHexString(System.identityHashCode(first)); - ActivatableNotificationView last = s.getLastVisibleChild(); - String ls = last == null ? "(null)" - : (last instanceof ExpandableNotificationRow) - ? ((ExpandableNotificationRow) last).getEntry().getKey() - : Integer.toHexString(System.identityHashCode(last)); - android.util.Log.d(TAG, "updateSections: f=" + fs + " s=" + i); - android.util.Log.d(TAG, "updateSections: l=" + ls + " s=" + i); - } - } - - @VisibleForTesting - ExpandableView getGentleHeaderView() { - return mGentleHeader; - } - - @VisibleForTesting - ExpandableView getAlertingHeaderView() { - return mAlertingHeader; - } - - @VisibleForTesting - ExpandableView getPeopleHeaderView() { - return mPeopleHubView; - } - - @VisibleForTesting - ExpandableView getMediaControlsView() { - return mMediaControlsView; - } - - @VisibleForTesting - ExpandableView getIncomingHeaderView() { - return mIncomingHeader; - } - - @VisibleForTesting - void setPeopleHubVisible(boolean visible) { - mPeopleHubVisible = visible; - } - - private final ConfigurationListener mConfigurationListener = new ConfigurationListener() { - @Override - public void onLocaleListChanged() { - reinflateViews(LayoutInflater.from(mParent.getContext())); - } - }; - - private void onGentleHeaderClick(View v) { - Intent intent = new Intent(Settings.ACTION_NOTIFICATION_SETTINGS); - mActivityStarter.startActivity( - intent, - true, - true, - Intent.FLAG_ACTIVITY_SINGLE_TOP); - } - - private void onClearGentleNotifsClick(View v) { - if (mOnClearGentleNotifsClickListener != null) { - mOnClearGentleNotifsClickListener.onClick(v); - } - } - - void hidePeopleRow() { - mPeopleHubVisible = false; - updateSectionBoundaries("PeopleHub dismissed"); - } - - void setHeaderForegroundColor(@ColorInt int color) { - mPeopleHubView.setTextColor(color); - mGentleHeader.setForegroundColor(color); - mAlertingHeader.setForegroundColor(color); - } - - /** - * For now, declare the available notification buckets (sections) here so that other - * presentation code can decide what to do based on an entry's buckets - */ - @Retention(SOURCE) - @IntDef(prefix = { "BUCKET_" }, value = { - BUCKET_HEADS_UP, - BUCKET_FOREGROUND_SERVICE, - BUCKET_MEDIA_CONTROLS, - BUCKET_PEOPLE, - BUCKET_ALERTING, - BUCKET_SILENT - }) - public @interface PriorityBucket {} - public static final int BUCKET_HEADS_UP = 0; - public static final int BUCKET_FOREGROUND_SERVICE = 1; - public static final int BUCKET_MEDIA_CONTROLS = 2; - public static final int BUCKET_PEOPLE = 3; - public static final int BUCKET_ALERTING = 4; - public static final int BUCKET_SILENT = 5; -} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManager.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManager.kt new file mode 100644 index 000000000000..65633a2e209f --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManager.kt @@ -0,0 +1,596 @@ +/* + * Copyright (C) 2019 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.stack + +import android.annotation.ColorInt +import android.annotation.IntDef +import android.annotation.LayoutRes +import android.content.Intent +import android.provider.Settings +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import com.android.internal.annotations.VisibleForTesting +import com.android.systemui.R +import com.android.systemui.media.KeyguardMediaController +import com.android.systemui.plugins.ActivityStarter +import com.android.systemui.plugins.statusbar.StatusBarStateController +import com.android.systemui.statusbar.StatusBarState +import com.android.systemui.statusbar.notification.NotificationSectionsFeatureManager +import com.android.systemui.statusbar.notification.people.DataListener +import com.android.systemui.statusbar.notification.people.PeopleHubViewAdapter +import com.android.systemui.statusbar.notification.people.PeopleHubViewBoundary +import com.android.systemui.statusbar.notification.people.PersonViewModel +import com.android.systemui.statusbar.notification.people.Subscription +import com.android.systemui.statusbar.notification.row.ActivatableNotificationView +import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow +import com.android.systemui.statusbar.notification.row.ExpandableView +import com.android.systemui.statusbar.notification.row.StackScrollerDecorView +import com.android.systemui.statusbar.notification.stack.StackScrollAlgorithm.SectionProvider +import com.android.systemui.statusbar.policy.ConfigurationController +import com.android.systemui.util.children +import com.android.systemui.util.foldToSparseArray +import javax.inject.Inject + +/** + * Manages the boundaries of the two notification sections (high priority and low priority). Also + * shows/hides the headers for those sections where appropriate. + * + * TODO: Move remaining sections logic from NSSL into this class. + */ +class NotificationSectionsManager @Inject internal constructor( + private val activityStarter: ActivityStarter, + private val statusBarStateController: StatusBarStateController, + private val configurationController: ConfigurationController, + private val peopleHubViewAdapter: PeopleHubViewAdapter, + private val keyguardMediaController: KeyguardMediaController, + private val sectionsFeatureManager: NotificationSectionsFeatureManager, + private val logger: NotificationSectionsLogger +) : SectionProvider { + + private val configurationListener = object : ConfigurationController.ConfigurationListener { + override fun onLocaleListChanged() { + reinflateViews(LayoutInflater.from(parent.context)) + } + } + + private val peopleHubViewBoundary: PeopleHubViewBoundary = object : PeopleHubViewBoundary { + override fun setVisible(isVisible: Boolean) { + if (peopleHubVisible != isVisible) { + peopleHubVisible = isVisible + if (initialized) { + updateSectionBoundaries("PeopleHub visibility changed") + } + } + } + + override val associatedViewForClickAnimation: View + get() = peopleHeaderView!! + + override val personViewAdapters: Sequence<DataListener<PersonViewModel?>> + get() = peopleHeaderView!!.personViewAdapters + } + + private lateinit var parent: NotificationStackScrollLayout + private var initialized = false + private var onClearSilentNotifsClickListener: View.OnClickListener? = null + + @get:VisibleForTesting + var silentHeaderView: SectionHeaderView? = null + private set + + @get:VisibleForTesting + var alertingHeaderView: SectionHeaderView? = null + private set + + @get:VisibleForTesting + var incomingHeaderView: SectionHeaderView? = null + private set + + @get:VisibleForTesting + var peopleHeaderView: PeopleHubView? = null + private set + + @set:VisibleForTesting + var peopleHubVisible = false + private var peopleHubSubscription: Subscription? = null + + @get:VisibleForTesting + var mediaControlsView: MediaHeaderView? = null + private set + + /** Must be called before use. */ + fun initialize(parent: NotificationStackScrollLayout, layoutInflater: LayoutInflater) { + check(!initialized) { "NotificationSectionsManager already initialized" } + initialized = true + this.parent = parent + reinflateViews(layoutInflater) + configurationController.addCallback(configurationListener) + } + + private fun <T : ExpandableView> reinflateView( + view: T?, + layoutInflater: LayoutInflater, + @LayoutRes layoutResId: Int + ): T { + var oldPos = -1 + view?.let { + view.transientContainer?.removeView(view) + if (view.parent === parent) { + oldPos = parent.indexOfChild(view) + parent.removeView(view) + } + } + val inflated = layoutInflater.inflate(layoutResId, parent, false) as T + if (oldPos != -1) { + parent.addView(inflated, oldPos) + } + return inflated + } + + fun createSectionsForBuckets(): Array<NotificationSection> = + sectionsFeatureManager.getNotificationBuckets() + .map { NotificationSection(parent, it) } + .toTypedArray() + + /** + * Reinflates the entire notification header, including all decoration views. + */ + fun reinflateViews(layoutInflater: LayoutInflater) { + silentHeaderView = reinflateView( + silentHeaderView, layoutInflater, R.layout.status_bar_notification_section_header + ).apply { + setHeaderText(R.string.notification_section_header_gentle) + setOnHeaderClickListener { onGentleHeaderClick() } + setOnClearAllClickListener { onClearGentleNotifsClick(it) } + } + alertingHeaderView = reinflateView( + alertingHeaderView, layoutInflater, R.layout.status_bar_notification_section_header + ).apply { + setHeaderText(R.string.notification_section_header_alerting) + setOnHeaderClickListener { onGentleHeaderClick() } + } + peopleHubSubscription?.unsubscribe() + peopleHubSubscription = null + peopleHeaderView = reinflateView(peopleHeaderView, layoutInflater, R.layout.people_strip) + if (ENABLE_SNOOZED_CONVERSATION_HUB) { + peopleHubSubscription = peopleHubViewAdapter.bindView(peopleHubViewBoundary) + } + incomingHeaderView = reinflateView( + incomingHeaderView, layoutInflater, R.layout.status_bar_notification_section_header + ).apply { + setHeaderText(R.string.notification_section_header_incoming) + setOnHeaderClickListener { onGentleHeaderClick() } + } + mediaControlsView = + reinflateView(mediaControlsView, layoutInflater, R.layout.keyguard_media_header) + .also(keyguardMediaController::attach) + } + + override fun beginsSection(view: View, previous: View?): Boolean = + view === silentHeaderView || + view === mediaControlsView || + view === peopleHeaderView || + view === alertingHeaderView || + view === incomingHeaderView || + getBucket(view) != getBucket(previous) + + private fun getBucket(view: View?): Int? = when { + view === silentHeaderView -> BUCKET_SILENT + view === incomingHeaderView -> BUCKET_HEADS_UP + view === mediaControlsView -> BUCKET_MEDIA_CONTROLS + view === peopleHeaderView -> BUCKET_PEOPLE + view === alertingHeaderView -> BUCKET_ALERTING + view is ExpandableNotificationRow -> view.entry.bucket + else -> null + } + + private fun logShadeContents() = parent.children.forEachIndexed { i, child -> + when { + child === incomingHeaderView -> logger.logIncomingHeader(i) + child === mediaControlsView -> logger.logMediaControls(i) + child === peopleHeaderView -> logger.logConversationsHeader(i) + child === alertingHeaderView -> logger.logAlertingHeader(i) + child === silentHeaderView -> logger.logSilentHeader(i) + child !is ExpandableNotificationRow -> logger.logOther(i, child.javaClass) + else -> { + val isHeadsUp = child.isHeadsUp + when (child.entry.bucket) { + BUCKET_HEADS_UP -> logger.logHeadsUp(i, isHeadsUp) + BUCKET_PEOPLE -> logger.logConversation(i, isHeadsUp) + BUCKET_ALERTING -> logger.logAlerting(i, isHeadsUp) + BUCKET_SILENT -> logger.logSilent(i, isHeadsUp) + } + } + } + } + + private val isUsingMultipleSections: Boolean + get() = sectionsFeatureManager.getNumberOfBuckets() > 1 + + @VisibleForTesting + fun updateSectionBoundaries() = updateSectionBoundaries("test") + + /** + * Should be called whenever notifs are added, removed, or updated. Updates section boundary + * bookkeeping and adds/moves/removes section headers if appropriate. + */ + fun updateSectionBoundaries(reason: String) { + if (!isUsingMultipleSections) { + return + } + logger.logStartSectionUpdate(reason) + + // The overall strategy here is to iterate over the current children of mParent, looking + // for where the sections headers are currently positioned, and where each section begins. + // Then, once we find the start of a new section, we track that position as the "target" for + // the section header, adjusted for the case where existing headers are in front of that + // target, but won't be once they are moved / removed after the pass has completed. + val showHeaders = statusBarStateController.state != StatusBarState.KEYGUARD + val usingPeopleFiltering = sectionsFeatureManager.isFilteringEnabled() + val usingMediaControls = sectionsFeatureManager.isMediaControlsEnabled() + + var peopleNotifsPresent = false + var currentMediaControlsIdx = -1 + val mediaControlsTarget = if (usingMediaControls) 0 else -1 + var currentIncomingHeaderIdx = -1 + var incomingHeaderTarget = -1 + var currentPeopleHeaderIdx = -1 + var peopleHeaderTarget = -1 + var currentAlertingHeaderIdx = -1 + var alertingHeaderTarget = -1 + var currentGentleHeaderIdx = -1 + var gentleHeaderTarget = -1 + + var lastNotifIndex = 0 + var lastIncomingIndex = -1 + var prev: ExpandableNotificationRow? = null + + for ((i, child) in parent.children.withIndex()) { + when { + // Track the existing positions of the headers + child === incomingHeaderView -> { + logger.logIncomingHeader(i) + currentIncomingHeaderIdx = i + } + child === mediaControlsView -> { + logger.logMediaControls(i) + currentMediaControlsIdx = i + } + child === peopleHeaderView -> { + logger.logConversationsHeader(i) + currentPeopleHeaderIdx = i + } + child === alertingHeaderView -> { + logger.logAlertingHeader(i) + currentAlertingHeaderIdx = i + } + child === silentHeaderView -> { + logger.logSilentHeader(i) + currentGentleHeaderIdx = i + } + child !is ExpandableNotificationRow -> logger.logOther(i, child.javaClass) + else -> { + lastNotifIndex = i + // Is there a section discontinuity? This usually occurs due to HUNs + if (prev?.entry?.bucket?.let { it > child.entry.bucket } == true) { + // Remove existing headers, and move the Incoming header if necessary + if (alertingHeaderTarget != -1) { + if (showHeaders && incomingHeaderTarget != -1) { + incomingHeaderTarget = alertingHeaderTarget + } + alertingHeaderTarget = -1 + } + if (peopleHeaderTarget != -1) { + if (showHeaders && incomingHeaderTarget != -1) { + incomingHeaderTarget = peopleHeaderTarget + } + peopleHeaderTarget = -1 + } + if (showHeaders && incomingHeaderTarget == -1) { + incomingHeaderTarget = 0 + } + // Walk backwards changing all previous notifications to the Incoming + // section + for (j in i - 1 downTo lastIncomingIndex + 1) { + val prevChild = parent.getChildAt(j) + if (prevChild is ExpandableNotificationRow) { + prevChild.entry.bucket = BUCKET_HEADS_UP + } + } + // Track the new bottom of the Incoming section + lastIncomingIndex = i - 1 + } + val isHeadsUp = child.isHeadsUp + when (child.entry.bucket) { + BUCKET_FOREGROUND_SERVICE -> logger.logForegroundService(i, isHeadsUp) + BUCKET_PEOPLE -> { + logger.logConversation(i, isHeadsUp) + peopleNotifsPresent = true + if (showHeaders && peopleHeaderTarget == -1) { + peopleHeaderTarget = i + // Offset the target if there are other headers before this that + // will be moved. + if (currentPeopleHeaderIdx != -1) { + peopleHeaderTarget-- + } + if (currentAlertingHeaderIdx != -1) { + peopleHeaderTarget-- + } + if (currentGentleHeaderIdx != -1) { + peopleHeaderTarget-- + } + } + } + BUCKET_ALERTING -> { + logger.logAlerting(i, isHeadsUp) + if (showHeaders && usingPeopleFiltering && alertingHeaderTarget == -1) { + alertingHeaderTarget = i + // Offset the target if there are other headers before this that + // will be moved. + if (currentAlertingHeaderIdx != -1) { + alertingHeaderTarget-- + } + if (currentGentleHeaderIdx != -1) { + alertingHeaderTarget-- + } + } + } + BUCKET_SILENT -> { + logger.logSilent(i, isHeadsUp) + if (showHeaders && gentleHeaderTarget == -1) { + gentleHeaderTarget = i + // Offset the target if there are other headers before this that + // will be moved. + if (currentGentleHeaderIdx != -1) { + gentleHeaderTarget-- + } + } + } + else -> throw IllegalStateException("Cannot find section bucket for view") + } + + prev = child + } + } + } + + if (showHeaders && usingPeopleFiltering && peopleHubVisible && peopleHeaderTarget == -1) { + // Insert the people header even if there are no people visible, in order to show + // the hub. Put it directly above the next header. + peopleHeaderTarget = when { + alertingHeaderTarget != -1 -> alertingHeaderTarget + gentleHeaderTarget != -1 -> gentleHeaderTarget + else -> lastNotifIndex // Put it at the end of the list. + } + // Offset the target to account for the current position of the people header. + if (currentPeopleHeaderIdx != -1 && currentPeopleHeaderIdx < peopleHeaderTarget) { + peopleHeaderTarget-- + } + } + + logger.logStr("New header target positions:") + logger.logIncomingHeader(incomingHeaderTarget) + logger.logMediaControls(mediaControlsTarget) + logger.logConversationsHeader(peopleHeaderTarget) + logger.logAlertingHeader(alertingHeaderTarget) + logger.logSilentHeader(gentleHeaderTarget) + + // Add headers in reverse order to preserve indices + silentHeaderView?.let { + adjustHeaderVisibilityAndPosition(gentleHeaderTarget, it, currentGentleHeaderIdx) + } + alertingHeaderView?.let { + adjustHeaderVisibilityAndPosition(alertingHeaderTarget, it, currentAlertingHeaderIdx) + } + peopleHeaderView?.let { + adjustHeaderVisibilityAndPosition(peopleHeaderTarget, it, currentPeopleHeaderIdx) + } + incomingHeaderView?.let { + adjustHeaderVisibilityAndPosition(incomingHeaderTarget, it, currentIncomingHeaderIdx) + } + mediaControlsView?.let { + adjustViewPosition(mediaControlsTarget, it, currentMediaControlsIdx) + } + + logger.logStr("Final order:") + logShadeContents() + logger.logStr("Section boundary update complete") + + // Update headers to reflect state of section contents + silentHeaderView?.setAreThereDismissableGentleNotifs( + parent.hasActiveClearableNotifications(NotificationStackScrollLayout.ROWS_GENTLE) + ) + peopleHeaderView?.canSwipe = showHeaders && peopleHubVisible && !peopleNotifsPresent + if (peopleHeaderTarget != currentPeopleHeaderIdx) { + peopleHeaderView?.resetTranslation() + } + } + + private fun adjustHeaderVisibilityAndPosition( + targetPosition: Int, + header: StackScrollerDecorView, + currentPosition: Int + ) { + adjustViewPosition(targetPosition, header, currentPosition) + if (targetPosition != -1 && currentPosition == -1) { + header.isContentVisible = true + } + } + + private fun adjustViewPosition( + targetPosition: Int, + view: ExpandableView, + currentPosition: Int + ) { + if (targetPosition == -1) { + if (currentPosition != -1) { + parent.removeView(view) + } + } else { + if (currentPosition == -1) { + // If the header is animating away, it will still have a parent, so detach it first + // TODO: We should really cancel the active animations here. This will happen + // automatically when the view's intro animation starts, but it's a fragile link. + view.transientContainer?.removeTransientView(view) + view.transientContainer = null + parent.addView(view, targetPosition) + } else { + parent.changeViewPosition(view, targetPosition) + } + } + } + + private sealed class SectionBounds { + + data class Many( + val first: ActivatableNotificationView, + val last: ActivatableNotificationView + ) : SectionBounds() + + data class One(val lone: ActivatableNotificationView) : SectionBounds() + object None : SectionBounds() + + fun addNotif(notif: ActivatableNotificationView): SectionBounds = when (this) { + is None -> One(notif) + is One -> Many(lone, notif) + is Many -> copy(last = notif) + } + + fun updateSection(section: NotificationSection): Boolean = when (this) { + is None -> section.setFirstAndLastVisibleChildren(null, null) + is One -> section.setFirstAndLastVisibleChildren(lone, lone) + is Many -> section.setFirstAndLastVisibleChildren(first, last) + } + + private fun NotificationSection.setFirstAndLastVisibleChildren( + first: ActivatableNotificationView?, + last: ActivatableNotificationView? + ): Boolean { + val firstChanged = setFirstVisibleChild(first) + val lastChanged = setLastVisibleChild(last) + return firstChanged || lastChanged + } + } + + /** + * Updates the boundaries (as tracked by their first and last views) of the priority sections. + * + * @return `true` If the last view in the top section changed (so we need to animate). + */ + fun updateFirstAndLastViewsForAllSections( + sections: Array<NotificationSection>, + children: List<ActivatableNotificationView> + ): Boolean { + // Create mapping of bucket to section + val sectionBounds = children.asSequence() + // Group children by bucket + .groupingBy { + getBucket(it) + ?: throw IllegalArgumentException("Cannot find section bucket for view") + } + // Combine each bucket into a SectionBoundary + .foldToSparseArray( + SectionBounds.None, + size = sections.size, + operation = SectionBounds::addNotif + ) + // Update each section with the associated boundary, tracking if there was a change + val changed = sections.fold(false) { changed, section -> + val bounds = sectionBounds[section.bucket] ?: SectionBounds.None + bounds.updateSection(section) || changed + } + if (DEBUG) { + logSections(sections) + } + return changed + } + + private fun logSections(sections: Array<NotificationSection>) { + for (i in sections.indices) { + val s = sections[i] + val fs = when (val first = s.firstVisibleChild) { + null -> "(null)" + is ExpandableNotificationRow -> first.entry.key + else -> Integer.toHexString(System.identityHashCode(first)) + } + val ls = when (val last = s.lastVisibleChild) { + null -> "(null)" + is ExpandableNotificationRow -> last.entry.key + else -> Integer.toHexString(System.identityHashCode(last)) + } + Log.d(TAG, "updateSections: f=$fs s=$i") + Log.d(TAG, "updateSections: l=$ls s=$i") + } + } + + private fun onGentleHeaderClick() { + val intent = Intent(Settings.ACTION_NOTIFICATION_SETTINGS) + activityStarter.startActivity( + intent, + true, + true, + Intent.FLAG_ACTIVITY_SINGLE_TOP) + } + + private fun onClearGentleNotifsClick(v: View) { + onClearSilentNotifsClickListener?.onClick(v) + } + + /** Listener for when the "clear all" button is clicked on the gentle notification header. */ + fun setOnClearSilentNotifsClickListener(listener: View.OnClickListener) { + onClearSilentNotifsClickListener = listener + } + + fun hidePeopleRow() { + peopleHubVisible = false + updateSectionBoundaries("PeopleHub dismissed") + } + + fun setHeaderForegroundColor(@ColorInt color: Int) { + peopleHeaderView?.setTextColor(color) + silentHeaderView?.setForegroundColor(color) + alertingHeaderView?.setForegroundColor(color) + } + + companion object { + private const val TAG = "NotifSectionsManager" + private const val DEBUG = false + private const val ENABLE_SNOOZED_CONVERSATION_HUB = false + } +} + +/** + * For now, declare the available notification buckets (sections) here so that other + * presentation code can decide what to do based on an entry's buckets + */ +@Retention(AnnotationRetention.SOURCE) +@IntDef( + prefix = ["BUCKET_"], + value = [ + BUCKET_UNKNOWN, BUCKET_MEDIA_CONTROLS, BUCKET_HEADS_UP, BUCKET_FOREGROUND_SERVICE, + BUCKET_PEOPLE, BUCKET_ALERTING, BUCKET_SILENT + ] +) +annotation class PriorityBucket + +const val BUCKET_UNKNOWN = 0 +const val BUCKET_MEDIA_CONTROLS = 1 +const val BUCKET_HEADS_UP = 2 +const val BUCKET_FOREGROUND_SERVICE = 3 +const val BUCKET_PEOPLE = 4 +const val BUCKET_ALERTING = 5 +const val BUCKET_SILENT = 6 diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java index 1ccc2bde2288..3db4b6f7ffbb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java @@ -21,7 +21,7 @@ import static android.service.notification.NotificationStats.DISMISS_SENTIMENT_N import static com.android.systemui.Dependency.ALLOW_NOTIFICATION_LONG_PRESS_NAME; import static com.android.systemui.statusbar.notification.ActivityLaunchAnimator.ExpandAnimationParameters; -import static com.android.systemui.statusbar.notification.stack.NotificationSectionsManager.BUCKET_SILENT; +import static com.android.systemui.statusbar.notification.stack.NotificationSectionsManagerKt.BUCKET_SILENT; import static com.android.systemui.statusbar.notification.stack.StackScrollAlgorithm.ANCHOR_SCROLLING; import static com.android.systemui.statusbar.notification.stack.StackStateAnimator.ANIMATION_DURATION_SWIPE; import static com.android.systemui.statusbar.phone.NotificationIconAreaController.HIGH_PRIORITY; @@ -577,7 +577,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd mSectionsManager = notificationSectionsManager; mSectionsManager.initialize(this, LayoutInflater.from(context)); - mSectionsManager.setOnClearGentleNotifsClickListener(v -> { + mSectionsManager.setOnClearSilentNotifsClickListener(v -> { // Leave the shade open if there will be other notifs left over to clear final boolean closeShade = !hasActiveClearableNotifications(ROWS_HIGH_PRIORITY); clearNotifications(ROWS_GENTLE, closeShade); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index bbf83bc2057a..3fa530af77de 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -1488,7 +1488,7 @@ public class StatusBar extends SystemUI implements DemoMode, if (mDividerOptional.isPresent()) { divider = mDividerOptional.get(); } - if (divider == null || !divider.inSplitMode()) { + if (divider == null || !divider.isDividerVisible()) { final int navbarPos = WindowManagerWrapper.getInstance().getNavBarPosition(mDisplayId); if (navbarPos == NAV_BAR_POS_INVALID) { return false; diff --git a/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingActivity.java b/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingActivity.java index 367d4d2bcfa0..2973e0aedd43 100644 --- a/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingActivity.java +++ b/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingActivity.java @@ -23,15 +23,12 @@ import android.debug.IAdbManager; import android.os.Bundle; import android.os.IBinder; import android.os.ServiceManager; -import android.util.EventLog; import android.util.Log; import android.view.LayoutInflater; -import android.view.MotionEvent; import android.view.View; import android.view.Window; import android.view.WindowManager; import android.widget.CheckBox; -import android.widget.Toast; import com.android.internal.app.AlertActivity; import com.android.internal.app.AlertController; @@ -79,25 +76,6 @@ public class UsbDebuggingActivity extends AlertActivity window.setCloseOnTouchOutside(false); setupAlert(); - - // adding touch listener on affirmative button - checks if window is obscured - // if obscured, do not let user give permissions (could be tapjacking involved) - final View.OnTouchListener filterTouchListener = (View v, MotionEvent event) -> { - // Filter obscured touches by consuming them. - if (((event.getFlags() & MotionEvent.FLAG_WINDOW_IS_OBSCURED) != 0) - || ((event.getFlags() & MotionEvent.FLAG_WINDOW_IS_PARTIALLY_OBSCURED) != 0)) { - if (event.getAction() == MotionEvent.ACTION_UP) { - EventLog.writeEvent(0x534e4554, "62187985"); // safety net logging - Toast.makeText(v.getContext(), - R.string.touch_filtered_warning, - Toast.LENGTH_SHORT).show(); - } - return true; - } - return false; - }; - mAlert.getButton(BUTTON_POSITIVE).setOnTouchListener(filterTouchListener); - } @Override diff --git a/packages/SystemUI/src/com/android/systemui/util/ConvenienceExtensions.kt b/packages/SystemUI/src/com/android/systemui/util/ConvenienceExtensions.kt new file mode 100644 index 000000000000..c91033e4745a --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/util/ConvenienceExtensions.kt @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.util + +import android.view.ViewGroup + +/** [Sequence] that yields all of the direct children of this [ViewGroup] */ +val ViewGroup.children + get() = sequence { + for (i in 0 until childCount) yield(getChildAt(i)) + }
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/util/SparseArrayUtils.kt b/packages/SystemUI/src/com/android/systemui/util/SparseArrayUtils.kt new file mode 100644 index 000000000000..accb81eae32a --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/util/SparseArrayUtils.kt @@ -0,0 +1,136 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.util + +import android.util.SparseArray + +/** + * Transforms an [Array] into a [SparseArray], by applying each element to [keySelector] in order to + * generate the index at which it will be placed. If two elements produce the same index, the latter + * replaces the former in the final result. + * + * See [Array.associateBy]. + */ +inline fun <T> Array<T>.associateByToSparseArray( + crossinline keySelector: (T) -> Int +): SparseArray<T> { + val sparseArray = SparseArray<T>(size) + for (value in this) { + sparseArray.put(keySelector(value), value) + } + return sparseArray +} + +/** + * Folds a [Grouping] into a [SparseArray]. See [Grouping.fold]. + */ +inline fun <T, R> Grouping<T, Int>.foldToSparseArray( + initial: R, + size: Int = -1, + crossinline operation: (R, T) -> R +): SparseArray<R> { + val sparseArray = when { + size < 0 -> SparseArray<R>() + else -> SparseArray<R>(size) + } + sourceIterator().forEach { elem -> + val key = keyOf(elem) + val acc = sparseArray.get(key) ?: initial + sparseArray.put(key, operation(acc, elem)) + } + return sparseArray +} + +/** + * Wraps this [SparseArray] into an immutable [Map], the methods of which forward to this + * [SparseArray]. + */ +fun <T> SparseArray<T>.asMap(): Map<Int, T> = SparseArrayMapWrapper(this) + +private class SparseArrayMapWrapper<T>( + private val sparseArray: SparseArray<T> +) : Map<Int, T> { + + private data class Entry<T>(override val key: Int, override val value: T) : Map.Entry<Int, T> + + private val entrySequence = sequence { + val size = sparseArray.size() + for (i in 0 until size) { + val key = sparseArray.keyAt(i) + val value = sparseArray.get(key) + yield(Entry(key, value)) + } + } + + override val entries: Set<Map.Entry<Int, T>> + get() = object : Set<Map.Entry<Int, T>> { + override val size: Int + get() = this@SparseArrayMapWrapper.size + + override fun contains(element: Map.Entry<Int, T>): Boolean = + sparseArray[element.key]?.let { it == element.value } == true + + override fun containsAll(elements: Collection<Map.Entry<Int, T>>): Boolean = + elements.all { contains(it) } + + override fun isEmpty(): Boolean = size == 0 + + override fun iterator(): Iterator<Map.Entry<Int, T>> = entrySequence.iterator() + } + + override val keys: Set<Int> = object : Set<Int> { + private val keySequence = entrySequence.map { it.key } + + override val size: Int + get() = this@SparseArrayMapWrapper.size + + override fun contains(element: Int): Boolean = containsKey(element) + + override fun containsAll(elements: Collection<Int>): Boolean = + elements.all { contains(it) } + + override fun isEmpty(): Boolean = size == 0 + + override fun iterator(): Iterator<Int> = keySequence.iterator() + } + override val size: Int + get() = sparseArray.size() + override val values: Collection<T> + get() = object : Collection<T> { + private val valueSequence = entrySequence.map { it.value } + + override val size: Int + get() = this@SparseArrayMapWrapper.size + + override fun contains(element: T): Boolean = containsValue(element) + + override fun containsAll(elements: Collection<T>): Boolean = + elements.all { contains(it) } + + override fun isEmpty(): Boolean = this@SparseArrayMapWrapper.isEmpty() + + override fun iterator(): Iterator<T> = valueSequence.iterator() + } + + override fun containsKey(key: Int): Boolean = sparseArray.contains(key) + + override fun containsValue(value: T): Boolean = sparseArray.indexOfValue(value) >= 0 + + override fun get(key: Int): T? = sparseArray.get(key) + + override fun isEmpty(): Boolean = sparseArray.size() == 0 +}
\ No newline at end of file diff --git a/packages/SystemUI/tests/src/com/android/systemui/bubbles/storage/BubblePersistentRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/bubbles/storage/BubblePersistentRepositoryTest.kt new file mode 100644 index 000000000000..d49d0219fa54 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/bubbles/storage/BubblePersistentRepositoryTest.kt @@ -0,0 +1,48 @@ +/* + * 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.bubbles.storage + +import android.testing.AndroidTestingRunner +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import junit.framework.Assert.assertEquals +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith + +@SmallTest +@RunWith(AndroidTestingRunner::class) +class BubblePersistentRepositoryTest : SysuiTestCase() { + + private val bubbles = listOf( + BubbleEntity(0, "com.example.messenger", "shortcut-1"), + BubbleEntity(10, "com.example.chat", "alice and bob"), + BubbleEntity(0, "com.example.messenger", "shortcut-2") + ) + private lateinit var repository: BubblePersistentRepository + + @Before + fun setup() { + repository = BubblePersistentRepository(mContext) + } + + @Test + fun testReadWriteOperation() { + repository.persistsToDisk(bubbles) + assertEquals(bubbles, repository.readFromDisk()) + } +}
\ No newline at end of file diff --git a/packages/SystemUI/tests/src/com/android/systemui/bubbles/storage/BubbleVolatileRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/bubbles/storage/BubbleVolatileRepositoryTest.kt new file mode 100644 index 000000000000..7acc93712d9b --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/bubbles/storage/BubbleVolatileRepositoryTest.kt @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.bubbles.storage + +import android.testing.AndroidTestingRunner +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import junit.framework.Assert.assertEquals +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith + +@SmallTest +@RunWith(AndroidTestingRunner::class) +class BubbleVolatileRepositoryTest : SysuiTestCase() { + + private val bubble1 = BubbleEntity(0, "com.example.messenger", "shortcut-1") + private val bubble2 = BubbleEntity(10, "com.example.chat", "alice and bob") + private val bubble3 = BubbleEntity(0, "com.example.messenger", "shortcut-2") + private val bubbles = listOf(bubble1, bubble2, bubble3) + + private lateinit var repository: BubbleVolatileRepository + + @Before + fun setup() { + repository = BubbleVolatileRepository() + } + + @Test + fun testAddAndRemoveBubbles() { + repository.addBubbles(bubbles) + assertEquals(bubbles, repository.bubbles) + repository.addBubbles(listOf(bubble1)) + assertEquals(listOf(bubble2, bubble3, bubble1), repository.bubbles) + repository.removeBubbles(listOf(bubble3)) + assertEquals(listOf(bubble2, bubble1), repository.bubbles) + } +}
\ No newline at end of file diff --git a/packages/SystemUI/tests/src/com/android/systemui/bubbles/storage/BubbleXmlHelperTest.kt b/packages/SystemUI/tests/src/com/android/systemui/bubbles/storage/BubbleXmlHelperTest.kt new file mode 100644 index 000000000000..ef4580c6b28d --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/bubbles/storage/BubbleXmlHelperTest.kt @@ -0,0 +1,67 @@ +/* + * 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.bubbles.storage + +import android.testing.AndroidTestingRunner +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import junit.framework.Assert.assertEquals +import junit.framework.Assert.assertTrue +import org.junit.Test +import org.junit.runner.RunWith +import java.io.ByteArrayInputStream +import java.io.ByteArrayOutputStream + +@SmallTest +@RunWith(AndroidTestingRunner::class) +class BubbleXmlHelperTest : SysuiTestCase() { + + private val bubbles = listOf( + BubbleEntity(0, "com.example.messenger", "shortcut-1"), + BubbleEntity(10, "com.example.chat", "alice and bob"), + BubbleEntity(0, "com.example.messenger", "shortcut-2") + ) + + @Test + fun testWriteXml() { + val expectedEntries = """ + <bb uid="0" pkg="com.example.messenger" sid="shortcut-1" /> + <bb uid="10" pkg="com.example.chat" sid="alice and bob" /> + <bb uid="0" pkg="com.example.messenger" sid="shortcut-2" /> + """.trimIndent() + ByteArrayOutputStream().use { + writeXml(it, bubbles) + val actual = it.toString() + assertTrue("cannot find expected entry in \n$actual", + actual.contains(expectedEntries)) + } + } + + @Test + fun testReadXml() { + val src = """ + <?xml version='1.0' encoding='utf-8' standalone='yes' ?> + <bs> + <bb uid="0" pkg="com.example.messenger" sid="shortcut-1" /> + <bb uid="10" pkg="com.example.chat" sid="alice and bob" /> + <bb uid="0" pkg="com.example.messenger" sid="shortcut-2" /> + </bs> + """.trimIndent() + val actual = readXml(ByteArrayInputStream(src.toByteArray(Charsets.UTF_8))) + assertEquals("failed parsing bubbles from xml\n$src", bubbles, actual) + } +}
\ No newline at end of file diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/SeekBarViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/SeekBarViewModelTest.kt index e5ced0d066b8..1bbf24f27a75 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/SeekBarViewModelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/SeekBarViewModelTest.kt @@ -16,7 +16,6 @@ package com.android.systemui.media -import android.graphics.Color import android.media.MediaMetadata import android.media.session.MediaController import android.media.session.PlaybackState @@ -355,25 +354,6 @@ public class SeekBarViewModelTest : SysuiTestCase() { } @Test - fun taskUpdatesProgress() { - // GIVEN that the PlaybackState contins the initial position - val initialPosition = 0L - val state = PlaybackState.Builder().run { - setState(PlaybackState.STATE_PLAYING, initialPosition, 1f) - build() - } - whenever(mockController.getPlaybackState()).thenReturn(state) - viewModel.updateController(mockController) - // WHEN the task runs - with(fakeExecutor) { - advanceClockToNext() - runAllReady() - } - // THEN elapsed time has increased - assertThat(viewModel.progress.value!!.elapsedTime).isGreaterThan(initialPosition.toInt()) - } - - @Test fun startListeningQueuesPollTask() { // GIVEN not listening viewModel.listening = false diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java index d124bad438c3..a24fa842eca7 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java @@ -20,9 +20,9 @@ import static android.app.NotificationManager.IMPORTANCE_LOW; import static android.content.Intent.ACTION_USER_SWITCHED; import static android.provider.Settings.Secure.NOTIFICATION_NEW_INTERRUPTION_MODEL; -import static com.android.systemui.statusbar.notification.stack.NotificationSectionsManager.BUCKET_MEDIA_CONTROLS; -import static com.android.systemui.statusbar.notification.stack.NotificationSectionsManager.BUCKET_PEOPLE; -import static com.android.systemui.statusbar.notification.stack.NotificationSectionsManager.BUCKET_SILENT; +import static com.android.systemui.statusbar.notification.stack.NotificationSectionsManagerKt.BUCKET_MEDIA_CONTROLS; +import static com.android.systemui.statusbar.notification.stack.NotificationSectionsManagerKt.BUCKET_PEOPLE; +import static com.android.systemui.statusbar.notification.stack.NotificationSectionsManagerKt.BUCKET_SILENT; import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertTrue; diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotificationRankingManagerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotificationRankingManagerTest.kt index b4cabfd1855d..a83de139bbca 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotificationRankingManagerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotificationRankingManagerTest.kt @@ -36,8 +36,8 @@ import com.android.systemui.statusbar.notification.people.PeopleNotificationIden import com.android.systemui.statusbar.notification.people.PeopleNotificationIdentifier.Companion.TYPE_IMPORTANT_PERSON import com.android.systemui.statusbar.notification.people.PeopleNotificationIdentifier.Companion.TYPE_PERSON import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow -import com.android.systemui.statusbar.notification.stack.NotificationSectionsManager.BUCKET_ALERTING -import com.android.systemui.statusbar.notification.stack.NotificationSectionsManager.BUCKET_SILENT +import com.android.systemui.statusbar.notification.stack.BUCKET_ALERTING +import com.android.systemui.statusbar.notification.stack.BUCKET_SILENT import com.android.systemui.statusbar.phone.NotificationGroupManager import com.android.systemui.statusbar.policy.HeadsUpManager import dagger.Lazy diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/NotificationLoggerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/NotificationLoggerTest.java index d39b2c202fd9..a3a46f67ee40 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/NotificationLoggerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/NotificationLoggerTest.java @@ -16,7 +16,7 @@ package com.android.systemui.statusbar.notification.logging; -import static com.android.systemui.statusbar.notification.stack.NotificationSectionsManager.BUCKET_ALERTING; +import static com.android.systemui.statusbar.notification.stack.NotificationSectionsManagerKt.BUCKET_ALERTING; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManagerTest.java index 546bce81a260..3dc941a0bd20 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManagerTest.java @@ -18,11 +18,11 @@ package com.android.systemui.statusbar.notification.stack; import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT; -import static com.android.systemui.statusbar.notification.stack.NotificationSectionsManager.BUCKET_ALERTING; -import static com.android.systemui.statusbar.notification.stack.NotificationSectionsManager.BUCKET_FOREGROUND_SERVICE; -import static com.android.systemui.statusbar.notification.stack.NotificationSectionsManager.BUCKET_HEADS_UP; -import static com.android.systemui.statusbar.notification.stack.NotificationSectionsManager.BUCKET_PEOPLE; -import static com.android.systemui.statusbar.notification.stack.NotificationSectionsManager.BUCKET_SILENT; +import static com.android.systemui.statusbar.notification.stack.NotificationSectionsManagerKt.BUCKET_ALERTING; +import static com.android.systemui.statusbar.notification.stack.NotificationSectionsManagerKt.BUCKET_FOREGROUND_SERVICE; +import static com.android.systemui.statusbar.notification.stack.NotificationSectionsManagerKt.BUCKET_HEADS_UP; +import static com.android.systemui.statusbar.notification.stack.NotificationSectionsManagerKt.BUCKET_PEOPLE; +import static com.android.systemui.statusbar.notification.stack.NotificationSectionsManagerKt.BUCKET_SILENT; import static com.google.common.truth.Truth.assertThat; @@ -52,6 +52,7 @@ import com.android.systemui.media.KeyguardMediaController; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.notification.NotificationSectionsFeatureManager; +import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.people.PeopleHubViewAdapter; import com.android.systemui.statusbar.notification.row.ActivatableNotificationViewController; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; @@ -135,140 +136,152 @@ public class NotificationSectionsManagerTest extends SysuiTestCase { @Test public void testInsertHeader() { // GIVEN a stack with HI and LO rows but no section headers - setStackState(ChildType.ALERTING, ChildType.ALERTING, ChildType.ALERTING, ChildType.GENTLE); + setStackState( + ALERTING, + ALERTING, + ALERTING, + GENTLE); // WHEN we update the section headers mSectionsManager.updateSectionBoundaries(); // THEN a LO section header is added - verify(mNssl).addView(mSectionsManager.getGentleHeaderView(), 3); + verify(mNssl).addView(mSectionsManager.getSilentHeaderView(), 3); } @Test public void testRemoveHeader() { // GIVEN a stack that originally had a header between the HI and LO sections - setStackState(ChildType.ALERTING, ChildType.ALERTING, ChildType.GENTLE); + setStackState( + ALERTING, + ALERTING, + GENTLE); mSectionsManager.updateSectionBoundaries(); // WHEN the last LO row is replaced with a HI row setStackState( - ChildType.ALERTING, - ChildType.ALERTING, - ChildType.GENTLE_HEADER, - ChildType.ALERTING); + ALERTING, + ALERTING, + GENTLE_HEADER, + ALERTING); clearInvocations(mNssl); mSectionsManager.updateSectionBoundaries(); // THEN the LO section header is removed - verify(mNssl).removeView(mSectionsManager.getGentleHeaderView()); + verify(mNssl).removeView(mSectionsManager.getSilentHeaderView()); } @Test public void testDoNothingIfHeaderAlreadyRemoved() { // GIVEN a stack with only HI rows - setStackState(ChildType.ALERTING, ChildType.ALERTING, ChildType.ALERTING); + setStackState( + ALERTING, + ALERTING, + ALERTING); // WHEN we update the sections headers mSectionsManager.updateSectionBoundaries(); // THEN we don't add any section headers - verify(mNssl, never()).addView(eq(mSectionsManager.getGentleHeaderView()), anyInt()); + verify(mNssl, never()).addView(eq(mSectionsManager.getSilentHeaderView()), anyInt()); } @Test public void testMoveHeaderForward() { // GIVEN a stack that originally had a header between the HI and LO sections setStackState( - ChildType.ALERTING, - ChildType.ALERTING, - ChildType.ALERTING, - ChildType.GENTLE); + ALERTING, + ALERTING, + ALERTING, + GENTLE); mSectionsManager.updateSectionBoundaries(); // WHEN the LO section moves forward setStackState( - ChildType.ALERTING, - ChildType.ALERTING, - ChildType.GENTLE, - ChildType.GENTLE_HEADER, - ChildType.GENTLE); + ALERTING, + ALERTING, + GENTLE, + GENTLE_HEADER, + GENTLE); mSectionsManager.updateSectionBoundaries(); // THEN the LO section header is also moved forward - verify(mNssl).changeViewPosition(mSectionsManager.getGentleHeaderView(), 2); + verify(mNssl).changeViewPosition(mSectionsManager.getSilentHeaderView(), 2); } @Test public void testMoveHeaderBackward() { // GIVEN a stack that originally had a header between the HI and LO sections setStackState( - ChildType.ALERTING, - ChildType.GENTLE, - ChildType.GENTLE, - ChildType.GENTLE); + ALERTING, + GENTLE, + GENTLE, + GENTLE); mSectionsManager.updateSectionBoundaries(); // WHEN the LO section moves backward setStackState( - ChildType.ALERTING, - ChildType.GENTLE_HEADER, - ChildType.ALERTING, - ChildType.ALERTING, - ChildType.GENTLE); + ALERTING, + GENTLE_HEADER, + ALERTING, + ALERTING, + GENTLE); mSectionsManager.updateSectionBoundaries(); // THEN the LO section header is also moved backward (with appropriate index shifting) - verify(mNssl).changeViewPosition(mSectionsManager.getGentleHeaderView(), 3); + verify(mNssl).changeViewPosition(mSectionsManager.getSilentHeaderView(), 3); } @Test public void testHeaderRemovedFromTransientParent() { // GIVEN a stack where the header is animating away setStackState( - ChildType.ALERTING, - ChildType.GENTLE, - ChildType.GENTLE, - ChildType.GENTLE); - mSectionsManager.updateSectionBoundaries(); - setStackState( - ChildType.ALERTING, - ChildType.GENTLE_HEADER); + ALERTING, + GENTLE_HEADER); mSectionsManager.updateSectionBoundaries(); clearInvocations(mNssl); ViewGroup transientParent = mock(ViewGroup.class); - mSectionsManager.getGentleHeaderView().setTransientContainer(transientParent); + mSectionsManager.getSilentHeaderView().setTransientContainer(transientParent); // WHEN the LO section reappears setStackState( - ChildType.ALERTING, - ChildType.GENTLE); + ALERTING, + GENTLE); mSectionsManager.updateSectionBoundaries(); // THEN the header is first removed from the transient parent before being added to the // NSSL. - verify(transientParent).removeTransientView(mSectionsManager.getGentleHeaderView()); - verify(mNssl).addView(mSectionsManager.getGentleHeaderView(), 1); + verify(transientParent).removeTransientView(mSectionsManager.getSilentHeaderView()); + verify(mNssl).addView(mSectionsManager.getSilentHeaderView(), 1); } @Test public void testHeaderNotShownOnLockscreen() { // GIVEN a stack of HI and LO notifs on the lockscreen when(mStatusBarStateController.getState()).thenReturn(StatusBarState.KEYGUARD); - setStackState(ChildType.ALERTING, ChildType.ALERTING, ChildType.ALERTING, ChildType.GENTLE); + setStackState( + ALERTING, + ALERTING, + ALERTING, + GENTLE); // WHEN we update the section headers mSectionsManager.updateSectionBoundaries(); // Then the section header is not added - verify(mNssl, never()).addView(eq(mSectionsManager.getGentleHeaderView()), anyInt()); + verify(mNssl, never()).addView(eq(mSectionsManager.getSilentHeaderView()), anyInt()); } @Test public void testHeaderShownWhenEnterLockscreen() { // GIVEN a stack of HI and LO notifs on the lockscreen when(mStatusBarStateController.getState()).thenReturn(StatusBarState.KEYGUARD); - setStackState(ChildType.ALERTING, ChildType.ALERTING, ChildType.ALERTING, ChildType.GENTLE); + setStackState( + ALERTING, + ALERTING, + ALERTING, + GENTLE); mSectionsManager.updateSectionBoundaries(); // WHEN we unlock @@ -276,20 +289,23 @@ public class NotificationSectionsManagerTest extends SysuiTestCase { mSectionsManager.updateSectionBoundaries(); // Then the section header is added - verify(mNssl).addView(mSectionsManager.getGentleHeaderView(), 3); + verify(mNssl).addView(mSectionsManager.getSilentHeaderView(), 3); } @Test public void testHeaderHiddenWhenEnterLockscreen() { // GIVEN a stack of HI and LO notifs on the shade - setStackState(ChildType.ALERTING, ChildType.GENTLE_HEADER, ChildType.GENTLE); + setStackState( + ALERTING, + GENTLE_HEADER, + GENTLE); // WHEN we go back to the keyguard when(mStatusBarStateController.getState()).thenReturn(StatusBarState.KEYGUARD); mSectionsManager.updateSectionBoundaries(); // Then the section header is removed - verify(mNssl).removeView(mSectionsManager.getGentleHeaderView()); + verify(mNssl).removeView(mSectionsManager.getSilentHeaderView()); } @Test @@ -297,13 +313,13 @@ public class NotificationSectionsManagerTest extends SysuiTestCase { enablePeopleFiltering(); setStackState( - ChildType.GENTLE_HEADER, - ChildType.PERSON, - ChildType.ALERTING, - ChildType.GENTLE); + GENTLE_HEADER, + PERSON, + ALERTING, + GENTLE); mSectionsManager.updateSectionBoundaries(); - verify(mNssl).changeViewPosition(mSectionsManager.getGentleHeaderView(), 2); + verify(mNssl).changeViewPosition(mSectionsManager.getSilentHeaderView(), 2); verify(mNssl).addView(mSectionsManager.getAlertingHeaderView(), 1); verify(mNssl).addView(mSectionsManager.getPeopleHeaderView(), 0); } @@ -313,12 +329,12 @@ public class NotificationSectionsManagerTest extends SysuiTestCase { enablePeopleFiltering(); setStackState( - ChildType.PERSON, - ChildType.ALERTING, - ChildType.GENTLE); + PERSON, + ALERTING, + GENTLE); mSectionsManager.updateSectionBoundaries(); - verify(mNssl).addView(mSectionsManager.getGentleHeaderView(), 2); + verify(mNssl).addView(mSectionsManager.getSilentHeaderView(), 2); verify(mNssl).addView(mSectionsManager.getAlertingHeaderView(), 1); verify(mNssl).addView(mSectionsManager.getPeopleHeaderView(), 0); } @@ -328,15 +344,15 @@ public class NotificationSectionsManagerTest extends SysuiTestCase { enablePeopleFiltering(); setStackState( - ChildType.PEOPLE_HEADER, - ChildType.ALERTING_HEADER, - ChildType.GENTLE_HEADER, - ChildType.PERSON, - ChildType.ALERTING, - ChildType.GENTLE); + PEOPLE_HEADER, + ALERTING_HEADER, + GENTLE_HEADER, + PERSON, + ALERTING, + GENTLE); mSectionsManager.updateSectionBoundaries(); - verify(mNssl).changeViewPosition(mSectionsManager.getGentleHeaderView(), 4); + verify(mNssl).changeViewPosition(mSectionsManager.getSilentHeaderView(), 4); verify(mNssl).changeViewPosition(mSectionsManager.getAlertingHeaderView(), 2); verify(mNssl).changeViewPosition(mSectionsManager.getPeopleHeaderView(), 0); } @@ -347,12 +363,11 @@ public class NotificationSectionsManagerTest extends SysuiTestCase { enablePeopleFiltering(); setStackState( - ChildType.PEOPLE_HEADER, - ChildType.ALERTING_HEADER, - ChildType.ALERTING, - ChildType.GENTLE_HEADER, - ChildType.GENTLE - ); + PEOPLE_HEADER, + ALERTING_HEADER, + ALERTING, + GENTLE_HEADER, + GENTLE); mSectionsManager.updateSectionBoundaries(); verify(mNssl, never()).removeView(mSectionsManager.getPeopleHeaderView()); @@ -360,41 +375,98 @@ public class NotificationSectionsManagerTest extends SysuiTestCase { } @Test - public void testPeopleFiltering_HunWhilePeopleVisible() { + public void testPeopleFiltering_AlertingHunWhilePeopleVisible() { enablePeopleFiltering(); setupMockStack( - ChildType.PEOPLE_HEADER, + PEOPLE_HEADER, + ALERTING.headsUp(), + PERSON, + ALERTING_HEADER, + GENTLE_HEADER, + GENTLE + ); + mSectionsManager.updateSectionBoundaries(); + + verifyMockStack( + ChildType.INCOMING_HEADER, ChildType.HEADS_UP, + ChildType.PEOPLE_HEADER, ChildType.PERSON, - ChildType.ALERTING_HEADER, ChildType.GENTLE_HEADER, ChildType.GENTLE ); + } + + @Test + public void testPeopleFiltering_PersonHunWhileAlertingHunVisible() { + enablePeopleFiltering(); + + setupMockStack( + PERSON.headsUp(), + INCOMING_HEADER, + ALERTING.headsUp(), + PEOPLE_HEADER, + PERSON + ); mSectionsManager.updateSectionBoundaries(); verifyMockStack( ChildType.INCOMING_HEADER, ChildType.HEADS_UP, + ChildType.HEADS_UP, + ChildType.PEOPLE_HEADER, + ChildType.PERSON + ); + } + + @Test + public void testPeopleFiltering_PersonHun() { + enablePeopleFiltering(); + + setupMockStack( + PERSON.headsUp(), + PEOPLE_HEADER, + PERSON + ); + mSectionsManager.updateSectionBoundaries(); + + verifyMockStack( ChildType.PEOPLE_HEADER, ChildType.PERSON, - ChildType.GENTLE_HEADER, - ChildType.GENTLE + ChildType.PERSON ); } @Test - public void testPeopleFiltering_Fsn() { + public void testPeopleFiltering_AlertingHunWhilePersonHunning() { enablePeopleFiltering(); setupMockStack( + ALERTING.headsUp(), + PERSON.headsUp() + ); + mSectionsManager.updateSectionBoundaries(); + verifyMockStack( ChildType.INCOMING_HEADER, ChildType.HEADS_UP, ChildType.PEOPLE_HEADER, - ChildType.FSN, - ChildType.PERSON, - ChildType.ALERTING, - ChildType.GENTLE + ChildType.PERSON + ); + } + + @Test + public void testPeopleFiltering_Fsn() { + enablePeopleFiltering(); + + setupMockStack( + INCOMING_HEADER, + ALERTING.headsUp(), + PEOPLE_HEADER, + FSN, + PERSON, + ALERTING, + GENTLE ); mSectionsManager.updateSectionBoundaries(); @@ -416,7 +488,7 @@ public class NotificationSectionsManagerTest extends SysuiTestCase { enableMediaControls(); // GIVEN a stack that doesn't include media controls - setStackState(ChildType.ALERTING, ChildType.GENTLE_HEADER, ChildType.GENTLE); + setStackState(ALERTING, GENTLE_HEADER, GENTLE); // WHEN we go back to the keyguard when(mStatusBarStateController.getState()).thenReturn(StatusBarState.KEYGUARD); @@ -431,14 +503,20 @@ public class NotificationSectionsManagerTest extends SysuiTestCase { enableMediaControls(); // GIVEN a stack that doesn't include media controls but includes HEADS_UP - setupMockStack(ChildType.HEADS_UP, ChildType.ALERTING, ChildType.GENTLE_HEADER, - ChildType.GENTLE); + setupMockStack( + ALERTING.headsUp(), + ALERTING, + GENTLE_HEADER, + GENTLE); // WHEN we go back to the keyguard when(mStatusBarStateController.getState()).thenReturn(StatusBarState.KEYGUARD); mSectionsManager.updateSectionBoundaries(); - verifyMockStack(ChildType.HEADS_UP, ChildType.MEDIA_CONTROLS, ChildType.ALERTING, + verifyMockStack( + ChildType.MEDIA_CONTROLS, + ChildType.ALERTING, + ChildType.ALERTING, ChildType.GENTLE); } @@ -455,11 +533,12 @@ public class NotificationSectionsManagerTest extends SysuiTestCase { FSN, PERSON, ALERTING, GENTLE, OTHER } - private void setStackState(ChildType... children) { + private void setStackState(StackEntry... children) { when(mNssl.getChildCount()).thenReturn(children.length); for (int i = 0; i < children.length; i++) { View child; - switch (children[i]) { + StackEntry entry = children[i]; + switch (entry.mChildType) { case INCOMING_HEADER: child = mSectionsManager.getIncomingHeaderView(); break; @@ -473,22 +552,19 @@ public class NotificationSectionsManagerTest extends SysuiTestCase { child = mSectionsManager.getAlertingHeaderView(); break; case GENTLE_HEADER: - child = mSectionsManager.getGentleHeaderView(); - break; - case HEADS_UP: - child = mockNotification(BUCKET_HEADS_UP); + child = mSectionsManager.getSilentHeaderView(); break; case FSN: - child = mockNotification(BUCKET_FOREGROUND_SERVICE); + child = mockNotification(BUCKET_FOREGROUND_SERVICE, entry.mIsHeadsUp); break; case PERSON: - child = mockNotification(BUCKET_PEOPLE); + child = mockNotification(BUCKET_PEOPLE, entry.mIsHeadsUp); break; case ALERTING: - child = mockNotification(BUCKET_ALERTING); + child = mockNotification(BUCKET_ALERTING, entry.mIsHeadsUp); break; case GENTLE: - child = mockNotification(BUCKET_SILENT); + child = mockNotification(BUCKET_SILENT, entry.mIsHeadsUp); break; case OTHER: child = mock(View.class); @@ -503,12 +579,24 @@ public class NotificationSectionsManagerTest extends SysuiTestCase { } } - private View mockNotification(int bucket) { - ExpandableNotificationRow notifRow = mock(ExpandableNotificationRow.class, - RETURNS_DEEP_STUBS); + private View mockNotification(int bucket, boolean headsUp) { + ExpandableNotificationRow notifRow = + mock(ExpandableNotificationRow.class, RETURNS_DEEP_STUBS); when(notifRow.getVisibility()).thenReturn(View.VISIBLE); - when(notifRow.getEntry().getBucket()).thenReturn(bucket); when(notifRow.getParent()).thenReturn(mNssl); + + NotificationEntry mockEntry = mock(NotificationEntry.class); + when(notifRow.getEntry()).thenReturn(mockEntry); + + int[] bucketRef = new int[] { bucket }; + when(mockEntry.getBucket()).thenAnswer(invocation -> bucketRef[0]); + doAnswer(invocation -> { + bucketRef[0] = invocation.getArgument(0); + return null; + }).when(mockEntry).setBucket(anyInt()); + + when(notifRow.isHeadsUp()).thenReturn(headsUp); + when(mockEntry.isRowHeadsUp()).thenReturn(headsUp); return notifRow; } @@ -533,7 +621,7 @@ public class NotificationSectionsManagerTest extends SysuiTestCase { actual.add(ChildType.ALERTING_HEADER); continue; } - if (child == mSectionsManager.getGentleHeaderView()) { + if (child == mSectionsManager.getSilentHeaderView()) { actual.add(ChildType.GENTLE_HEADER); continue; } @@ -565,7 +653,7 @@ public class NotificationSectionsManagerTest extends SysuiTestCase { assertThat(actual).containsExactly((Object[]) expected).inOrder(); } - private void setupMockStack(ChildType... childTypes) { + private void setupMockStack(StackEntry... entries) { final List<View> children = new ArrayList<>(); when(mNssl.getChildCount()).thenAnswer(invocation -> children.size()); when(mNssl.getChildAt(anyInt())) @@ -590,9 +678,9 @@ public class NotificationSectionsManagerTest extends SysuiTestCase { children.add(newIndex, child); return null; }).when(mNssl).changeViewPosition(any(), anyInt()); - for (ChildType childType : childTypes) { + for (StackEntry entry : entries) { View child; - switch (childType) { + switch (entry.mChildType) { case INCOMING_HEADER: child = mSectionsManager.getIncomingHeaderView(); break; @@ -606,22 +694,19 @@ public class NotificationSectionsManagerTest extends SysuiTestCase { child = mSectionsManager.getAlertingHeaderView(); break; case GENTLE_HEADER: - child = mSectionsManager.getGentleHeaderView(); - break; - case HEADS_UP: - child = mockNotification(BUCKET_HEADS_UP); + child = mSectionsManager.getSilentHeaderView(); break; case FSN: - child = mockNotification(BUCKET_FOREGROUND_SERVICE); + child = mockNotification(BUCKET_FOREGROUND_SERVICE, entry.mIsHeadsUp); break; case PERSON: - child = mockNotification(BUCKET_PEOPLE); + child = mockNotification(BUCKET_PEOPLE, entry.mIsHeadsUp); break; case ALERTING: - child = mockNotification(BUCKET_ALERTING); + child = mockNotification(BUCKET_ALERTING, entry.mIsHeadsUp); break; case GENTLE: - child = mockNotification(BUCKET_SILENT); + child = mockNotification(BUCKET_SILENT, entry.mIsHeadsUp); break; case OTHER: child = mock(View.class); @@ -629,9 +714,48 @@ public class NotificationSectionsManagerTest extends SysuiTestCase { when(child.getParent()).thenReturn(mNssl); break; default: - throw new RuntimeException("Unknown ChildType: " + childType); + throw new RuntimeException("Unknown ChildType: " + entry.mChildType); } children.add(child); } } + + private static final StackEntry INCOMING_HEADER = new StackEntry(ChildType.INCOMING_HEADER); + private static final StackEntry MEDIA_CONTROLS = new StackEntry(ChildType.MEDIA_CONTROLS); + private static final StackEntry PEOPLE_HEADER = new StackEntry(ChildType.PEOPLE_HEADER); + private static final StackEntry ALERTING_HEADER = new StackEntry(ChildType.ALERTING_HEADER); + private static final StackEntry GENTLE_HEADER = new StackEntry(ChildType.GENTLE_HEADER); + private static final StackEntry FSN = new StackEntry(ChildType.FSN); + private static final StackEntry.Hunnable PERSON = new StackEntry.Hunnable(ChildType.PERSON); + private static final StackEntry.Hunnable ALERTING = new StackEntry.Hunnable(ChildType.ALERTING); + private static final StackEntry GENTLE = new StackEntry(ChildType.GENTLE); + + private static class StackEntry { + final ChildType mChildType; + final boolean mIsHeadsUp; + + StackEntry(ChildType childType) { + this(childType, false); + } + + StackEntry(ChildType childType, boolean isHeadsUp) { + mChildType = childType; + mIsHeadsUp = isHeadsUp; + } + + static class Hunnable extends StackEntry { + + Hunnable(ChildType childType) { + super(childType, false); + } + + Hunnable(ChildType childType, boolean isHeadsUp) { + super(childType, isHeadsUp); + } + + public Hunnable headsUp() { + return new Hunnable(mChildType, true); + } + } + } } diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index e9cf72755896..b3867a35dba5 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -1212,7 +1212,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub final Intent intent = new Intent(); final Bundle bundle = ActivityOptions.makeBasic().setLaunchDisplayId(displayId).toBundle(); intent.setComponent(name); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); try { mContext.startActivityAsUser(intent, bundle, UserHandle.of(mCurrentUserId)); } catch (ActivityNotFoundException ignore) { diff --git a/services/core/Android.bp b/services/core/Android.bp index cf85b1d012d2..a95a0c2eaf28 100644 --- a/services/core/Android.bp +++ b/services/core/Android.bp @@ -97,7 +97,7 @@ java_library_static { "android.hardware.power-V1.0-java", "android.hardware.tv.cec-V1.0-java", "android.hardware.vibrator-java", - "android.net.ipsec.ike.stubs.module_libs_api", + "android.net.ipsec.ike.stubs.module_lib", "app-compat-annotations", "framework-tethering-stubs-module_libs_api", "service-permission-stubs", diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 930f124cd687..2b86d7fe057e 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -11083,18 +11083,22 @@ public class ActivityManagerService extends IActivityManager.Stub void dumpLruEntryLocked(PrintWriter pw, int index, ProcessRecord proc, String prefix) { pw.print(prefix); - pw.print("#"); + pw.print('#'); + if (index < 10) { + pw.print(' '); + } pw.print(index); pw.print(": "); pw.print(ProcessList.makeOomAdjString(proc.setAdj, false)); - pw.print(" "); + pw.print(' '); pw.print(ProcessList.makeProcStateString(proc.getCurProcState())); - pw.print(" "); + pw.print(' '); + ActivityManager.printCapabilitiesSummary(pw, proc.curCapability); + pw.print(' '); pw.print(proc.toShortString()); - pw.print(" "); if (proc.hasActivitiesOrRecentTasks() || proc.hasClientActivities() || proc.treatLikeActivity) { - pw.print(" activity="); + pw.print(" act:"); boolean printed = false; if (proc.hasActivities()) { pw.print("activities"); @@ -12559,7 +12563,7 @@ public class ActivityManagerService extends IActivityManager.Stub char schedGroup; switch (r.setSchedGroup) { case ProcessList.SCHED_GROUP_BACKGROUND: - schedGroup = 'B'; + schedGroup = 'b'; break; case ProcessList.SCHED_GROUP_DEFAULT: schedGroup = 'F'; @@ -12570,6 +12574,9 @@ public class ActivityManagerService extends IActivityManager.Stub case ProcessList.SCHED_GROUP_RESTRICTED: schedGroup = 'R'; break; + case ProcessList.SCHED_GROUP_TOP_APP_BOUND: + schedGroup = 'B'; + break; default: schedGroup = '?'; break; @@ -12597,7 +12604,10 @@ public class ActivityManagerService extends IActivityManager.Stub pw.print(foreground); pw.print('/'); pw.print(procState); - pw.print(" trm:"); + pw.print(' '); + ActivityManager.printCapabilitiesSummary(pw, r.curCapability); + pw.print(' '); + pw.print(" t:"); if (r.trimMemoryLevel < 10) pw.print(' '); pw.print(r.trimMemoryLevel); pw.print(' '); diff --git a/services/core/java/com/android/server/am/CarUserSwitchingDialog.java b/services/core/java/com/android/server/am/CarUserSwitchingDialog.java deleted file mode 100644 index 0e3480131952..000000000000 --- a/services/core/java/com/android/server/am/CarUserSwitchingDialog.java +++ /dev/null @@ -1,193 +0,0 @@ -/* - * Copyright (C) 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.server.am; - -import android.content.Context; -import android.content.pm.UserInfo; -import android.content.res.Resources; -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.ColorFilter; -import android.graphics.Paint; -import android.graphics.Path; -import android.graphics.PixelFormat; -import android.graphics.PorterDuff; -import android.graphics.PorterDuffXfermode; -import android.graphics.Rect; -import android.graphics.RectF; -import android.graphics.drawable.Drawable; -import android.os.UserManager; -import android.provider.Settings; -import android.view.LayoutInflater; -import android.view.View; -import android.view.WindowInsets; -import android.widget.ImageView; -import android.widget.TextView; - -import com.android.internal.R; - - -/** - * Dialog to show when a user switch it about to happen for the car. The intent is to snapshot the - * screen immediately after the dialog shows so that the user is informed that something is - * happening in the background rather than just freeze the screen and not know if the user-switch - * affordance was being handled. - */ -final class CarUserSwitchingDialog extends UserSwitchingDialog { - - private static final String TAG = "ActivityManagerCarUserSwitchingDialog"; - private View mView; - - public CarUserSwitchingDialog(ActivityManagerService service, Context context, UserInfo oldUser, - UserInfo newUser, boolean aboveSystem, String switchingFromSystemUserMessage, - String switchingToSystemUserMessage) { - super(service, context, oldUser, newUser, aboveSystem, switchingFromSystemUserMessage, - switchingToSystemUserMessage); - } - - @Override - void inflateContent() { - // Set up the dialog contents - setCancelable(false); - Resources res = getContext().getResources(); - // Custom view due to alignment and font size requirements - getContext().setTheme(R.style.Theme_DeviceDefault_Light_Dialog_Alert_UserSwitchingDialog); - mView = LayoutInflater.from(getContext()).inflate( - R.layout.car_user_switching_dialog, - null); - - UserManager userManager = - (UserManager) getContext().getSystemService(Context.USER_SERVICE); - Bitmap bitmap = userManager.getUserIcon(mNewUser.id); - if (bitmap != null) { - CircleFramedDrawable drawable = CircleFramedDrawable.getInstance(bitmap, - res.getDimension(R.dimen.car_fullscreen_user_pod_image_avatar_height)); - ((ImageView) mView.findViewById(R.id.user_loading_avatar)) - .setImageDrawable(drawable); - } - - TextView msgView = mView.findViewById(R.id.user_loading); - - // TODO(b/145132885): use constant from CarSettings - boolean showInfo = "true".equals(Settings.Global.getString( - getContext().getContentResolver(), - "android.car.ENABLE_USER_SWITCH_DEVELOPER_MESSAGE")); - - if (showInfo) { - msgView.setText(res.getString(R.string.car_loading_profile) + " user\n(from " - + mOldUser.id + " to " + mNewUser.id + ")"); - } else { - msgView.setText(res.getString(R.string.car_loading_profile)); - } - setView(mView); - } - - @Override - public void show() { - super.show(); - hideNavigationBar(); - } - - private void hideNavigationBar() { - mView.getWindowInsetsController().hide(WindowInsets.Type.navigationBars()); - } - - /** - * Converts the user icon to a circularly clipped one. This is used in the User Picker and - * Settings. - */ - static class CircleFramedDrawable extends Drawable { - - private final Bitmap mBitmap; - private final int mSize; - private final Paint mPaint; - - private float mScale; - private Rect mSrcRect; - private RectF mDstRect; - - public static CircleFramedDrawable getInstance(Bitmap icon, float iconSize) { - CircleFramedDrawable instance = new CircleFramedDrawable(icon, (int) iconSize); - return instance; - } - - public CircleFramedDrawable(Bitmap icon, int size) { - super(); - mSize = size; - - mBitmap = Bitmap.createBitmap(mSize, mSize, Bitmap.Config.ARGB_8888); - final Canvas canvas = new Canvas(mBitmap); - - final int width = icon.getWidth(); - final int height = icon.getHeight(); - final int square = Math.min(width, height); - - final Rect cropRect = new Rect((width - square) / 2, (height - square) / 2, - square, square); - final RectF circleRect = new RectF(0f, 0f, mSize, mSize); - - final Path fillPath = new Path(); - fillPath.addArc(circleRect, 0f, 360f); - - canvas.drawColor(0, PorterDuff.Mode.CLEAR); - - // opaque circle - mPaint = new Paint(); - mPaint.setAntiAlias(true); - mPaint.setColor(Color.BLACK); - mPaint.setStyle(Paint.Style.FILL); - canvas.drawPath(fillPath, mPaint); - - // mask in the icon where the bitmap is opaque - mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); - canvas.drawBitmap(icon, cropRect, circleRect, mPaint); - - // prepare paint for frame drawing - mPaint.setXfermode(null); - - mScale = 1f; - - mSrcRect = new Rect(0, 0, mSize, mSize); - mDstRect = new RectF(0, 0, mSize, mSize); - } - - @Override - public void draw(Canvas canvas) { - final float inside = mScale * mSize; - final float pad = (mSize - inside) / 2f; - - mDstRect.set(pad, pad, mSize - pad, mSize - pad); - canvas.drawBitmap(mBitmap, mSrcRect, mDstRect, null); - } - - @Override - public int getOpacity() { - return PixelFormat.TRANSLUCENT; - } - - @Override - public void setAlpha(int alpha) { - // Needed to implement abstract method. Do nothing. - } - - @Override - public void setColorFilter(ColorFilter colorFilter) { - // Needed to implement abstract method. Do nothing. - } - } -} diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java index ad858533c430..c13bb5aff9b9 100644 --- a/services/core/java/com/android/server/am/OomAdjuster.java +++ b/services/core/java/com/android/server/am/OomAdjuster.java @@ -151,15 +151,6 @@ public final class OomAdjuster { @EnabledAfter(targetSdkVersion=android.os.Build.VERSION_CODES.Q) static final long CAMERA_MICROPHONE_CAPABILITY_CHANGE_ID = 136219221L; - // TODO: remove this when development is done. - // These are debug flags used between OomAdjuster and AppOpsService to detect and report absence - // of the real flags. - public static final int DEBUG_PROCESS_CAPABILITY_FOREGROUND_MICROPHONE_Q = 1 << 27; - public static final int DEBUG_PROCESS_CAPABILITY_FOREGROUND_CAMERA_Q = 1 << 28; - public static final int DEBUG_PROCESS_CAPABILITY_FOREGROUND_MICROPHONE = 1 << 29; - public static final int DEBUG_PROCESS_CAPABILITY_FOREGROUND_CAMERA = 1 << 30; - public static final int DEBUG_PROCESS_CAPABILITY_FOREGROUND_LOCATION = 1 << 31; - /** * For some direct access we need to power manager. */ @@ -1506,8 +1497,9 @@ public final class OomAdjuster { //lost the capability, use temp location capability to mark this case. //TODO: remove this block when development is done. capabilityFromFGS |= - (fgsType & FOREGROUND_SERVICE_TYPE_LOCATION) - != 0 ? DEBUG_PROCESS_CAPABILITY_FOREGROUND_LOCATION : 0; + (fgsType & FOREGROUND_SERVICE_TYPE_LOCATION) != 0 + ? ActivityManager.DEBUG_PROCESS_CAPABILITY_FOREGROUND_LOCATION + : 0; } if (s.mAllowWhileInUsePermissionInFgs) { boolean enabled = false; @@ -1520,22 +1512,22 @@ public final class OomAdjuster { capabilityFromFGS |= (fgsType & FOREGROUND_SERVICE_TYPE_CAMERA) != 0 ? PROCESS_CAPABILITY_FOREGROUND_CAMERA - : DEBUG_PROCESS_CAPABILITY_FOREGROUND_CAMERA; + : ActivityManager.DEBUG_PROCESS_CAPABILITY_FOREGROUND_CAMERA; capabilityFromFGS |= (fgsType & FOREGROUND_SERVICE_TYPE_MICROPHONE) != 0 ? PROCESS_CAPABILITY_FOREGROUND_MICROPHONE - : DEBUG_PROCESS_CAPABILITY_FOREGROUND_MICROPHONE; + : ActivityManager.DEBUG_PROCESS_CAPABILITY_FOREGROUND_MICROPHONE; } else { // Remove fgsType check and assign PROCESS_CAPABILITY_FOREGROUND_CAMERA // and MICROPHONE when finish debugging. capabilityFromFGS |= (fgsType & FOREGROUND_SERVICE_TYPE_CAMERA) != 0 ? PROCESS_CAPABILITY_FOREGROUND_CAMERA - : DEBUG_PROCESS_CAPABILITY_FOREGROUND_CAMERA_Q; + : ActivityManager.DEBUG_PROCESS_CAPABILITY_FOREGROUND_CAMERA_Q; capabilityFromFGS |= (fgsType & FOREGROUND_SERVICE_TYPE_MICROPHONE) != 0 ? PROCESS_CAPABILITY_FOREGROUND_MICROPHONE - : DEBUG_PROCESS_CAPABILITY_FOREGROUND_MICROPHONE_Q; + : ActivityManager.DEBUG_PROCESS_CAPABILITY_FOREGROUND_MICROPHONE_Q; } } } diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java index b753de9b264b..108fb7dff2cd 100644 --- a/services/core/java/com/android/server/am/ProcessList.java +++ b/services/core/java/com/android/server/am/ProcessList.java @@ -972,7 +972,7 @@ public final class ProcessList { return buildOomTag("vis", "vis", " ", setAdj, ProcessList.VISIBLE_APP_ADJ, compact); } else if (setAdj >= ProcessList.FOREGROUND_APP_ADJ) { - return buildOomTag("fore ", "fore", null, setAdj, + return buildOomTag("fg ", "fg ", " ", setAdj, ProcessList.FOREGROUND_APP_ADJ, compact); } else if (setAdj >= ProcessList.PERSISTENT_SERVICE_ADJ) { return buildOomTag("psvc ", "psvc", null, setAdj, diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java index fc6931d6ede2..c5152c081e70 100644 --- a/services/core/java/com/android/server/am/ProcessRecord.java +++ b/services/core/java/com/android/server/am/ProcessRecord.java @@ -431,33 +431,24 @@ class ProcessRecord implements WindowProcessListener { pw.print(" nextPssTime="); TimeUtils.formatDuration(nextPssTime, nowUptime, pw); pw.println(); - pw.print(prefix); pw.print("adjSeq="); pw.print(adjSeq); - pw.print(" lruSeq="); pw.print(lruSeq); - pw.print(" lastPss="); DebugUtils.printSizeValue(pw, lastPss*1024); - pw.print(" lastSwapPss="); DebugUtils.printSizeValue(pw, lastSwapPss*1024); - pw.print(" lastCachedPss="); DebugUtils.printSizeValue(pw, lastCachedPss*1024); - pw.print(" lastCachedSwapPss="); DebugUtils.printSizeValue(pw, lastCachedSwapPss*1024); - pw.print(" lastRss="); DebugUtils.printSizeValue(pw, mLastRss * 1024); + pw.print(prefix); pw.print("lastPss="); DebugUtils.printSizeValue(pw, lastPss * 1024); + pw.print(" lastSwapPss="); DebugUtils.printSizeValue(pw, lastSwapPss * 1024); + pw.print(" lastCachedPss="); DebugUtils.printSizeValue(pw, lastCachedPss * 1024); + pw.print(" lastCachedSwapPss="); DebugUtils.printSizeValue(pw, + lastCachedSwapPss * 1024); + pw.print(" lastRss="); DebugUtils.printSizeValue(pw, mLastRss * 1024); pw.println(); pw.print(prefix); pw.print("procStateMemTracker: "); procStateMemTracker.dumpLine(pw); - pw.print(prefix); pw.print("cached="); pw.print(mCached); - pw.print(" empty="); pw.println(empty); - if (serviceb) { - pw.print(prefix); pw.print("serviceb="); pw.print(serviceb); - pw.print(" serviceHighRam="); pw.println(serviceHighRam); - } - if (notCachedSinceIdle) { - pw.print(prefix); pw.print("notCachedSinceIdle="); pw.print(notCachedSinceIdle); - pw.print(" initialIdlePss="); pw.println(initialIdlePss); - } - pw.print(prefix); pw.print("oom: max="); pw.print(maxAdj); + pw.print(prefix); pw.print("adjSeq="); pw.print(adjSeq); + pw.print(" lruSeq="); pw.println(lruSeq); + pw.print(prefix); pw.print("oom adj: max="); pw.print(maxAdj); pw.print(" curRaw="); pw.print(mCurRawAdj); pw.print(" setRaw="); pw.print(setRawAdj); pw.print(" cur="); pw.print(curAdj); pw.print(" set="); pw.println(setAdj); pw.print(prefix); pw.print("lastCompactTime="); pw.print(lastCompactTime); - pw.print(" lastCompactAction="); pw.print(lastCompactAction); + pw.print(" lastCompactAction="); pw.println(lastCompactAction); pw.print(prefix); pw.print("mCurSchedGroup="); pw.print(mCurSchedGroup); pw.print(" setSchedGroup="); pw.print(setSchedGroup); pw.print(" systemNoUi="); pw.print(systemNoUi); @@ -466,17 +457,30 @@ class ProcessRecord implements WindowProcessListener { pw.print(" mRepProcState="); pw.print(mRepProcState); pw.print(" pssProcState="); pw.print(pssProcState); pw.print(" setProcState="); pw.print(setProcState); - pw.print(" curCapability="); pw.print(curCapability); - pw.print(" setCapability="); pw.print(setCapability); pw.print(" lastStateTime="); TimeUtils.formatDuration(lastStateTime, nowUptime, pw); pw.println(); + pw.print(prefix); pw.print("curCapability="); + ActivityManager.printCapabilitiesFull(pw, curCapability); + pw.print(" setCapability="); + ActivityManager.printCapabilitiesFull(pw, setCapability); + pw.println(); if (hasShownUi || mPendingUiClean || hasAboveClient || treatLikeActivity) { pw.print(prefix); pw.print("hasShownUi="); pw.print(hasShownUi); pw.print(" pendingUiClean="); pw.print(mPendingUiClean); pw.print(" hasAboveClient="); pw.print(hasAboveClient); pw.print(" treatLikeActivity="); pw.println(treatLikeActivity); } + pw.print(prefix); pw.print("cached="); pw.print(mCached); + pw.print(" empty="); pw.println(empty); + if (serviceb) { + pw.print(prefix); pw.print("serviceb="); pw.print(serviceb); + pw.print(" serviceHighRam="); pw.println(serviceHighRam); + } + if (notCachedSinceIdle) { + pw.print(prefix); pw.print("notCachedSinceIdle="); pw.print(notCachedSinceIdle); + pw.print(" initialIdlePss="); pw.println(initialIdlePss); + } if (connectionService != null || connectionGroup != 0) { pw.print(prefix); pw.print("connectionGroup="); pw.print(connectionGroup); pw.print(" Importance="); pw.print(connectionImportance); diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java index 5b12933f7a40..fac4a1e95827 100644 --- a/services/core/java/com/android/server/am/UserController.java +++ b/services/core/java/com/android/server/am/UserController.java @@ -2736,19 +2736,13 @@ class UserController implements Handler.Callback { void showUserSwitchingDialog(UserInfo fromUser, UserInfo toUser, String switchingFromSystemUserMessage, String switchingToSystemUserMessage) { - Dialog d; if (!mService.mContext.getPackageManager() .hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)) { - d = new UserSwitchingDialog(mService, mService.mContext, fromUser, toUser, - true /* above system */, switchingFromSystemUserMessage, - switchingToSystemUserMessage); - } else { - d = new CarUserSwitchingDialog(mService, mService.mContext, fromUser, toUser, - true /* above system */, switchingFromSystemUserMessage, - switchingToSystemUserMessage); + final Dialog d = new UserSwitchingDialog(mService, mService.mContext, fromUser, + toUser, true /* above system */, switchingFromSystemUserMessage, + switchingToSystemUserMessage); + d.show(); } - - d.show(); } void reportGlobalUsageEventLocked(int event) { diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java index 5ebfb0069931..ae38e81fb8a3 100644 --- a/services/core/java/com/android/server/appop/AppOpsService.java +++ b/services/core/java/com/android/server/appop/AppOpsService.java @@ -66,11 +66,11 @@ import static android.content.Intent.EXTRA_REPLACING; import static android.content.pm.PermissionInfo.PROTECTION_DANGEROUS; import static android.content.pm.PermissionInfo.PROTECTION_FLAG_APPOP; -import static com.android.server.am.OomAdjuster.DEBUG_PROCESS_CAPABILITY_FOREGROUND_CAMERA; -import static com.android.server.am.OomAdjuster.DEBUG_PROCESS_CAPABILITY_FOREGROUND_CAMERA_Q; -import static com.android.server.am.OomAdjuster.DEBUG_PROCESS_CAPABILITY_FOREGROUND_LOCATION; -import static com.android.server.am.OomAdjuster.DEBUG_PROCESS_CAPABILITY_FOREGROUND_MICROPHONE; -import static com.android.server.am.OomAdjuster.DEBUG_PROCESS_CAPABILITY_FOREGROUND_MICROPHONE_Q; +import static android.app.ActivityManager.DEBUG_PROCESS_CAPABILITY_FOREGROUND_CAMERA; +import static android.app.ActivityManager.DEBUG_PROCESS_CAPABILITY_FOREGROUND_CAMERA_Q; +import static android.app.ActivityManager.DEBUG_PROCESS_CAPABILITY_FOREGROUND_LOCATION; +import static android.app.ActivityManager.DEBUG_PROCESS_CAPABILITY_FOREGROUND_MICROPHONE; +import static android.app.ActivityManager.DEBUG_PROCESS_CAPABILITY_FOREGROUND_MICROPHONE_Q; import static com.android.server.appop.AppOpsService.ModeCallback.ALL_OPS; import static java.lang.Long.max; diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 2407fa96f719..98d662a1a9b5 100755 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -52,7 +52,6 @@ import android.content.IntentFilter; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; -import android.content.pm.PackageManagerInternal; import android.content.pm.ResolveInfo; import android.content.pm.UserInfo; import android.content.res.Configuration; @@ -570,6 +569,10 @@ public class AudioService extends IAudioService.Stub private int[] mAccessibilityServiceUids; private final Object mAccessibilityServiceUidsLock = new Object(); + // Uid of the active input method service to check if caller is the one or not. + private int mInputMethodServiceUid = android.os.Process.INVALID_UID; + private final Object mInputMethodServiceUidLock = new Object(); + private int mEncodedSurroundMode; private String mEnabledSurroundFormats; private boolean mSurroundModeChanged; @@ -1078,12 +1081,14 @@ public class AudioService extends IAudioService.Stub sendEncodedSurroundMode(mContentResolver, "onAudioServerDied"); sendEnabledSurroundFormats(mContentResolver, true); updateAssistantUId(true); - updateCurrentImeUid(true); AudioSystem.setRttEnabled(mRttEnabled); } synchronized (mAccessibilityServiceUidsLock) { AudioSystem.setA11yServicesUids(mAccessibilityServiceUids); } + synchronized (mInputMethodServiceUidLock) { + mAudioSystem.setCurrentImeUid(mInputMethodServiceUid); + } synchronized (mHdmiClientLock) { if (mHdmiManager != null && mHdmiTvClient != null) { setHdmiSystemAudioSupported(mHdmiSystemAudioSupported); @@ -1629,37 +1634,6 @@ public class AudioService extends IAudioService.Stub } } - @GuardedBy("mSettingsLock") - private void updateCurrentImeUid(boolean forceUpdate) { - String imeId = Settings.Secure.getStringForUser( - mContentResolver, - Settings.Secure.DEFAULT_INPUT_METHOD, UserHandle.USER_CURRENT); - if (TextUtils.isEmpty(imeId)) { - Log.e(TAG, "updateCurrentImeUid() could not find current IME"); - return; - } - ComponentName componentName = ComponentName.unflattenFromString(imeId); - if (componentName == null) { - Log.e(TAG, "updateCurrentImeUid() got invalid service name for " - + Settings.Secure.DEFAULT_INPUT_METHOD + ": " + imeId); - return; - } - String packageName = componentName.getPackageName(); - int currentUserId = LocalServices.getService(ActivityManagerInternal.class) - .getCurrentUserId(); - int currentImeUid = LocalServices.getService(PackageManagerInternal.class) - .getPackageUidInternal(packageName, 0 /* flags */, currentUserId); - if (currentImeUid < 0) { - Log.e(TAG, "updateCurrentImeUid() could not find UID for package: " + packageName); - return; - } - - if (currentImeUid != mCurrentImeUid || forceUpdate) { - mAudioSystem.setCurrentImeUid(currentImeUid); - mCurrentImeUid = currentImeUid; - } - } - private void readPersistedSettings() { if (!mSystemServer.isPrivileged()) { return; @@ -1707,7 +1681,6 @@ public class AudioService extends IAudioService.Stub sendEncodedSurroundMode(cr, "readPersistedSettings"); sendEnabledSurroundFormats(cr, true); updateAssistantUId(true); - updateCurrentImeUid(true); AudioSystem.setRttEnabled(mRttEnabled); } @@ -6200,8 +6173,6 @@ public class AudioService extends IAudioService.Stub mContentResolver.registerContentObserver(Settings.Secure.getUriFor( Settings.Secure.VOICE_INTERACTION_SERVICE), false, this); - mContentResolver.registerContentObserver(Settings.Secure.getUriFor( - Settings.Secure.DEFAULT_INPUT_METHOD), false, this); } @Override @@ -6225,7 +6196,6 @@ public class AudioService extends IAudioService.Stub updateEncodedSurroundOutput(); sendEnabledSurroundFormats(mContentResolver, mSurroundModeChanged); updateAssistantUId(false); - updateCurrentImeUid(false); } } @@ -7567,6 +7537,19 @@ public class AudioService extends IAudioService.Stub AudioSystem.setA11yServicesUids(mAccessibilityServiceUids); } } + + /** + * {@inheritDoc} + */ + @Override + public void setInputMethodServiceUid(int uid) { + synchronized (mInputMethodServiceUidLock) { + if (mInputMethodServiceUid != uid) { + mAudioSystem.setCurrentImeUid(uid); + mInputMethodServiceUid = uid; + } + } + } } //========================================================================================== diff --git a/services/core/java/com/android/server/biometrics/BiometricServiceBase.java b/services/core/java/com/android/server/biometrics/BiometricServiceBase.java index 808f8c21cc8d..5a6ab4e59424 100644 --- a/services/core/java/com/android/server/biometrics/BiometricServiceBase.java +++ b/services/core/java/com/android/server/biometrics/BiometricServiceBase.java @@ -978,6 +978,10 @@ public abstract class BiometricServiceBase extends SystemService } protected void addLockoutResetCallback(IBiometricServiceLockoutResetCallback callback) { + if (callback == null) { + Slog.w(getTag(), "Null LockoutResetCallback"); + return; + } mHandler.post(() -> { final LockoutResetMonitor monitor = new LockoutResetMonitor(callback); if (!mLockoutMonitors.contains(monitor)) { diff --git a/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java b/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java index 8520f5aa0632..d90f3afd8dca 100644 --- a/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java +++ b/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java @@ -330,6 +330,7 @@ public class FingerprintService extends BiometricServiceBase { @Override public void addLockoutResetCallback(final IBiometricServiceLockoutResetCallback callback) throws RemoteException { + checkPermission(USE_BIOMETRIC_INTERNAL); FingerprintService.super.addLockoutResetCallback(callback); } diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java index 1ed5cd824050..549e33608a78 100644 --- a/services/core/java/com/android/server/hdmi/HdmiControlService.java +++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java @@ -2207,7 +2207,9 @@ public class HdmiControlService extends SystemService { @Override public void setHdmiCecVolumeControlEnabled(final boolean isHdmiCecVolumeControlEnabled) { enforceAccessPermission(); + long token = Binder.clearCallingIdentity(); HdmiControlService.this.setHdmiCecVolumeControlEnabled(isHdmiCecVolumeControlEnabled); + Binder.restoreCallingIdentity(token); } @Override diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java index 6efc88e017af..52116a07e8e6 100644 --- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java +++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java @@ -56,6 +56,7 @@ import android.content.ServiceConnection; import android.content.pm.ApplicationInfo; import android.content.pm.IPackageManager; import android.content.pm.PackageManager; +import android.content.pm.PackageManagerInternal; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; import android.content.res.Configuration; @@ -67,6 +68,7 @@ import android.graphics.drawable.Drawable; import android.hardware.display.DisplayManagerInternal; import android.hardware.input.InputManagerInternal; import android.inputmethodservice.InputMethodService; +import android.media.AudioManagerInternal; import android.net.Uri; import android.os.Binder; import android.os.Bundle; @@ -223,6 +225,8 @@ public class InputMethodManagerService extends IInputMethodManager.Stub static final int MSG_INLINE_SUGGESTIONS_REQUEST = 6000; + static final int MSG_NOTIFY_IME_UID_TO_AUDIO_SERVICE = 7000; + static final long TIME_TO_RECONNECT = 3 * 1000; static final int SECURE_SUGGESTION_SPANS_MAX_SIZE = 20; @@ -308,6 +312,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub final SettingsObserver mSettingsObserver; final IWindowManager mIWindowManager; final WindowManagerInternal mWindowManagerInternal; + final PackageManagerInternal mPackageManagerInternal; final InputManagerInternal mInputManagerInternal; private final DisplayManagerInternal mDisplayManagerInternal; final HandlerCaller mCaller; @@ -320,6 +325,16 @@ public class InputMethodManagerService extends IInputMethodManager.Stub private final UserManager mUserManager; private final UserManagerInternal mUserManagerInternal; + /** + * Cache the result of {@code LocalServices.getService(AudioManagerInternal.class)}. + * + * <p>This field is used only within {@link #handleMessage(Message)} hence synchronization is + * not necessary.</p> + */ + @Nullable + private AudioManagerInternal mAudioManagerInternal = null; + + // All known input methods. mMethodMap also serves as the global // lock for this class. final ArrayList<InputMethodInfo> mMethodList = new ArrayList<>(); @@ -643,6 +658,11 @@ public class InputMethodManagerService extends IInputMethodManager.Stub IInputMethod mCurMethod; /** + * If not {@link Process#INVALID_UID}, then the UID of {@link #mCurIntent}. + */ + int mCurMethodUid = Process.INVALID_UID; + + /** * Time that we last initiated a bind to the input method, to determine * if we should try to disconnect and reconnect to it. */ @@ -1625,6 +1645,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub mIWindowManager = IWindowManager.Stub.asInterface( ServiceManager.getService(Context.WINDOW_SERVICE)); mWindowManagerInternal = LocalServices.getService(WindowManagerInternal.class); + mPackageManagerInternal = LocalServices.getService(PackageManagerInternal.class); mInputManagerInternal = LocalServices.getService(InputManagerInternal.class); mDisplayManagerInternal = LocalServices.getService(DisplayManagerInternal.class); mImeDisplayValidator = displayId -> mWindowManagerInternal.shouldShowIme(displayId); @@ -2521,11 +2542,26 @@ public class InputMethodManagerService extends IInputMethodManager.Stub return checker.displayCanShowIme(displayId) ? displayId : FALLBACK_DISPLAY_ID; } + @AnyThread + private void scheduleNotifyImeUidToAudioService(int uid) { + mCaller.removeMessages(MSG_NOTIFY_IME_UID_TO_AUDIO_SERVICE); + mCaller.obtainMessageI(MSG_NOTIFY_IME_UID_TO_AUDIO_SERVICE, uid).sendToTarget(); + } + @Override public void onServiceConnected(ComponentName name, IBinder service) { synchronized (mMethodMap) { if (mCurIntent != null && name.equals(mCurIntent.getComponent())) { mCurMethod = IInputMethod.Stub.asInterface(service); + final String curMethodPackage = mCurIntent.getComponent().getPackageName(); + final int curMethodUid = mPackageManagerInternal.getPackageUidInternal( + curMethodPackage, 0 /* flags */, mSettings.getCurrentUserId()); + if (curMethodUid < 0) { + Slog.e(TAG, "Failed to get UID for package=" + curMethodPackage); + mCurMethodUid = Process.INVALID_UID; + } else { + mCurMethodUid = curMethodUid; + } if (mCurToken == null) { Slog.w(TAG, "Service connected without a token!"); unbindCurrentMethodLocked(); @@ -2535,6 +2571,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub // Dispatch display id for InputMethodService to update context display. executeOrSendMessage(mCurMethod, mCaller.obtainMessageIOO( MSG_INITIALIZE_IME, mCurTokenDisplayId, mCurMethod, mCurToken)); + scheduleNotifyImeUidToAudioService(mCurMethodUid); if (mCurClient != null) { clearClientSessionLocked(mCurClient); requestClientSessionLocked(mCurClient); @@ -2656,6 +2693,8 @@ public class InputMethodManagerService extends IInputMethodManager.Stub finishSessionLocked(mEnabledSession); mEnabledSession = null; mCurMethod = null; + mCurMethodUid = Process.INVALID_UID; + scheduleNotifyImeUidToAudioService(mCurMethodUid); } if (mStatusBar != null) { mStatusBar.setIconVisibility(mSlotIme, false); @@ -4262,7 +4301,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub } // --------------------------------------------------------------- - case MSG_INLINE_SUGGESTIONS_REQUEST: + case MSG_INLINE_SUGGESTIONS_REQUEST: { args = (SomeArgs) msg.obj; final InlineSuggestionsRequestInfo requestInfo = (InlineSuggestionsRequestInfo) args.arg2; @@ -4274,7 +4313,20 @@ public class InputMethodManagerService extends IInputMethodManager.Stub } catch (RemoteException e) { Slog.w(TAG, "RemoteException calling onCreateInlineSuggestionsRequest(): " + e); } + args.recycle(); return true; + } + + // --------------------------------------------------------------- + case MSG_NOTIFY_IME_UID_TO_AUDIO_SERVICE: { + if (mAudioManagerInternal == null) { + mAudioManagerInternal = LocalServices.getService(AudioManagerInternal.class); + } + if (mAudioManagerInternal != null) { + mAudioManagerInternal.setInputMethodServiceUid(msg.arg1 /* uid */); + } + return true; + } } return false; } diff --git a/services/core/java/com/android/server/integrity/AppIntegrityManagerServiceImpl.java b/services/core/java/com/android/server/integrity/AppIntegrityManagerServiceImpl.java index 905a10bd641b..817902d9d566 100644 --- a/services/core/java/com/android/server/integrity/AppIntegrityManagerServiceImpl.java +++ b/services/core/java/com/android/server/integrity/AppIntegrityManagerServiceImpl.java @@ -190,6 +190,9 @@ public class AppIntegrityManagerServiceImpl extends IAppIntegrityManager.Stub { public void updateRuleSet( String version, ParceledListSlice<Rule> rules, IntentSender statusReceiver) { String ruleProvider = getCallerPackageNameOrThrow(Binder.getCallingUid()); + if (DEBUG_INTEGRITY_COMPONENT) { + Slog.i(TAG, String.format("Calling rule provider name is: %s.", ruleProvider)); + } mHandler.post( () -> { @@ -201,6 +204,9 @@ public class AppIntegrityManagerServiceImpl extends IAppIntegrityManager.Stub { success = false; } + if (DEBUG_INTEGRITY_COMPONENT) { + Slog.i(TAG, String.format("Successfully pushed rule set: %s", version)); + } FrameworkStatsLog.write( FrameworkStatsLog.INTEGRITY_RULES_PUSHED, success, @@ -673,9 +679,6 @@ public class AppIntegrityManagerServiceImpl extends IAppIntegrityManager.Stub { // Identify the package names in the caller list. List<String> callingPackageNames = getPackageListForUid(callingUid); - if (DEBUG_INTEGRITY_COMPONENT) { - Slog.i(TAG, String.format("Calling packages are: ", callingPackageNames)); - } // Find the intersection between the allowed and calling packages. Ideally, we will have // at most one package name here. But if we have more, it is fine. @@ -685,10 +688,7 @@ public class AppIntegrityManagerServiceImpl extends IAppIntegrityManager.Stub { allowedCallingPackages.add(packageName); } } - if (DEBUG_INTEGRITY_COMPONENT) { - Slog.i(TAG, - String.format("Calling rule pusher packages are: ", allowedCallingPackages)); - } + return allowedCallingPackages.isEmpty() ? null : allowedCallingPackages.get(0); } @@ -706,9 +706,6 @@ public class AppIntegrityManagerServiceImpl extends IAppIntegrityManager.Stub { Arrays.asList( mContext.getResources() .getStringArray(R.array.config_integrityRuleProviderPackages)); - if (DEBUG_INTEGRITY_COMPONENT) { - Slog.i(TAG, String.format("Rule provider list contains: %s", integrityRuleProviders)); - } // Filter out the rule provider packages that are not system apps. List<String> systemAppRuleProviders = new ArrayList<>(); diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index bc7bd2355195..86e8734177f0 100755 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -2725,9 +2725,18 @@ public class NotificationManagerService extends SystemService { Context appContext = r.getSbn().getPackageContext(getContext()); Notification.Builder nb = Notification.Builder.recoverBuilder(appContext, r.getNotification()); - if (nb.getStyle() instanceof Notification.MessagingStyle && r.getShortcutInfo() == null) { - mPreferencesHelper.setMessageSent(r.getSbn().getPackageName(), r.getUid()); - handleSavePolicyFile(); + if (nb.getStyle() instanceof Notification.MessagingStyle) { + if (r.getShortcutInfo() != null) { + if (mPreferencesHelper.setValidMessageSent( + r.getSbn().getPackageName(), r.getUid())) { + handleSavePolicyFile(); + } + } else { + if (mPreferencesHelper.setInvalidMessageSent( + r.getSbn().getPackageName(), r.getUid())) { + handleSavePolicyFile(); + } + } } } @@ -3158,9 +3167,22 @@ public class NotificationManagerService extends SystemService { } @Override - public boolean hasSentMessage(String pkg, int uid) { + public boolean isInInvalidMsgState(String pkg, int uid) { + checkCallerIsSystem(); + return mPreferencesHelper.isInInvalidMsgState(pkg, uid); + } + + @Override + public boolean hasUserDemotedInvalidMsgApp(String pkg, int uid) { + checkCallerIsSystem(); + return mPreferencesHelper.hasUserDemotedInvalidMsgApp(pkg, uid); + } + + @Override + public void setInvalidMsgAppDemoted(String pkg, int uid, boolean isDemoted) { checkCallerIsSystem(); - return mPreferencesHelper.hasSentMessage(pkg, uid); + mPreferencesHelper.setInvalidMsgAppDemoted(pkg, uid, isDemoted); + handleSavePolicyFile(); } @Override @@ -5698,6 +5720,9 @@ public class NotificationManagerService extends SystemService { Slog.w(TAG, "notification " + r.getKey() + " added an invalid shortcut"); } r.setShortcutInfo(info); + r.setHasSentValidMsg(mPreferencesHelper.hasSentValidMsg(pkg, notificationUid)); + r.userDemotedAppFromConvoSpace( + mPreferencesHelper.hasUserDemotedInvalidMsgApp(pkg, notificationUid)); if (!checkDisqualifyingFeatures(userId, notificationUid, id, tag, r, r.getSbn().getOverrideGroupKey() != null)) { diff --git a/services/core/java/com/android/server/notification/NotificationRecord.java b/services/core/java/com/android/server/notification/NotificationRecord.java index a9fa2b1bd491..c10782242faa 100644 --- a/services/core/java/com/android/server/notification/NotificationRecord.java +++ b/services/core/java/com/android/server/notification/NotificationRecord.java @@ -188,6 +188,8 @@ public final class NotificationRecord { private boolean mHasSeenSmartReplies; private boolean mFlagBubbleRemoved; private boolean mPostSilently; + private boolean mHasSentValidMsg; + private boolean mAppDemotedFromConvo; /** * Whether this notification (and its channels) should be considered user locked. Used in * conjunction with user sentiment calculation. @@ -1377,6 +1379,14 @@ public final class NotificationRecord { return mShortcutInfo; } + public void setHasSentValidMsg(boolean hasSentValidMsg) { + mHasSentValidMsg = hasSentValidMsg; + } + + public void userDemotedAppFromConvoSpace(boolean userDemoted) { + mAppDemotedFromConvo = userDemoted; + } + /** * Whether this notification is a conversation notification. */ @@ -1397,6 +1407,12 @@ public final class NotificationRecord { && mShortcutInfo == null) { return false; } + if (mHasSentValidMsg && mShortcutInfo == null) { + return false; + } + if (mAppDemotedFromConvo) { + return false; + } return true; } diff --git a/services/core/java/com/android/server/notification/NotificationRecordLoggerImpl.java b/services/core/java/com/android/server/notification/NotificationRecordLoggerImpl.java index c6ec95a2e1d5..2b8ee92e00d9 100644 --- a/services/core/java/com/android/server/notification/NotificationRecordLoggerImpl.java +++ b/services/core/java/com/android/server/notification/NotificationRecordLoggerImpl.java @@ -62,7 +62,7 @@ public class NotificationRecordLoggerImpl implements NotificationRecordLogger { /* android.stats.sysui.NotificationImportance importance_asst = 19 */ r.getAssistantImportance(), /* int32 assistant_hash = 20 */ p.getAssistantHash(), - /* float assistant_ranking_score = 21 */ 0 // TODO connect up ranking score + /* float assistant_ranking_score = 21 */ r.getRankingScore() ); } diff --git a/services/core/java/com/android/server/notification/PreferencesHelper.java b/services/core/java/com/android/server/notification/PreferencesHelper.java index ec0fc4a34387..38c65f11a717 100644 --- a/services/core/java/com/android/server/notification/PreferencesHelper.java +++ b/services/core/java/com/android/server/notification/PreferencesHelper.java @@ -116,7 +116,9 @@ 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_invalid_msg"; + private static final String ATT_SENT_INVALID_MESSAGE = "sent_invalid_msg"; + private static final String ATT_SENT_VALID_MESSAGE = "sent_valid_msg"; + private static final String ATT_USER_DEMOTED_INVALID_MSG_APP = "user_demote_msg_app"; private static final int DEFAULT_PRIORITY = Notification.PRIORITY_DEFAULT; private static final int DEFAULT_VISIBILITY = NotificationManager.VISIBILITY_NO_OVERRIDE; @@ -253,8 +255,12 @@ public class PreferencesHelper implements RankingConfig { parser, ATT_SHOW_BADGE, DEFAULT_SHOW_BADGE); r.lockedAppFields = XmlUtils.readIntAttribute(parser, ATT_APP_USER_LOCKED_FIELDS, DEFAULT_LOCKED_APP_FIELDS); - r.hasSentMessage = XmlUtils.readBooleanAttribute( - parser, ATT_SENT_MESSAGE, false); + r.hasSentInvalidMessage = XmlUtils.readBooleanAttribute( + parser, ATT_SENT_INVALID_MESSAGE, false); + r.hasSentValidMessage = XmlUtils.readBooleanAttribute( + parser, ATT_SENT_VALID_MESSAGE, false); + r.userDemotedMsgApp = XmlUtils.readBooleanAttribute( + parser, ATT_USER_DEMOTED_INVALID_MSG_APP, false); final int innerDepth = parser.getDepth(); while ((type = parser.next()) != XmlPullParser.END_DOCUMENT @@ -497,7 +503,9 @@ public class PreferencesHelper implements RankingConfig { || r.groups.size() > 0 || r.delegate != null || r.bubblePreference != DEFAULT_BUBBLE_PREFERENCE - || r.hasSentMessage; + || r.hasSentInvalidMessage + || r.userDemotedMsgApp + || r.hasSentValidMessage; if (hasNonDefaultSettings) { out.startTag(null, TAG_PACKAGE); out.attribute(null, ATT_NAME, r.pkg); @@ -516,7 +524,12 @@ public class PreferencesHelper implements RankingConfig { out.attribute(null, ATT_SHOW_BADGE, Boolean.toString(r.showBadge)); out.attribute(null, ATT_APP_USER_LOCKED_FIELDS, Integer.toString(r.lockedAppFields)); - out.attribute(null, ATT_SENT_MESSAGE, Boolean.toString(r.hasSentMessage)); + out.attribute(null, ATT_SENT_INVALID_MESSAGE, + Boolean.toString(r.hasSentInvalidMessage)); + out.attribute(null, ATT_SENT_VALID_MESSAGE, + Boolean.toString(r.hasSentValidMessage)); + out.attribute(null, ATT_USER_DEMOTED_INVALID_MSG_APP, + Boolean.toString(r.userDemotedMsgApp)); if (!forBackup) { out.attribute(null, ATT_UID, Integer.toString(r.uid)); @@ -635,15 +648,68 @@ public class PreferencesHelper implements RankingConfig { updateConfig(); } - public boolean hasSentMessage(String packageName, int uid) { + public boolean isInInvalidMsgState(String packageName, int uid) { synchronized (mPackagePreferences) { - return getOrCreatePackagePreferencesLocked(packageName, uid).hasSentMessage; + PackagePreferences r = getOrCreatePackagePreferencesLocked(packageName, uid); + return r.hasSentInvalidMessage && !r.hasSentValidMessage; + } + } + + public boolean hasUserDemotedInvalidMsgApp(String packageName, int uid) { + synchronized (mPackagePreferences) { + PackagePreferences r = getOrCreatePackagePreferencesLocked(packageName, uid); + return isInInvalidMsgState(packageName, uid) ? r.userDemotedMsgApp : false; + } + } + + public void setInvalidMsgAppDemoted(String packageName, int uid, boolean isDemoted) { + synchronized (mPackagePreferences) { + PackagePreferences r = getOrCreatePackagePreferencesLocked(packageName, uid); + r.userDemotedMsgApp = isDemoted; + } + } + + public boolean setInvalidMessageSent(String packageName, int uid) { + synchronized (mPackagePreferences) { + PackagePreferences r = getOrCreatePackagePreferencesLocked(packageName, uid); + boolean valueChanged = r.hasSentInvalidMessage == false; + r.hasSentInvalidMessage = true; + + return valueChanged; + } + } + + public boolean setValidMessageSent(String packageName, int uid) { + synchronized (mPackagePreferences) { + PackagePreferences r = getOrCreatePackagePreferencesLocked(packageName, uid); + boolean valueChanged = r.hasSentValidMessage == false; + r.hasSentValidMessage = true; + + return valueChanged; } } - public void setMessageSent(String packageName, int uid) { + @VisibleForTesting + boolean hasSentInvalidMsg(String packageName, int uid) { synchronized (mPackagePreferences) { - getOrCreatePackagePreferencesLocked(packageName, uid).hasSentMessage = true; + PackagePreferences r = getOrCreatePackagePreferencesLocked(packageName, uid); + return r.hasSentInvalidMessage; + } + } + + @VisibleForTesting + boolean hasSentValidMsg(String packageName, int uid) { + synchronized (mPackagePreferences) { + PackagePreferences r = getOrCreatePackagePreferencesLocked(packageName, uid); + return r.hasSentValidMessage; + } + } + + @VisibleForTesting + boolean didUserEverDemoteInvalidMsgApp(String packageName, int uid) { + synchronized (mPackagePreferences) { + PackagePreferences r = getOrCreatePackagePreferencesLocked(packageName, uid); + return r.userDemotedMsgApp; } } @@ -2273,7 +2339,11 @@ public class PreferencesHelper implements RankingConfig { boolean oemLockedImportance = DEFAULT_OEM_LOCKED_IMPORTANCE; List<String> oemLockedChannels = new ArrayList<>(); boolean defaultAppLockedImportance = DEFAULT_APP_LOCKED_IMPORTANCE; - boolean hasSentMessage = false; + + boolean hasSentInvalidMessage = false; + boolean hasSentValidMessage = false; + // notE: only valid while hasSentMessage is false and hasSentInvalidMessage is true + boolean userDemotedMsgApp = false; Delegate delegate = null; ArrayMap<String, NotificationChannel> channels = new ArrayMap<>(); diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 7959461c5824..3e587bf01521 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -1566,13 +1566,17 @@ public class PackageManagerService extends IPackageManager.Stub // Recordkeeping of restore-after-install operations that are currently in flight // between the Package Manager and the Backup Manager static class PostInstallData { + @Nullable public final InstallArgs args; + @NonNull public final PackageInstalledInfo res; + @Nullable public final Runnable mPostInstallRunnable; - PostInstallData(InstallArgs _a, PackageInstalledInfo _r, Runnable postInstallRunnable) { - args = _a; - res = _r; + PostInstallData(@Nullable InstallArgs args, @NonNull PackageInstalledInfo res, + @Nullable Runnable postInstallRunnable) { + this.args = args; + this.res = res; mPostInstallRunnable = postInstallRunnable; } } @@ -1714,7 +1718,7 @@ public class PackageManagerService extends IPackageManager.Stub if (data != null && data.mPostInstallRunnable != null) { data.mPostInstallRunnable.run(); - } else if (data != null) { + } else if (data != null && data.args != null) { InstallArgs args = data.args; PackageInstalledInfo parentRes = data.res; @@ -1732,26 +1736,12 @@ public class PackageManagerService extends IPackageManager.Stub : args.whitelistedRestrictedPermissions; int autoRevokePermissionsMode = args.autoRevokePermissionsMode; - // Handle the parent package handlePackagePostInstall(parentRes, grantPermissions, killApp, virtualPreload, grantedPermissions, whitelistedRestrictedPermissions, autoRevokePermissionsMode, didRestore, args.installSource.installerPackageName, args.observer, args.mDataLoaderType); - // Handle the child packages - final int childCount = (parentRes.addedChildPackages != null) - ? parentRes.addedChildPackages.size() : 0; - for (int i = 0; i < childCount; i++) { - PackageInstalledInfo childRes = parentRes.addedChildPackages.valueAt(i); - handlePackagePostInstall(childRes, grantPermissions, - killApp, virtualPreload, grantedPermissions, - whitelistedRestrictedPermissions, autoRevokePermissionsMode, - false /*didRestore*/, - args.installSource.installerPackageName, args.observer, - args.mDataLoaderType); - } - // Log tracing if needed if (args.traceMethod != null) { Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, args.traceMethod, @@ -2306,27 +2296,8 @@ public class PackageManagerService extends IPackageManager.Stub // Work that needs to happen on first install within each user if (firstUserIds != null && firstUserIds.length > 0) { for (int userId : firstUserIds) { - // If this app is a browser and it's newly-installed for some - // users, clear any default-browser state in those users. The - // app's nature doesn't depend on the user, so we can just check - // its browser nature in any user and generalize. - if (packageIsBrowser(packageName, userId)) { - // If this browser is restored from user's backup, do not clear - // default-browser state for this user - if (pkgSetting.getInstallReason(userId) - != PackageManager.INSTALL_REASON_DEVICE_RESTORE) { - mPermissionManager.setDefaultBrowser(null, true, true, userId); - } - } - - // We may also need to apply pending (restored) runtime permission grants - // within these users. - mPermissionManager.restoreDelayedRuntimePermissions(packageName, - UserHandle.of(userId)); - - // Persistent preferred activity might have came into effect due to this - // install. - updateDefaultHomeNotLocked(userId); + clearRolesAndRestorePermissionsForNewUserInstall(packageName, + pkgSetting.getInstallReason(userId), userId); } } @@ -7210,11 +7181,14 @@ public class PackageManagerService extends IPackageManager.Stub sortResult = true; } } else { - final AndroidPackage pkg = mPackages.get(pkgName); + final PackageSetting setting = + getPackageSettingInternal(pkgName, Process.SYSTEM_UID); result = null; - if (pkg != null) { + if (setting != null && setting.pkg != null + && !shouldFilterApplicationLocked(setting, filterCallingUid, userId)) { result = filterIfNotSystemUser(mComponentResolver.queryActivities( - intent, resolvedType, flags, pkg.getActivities(), userId), userId); + intent, resolvedType, flags, setting.pkg.getActivities(), userId), + userId); } if (result == null || result.size() == 0) { // the caller wants to resolve for a particular package; however, there @@ -13122,9 +13096,15 @@ public class PackageManagerService extends IPackageManager.Stub createPackageInstalledInfo(PackageManager.INSTALL_SUCCEEDED); res.pkg = pkgSetting.pkg; res.newUsers = new int[]{ userId }; - PostInstallData postInstallData = intentSender == null ? null : - new PostInstallData(null, res, () -> onRestoreComplete(res.returnCode, - mContext, intentSender)); + + PostInstallData postInstallData = + new PostInstallData(null, res, () -> { + clearRolesAndRestorePermissionsForNewUserInstall(packageName, + pkgSetting.getInstallReason(userId), userId); + if (intentSender != null) { + onRestoreComplete(res.returnCode, mContext, intentSender); + } + }); restoreAndPostInstall(userId, res, postInstallData); } } finally { @@ -15801,7 +15781,6 @@ public class PackageManagerService extends IPackageManager.Stub String returnMsg; String installerPackageName; PackageRemovedInfo removedInfo; - ArrayMap<String, PackageInstalledInfo> addedChildPackages; // The set of packages consuming this shared library or null if no consumers exist. ArrayList<AndroidPackage> libraryConsumers; PackageFreezer freezer; @@ -15815,37 +15794,21 @@ public class PackageManagerService extends IPackageManager.Stub public void setError(String msg, PackageParserException e) { setReturnCode(e.error); setReturnMessage(ExceptionUtils.getCompleteMessage(msg, e)); - final int childCount = (addedChildPackages != null) ? addedChildPackages.size() : 0; - for (int i = 0; i < childCount; i++) { - addedChildPackages.valueAt(i).setError(msg, e); - } Slog.w(TAG, msg, e); } public void setError(String msg, PackageManagerException e) { returnCode = e.error; setReturnMessage(ExceptionUtils.getCompleteMessage(msg, e)); - final int childCount = (addedChildPackages != null) ? addedChildPackages.size() : 0; - for (int i = 0; i < childCount; i++) { - addedChildPackages.valueAt(i).setError(msg, e); - } Slog.w(TAG, msg, e); } public void setReturnCode(int returnCode) { this.returnCode = returnCode; - final int childCount = (addedChildPackages != null) ? addedChildPackages.size() : 0; - for (int i = 0; i < childCount; i++) { - addedChildPackages.valueAt(i).returnCode = returnCode; - } } private void setReturnMessage(String returnMsg) { this.returnMsg = returnMsg; - final int childCount = (addedChildPackages != null) ? addedChildPackages.size() : 0; - for (int i = 0; i < childCount; i++) { - addedChildPackages.valueAt(i).returnMsg = returnMsg; - } } // In some error cases we want to convey more info back to the observer @@ -17395,7 +17358,6 @@ public class PackageManagerService extends IPackageManager.Stub int targetParseFlags = parseFlags; final PackageSetting ps; final PackageSetting disabledPs; - final PackageSetting[] childPackages; if (replace) { if (parsedPackage.isStaticSharedLibrary()) { // Static libs have a synthetic package name containing the version @@ -18397,7 +18359,6 @@ public class PackageManagerService extends IPackageManager.Stub final boolean killApp = (deleteFlags & PackageManager.DELETE_DONT_KILL_APP) == 0; info.sendPackageRemovedBroadcasts(killApp); info.sendSystemPackageUpdatedBroadcasts(); - info.sendSystemPackageAppearedBroadcasts(); } // Force a gc here. Runtime.getRuntime().gc(); @@ -18455,7 +18416,6 @@ public class PackageManagerService extends IPackageManager.Stub SparseArray<int[]> broadcastWhitelist; // Clean up resources deleted packages. InstallArgs args = null; - ArrayMap<String, PackageInstalledInfo> appearedChildPackages; PackageRemovedInfo(PackageSender packageSender) { this.packageSender = packageSender; @@ -18471,18 +18431,6 @@ public class PackageManagerService extends IPackageManager.Stub } } - void sendSystemPackageAppearedBroadcasts() { - final int packageCount = (appearedChildPackages != null) - ? appearedChildPackages.size() : 0; - for (int i = 0; i < packageCount; i++) { - PackageInstalledInfo installedInfo = appearedChildPackages.valueAt(i); - packageSender.sendPackageAddedForNewUsers(installedInfo.name, - true /*sendBootCompleted*/, false /*startReceiver*/, - UserHandle.getAppId(installedInfo.uid), installedInfo.newUsers, null, - DataLoaderType.NONE); - } - } - private void sendSystemPackageUpdatedBroadcastsInternal() { Bundle extras = new Bundle(2); extras.putInt(Intent.EXTRA_UID, removedAppId >= 0 ? removedAppId : uid); @@ -19749,6 +19697,30 @@ public class PackageManagerService extends IPackageManager.Stub } } + private void clearRolesAndRestorePermissionsForNewUserInstall(String packageName, + int installReason, @UserIdInt int userId) { + // If this app is a browser and it's newly-installed for some + // users, clear any default-browser state in those users. The + // app's nature doesn't depend on the user, so we can just check + // its browser nature in any user and generalize. + if (packageIsBrowser(packageName, userId)) { + // If this browser is restored from user's backup, do not clear + // default-browser state for this user + if (installReason != PackageManager.INSTALL_REASON_DEVICE_RESTORE) { + mPermissionManager.setDefaultBrowser(null, true, true, userId); + } + } + + // We may also need to apply pending (restored) runtime permission grants + // within these users. + mPermissionManager.restoreDelayedRuntimePermissions(packageName, + UserHandle.of(userId)); + + // Persistent preferred activity might have came into effect due to this + // install. + updateDefaultHomeNotLocked(userId); + } + @Override public void resetApplicationPreferences(int userId) { mContext.enforceCallingOrSelfPermission( diff --git a/services/core/java/com/android/server/pm/StagingManager.java b/services/core/java/com/android/server/pm/StagingManager.java index b805a2456b46..79805e3b42ae 100644 --- a/services/core/java/com/android/server/pm/StagingManager.java +++ b/services/core/java/com/android/server/pm/StagingManager.java @@ -69,6 +69,8 @@ import com.android.internal.annotations.GuardedBy; import com.android.internal.content.PackageHelper; import com.android.internal.os.BackgroundThread; import com.android.server.LocalServices; +import com.android.server.SystemService; +import com.android.server.SystemServiceManager; import com.android.server.pm.parsing.PackageParser2; import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.AndroidPackageUtils; @@ -110,6 +112,9 @@ public class StagingManager { private final List<String> mFailedPackageNames = new ArrayList<>(); private String mNativeFailureReason; + @GuardedBy("mSuccessfulStagedSessionIds") + private final List<Integer> mSuccessfulStagedSessionIds = new ArrayList<>(); + StagingManager(PackageInstallerService pi, Context context, Supplier<PackageParser2> packageParserSupplier) { mPi = pi; @@ -122,6 +127,34 @@ public class StagingManager { BackgroundThread.get().getLooper()); } + /** + This class manages lifecycle events for StagingManager. + */ + public static final class Lifecycle extends SystemService { + private static StagingManager sStagingManager; + + public Lifecycle(Context context) { + super(context); + } + + void startService(StagingManager stagingManager) { + sStagingManager = stagingManager; + LocalServices.getService(SystemServiceManager.class).startService(this); + } + + @Override + public void onStart() { + // no-op + } + + @Override + public void onBootPhase(int phase) { + if (phase == SystemService.PHASE_BOOT_COMPLETED && sStagingManager != null) { + sStagingManager.markStagedSessionsAsSuccessful(); + } + } + } + private void updateStoredSession(@NonNull PackageInstallerSession sessionInfo) { synchronized (mStagedSessions) { PackageInstallerSession storedSession = mStagedSessions.get(sessionInfo.sessionId); @@ -652,7 +685,22 @@ public class StagingManager { Slog.d(TAG, "Marking session " + session.sessionId + " as applied"); session.setStagedSessionApplied(); if (hasApex) { - mApexManager.markStagedSessionSuccessful(session.sessionId); + try { + if (supportsCheckpoint()) { + // Store the session ID, which will be marked as successful by ApexManager + // upon boot completion. + synchronized (mSuccessfulStagedSessionIds) { + mSuccessfulStagedSessionIds.add(session.sessionId); + } + } else { + // Mark sessions as successful immediately on non-checkpointing devices. + mApexManager.markStagedSessionSuccessful(session.sessionId); + } + } catch (RemoteException e) { + Slog.w(TAG, "Checkpoint support unknown, marking session as successful " + + "immediately."); + mApexManager.markStagedSessionSuccessful(session.sessionId); + } } } @@ -1121,7 +1169,16 @@ public class StagingManager { } } + void markStagedSessionsAsSuccessful() { + synchronized (mSuccessfulStagedSessionIds) { + for (int i = 0; i < mSuccessfulStagedSessionIds.size(); i++) { + mApexManager.markStagedSessionSuccessful(mSuccessfulStagedSessionIds.get(i)); + } + } + } + void systemReady() { + new Lifecycle(mContext).startService(this); // Register the receiver of boot completed intent for staging manager. mContext.registerReceiver(new BroadcastReceiver() { @Override diff --git a/services/core/java/com/android/server/policy/PermissionPolicyService.java b/services/core/java/com/android/server/policy/PermissionPolicyService.java index 8648a2392d9e..76c6a7aec00b 100644 --- a/services/core/java/com/android/server/policy/PermissionPolicyService.java +++ b/services/core/java/com/android/server/policy/PermissionPolicyService.java @@ -25,6 +25,8 @@ import static android.content.pm.PackageManager.FLAG_PERMISSION_APPLY_RESTRICTIO import static android.content.pm.PackageManager.FLAG_PERMISSION_AUTO_REVOKED; import static android.content.pm.PackageManager.FLAG_PERMISSION_REVIEW_REQUIRED; import static android.content.pm.PackageManager.FLAG_PERMISSION_REVOKED_COMPAT; +import static android.content.pm.PackageManager.FLAG_PERMISSION_USER_SENSITIVE_WHEN_DENIED; +import static android.content.pm.PackageManager.FLAG_PERMISSION_USER_SENSITIVE_WHEN_GRANTED; import static android.content.pm.PackageManager.GET_PERMISSIONS; import static android.content.pm.PackageManager.MATCH_ALL; @@ -45,7 +47,6 @@ import android.content.pm.PackageManagerInternal; import android.content.pm.PackageManagerInternal.PackageListObserver; import android.content.pm.PermissionInfo; import android.os.Build; -import android.os.Handler; import android.os.Process; import android.os.RemoteException; import android.os.ServiceManager; @@ -57,7 +58,6 @@ import android.provider.Telephony; import android.telecom.TelecomManager; import android.util.ArrayMap; import android.util.ArraySet; -import android.util.Log; import android.util.LongSparseLongArray; import android.util.Pair; import android.util.Slog; @@ -93,6 +93,7 @@ import java.util.concurrent.ExecutionException; public final class PermissionPolicyService extends SystemService { private static final String LOG_TAG = PermissionPolicyService.class.getSimpleName(); private static final boolean DEBUG = false; + private static final long USER_SENSITIVE_UPDATE_DELAY_MS = 10000; private final Object mLock = new Object(); @@ -378,8 +379,6 @@ public final class PermissionPolicyService extends SystemService { * TODO ntmyren: Remove once propagated, and state is repaired */ private void restoreReadPhoneStatePermissions(int userId) { - PermissionControllerManager manager = new PermissionControllerManager(this.getContext(), - Handler.getMain()); PackageManager pm = getContext().getPackageManager(); List<PackageInfo> packageInfos = pm.getInstalledPackagesAsUser( MATCH_ALL | GET_PERMISSIONS, userId); @@ -389,26 +388,21 @@ public final class PermissionPolicyService extends SystemService { continue; } - boolean hasReadPhoneState = false; + UserHandle user = UserHandle.getUserHandleForUid(pI.applicationInfo.uid); for (int j = pI.requestedPermissions.length - 1; j >= 0; j--) { if (pI.requestedPermissions[j].equals(READ_PHONE_STATE)) { - hasReadPhoneState = true; + int flags = pm.getPermissionFlags(READ_PHONE_STATE, pI.packageName, user); + // If the app is auto revoked for read phone state, and is only user sensitive + // when granted, clear auto revoked flag. + if ((flags & FLAG_PERMISSION_AUTO_REVOKED) != 0 + && (flags & FLAG_PERMISSION_USER_SENSITIVE_WHEN_GRANTED) != 0 + && (flags & FLAG_PERMISSION_USER_SENSITIVE_WHEN_DENIED) == 0) { + pm.updatePermissionFlags(READ_PHONE_STATE, pI.packageName, + FLAG_PERMISSION_AUTO_REVOKED, 0, user); + } + break; } } - if (!hasReadPhoneState) { - continue; - } - - Log.i(LOG_TAG, "Updating read phone state for " + pI.packageName + " " - + pI.applicationInfo.uid); - manager.updateUserSensitiveForApp(pI.applicationInfo.uid); - - UserHandle user = UserHandle.getUserHandleForUid(pI.applicationInfo.uid); - int permFlags = pm.getPermissionFlags(READ_PHONE_STATE, pI.packageName, user); - if ((permFlags & FLAG_PERMISSION_AUTO_REVOKED) != 0) { - pm.updatePermissionFlags(READ_PHONE_STATE, pI.packageName, - FLAG_PERMISSION_AUTO_REVOKED, 0, user); - } } } @@ -460,7 +454,8 @@ public final class PermissionPolicyService extends SystemService { throw new IllegalStateException(e); } - permissionControllerManager.updateUserSensitive(); + FgThread.getHandler().postDelayed(permissionControllerManager::updateUserSensitive, + USER_SENSITIVE_UPDATE_DELAY_MS); packageManagerInternal.updateRuntimePermissionsFingerprint(userId); } 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 9b0feae1b8c6..12309f407786 100644 --- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java +++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java @@ -445,6 +445,8 @@ public class StatsPullAtomService extends SystemService { return pullAttributedAppOps(atomTag, data); case FrameworkStatsLog.SETTING_SNAPSHOT: return pullSettingsStats(atomTag, data); + case FrameworkStatsLog.DISPLAY_WAKE_REASON: + return pullDisplayWakeStats(atomTag, data); default: throw new UnsupportedOperationException("Unknown tagId=" + atomTag); } @@ -609,6 +611,7 @@ public class StatsPullAtomService extends SystemService { registerBatteryVoltage(); registerBatteryCycleCount(); registerSettingsStats(); + registerDisplayWakeStats(); } private void initAndRegisterNetworkStatsPullers() { @@ -3391,6 +3394,21 @@ public class StatsPullAtomService extends SystemService { return StatsManager.PULL_SUCCESS; } + private void registerDisplayWakeStats() { + int tagId = FrameworkStatsLog.DISPLAY_WAKE_REASON; + mStatsManager.setPullAtomCallback( + tagId, + null, // use default PullAtomMetadata values + BackgroundThread.getExecutor(), + mStatsCallbackImpl + ); + } + + int pullDisplayWakeStats(int atomTag, List<StatsEvent> pulledData) { + //TODO: Denny, implement read/write DisplayWakeStats, b/154172964 + return 0; + } + // Thermal event received from vendor thermal management subsystem private static final class ThermalEventListener extends IThermalEventListener.Stub { @Override diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index e675afc09e07..91c849c4110f 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -1940,6 +1940,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A mStartingData = null; startingSurface = null; startingWindow = null; + startingDisplayed = false; if (surface == null) { ProtoLog.v(WM_DEBUG_STARTING_WINDOW, "startingWindow was set but startingSurface==null, couldn't " @@ -5456,6 +5457,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A if (mLastTransactionSequence != mWmService.mTransactionSequence) { mLastTransactionSequence = mWmService.mTransactionSequence; mNumDrawnWindows = 0; + startingDisplayed = false; // There is the main base application window, even if it is exiting, wait for it mNumInterestingWindows = findMainWindow(false /* includeStartingApp */) != null ? 1 : 0; diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 3acb127673e9..0b2bd811bb84 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -3317,7 +3317,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo mInputMethodWindow.getDisplayId()); } mInsetsStateController.getSourceProvider(ITYPE_IME).setWindow(win, - null /* frameProvider */, null /* imeFrameProvider */); + mDisplayPolicy.getImeSourceFrameProvider(), null /* imeFrameProvider */); computeImeTarget(true /* updateImeTarget */); updateImeControlTarget(); } diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index 2e18fbf30d46..2f18a0d7e531 100644 --- a/services/core/java/com/android/server/wm/DisplayPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayPolicy.java @@ -1106,6 +1106,24 @@ public class DisplayPolicy { } } + TriConsumer<DisplayFrames, WindowState, Rect> getImeSourceFrameProvider() { + return (displayFrames, windowState, inOutFrame) -> { + if (mNavigationBar != null && navigationBarPosition(displayFrames.mDisplayWidth, + displayFrames.mDisplayHeight, + displayFrames.mRotation) == NAV_BAR_BOTTOM) { + // In gesture navigation, nav bar frame is larger than frame to calculate insets. + // IME should not provide frame which is smaller than the nav bar frame. Otherwise, + // nav bar might be overlapped with the content of the client when IME is shown. + sTmpRect.set(inOutFrame); + sTmpRect.intersectUnchecked(mNavigationBar.getFrameLw()); + inOutFrame.inset(windowState.getGivenContentInsetsLw()); + inOutFrame.union(sTmpRect); + } else { + inOutFrame.inset(windowState.getGivenContentInsetsLw()); + } + }; + } + private static void enforceSingleInsetsTypeCorrespondingToWindowType(int[] insetsTypes) { int count = 0; for (int insetsType : insetsTypes) { diff --git a/services/core/java/com/android/server/wm/InputMonitor.java b/services/core/java/com/android/server/wm/InputMonitor.java index 1b1898b76506..efcd61df5c75 100644 --- a/services/core/java/com/android/server/wm/InputMonitor.java +++ b/services/core/java/com/android/server/wm/InputMonitor.java @@ -469,8 +469,12 @@ final class InputMonitor { public void accept(WindowState w) { final InputChannel inputChannel = w.mInputChannel; final InputWindowHandle inputWindowHandle = w.mInputWindowHandle; + final RecentsAnimationController recentsAnimationController = + mService.getRecentsAnimationController(); + final boolean shouldApplyRecentsInputConsumer = recentsAnimationController != null + && recentsAnimationController.shouldApplyInputConsumer(w.mActivityRecord); if (inputChannel == null || inputWindowHandle == null || w.mRemoved - || w.cantReceiveTouchInput()) { + || (w.cantReceiveTouchInput() && !shouldApplyRecentsInputConsumer)) { if (w.mWinAnimator.hasSurface()) { mInputTransaction.setInputWindowInfo( w.mWinAnimator.mSurfaceController.getClientViewRootSurface(), @@ -486,22 +490,16 @@ final class InputMonitor { final boolean hasFocus = w.isFocused(); final boolean isVisible = w.isVisibleLw(); - if (mAddRecentsAnimationInputConsumerHandle) { - final RecentsAnimationController recentsAnimationController = - mService.getRecentsAnimationController(); - if (recentsAnimationController != null - && recentsAnimationController.shouldApplyInputConsumer(w.mActivityRecord)) { - if (recentsAnimationController.updateInputConsumerForApp( - mRecentsAnimationInputConsumer.mWindowHandle, hasFocus)) { - mRecentsAnimationInputConsumer.show(mInputTransaction, w); - mAddRecentsAnimationInputConsumerHandle = false; - } + if (mAddRecentsAnimationInputConsumerHandle && shouldApplyRecentsInputConsumer) { + if (recentsAnimationController.updateInputConsumerForApp( + mRecentsAnimationInputConsumer.mWindowHandle, hasFocus)) { + mRecentsAnimationInputConsumer.show(mInputTransaction, w); + mAddRecentsAnimationInputConsumerHandle = false; } } if (w.inPinnedWindowingMode()) { if (mAddPipInputConsumerHandle) { - final Task rootTask = w.getTask().getRootTask(); mPipInputConsumer.mWindowHandle.replaceTouchableRegionWithCrop( rootTask.getSurfaceControl()); diff --git a/services/core/java/com/android/server/wm/RecentsAnimationController.java b/services/core/java/com/android/server/wm/RecentsAnimationController.java index d6ddcd0cc9f9..cbc1bdfa0e9e 100644 --- a/services/core/java/com/android/server/wm/RecentsAnimationController.java +++ b/services/core/java/com/android/server/wm/RecentsAnimationController.java @@ -799,7 +799,8 @@ public class RecentsAnimationController implements DeathRecipient { // Only apply the input consumer if it is enabled, it is not the target (home/recents) // being revealed with the transition, and we are actively animating the app as a part of // the animation - return mInputConsumerEnabled && !isTargetApp(activity) && isAnimatingApp(activity); + return mInputConsumerEnabled && activity != null + && !isTargetApp(activity) && isAnimatingApp(activity); } boolean updateInputConsumerForApp(InputWindowHandle inputWindowHandle, diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index a2979e6ec286..888a6e986e88 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -2176,6 +2176,10 @@ class RootWindowContainer extends WindowContainer<DisplayContent> // move the PIP activity into the task. stack = taskDisplayArea.createStack(WINDOWING_MODE_UNDEFINED, r.getActivityType(), ON_TOP, r.info, r.intent, false /* createdByOrganizer */); + // It's possible the task entering PIP is in freeform, so save the last + // non-fullscreen bounds. Then when this new PIP task exits PIP, it can restore + // to its previous freeform bounds. + stack.setLastNonFullscreenBounds(task.mLastNonFullscreenBounds); // There are multiple activities in the task and moving the top activity should // reveal/leave the other activities in their original task. diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index a948ecef48e7..e925ce5c2dac 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -2191,9 +2191,9 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP if (wasVisible) { final int transit = (!startingWindow) ? TRANSIT_EXIT : TRANSIT_PREVIEW_DONE; - final int flags = startingWindow ? 0 /* self */ : PARENTS; + // Try starting an animation. - if (mWinAnimator.applyAnimationLocked(transit, false, flags)) { + if (mWinAnimator.applyAnimationLocked(transit, false)) { mAnimatingExit = true; // mAnimatingExit affects canAffectSystemUiFlags(). Run layout such that @@ -2205,9 +2205,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP mWmService.mAccessibilityController.onWindowTransitionLocked(this, transit); } } - final boolean isAnimating = startingWindow - ? isAnimating(0) - : isAnimating(TRANSITION | PARENTS) + final boolean isAnimating = isAnimating(TRANSITION | PARENTS) && (mActivityRecord == null || !mActivityRecord.isWaitingForTransitionStart()); final boolean lastWindowIsStartingWindow = startingWindow && mActivityRecord != null && mActivityRecord.isLastWindow(this); @@ -2229,9 +2227,6 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP } } - if (startingWindow && mActivityRecord != null) { - mActivityRecord.startingDisplayed = false; - } removeImmediately(); // Removing a visible window will effect the computed orientation // So just update orientation if needed. diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java index e70f3e4ef9b9..c570cf1d949f 100644 --- a/services/core/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java @@ -1400,25 +1400,9 @@ class WindowStateAnimator { * the switch statement below. * @param isEntrance The animation type the last time this was called. Used to keep from * loading the same animation twice. - * @return {@code true} if an animation has been loaded, includes the parents. - * + * @return true if an animation has been loaded. */ boolean applyAnimationLocked(int transit, boolean isEntrance) { - return applyAnimationLocked(transit, isEntrance, PARENTS); - } - - /** - * Choose the correct animation and set it to the passed WindowState. - * @param transit If AppTransition.TRANSIT_PREVIEW_DONE and the app window has been drawn - * then the animation will be app_starting_exit. Any other value loads the animation from - * the switch statement below. - * @param isEntrance The animation type the last time this was called. Used to keep from - * loading the same animation twice. - * @param flags The combination of bitmask flags to specify targets and condition for - * checking animating status. See {@link WindowContainer.AnimationFlags}. - * @return {@code true} if an animation has been loaded. - */ - boolean applyAnimationLocked(int transit, boolean isEntrance, int flags) { if (mWin.isAnimating() && mAnimationIsEntrance == isEntrance) { // If we are trying to apply an animation, but already running // an animation of the same type, then just leave that one alone. @@ -1488,7 +1472,7 @@ class WindowStateAnimator { mWin.getDisplayContent().adjustForImeIfNeeded(); } - return mWin.isAnimating(flags); + return mWin.isAnimating(PARENTS); } void dumpDebug(ProtoOutputStream proto, long fieldId) { 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 289933e5ecb2..d45ecc9a3329 100755 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java @@ -6650,18 +6650,14 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId()); waitForIdle(); - assertTrue(mBinderService.hasSentMessage(PKG, mUid)); + assertTrue(mBinderService.isInInvalidMsgState(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); + nb.setShortcutId(null); 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); @@ -6670,7 +6666,43 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId()); waitForIdle(); - assertFalse(mBinderService.hasSentMessage(PKG, mUid)); + assertTrue(mBinderService.isInInvalidMsgState(PKG, mUid)); + + nr = generateMessageBubbleNotifRecord(mTestNotificationChannel, + "testRecordMessages_validMsg"); + + mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(), + nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId()); + waitForIdle(); + + assertFalse(mBinderService.isInInvalidMsgState(PKG, mUid)); + } + + @Test + public void testRecordMessages_invalidMsg_afterValidMsg() throws RemoteException { + NotificationRecord nr = generateMessageBubbleNotifRecord(mTestNotificationChannel, + "testRecordMessages_invalidMsg_afterValidMsg_1"); + mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(), + nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId()); + waitForIdle(); + assertTrue(mService.getNotificationRecord(nr.getKey()).isConversation()); + + mBinderService.cancelAllNotifications(PKG, mUid); + waitForIdle(); + + Notification.Builder nb = getMessageStyleNotifBuilder(false /* addDefaultMetadata */, + null /* groupKey */, false /* isSummary */); + nb.setShortcutId(null); + StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 1, + "testRecordMessages_invalidMsg_afterValidMsg_2", mUid, 0, nb.build(), + new UserHandle(mUid), null, 0); + nr = new NotificationRecord(mContext, sbn, mTestNotificationChannel); + + mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(), + nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId()); + waitForIdle(); + + assertFalse(mService.getNotificationRecord(nr.getKey()).isConversation()); } @Test 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 b03596a35c32..6df3c7b69d15 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordTest.java @@ -1137,6 +1137,26 @@ public class NotificationRecordTest extends UiServiceTestCase { } @Test + public void testIsConversation_noShortcut_appHasPreviousSentFullConversation() { + StatusBarNotification sbn = getMessagingStyleNotification(); + NotificationRecord record = new NotificationRecord(mMockContext, sbn, channel); + record.setShortcutInfo(null); + record.setHasSentValidMsg(true); + + assertFalse(record.isConversation()); + } + + @Test + public void testIsConversation_noShortcut_userDemotedApp() { + StatusBarNotification sbn = getMessagingStyleNotification(); + NotificationRecord record = new NotificationRecord(mMockContext, sbn, channel); + record.setShortcutInfo(null); + record.userDemotedAppFromConvoSpace(true); + + assertFalse(record.isConversation()); + } + + @Test public void testIsConversation_noShortcut_targetsR() { StatusBarNotification sbn = getMessagingStyleNotification(PKG_R); NotificationRecord record = new NotificationRecord(mMockContext, sbn, channel); 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 4320f1c3c896..f4e5d569512a 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java @@ -454,7 +454,9 @@ public class PreferencesHelperTest extends UiServiceTestCase { mHelper.createNotificationChannel(PKG_O, UID_O, getChannel(), true, false); mHelper.setShowBadge(PKG_N_MR1, UID_N_MR1, true); - mHelper.setMessageSent(PKG_P, UID_P); + mHelper.setInvalidMessageSent(PKG_P, UID_P); + mHelper.setValidMessageSent(PKG_P, UID_P); + mHelper.setInvalidMsgAppDemoted(PKG_P, UID_P, true); mHelper.setImportance(PKG_O, UID_O, IMPORTANCE_NONE); @@ -470,8 +472,10 @@ public class PreferencesHelperTest extends UiServiceTestCase { assertEquals(IMPORTANCE_NONE, mHelper.getImportance(PKG_O, UID_O)); assertTrue(mHelper.canShowBadge(PKG_N_MR1, UID_N_MR1)); - assertTrue(mHelper.hasSentMessage(PKG_P, UID_P)); - assertFalse(mHelper.hasSentMessage(PKG_N_MR1, UID_N_MR1)); + assertTrue(mHelper.hasSentInvalidMsg(PKG_P, UID_P)); + assertFalse(mHelper.hasSentInvalidMsg(PKG_N_MR1, UID_N_MR1)); + assertTrue(mHelper.hasSentValidMsg(PKG_P, UID_P)); + assertTrue(mHelper.didUserEverDemoteInvalidMsgApp(PKG_P, UID_P)); assertEquals(channel1, mHelper.getNotificationChannel(PKG_N_MR1, UID_N_MR1, channel1.getId(), false)); compareChannels(channel2, @@ -3380,15 +3384,49 @@ public class PreferencesHelperTest extends UiServiceTestCase { } @Test - public void testMessageSent() { + public void testInvalidMessageSent() { // create package preferences mHelper.canShowBadge(PKG_P, UID_P); // check default value - assertFalse(mHelper.hasSentMessage(PKG_P, UID_P)); + assertFalse(mHelper.isInInvalidMsgState(PKG_P, UID_P)); // change it - mHelper.setMessageSent(PKG_P, UID_P); - assertTrue(mHelper.hasSentMessage(PKG_P, UID_P)); + mHelper.setInvalidMessageSent(PKG_P, UID_P); + assertTrue(mHelper.isInInvalidMsgState(PKG_P, UID_P)); + assertTrue(mHelper.hasSentInvalidMsg(PKG_P, UID_P)); + } + + @Test + public void testValidMessageSent() { + // create package preferences + mHelper.canShowBadge(PKG_P, UID_P); + + // get into the bad state + mHelper.setInvalidMessageSent(PKG_P, UID_P); + + // and then fix it + mHelper.setValidMessageSent(PKG_P, UID_P); + + assertTrue(mHelper.hasSentValidMsg(PKG_P, UID_P)); + assertFalse(mHelper.isInInvalidMsgState(PKG_P, UID_P)); + } + + @Test + public void testUserDemotedInvalidMsgApp() { + // create package preferences + mHelper.canShowBadge(PKG_P, UID_P); + + // demotion means nothing before msg notif sent + mHelper.setInvalidMsgAppDemoted(PKG_P, UID_P, true); + assertFalse(mHelper.hasUserDemotedInvalidMsgApp(PKG_P, UID_P)); + + // it's valid when incomplete msgs have been sent + mHelper.setInvalidMessageSent(PKG_P, UID_P); + assertTrue(mHelper.hasUserDemotedInvalidMsgApp(PKG_P, UID_P)); + + // and is invalid once complete msgs are sent + mHelper.setValidMessageSent(PKG_P, UID_P); + assertFalse(mHelper.hasUserDemotedInvalidMsgApp(PKG_P, UID_P)); } } diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java index c2db0c09f88a..a3f9b2e71cb5 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java @@ -16,7 +16,9 @@ package com.android.server.wm; +import static android.view.InsetsState.ITYPE_IME; import static android.view.InsetsState.ITYPE_NAVIGATION_BAR; +import static android.view.Surface.ROTATION_0; import static android.view.View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR; import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT; @@ -56,7 +58,10 @@ import static org.mockito.Mockito.when; import android.graphics.PixelFormat; import android.graphics.Rect; import android.platform.test.annotations.Presubmit; +import android.view.DisplayInfo; +import android.view.InsetsSource; import android.view.InsetsState; +import android.view.WindowInsets.Side; import android.view.WindowManager; import androidx.test.filters.SmallTest; @@ -352,4 +357,36 @@ public class DisplayPolicyTests extends WindowTestsBase { insetsPolicy.updateBarControlTarget(mAppWindow); assertNull(displayPolicy.mInputConsumer); } + + @Test + public void testImeMinimalSourceFrame() { + final DisplayPolicy displayPolicy = mDisplayContent.getDisplayPolicy(); + final DisplayInfo displayInfo = new DisplayInfo(); + displayInfo.logicalWidth = 1000; + displayInfo.logicalHeight = 2000; + displayInfo.rotation = ROTATION_0; + mDisplayContent.mDisplayFrames = new DisplayFrames(mDisplayContent.getDisplayId(), + displayInfo, null /* displayCutout */); + + displayPolicy.addWindowLw(mNavBarWindow, mNavBarWindow.mAttrs); + mNavBarWindow.getControllableInsetProvider().setServerVisible(true); + + mDisplayContent.setInputMethodWindowLocked(mImeWindow); + mImeWindow.mAttrs.setFitInsetsSides(Side.all() & ~Side.BOTTOM); + mImeWindow.getGivenContentInsetsLw().set(0, displayInfo.logicalHeight, 0, 0); + mImeWindow.getControllableInsetProvider().setServerVisible(true); + + displayPolicy.beginLayoutLw(mDisplayContent.mDisplayFrames, 0 /* UI mode */); + displayPolicy.layoutWindowLw(mImeWindow, null, mDisplayContent.mDisplayFrames); + + final InsetsState state = mDisplayContent.getInsetsStateController().getRawInsetsState(); + final InsetsSource imeSource = state.peekSource(ITYPE_IME); + final InsetsSource navBarSource = state.peekSource(ITYPE_NAVIGATION_BAR); + + assertNotNull(imeSource); + assertNotNull(navBarSource); + assertFalse(imeSource.getFrame().isEmpty()); + assertFalse(navBarSource.getFrame().isEmpty()); + assertTrue(imeSource.getFrame().contains(navBarSource.getFrame())); + } } diff --git a/telecomm/java/android/telecom/Call.java b/telecomm/java/android/telecom/Call.java index ead90bb4561f..3365ab740cde 100755 --- a/telecomm/java/android/telecom/Call.java +++ b/telecomm/java/android/telecom/Call.java @@ -22,6 +22,7 @@ import android.annotation.Nullable; import android.annotation.SystemApi; import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; +import android.content.pm.ServiceInfo; import android.net.Uri; import android.os.Build; import android.os.Bundle; @@ -1635,13 +1636,21 @@ public final class Call { /** * Instructs Telecom to put the call into the background audio processing state. - * + * <p> * This method can be called either when the call is in {@link #STATE_RINGING} or * {@link #STATE_ACTIVE}. After Telecom acknowledges the request by setting the call's state to * {@link #STATE_AUDIO_PROCESSING}, your app may setup the audio paths with the audio stack in * order to capture and play audio on the call stream. - * + * <p> * This method can only be called by the default dialer app. + * <p> + * Apps built with SDK version {@link android.os.Build.VERSION_CODES#R} or later which are using + * the microphone as part of audio processing should specify the foreground service type using + * the attribute {@link android.R.attr#foregroundServiceType} in the {@link InCallService} + * service element of the app's manifest file. + * The {@link ServiceInfo#FOREGROUND_SERVICE_TYPE_MICROPHONE} attribute should be specified. + * @see <a href="https://developer.android.com/preview/privacy/foreground-service-types"> + * the Android Developer Site</a> for more information. * @hide */ @SystemApi diff --git a/telecomm/java/android/telecom/CallScreeningService.java b/telecomm/java/android/telecom/CallScreeningService.java index f8722f4ea653..8abab90f775f 100644 --- a/telecomm/java/android/telecom/CallScreeningService.java +++ b/telecomm/java/android/telecom/CallScreeningService.java @@ -23,6 +23,7 @@ import android.annotation.TestApi; import android.app.Service; import android.content.ComponentName; import android.content.Intent; +import android.content.pm.ServiceInfo; import android.net.Uri; import android.os.Handler; import android.os.IBinder; @@ -281,9 +282,20 @@ public abstract class CallScreeningService extends Service { * Sets whether to request background audio processing so that the in-call service can * screen the call further. If set to {@code true}, {@link #setDisallowCall} should be * called with {@code false}, and all other parameters in this builder will be ignored. - * + * <p> * This request will only be honored if the {@link CallScreeningService} shares the same * uid as the default dialer app. Otherwise, the call will go through as usual. + * <p> + * Apps built with SDK version {@link android.os.Build.VERSION_CODES#R} or later which + * are using the microphone as part of audio processing should specify the + * foreground service type using the attribute + * {@link android.R.attr#foregroundServiceType} in the {@link CallScreeningService} + * service element of the app's manifest file. + * The {@link ServiceInfo#FOREGROUND_SERVICE_TYPE_MICROPHONE} attribute should be + * specified. + * @see + * <a href="https://developer.android.com/preview/privacy/foreground-service-types"> + * the Android Developer Site</a> for more information. * * @param shouldScreenCallViaAudioProcessing Whether to request further call screening. * @hide diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index a28f281b37de..50ff8f49babc 100755 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -1632,6 +1632,12 @@ public class CarrierConfigManager { "show_precise_failed_cause_bool"; /** + * Boolean to decide whether NR is enabled. + * @hide + */ + public static final String KEY_NR_ENABLED_BOOL = "nr_enabled_bool"; + + /** * Boolean to decide whether LTE is enabled. */ public static final String KEY_LTE_ENABLED_BOOL = "lte_enabled_bool"; @@ -4139,6 +4145,7 @@ public class CarrierConfigManager { sDefaults.putString(KEY_OPERATOR_NAME_FILTER_PATTERN_STRING, ""); sDefaults.putString(KEY_SHOW_CARRIER_DATA_ICON_PATTERN_STRING, ""); sDefaults.putBoolean(KEY_HIDE_LTE_PLUS_DATA_ICON_BOOL, true); + sDefaults.putBoolean(KEY_NR_ENABLED_BOOL, true); sDefaults.putBoolean(KEY_LTE_ENABLED_BOOL, true); sDefaults.putBoolean(KEY_SUPPORT_TDSCDMA_BOOL, false); sDefaults.putStringArray(KEY_SUPPORT_TDSCDMA_ROAMING_NETWORKS_STRING_ARRAY, null); diff --git a/tests/NullHomeTest/Android.bp b/tests/NullHomeTest/Android.bp new file mode 100644 index 000000000000..99248bfe1da1 --- /dev/null +++ b/tests/NullHomeTest/Android.bp @@ -0,0 +1,22 @@ +// Copyright 2020 Google Inc. All Rights Reserved. +// +// 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. + +android_test { + name: "NullHomeTest", + srcs: ["src/**/*.java"], + certificate: "platform", + platform_apis: true, + static_libs: ["android-support-test"], + test_suites: ["device-tests"], +} diff --git a/tests/NullHomeTest/AndroidManifest.xml b/tests/NullHomeTest/AndroidManifest.xml new file mode 100644 index 000000000000..dc6402e03b5a --- /dev/null +++ b/tests/NullHomeTest/AndroidManifest.xml @@ -0,0 +1,31 @@ +<?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. +--> + +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.android.test.nullhome" + android:sharedUserId="android.uid.system" > + + <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="21" /> + + <instrumentation + android:name="android.support.test.runner.AndroidJUnitRunner" + android:targetPackage="com.android.test.nullhome" + android:label="Check if no null Home exists/is enabled" /> + + <application android:label="Null Home Test"> + <uses-library android:name="android.test.runner" /> + </application> +</manifest> diff --git a/tests/NullHomeTest/src/com/android/test/nullhome/NullHomeTest.java b/tests/NullHomeTest/src/com/android/test/nullhome/NullHomeTest.java new file mode 100644 index 000000000000..1d77cdc51187 --- /dev/null +++ b/tests/NullHomeTest/src/com/android/test/nullhome/NullHomeTest.java @@ -0,0 +1,72 @@ +/* + * 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.test.nullhome; + +import android.content.Context; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.support.test.InstrumentationRegistry; +import android.util.Log; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +import java.util.ArrayList; +import java.util.List; + +/* + * Check if NullHome/SystemUserHome activity does not exist/is disabled. + * + * SystemUserHome is only enabled in bootable CSI (csi_x86, csi_arm64) + * products and should not be enabled in other products. + * + * Shell's NullHome is empty and caused issues in sevaral manual GUI tests + * that try to select/use it, and should be removed. + * + * Settings' FallbackHome is fine because it's specially handled by Settings. + * + */ + +@RunWith(JUnit4.class) +public class NullHomeTest { + private static final String TAG = "NullHomeTest"; + private Context mContext; + private PackageManager mPm; + + @Before + public void before() { + Log.d(TAG, "beforeClass()"); + mContext = InstrumentationRegistry.getInstrumentation().getContext(); + mPm = mContext.getPackageManager(); + } + + @Test + public void checkNullHome() { + final List<ResolveInfo> homeActivities = new ArrayList<>(); + + mPm.getHomeActivities(homeActivities); + for (ResolveInfo activity : homeActivities) { + Log.d(TAG, "Home activity: " + activity.activityInfo.packageName); + Assert.assertNotEquals(activity.activityInfo.packageName, + "com.android.internal.app.SystemUserHomeActivity"); + Assert.assertNotEquals(activity.activityInfo.packageName, + "com.android.shell"); + } + } +} diff --git a/tests/testables/src/android/testing/TestableLooper.java b/tests/testables/src/android/testing/TestableLooper.java index fe0224a27c80..ebe9b5706bf8 100644 --- a/tests/testables/src/android/testing/TestableLooper.java +++ b/tests/testables/src/android/testing/TestableLooper.java @@ -222,6 +222,10 @@ public class TestableLooper { return sLoopers.get(test); } + public static void remove(Object test) { + sLoopers.remove(test); + } + static class LooperFrameworkMethod extends FrameworkMethod { private HandlerThread mHandlerThread; diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java index 7d20d0d09dc2..5f46cb3fa642 100644 --- a/wifi/java/android/net/wifi/WifiManager.java +++ b/wifi/java/android/net/wifi/WifiManager.java @@ -817,6 +817,9 @@ public class WifiManager { /** * Broadcast intent action indicating that the wifi network settings * had been reset. + * + * Note: This intent is sent as a directed broadcast to each manifest registered receiver. + * Intent will not be received by dynamically registered receivers. * @hide */ @SystemApi |