diff options
378 files changed, 7559 insertions, 3878 deletions
diff --git a/Android.bp b/Android.bp index a64cc819a480..faad6f32dec4 100644 --- a/Android.bp +++ b/Android.bp @@ -77,6 +77,7 @@ java_defaults { "core/java/android/app/ISearchManager.aidl", "core/java/android/app/ISearchManagerCallback.aidl", "core/java/android/app/IServiceConnection.aidl", + "core/java/android/app/ISmsAppService.aidl", "core/java/android/app/IStopUserCallback.aidl", "core/java/android/app/job/IJobCallback.aidl", "core/java/android/app/job/IJobScheduler.aidl", diff --git a/api/current.txt b/api/current.txt index 006aaac22b84..87aaaa671da3 100755 --- a/api/current.txt +++ b/api/current.txt @@ -37,6 +37,7 @@ package android { field public static final java.lang.String BIND_QUICK_SETTINGS_TILE = "android.permission.BIND_QUICK_SETTINGS_TILE"; field public static final java.lang.String BIND_REMOTEVIEWS = "android.permission.BIND_REMOTEVIEWS"; field public static final java.lang.String BIND_SCREENING_SERVICE = "android.permission.BIND_SCREENING_SERVICE"; + field public static final java.lang.String BIND_SMS_APP_SERVICE = "android.permission.BIND_SMS_APP_SERVICE"; field public static final java.lang.String BIND_TELECOM_CONNECTION_SERVICE = "android.permission.BIND_TELECOM_CONNECTION_SERVICE"; field public static final java.lang.String BIND_TEXT_SERVICE = "android.permission.BIND_TEXT_SERVICE"; field public static final java.lang.String BIND_TV_INPUT = "android.permission.BIND_TV_INPUT"; @@ -772,6 +773,7 @@ package android { field public static final int isFeatureSplit = 16844123; // 0x101055b field public static final int isGame = 16843764; // 0x10103f4 field public static final int isIndicator = 16843079; // 0x1010147 + field public static final int isLightTheme = 16844175; // 0x101058f field public static final int isModifier = 16843334; // 0x1010246 field public static final int isRepeatable = 16843336; // 0x1010248 field public static final int isScrollContainer = 16843342; // 0x101024e @@ -4296,6 +4298,20 @@ package android.app { method public abstract void onActivityCreated(android.app.Activity, android.os.Bundle); method public abstract void onActivityDestroyed(android.app.Activity); method public abstract void onActivityPaused(android.app.Activity); + method public default void onActivityPostCreated(android.app.Activity, android.os.Bundle); + method public default void onActivityPostDestroyed(android.app.Activity); + method public default void onActivityPostPaused(android.app.Activity); + method public default void onActivityPostResumed(android.app.Activity); + method public default void onActivityPostSaveInstanceState(android.app.Activity, android.os.Bundle); + method public default void onActivityPostStarted(android.app.Activity); + method public default void onActivityPostStopped(android.app.Activity); + method public default void onActivityPreCreated(android.app.Activity, android.os.Bundle); + method public default void onActivityPreDestroyed(android.app.Activity); + method public default void onActivityPrePaused(android.app.Activity); + method public default void onActivityPreResumed(android.app.Activity); + method public default void onActivityPreSaveInstanceState(android.app.Activity, android.os.Bundle); + method public default void onActivityPreStarted(android.app.Activity); + method public default void onActivityPreStopped(android.app.Activity); method public abstract void onActivityResumed(android.app.Activity); method public abstract void onActivitySaveInstanceState(android.app.Activity, android.os.Bundle); method public abstract void onActivityStarted(android.app.Activity); @@ -6095,6 +6111,11 @@ package android.app { method public abstract void onSharedElementsReady(); } + public class SmsAppService extends android.app.Service { + ctor public SmsAppService(); + method public final android.os.IBinder onBind(android.content.Intent); + } + public deprecated class TabActivity extends android.app.ActivityGroup { ctor public TabActivity(); method public android.widget.TabHost getTabHost(); @@ -15314,7 +15335,7 @@ package android.graphics.fonts { method public static java.lang.String toFontVariationSettings(android.graphics.fonts.FontVariationAxis[]); } - public class SystemFonts { + public final class SystemFonts { method public static java.util.Set<android.graphics.fonts.Font> getAvailableFonts(); } @@ -42920,6 +42941,7 @@ package android.telephony { method public static int getSlotIndex(int); method public static int[] getSubscriptionIds(int); method public java.util.List<android.telephony.SubscriptionPlan> getSubscriptionPlans(int); + method public boolean isActiveSubscriptionId(int); method public boolean isNetworkRoaming(int); method public static boolean isValidSubscriptionId(int); method public void removeOnOpportunisticSubscriptionsChangedListener(android.telephony.SubscriptionManager.OnOpportunisticSubscriptionsChangedListener); @@ -43072,6 +43094,7 @@ package android.telephony { field public static final java.lang.String ACTION_RESPOND_VIA_MESSAGE = "android.intent.action.RESPOND_VIA_MESSAGE"; field public static final java.lang.String ACTION_SECRET_CODE = "android.telephony.action.SECRET_CODE"; field public static final java.lang.String ACTION_SHOW_VOICEMAIL_NOTIFICATION = "android.telephony.action.SHOW_VOICEMAIL_NOTIFICATION"; + field public static final java.lang.String ACTION_SMS_APP_SERVICE = "android.telephony.action.SMS_APP_SERVICE"; field public static final java.lang.String ACTION_SUBSCRIPTION_CARRIER_IDENTITY_CHANGED = "android.telephony.action.SUBSCRIPTION_CARRIER_IDENTITY_CHANGED"; field public static final int APPTYPE_CSIM = 4; // 0x4 field public static final int APPTYPE_ISIM = 5; // 0x5 @@ -45017,11 +45040,20 @@ package android.text.style { ctor public TextAppearanceSpan(android.os.Parcel); method public int describeContents(); method public java.lang.String getFamily(); + method public java.lang.String getFontFeatureSettings(); + method public java.lang.String getFontVariationSettings(); method public android.content.res.ColorStateList getLinkTextColor(); + method public int getShadowColor(); + method public float getShadowDx(); + method public float getShadowDy(); + method public float getShadowRadius(); method public int getSpanTypeId(); method public android.content.res.ColorStateList getTextColor(); + method public int getTextFontWeight(); method public int getTextSize(); method public int getTextStyle(); + method public android.graphics.Typeface getTypeface(); + method public boolean isElegantTextHeight(); method public void updateDrawState(android.text.TextPaint); method public void updateMeasureState(android.text.TextPaint); method public void writeToParcel(android.os.Parcel, int); @@ -55222,6 +55254,7 @@ package dalvik.system { public final class DelegateLastClassLoader extends dalvik.system.PathClassLoader { ctor public DelegateLastClassLoader(java.lang.String, java.lang.ClassLoader); ctor public DelegateLastClassLoader(java.lang.String, java.lang.String, java.lang.ClassLoader); + ctor public DelegateLastClassLoader(java.lang.String, java.lang.String, java.lang.ClassLoader, boolean); } public class DexClassLoader extends dalvik.system.BaseDexClassLoader { diff --git a/api/system-current.txt b/api/system-current.txt index 1f74cbf6312c..5785e4aa3969 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -5439,6 +5439,7 @@ package android.telephony { method public boolean disableDataConnectivity(); method public boolean enableDataConnectivity(); method public void enableVideoCalling(boolean); + method public java.lang.String getAidForAppType(int); method public java.util.List<android.service.carrier.CarrierIdentifier> getAllowedCarriers(int); method public java.util.List<java.lang.String> getCarrierPackageNamesForIntent(android.content.Intent); method public java.util.List<java.lang.String> getCarrierPackageNamesForIntentAndPhone(android.content.Intent, int); @@ -5454,6 +5455,7 @@ package android.telephony { method public deprecated boolean getDataEnabled(int); method public boolean getEmergencyCallbackMode(); method public java.lang.String getIsimDomain(); + method public int getPreferredNetworkType(int); method public int getSimApplicationState(); method public int getSimCardState(); method public java.util.List<android.telephony.TelephonyHistogram> getTelephonyHistograms(); @@ -5463,10 +5465,7 @@ package android.telephony { method public boolean handlePinMmi(java.lang.String); method public boolean handlePinMmiForSubscriber(int, java.lang.String); method public boolean isDataConnectivityPossible(); - method public deprecated boolean isIdle(); - method public deprecated boolean isOffhook(); method public deprecated boolean isRadioOn(); - method public deprecated boolean isRinging(); method public boolean isVideoCallingEnabled(); method public deprecated boolean isVisualVoicemailEnabled(android.telecom.PhoneAccountHandle); method public boolean needsOtaServiceProvisioning(); @@ -5480,7 +5479,6 @@ package android.telephony { method public void setSimPowerStateForSlot(int, int); method public deprecated void setVisualVoicemailEnabled(android.telecom.PhoneAccountHandle, boolean); method public void setVoiceActivationState(int); - method public deprecated void silenceRinger(); method public boolean supplyPin(java.lang.String); method public int[] supplyPinReportResult(java.lang.String); method public boolean supplyPuk(java.lang.String, java.lang.String); @@ -5498,6 +5496,29 @@ package android.telephony { field public static final java.lang.String EXTRA_SIM_STATE = "android.telephony.extra.SIM_STATE"; field public static final java.lang.String EXTRA_VISUAL_VOICEMAIL_ENABLED_BY_USER_BOOL = "android.telephony.extra.VISUAL_VOICEMAIL_ENABLED_BY_USER_BOOL"; field public static final java.lang.String EXTRA_VOICEMAIL_SCRAMBLED_PIN_STRING = "android.telephony.extra.VOICEMAIL_SCRAMBLED_PIN_STRING"; + field public static final int NETWORK_MODE_CDMA_EVDO = 4; // 0x4 + field public static final int NETWORK_MODE_CDMA_NO_EVDO = 5; // 0x5 + field public static final int NETWORK_MODE_EVDO_NO_CDMA = 6; // 0x6 + field public static final int NETWORK_MODE_GLOBAL = 7; // 0x7 + field public static final int NETWORK_MODE_GSM_ONLY = 1; // 0x1 + field public static final int NETWORK_MODE_GSM_UMTS = 3; // 0x3 + field public static final int NETWORK_MODE_LTE_CDMA_EVDO = 8; // 0x8 + field public static final int NETWORK_MODE_LTE_CDMA_EVDO_GSM_WCDMA = 10; // 0xa + field public static final int NETWORK_MODE_LTE_GSM_WCDMA = 9; // 0x9 + field public static final int NETWORK_MODE_LTE_ONLY = 11; // 0xb + field public static final int NETWORK_MODE_LTE_TDSCDMA = 15; // 0xf + field public static final int NETWORK_MODE_LTE_TDSCDMA_CDMA_EVDO_GSM_WCDMA = 22; // 0x16 + field public static final int NETWORK_MODE_LTE_TDSCDMA_GSM = 17; // 0x11 + field public static final int NETWORK_MODE_LTE_TDSCDMA_GSM_WCDMA = 20; // 0x14 + field public static final int NETWORK_MODE_LTE_TDSCDMA_WCDMA = 19; // 0x13 + field public static final int NETWORK_MODE_LTE_WCDMA = 12; // 0xc + field public static final int NETWORK_MODE_TDSCDMA_CDMA_EVDO_GSM_WCDMA = 21; // 0x15 + field public static final int NETWORK_MODE_TDSCDMA_GSM = 16; // 0x10 + field public static final int NETWORK_MODE_TDSCDMA_GSM_WCDMA = 18; // 0x12 + field public static final int NETWORK_MODE_TDSCDMA_ONLY = 13; // 0xd + field public static final int NETWORK_MODE_TDSCDMA_WCDMA = 14; // 0xe + field public static final int NETWORK_MODE_WCDMA_ONLY = 2; // 0x2 + field public static final int NETWORK_MODE_WCDMA_PREF = 0; // 0x0 field public static final int SIM_ACTIVATION_STATE_ACTIVATED = 2; // 0x2 field public static final int SIM_ACTIVATION_STATE_ACTIVATING = 1; // 0x1 field public static final int SIM_ACTIVATION_STATE_DEACTIVATED = 3; // 0x3 diff --git a/api/system-removed.txt b/api/system-removed.txt index 9012c3315cfe..22465621e693 100644 --- a/api/system-removed.txt +++ b/api/system-removed.txt @@ -148,6 +148,10 @@ package android.telephony { public class TelephonyManager { method public deprecated void answerRingingCall(); method public deprecated boolean endCall(); + method public deprecated boolean isIdle(); + method public deprecated boolean isOffhook(); + method public deprecated boolean isRinging(); + method public deprecated void silenceRinger(); } } diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto index 448608e9ece7..10a00ee5cda3 100644 --- a/cmds/statsd/src/atoms.proto +++ b/cmds/statsd/src/atoms.proto @@ -80,7 +80,8 @@ message Atom { BatteryLevelChanged battery_level_changed = 30; ChargingStateChanged charging_state_changed = 31; PluggedStateChanged plugged_state_changed = 32; - // 33 - 34 are available + InteractiveStateChanged interactive_state_changed = 33; + // 34 is available WakeupAlarmOccurred wakeup_alarm_occurred = 35; KernelWakeupReported kernel_wakeup_reported = 36; WifiLockStateChanged wifi_lock_state_changed = 37; @@ -199,9 +200,10 @@ message AttributionNode { message KeyValuePair { optional int32 key = 1; oneof value { - int64 value_int = 2; - string value_str = 3; - float value_float = 4; + int32 value_int = 2; + int64 value_long = 3; + string value_str = 4; + float value_float = 5; } } @@ -665,6 +667,20 @@ message LongPartialWakelockStateChanged { } /** + * Logs when the device is interactive, according to the PowerManager Notifier. + * + * Logged from: + * frameworks/base/services/core/java/com/android/server/power/Notifier.java + */ +message InteractiveStateChanged { + enum State { + OFF = 0; + ON = 1; + } + optional State state = 1; +} + +/** * Logs Battery Saver state change. * * Logged from: @@ -754,6 +770,9 @@ message WakeupAlarmOccurred { // Name of the wakeup alarm. optional string tag = 2; + + // Name of source package (for historical reasons, since BatteryStats tracked it). + optional string package_name = 3; } /** diff --git a/cmds/statsd/src/logd/LogEvent.cpp b/cmds/statsd/src/logd/LogEvent.cpp index f9f1b387279a..3afa08fdcd0c 100644 --- a/cmds/statsd/src/logd/LogEvent.cpp +++ b/cmds/statsd/src/logd/LogEvent.cpp @@ -92,7 +92,8 @@ LogEvent::LogEvent(int32_t tagId, int64_t wallClockTimestampNs, int64_t elapsedT LogEvent::LogEvent(int32_t tagId, int64_t wallClockTimestampNs, int64_t elapsedTimestampNs, int32_t uid, - const std::map<int32_t, int64_t>& int_map, + const std::map<int32_t, int32_t>& int_map, + const std::map<int32_t, int64_t>& long_map, const std::map<int32_t, std::string>& string_map, const std::map<int32_t, float>& float_map) { mLogdTimestampNs = wallClockTimestampNs; @@ -113,7 +114,7 @@ LogEvent::LogEvent(int32_t tagId, int64_t wallClockTimestampNs, int64_t elapsedT pos[1]++; } - for (const auto&itr : string_map) { + for (const auto&itr : long_map) { pos[2] = 1; mValues.push_back(FieldValue(Field(mTagId, pos, 2 /* depth */), Value(itr.first))); pos[2] = 3; @@ -122,7 +123,7 @@ LogEvent::LogEvent(int32_t tagId, int64_t wallClockTimestampNs, int64_t elapsedT pos[1]++; } - for (const auto&itr : float_map) { + for (const auto&itr : string_map) { pos[2] = 1; mValues.push_back(FieldValue(Field(mTagId, pos, 2 /* depth */), Value(itr.first))); pos[2] = 4; @@ -130,6 +131,15 @@ LogEvent::LogEvent(int32_t tagId, int64_t wallClockTimestampNs, int64_t elapsedT mValues.back().mField.decorateLastPos(2); pos[1]++; } + + for (const auto&itr : float_map) { + pos[2] = 1; + mValues.push_back(FieldValue(Field(mTagId, pos, 2 /* depth */), Value(itr.first))); + pos[2] = 5; + mValues.push_back(FieldValue(Field(mTagId, pos, 2 /* depth */), Value(itr.second))); + mValues.back().mField.decorateLastPos(2); + pos[1]++; + } if (!mValues.empty()) { mValues.back().mField.decorateLastPos(1); mValues.at(mValues.size() - 2).mField.decorateLastPos(1); @@ -215,7 +225,8 @@ bool LogEvent::write(float value) { -bool LogEvent::writeKeyValuePairs(const std::map<int32_t, int64_t>& int_map, +bool LogEvent::writeKeyValuePairs(const std::map<int32_t, int32_t>& int_map, + const std::map<int32_t, int64_t>& long_map, const std::map<int32_t, std::string>& string_map, const std::map<int32_t, float>& float_map) { if (mContext) { @@ -233,6 +244,17 @@ bool LogEvent::writeKeyValuePairs(const std::map<int32_t, int64_t>& int_map, } } + for (const auto& itr : long_map) { + if (android_log_write_list_begin(mContext) < 0) { + return false; + } + write(itr.first); + write(itr.second); + if (android_log_write_list_end(mContext) < 0) { + return false; + } + } + for (const auto& itr : string_map) { if (android_log_write_list_begin(mContext) < 0) { return false; diff --git a/cmds/statsd/src/logd/LogEvent.h b/cmds/statsd/src/logd/LogEvent.h index 9ef0bf469c14..0a8ac2b7da9e 100644 --- a/cmds/statsd/src/logd/LogEvent.h +++ b/cmds/statsd/src/logd/LogEvent.h @@ -77,7 +77,8 @@ public: */ explicit LogEvent(int32_t tagId, int64_t wallClockTimestampNs, int64_t elapsedTimestampNs, int32_t uid, - const std::map<int32_t, int64_t>& int_map, + const std::map<int32_t, int32_t>& int_map, + const std::map<int32_t, int64_t>& long_map, const std::map<int32_t, std::string>& string_map, const std::map<int32_t, float>& float_map); @@ -122,7 +123,8 @@ public: bool write(float value); bool write(const std::vector<AttributionNodeInternal>& nodes); bool write(const AttributionNodeInternal& node); - bool writeKeyValuePairs(const std::map<int32_t, int64_t>& int_map, + bool writeKeyValuePairs(const std::map<int32_t, int32_t>& int_map, + const std::map<int32_t, int64_t>& long_map, const std::map<int32_t, std::string>& string_map, const std::map<int32_t, float>& float_map); diff --git a/cmds/statsd/tests/LogEvent_test.cpp b/cmds/statsd/tests/LogEvent_test.cpp index 6e3b04ce6b3b..d4907017dc6d 100644 --- a/cmds/statsd/tests/LogEvent_test.cpp +++ b/cmds/statsd/tests/LogEvent_test.cpp @@ -91,12 +91,16 @@ TEST(LogEventTest, TestLogParsing) { TEST(LogEventTest, TestKeyValuePairsAtomParsing) { LogEvent event1(83, 2000); - std::map<int32_t, int64_t> int_map; + std::map<int32_t, int32_t> int_map; + std::map<int32_t, int64_t> long_map; std::map<int32_t, std::string> string_map; std::map<int32_t, float> float_map; - int_map[11] = 123L; - int_map[22] = 345L; + int_map[11] = 123; + int_map[22] = 345; + + long_map[33] = 678L; + long_map[44] = 890L; string_map[1] = "test2"; string_map[2] = "test1"; @@ -104,12 +108,15 @@ TEST(LogEventTest, TestKeyValuePairsAtomParsing) { float_map[111] = 2.2f; float_map[222] = 1.1f; - EXPECT_TRUE(event1.writeKeyValuePairs(int_map, string_map, float_map)); + EXPECT_TRUE(event1.writeKeyValuePairs(int_map, + long_map, + string_map, + float_map)); event1.init(); EXPECT_EQ(83, event1.GetTagId()); const auto& items = event1.getValues(); - EXPECT_EQ((size_t)12, items.size()); + EXPECT_EQ((size_t)16, items.size()); const FieldValue& item0 = event1.getValues()[0]; EXPECT_EQ(0x2010101, item0.mField.getField()); @@ -118,8 +125,8 @@ TEST(LogEventTest, TestKeyValuePairsAtomParsing) { const FieldValue& item1 = event1.getValues()[1]; EXPECT_EQ(0x2010182, item1.mField.getField()); - EXPECT_EQ(Type::LONG, item1.mValue.getType()); - EXPECT_EQ(123L, item1.mValue.long_value); + EXPECT_EQ(Type::INT, item1.mValue.getType()); + EXPECT_EQ(123, item1.mValue.int_value); const FieldValue& item2 = event1.getValues()[2]; EXPECT_EQ(0x2010201, item2.mField.getField()); @@ -128,48 +135,68 @@ TEST(LogEventTest, TestKeyValuePairsAtomParsing) { const FieldValue& item3 = event1.getValues()[3]; EXPECT_EQ(0x2010282, item3.mField.getField()); - EXPECT_EQ(Type::LONG, item3.mValue.getType()); - EXPECT_EQ(345L, item3.mValue.long_value); + EXPECT_EQ(Type::INT, item3.mValue.getType()); + EXPECT_EQ(345, item3.mValue.int_value); const FieldValue& item4 = event1.getValues()[4]; EXPECT_EQ(0x2010301, item4.mField.getField()); EXPECT_EQ(Type::INT, item4.mValue.getType()); - EXPECT_EQ(1, item4.mValue.int_value); + EXPECT_EQ(33, item4.mValue.int_value); const FieldValue& item5 = event1.getValues()[5]; - EXPECT_EQ(0x2010383, item5.mField.getField()); - EXPECT_EQ(Type::STRING, item5.mValue.getType()); - EXPECT_EQ("test2", item5.mValue.str_value); + EXPECT_EQ(0x2010382, item5.mField.getField()); + EXPECT_EQ(Type::LONG, item5.mValue.getType()); + EXPECT_EQ(678L, item5.mValue.int_value); const FieldValue& item6 = event1.getValues()[6]; EXPECT_EQ(0x2010401, item6.mField.getField()); EXPECT_EQ(Type::INT, item6.mValue.getType()); - EXPECT_EQ(2, item6.mValue.int_value); + EXPECT_EQ(44, item6.mValue.int_value); const FieldValue& item7 = event1.getValues()[7]; - EXPECT_EQ(0x2010483, item7.mField.getField()); - EXPECT_EQ(Type::STRING, item7.mValue.getType()); - EXPECT_EQ("test1", item7.mValue.str_value); + EXPECT_EQ(0x2010482, item7.mField.getField()); + EXPECT_EQ(Type::LONG, item7.mValue.getType()); + EXPECT_EQ(890L, item7.mValue.int_value); const FieldValue& item8 = event1.getValues()[8]; EXPECT_EQ(0x2010501, item8.mField.getField()); EXPECT_EQ(Type::INT, item8.mValue.getType()); - EXPECT_EQ(111, item8.mValue.int_value); + EXPECT_EQ(1, item8.mValue.int_value); const FieldValue& item9 = event1.getValues()[9]; - EXPECT_EQ(0x2010584, item9.mField.getField()); - EXPECT_EQ(Type::FLOAT, item9.mValue.getType()); - EXPECT_EQ(2.2f, item9.mValue.float_value); + EXPECT_EQ(0x2010583, item9.mField.getField()); + EXPECT_EQ(Type::STRING, item9.mValue.getType()); + EXPECT_EQ("test2", item9.mValue.str_value); const FieldValue& item10 = event1.getValues()[10]; - EXPECT_EQ(0x2018601, item10.mField.getField()); + EXPECT_EQ(0x2010601, item10.mField.getField()); EXPECT_EQ(Type::INT, item10.mValue.getType()); - EXPECT_EQ(222, item10.mValue.int_value); + EXPECT_EQ(2, item10.mValue.int_value); const FieldValue& item11 = event1.getValues()[11]; - EXPECT_EQ(0x2018684, item11.mField.getField()); - EXPECT_EQ(Type::FLOAT, item11.mValue.getType()); - EXPECT_EQ(1.1f, item11.mValue.float_value); + EXPECT_EQ(0x2010683, item11.mField.getField()); + EXPECT_EQ(Type::STRING, item11.mValue.getType()); + EXPECT_EQ("test1", item11.mValue.str_value); + + const FieldValue& item12 = event1.getValues()[12]; + EXPECT_EQ(0x2010701, item12.mField.getField()); + EXPECT_EQ(Type::INT, item12.mValue.getType()); + EXPECT_EQ(111, item12.mValue.int_value); + + const FieldValue& item13 = event1.getValues()[13]; + EXPECT_EQ(0x2010784, item13.mField.getField()); + EXPECT_EQ(Type::FLOAT, item13.mValue.getType()); + EXPECT_EQ(2.2f, item13.mValue.float_value); + + const FieldValue& item14 = event1.getValues()[14]; + EXPECT_EQ(0x2018801, item14.mField.getField()); + EXPECT_EQ(Type::INT, item14.mValue.getType()); + EXPECT_EQ(222, item14.mValue.int_value); + + const FieldValue& item15 = event1.getValues()[15]; + EXPECT_EQ(0x2018884, item15.mField.getField()); + EXPECT_EQ(Type::FLOAT, item15.mValue.getType()); + EXPECT_EQ(1.1f, item15.mValue.float_value); } TEST(LogEventTest, TestLogParsing2) { @@ -242,12 +269,16 @@ TEST(LogEventTest, TestLogParsing2) { } TEST(LogEventTest, TestKeyValuePairsEvent) { - std::map<int32_t, int64_t> int_map; + std::map<int32_t, int32_t> int_map; + std::map<int32_t, int64_t> long_map; std::map<int32_t, std::string> string_map; std::map<int32_t, float> float_map; - int_map[11] = 123L; - int_map[22] = 345L; + int_map[11] = 123; + int_map[22] = 345; + + long_map[33] = 678L; + long_map[44] = 890L; string_map[1] = "test2"; string_map[2] = "test1"; @@ -255,7 +286,7 @@ TEST(LogEventTest, TestKeyValuePairsEvent) { float_map[111] = 2.2f; float_map[222] = 1.1f; - LogEvent event1(83, 2000, 2001, 10001, int_map, string_map, float_map); + LogEvent event1(83, 2000, 2001, 10001, int_map, long_map, string_map, float_map); event1.init(); EXPECT_EQ(83, event1.GetTagId()); @@ -263,7 +294,7 @@ TEST(LogEventTest, TestKeyValuePairsEvent) { EXPECT_EQ((int64_t)2001, event1.GetElapsedTimestampNs()); const auto& items = event1.getValues(); - EXPECT_EQ((size_t)13, items.size()); + EXPECT_EQ((size_t)17, items.size()); const FieldValue& item0 = event1.getValues()[0]; EXPECT_EQ(0x00010000, item0.mField.getField()); @@ -277,8 +308,8 @@ TEST(LogEventTest, TestKeyValuePairsEvent) { const FieldValue& item2 = event1.getValues()[2]; EXPECT_EQ(0x2020182, item2.mField.getField()); - EXPECT_EQ(Type::LONG, item2.mValue.getType()); - EXPECT_EQ(123L, item2.mValue.long_value); + EXPECT_EQ(Type::INT, item2.mValue.getType()); + EXPECT_EQ(123, item2.mValue.int_value); const FieldValue& item3 = event1.getValues()[3]; EXPECT_EQ(0x2020201, item3.mField.getField()); @@ -287,48 +318,68 @@ TEST(LogEventTest, TestKeyValuePairsEvent) { const FieldValue& item4 = event1.getValues()[4]; EXPECT_EQ(0x2020282, item4.mField.getField()); - EXPECT_EQ(Type::LONG, item4.mValue.getType()); - EXPECT_EQ(345L, item4.mValue.long_value); + EXPECT_EQ(Type::INT, item4.mValue.getType()); + EXPECT_EQ(345, item4.mValue.int_value); const FieldValue& item5 = event1.getValues()[5]; EXPECT_EQ(0x2020301, item5.mField.getField()); EXPECT_EQ(Type::INT, item5.mValue.getType()); - EXPECT_EQ(1, item5.mValue.int_value); + EXPECT_EQ(33, item5.mValue.int_value); const FieldValue& item6 = event1.getValues()[6]; - EXPECT_EQ(0x2020383, item6.mField.getField()); - EXPECT_EQ(Type::STRING, item6.mValue.getType()); - EXPECT_EQ("test2", item6.mValue.str_value); + EXPECT_EQ(0x2020382, item6.mField.getField()); + EXPECT_EQ(Type::LONG, item6.mValue.getType()); + EXPECT_EQ(678L, item6.mValue.long_value); const FieldValue& item7 = event1.getValues()[7]; EXPECT_EQ(0x2020401, item7.mField.getField()); EXPECT_EQ(Type::INT, item7.mValue.getType()); - EXPECT_EQ(2, item7.mValue.int_value); + EXPECT_EQ(44, item7.mValue.int_value); const FieldValue& item8 = event1.getValues()[8]; - EXPECT_EQ(0x2020483, item8.mField.getField()); - EXPECT_EQ(Type::STRING, item8.mValue.getType()); - EXPECT_EQ("test1", item8.mValue.str_value); + EXPECT_EQ(0x2020482, item8.mField.getField()); + EXPECT_EQ(Type::LONG, item8.mValue.getType()); + EXPECT_EQ(890L, item8.mValue.long_value); const FieldValue& item9 = event1.getValues()[9]; EXPECT_EQ(0x2020501, item9.mField.getField()); EXPECT_EQ(Type::INT, item9.mValue.getType()); - EXPECT_EQ(111, item9.mValue.int_value); + EXPECT_EQ(1, item9.mValue.int_value); const FieldValue& item10 = event1.getValues()[10]; - EXPECT_EQ(0x2020584, item10.mField.getField()); - EXPECT_EQ(Type::FLOAT, item10.mValue.getType()); - EXPECT_EQ(2.2f, item10.mValue.float_value); + EXPECT_EQ(0x2020583, item10.mField.getField()); + EXPECT_EQ(Type::STRING, item10.mValue.getType()); + EXPECT_EQ("test2", item10.mValue.str_value); const FieldValue& item11 = event1.getValues()[11]; - EXPECT_EQ(0x2028601, item11.mField.getField()); + EXPECT_EQ(0x2020601, item11.mField.getField()); EXPECT_EQ(Type::INT, item11.mValue.getType()); - EXPECT_EQ(222, item11.mValue.int_value); + EXPECT_EQ(2, item11.mValue.int_value); const FieldValue& item12 = event1.getValues()[12]; - EXPECT_EQ(0x2028684, item12.mField.getField()); - EXPECT_EQ(Type::FLOAT, item12.mValue.getType()); - EXPECT_EQ(1.1f, item12.mValue.float_value); + EXPECT_EQ(0x2020683, item12.mField.getField()); + EXPECT_EQ(Type::STRING, item12.mValue.getType()); + EXPECT_EQ("test1", item12.mValue.str_value); + + const FieldValue& item13 = event1.getValues()[13]; + EXPECT_EQ(0x2020701, item13.mField.getField()); + EXPECT_EQ(Type::INT, item13.mValue.getType()); + EXPECT_EQ(111, item13.mValue.int_value); + + const FieldValue& item14 = event1.getValues()[14]; + EXPECT_EQ(0x2020784, item14.mField.getField()); + EXPECT_EQ(Type::FLOAT, item14.mValue.getType()); + EXPECT_EQ(2.2f, item14.mValue.float_value); + + const FieldValue& item15 = event1.getValues()[15]; + EXPECT_EQ(0x2028801, item15.mField.getField()); + EXPECT_EQ(Type::INT, item15.mValue.getType()); + EXPECT_EQ(222, item15.mValue.int_value); + + const FieldValue& item16 = event1.getValues()[16]; + EXPECT_EQ(0x2028884, item16.mField.getField()); + EXPECT_EQ(Type::FLOAT, item16.mValue.getType()); + EXPECT_EQ(1.1f, item16.mValue.float_value); } @@ -337,4 +388,4 @@ TEST(LogEventTest, TestKeyValuePairsEvent) { } // namespace android #else GTEST_LOG_(INFO) << "This test does nothing.\n"; -#endif
\ No newline at end of file +#endif diff --git a/config/hiddenapi-light-greylist.txt b/config/hiddenapi-light-greylist.txt index 04724616420b..ac16fd311c32 100644 --- a/config/hiddenapi-light-greylist.txt +++ b/config/hiddenapi-light-greylist.txt @@ -2076,27 +2076,20 @@ Lcom/android/internal/telephony/ISub;->getDefaultDataSubId()I Lcom/android/internal/telephony/ISub;->getDefaultSubId()I Lcom/android/internal/telephony/ISub;->setDefaultDataSubId(I)V Lcom/android/internal/telephony/ITelephony$Stub$Proxy;-><init>(Landroid/os/IBinder;)V -Lcom/android/internal/telephony/ITelephony$Stub$Proxy;->endCall()Z -Lcom/android/internal/telephony/ITelephony$Stub$Proxy;->endCallForSubscriber(I)Z Lcom/android/internal/telephony/ITelephony$Stub$Proxy;->getDeviceId(Ljava/lang/String;)Ljava/lang/String; Lcom/android/internal/telephony/ITelephony$Stub$Proxy;->isRadioOn(Ljava/lang/String;)Z Lcom/android/internal/telephony/ITelephony$Stub$Proxy;->mRemote:Landroid/os/IBinder; Lcom/android/internal/telephony/ITelephony$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telephony/ITelephony; Lcom/android/internal/telephony/ITelephony$Stub;->DESCRIPTOR:Ljava/lang/String; -Lcom/android/internal/telephony/ITelephony$Stub;->TRANSACTION_answerRingingCall:I Lcom/android/internal/telephony/ITelephony$Stub;->TRANSACTION_call:I Lcom/android/internal/telephony/ITelephony$Stub;->TRANSACTION_dial:I -Lcom/android/internal/telephony/ITelephony$Stub;->TRANSACTION_endCall:I Lcom/android/internal/telephony/ITelephony$Stub;->TRANSACTION_getDeviceId:I -Lcom/android/internal/telephony/ITelephony;->answerRingingCall()V Lcom/android/internal/telephony/ITelephony;->call(Ljava/lang/String;Ljava/lang/String;)V Lcom/android/internal/telephony/ITelephony;->dial(Ljava/lang/String;)V Lcom/android/internal/telephony/ITelephony;->disableDataConnectivity()Z Lcom/android/internal/telephony/ITelephony;->disableLocationUpdates()V Lcom/android/internal/telephony/ITelephony;->enableDataConnectivity()Z Lcom/android/internal/telephony/ITelephony;->enableLocationUpdates()V -Lcom/android/internal/telephony/ITelephony;->endCall()Z -Lcom/android/internal/telephony/ITelephony;->endCallForSubscriber(I)Z Lcom/android/internal/telephony/ITelephony;->getActivePhoneType()I Lcom/android/internal/telephony/ITelephony;->getCallState()I Lcom/android/internal/telephony/ITelephony;->getDataActivity()I @@ -2108,12 +2101,8 @@ Lcom/android/internal/telephony/ITelephony;->handlePinMmiForSubscriber(ILjava/la Lcom/android/internal/telephony/ITelephony;->hasIccCard()Z Lcom/android/internal/telephony/ITelephony;->iccCloseLogicalChannel(II)Z Lcom/android/internal/telephony/ITelephony;->iccTransmitApduLogicalChannel(IIIIIIILjava/lang/String;)Ljava/lang/String; -Lcom/android/internal/telephony/ITelephony;->isIdle(Ljava/lang/String;)Z -Lcom/android/internal/telephony/ITelephony;->isIdleForSubscriber(ILjava/lang/String;)Z Lcom/android/internal/telephony/ITelephony;->isRadioOnForSubscriber(ILjava/lang/String;)Z -Lcom/android/internal/telephony/ITelephony;->isRinging(Ljava/lang/String;)Z Lcom/android/internal/telephony/ITelephony;->setRadio(Z)Z -Lcom/android/internal/telephony/ITelephony;->silenceRinger()V Lcom/android/internal/telephony/ITelephony;->supplyPin(Ljava/lang/String;)Z Lcom/android/internal/telephony/ITelephony;->toggleRadioOnOff()V Lcom/android/internal/telephony/ITelephony;->updateServiceLocation()V diff --git a/config/preloaded-classes b/config/preloaded-classes index d93befdf5143..56ca98ff9888 100644 --- a/config/preloaded-classes +++ b/config/preloaded-classes @@ -1022,6 +1022,7 @@ android.graphics.-$$Lambda$ColorSpace$Rgb$b9VGKuNnse0bbguR9jbOM_wK2Ac android.graphics.-$$Lambda$ColorSpace$Rgb$bWzafC8vMHNuVmRuTUPEFUMlfuY android.graphics.-$$Lambda$ColorSpace$S2rlqJvkXGTpUF6mZhvkElds8JE android.graphics.BaseCanvas +android.graphics.BaseRecordingCanvas android.graphics.Bitmap android.graphics.Bitmap$1 android.graphics.Bitmap$2 @@ -3303,7 +3304,6 @@ android.view.OrientationEventListener android.view.OrientationEventListener$SensorEventListenerImpl android.view.PointerIcon android.view.PointerIcon$1 -android.view.RecordingCanvas android.view.RenderNode android.view.RenderNode$NoImagePreloadHolder android.view.RenderNodeAnimator diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index 2ee266de4c77..2acae1cf8bac 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -1588,11 +1588,13 @@ public class Activity extends ContextThemeWrapper * @param outState The bundle to save the state to. */ final void performSaveInstanceState(@NonNull Bundle outState) { + getApplication().dispatchActivityPreSaveInstanceState(this, outState); onSaveInstanceState(outState); saveManagedDialogs(outState); mActivityTransitionState.saveState(outState); storeHasCurrentPermissionRequest(outState); if (DEBUG_LIFECYCLE) Slog.v(TAG, "onSaveInstanceState " + this + ": " + outState); + getApplication().dispatchActivityPostSaveInstanceState(this, outState); } /** @@ -1606,11 +1608,13 @@ public class Activity extends ContextThemeWrapper */ final void performSaveInstanceState(@NonNull Bundle outState, @NonNull PersistableBundle outPersistentState) { + getApplication().dispatchActivityPreSaveInstanceState(this, outState); onSaveInstanceState(outState, outPersistentState); saveManagedDialogs(outState); storeHasCurrentPermissionRequest(outState); if (DEBUG_LIFECYCLE) Slog.v(TAG, "onSaveInstanceState " + this + ": " + outState + ", " + outPersistentState); + getApplication().dispatchActivityPostSaveInstanceState(this, outState); } /** @@ -7195,6 +7199,7 @@ public class Activity extends ContextThemeWrapper @UnsupportedAppUsage final void performCreate(Bundle icicle, PersistableBundle persistentState) { + getApplication().dispatchActivityPreCreated(this, icicle); mCanEnterPictureInPicture = true; restoreHasCurrentPermissionRequest(icicle); if (persistentState != null) { @@ -7209,6 +7214,7 @@ public class Activity extends ContextThemeWrapper com.android.internal.R.styleable.Window_windowNoDisplay, false); mFragments.dispatchActivityCreated(); mActivityTransitionState.setEnterActivityOptions(this, getActivityOptions()); + getApplication().dispatchActivityPostCreated(this, icicle); } final void performNewIntent(@NonNull Intent intent) { @@ -7217,6 +7223,7 @@ public class Activity extends ContextThemeWrapper } final void performStart(String reason) { + getApplication().dispatchActivityPreStarted(this); mActivityTransitionState.setEnterActivityOptions(this, getActivityOptions()); mFragments.noteStateNotSaved(); mCalled = false; @@ -7284,6 +7291,7 @@ public class Activity extends ContextThemeWrapper } mActivityTransitionState.enterReady(this); + getApplication().dispatchActivityPostStarted(this); } /** @@ -7338,6 +7346,7 @@ public class Activity extends ContextThemeWrapper } final void performResume(boolean followedByPause, String reason) { + getApplication().dispatchActivityPreResumed(this); performRestart(true /* start */, reason); mFragments.execPendingActions(); @@ -7387,9 +7396,11 @@ public class Activity extends ContextThemeWrapper "Activity " + mComponent.toShortString() + " did not call through to super.onPostResume()"); } + getApplication().dispatchActivityPostResumed(this); } final void performPause() { + getApplication().dispatchActivityPrePaused(this); mDoReportFullyDrawn = false; mFragments.dispatchPause(); mCalled = false; @@ -7402,6 +7413,7 @@ public class Activity extends ContextThemeWrapper "Activity " + mComponent.toShortString() + " did not call through to super.onPause()"); } + getApplication().dispatchActivityPostPaused(this); } final void performUserLeaving() { @@ -7417,6 +7429,7 @@ public class Activity extends ContextThemeWrapper mCanEnterPictureInPicture = false; if (!mStopped) { + getApplication().dispatchActivityPreStopped(this); if (mWindow != null) { mWindow.closeAllPanels(); } @@ -7451,11 +7464,13 @@ public class Activity extends ContextThemeWrapper } mStopped = true; + getApplication().dispatchActivityPostStopped(this); } mResumed = false; } final void performDestroy() { + getApplication().dispatchActivityPreDestroyed(this); mDestroyed = true; mWindow.destroy(); mFragments.dispatchDestroy(); @@ -7465,6 +7480,7 @@ public class Activity extends ContextThemeWrapper if (mVoiceInteractor != null) { mVoiceInteractor.detachActivity(); } + getApplication().dispatchActivityPostDestroyed(this); } final void dispatchMultiWindowModeChanged(boolean isInMultiWindowMode, diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java index be1f2dbc8e4f..294a3ec73efd 100644 --- a/core/java/android/app/ActivityManagerInternal.java +++ b/core/java/android/app/ActivityManagerInternal.java @@ -19,11 +19,14 @@ package android.app; import android.annotation.NonNull; import android.annotation.Nullable; import android.content.ComponentName; +import android.content.IIntentReceiver; import android.content.IIntentSender; import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.UserInfo; +import android.os.Bundle; import android.os.IBinder; +import android.os.TransactionTooLargeException; import android.view.RemoteAnimationAdapter; import java.util.ArrayList; @@ -232,4 +235,14 @@ public abstract class ActivityManagerInternal { public abstract void setBooted(boolean booted); public abstract boolean isBooted(); public abstract void finishBooting(); + + public abstract void tempWhitelistForPendingIntent(int callerPid, int callerUid, int targetUid, + long duration, String tag); + public abstract int broadcastIntentInPackage(String packageName, int uid, Intent intent, + String resolvedType, IIntentReceiver resultTo, int resultCode, String resultData, + Bundle resultExtras, String requiredPermission, Bundle bOptions, boolean serialized, + boolean sticky, int userId); + public abstract ComponentName startServiceInPackage(int uid, Intent service, + String resolvedType, boolean fgRequired, String callingPackage, int userId) + throws TransactionTooLargeException; } diff --git a/core/java/android/app/Application.java b/core/java/android/app/Application.java index 68b745d54bc0..e12942f248d4 100644 --- a/core/java/android/app/Application.java +++ b/core/java/android/app/Application.java @@ -65,13 +65,144 @@ public class Application extends ContextWrapper implements ComponentCallbacks2 { public LoadedApk mLoadedApk; public interface ActivityLifecycleCallbacks { + + /** + * Called as the first step of the Activity being created. This is always called before + * {@link Activity#onCreate}. + */ + default void onActivityPreCreated(@NonNull Activity activity, + @Nullable Bundle savedInstanceState) { + } + + /** + * Called when the Activity calls {@link Activity#onCreate super.onCreate()}. + */ void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState); + + /** + * Called as the last step of the Activity being created. This is always called after + * {@link Activity#onCreate}. + */ + default void onActivityPostCreated(@NonNull Activity activity, + @Nullable Bundle savedInstanceState) { + } + + /** + * Called as the first step of the Activity being started. This is always called before + * {@link Activity#onStart}. + */ + default void onActivityPreStarted(@NonNull Activity activity) { + } + + /** + * Called when the Activity calls {@link Activity#onStart super.onStart()}. + */ void onActivityStarted(@NonNull Activity activity); + + /** + * Called as the last step of the Activity being started. This is always called after + * {@link Activity#onStart}. + */ + default void onActivityPostStarted(@NonNull Activity activity) { + } + + /** + * Called as the first step of the Activity being resumed. This is always called before + * {@link Activity#onResume}. + */ + default void onActivityPreResumed(@NonNull Activity activity) { + } + + /** + * Called when the Activity calls {@link Activity#onResume super.onResume()}. + */ void onActivityResumed(@NonNull Activity activity); + + /** + * Called as the last step of the Activity being resumed. This is always called after + * {@link Activity#onResume} and {@link Activity#onPostResume}. + */ + default void onActivityPostResumed(@NonNull Activity activity) { + } + + /** + * Called as the first step of the Activity being paused. This is always called before + * {@link Activity#onPause}. + */ + default void onActivityPrePaused(@NonNull Activity activity) { + } + + /** + * Called when the Activity calls {@link Activity#onPause super.onPause()}. + */ void onActivityPaused(@NonNull Activity activity); + + /** + * Called as the last step of the Activity being paused. This is always called after + * {@link Activity#onPause}. + */ + default void onActivityPostPaused(@NonNull Activity activity) { + } + + /** + * Called as the first step of the Activity being stopped. This is always called before + * {@link Activity#onStop}. + */ + default void onActivityPreStopped(@NonNull Activity activity) { + } + + /** + * Called when the Activity calls {@link Activity#onStop super.onStop()}. + */ void onActivityStopped(@NonNull Activity activity); + + /** + * Called as the last step of the Activity being stopped. This is always called after + * {@link Activity#onStop}. + */ + default void onActivityPostStopped(@NonNull Activity activity) { + } + + /** + * Called as the first step of the Activity saving its instance state. This is always + * called before {@link Activity#onSaveInstanceState}. + */ + default void onActivityPreSaveInstanceState(@NonNull Activity activity, + @NonNull Bundle outState) { + } + + /** + * Called when the Activity calls + * {@link Activity#onSaveInstanceState super.onSaveInstanceState()}. + */ void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState); + + /** + * Called as the last step of the Activity saving its instance state. This is always + * called after{@link Activity#onSaveInstanceState}. + */ + default void onActivityPostSaveInstanceState(@NonNull Activity activity, + @NonNull Bundle outState) { + } + + /** + * Called as the first step of the Activity being destroyed. This is always called before + * {@link Activity#onDestroy}. + */ + default void onActivityPreDestroyed(@NonNull Activity activity) { + } + + /** + * Called when the Activity calls {@link Activity#onDestroy super.onDestroy()}. + */ void onActivityDestroyed(@NonNull Activity activity); + + /** + * Called as the last step of the Activity being destroyed. This is always called after + * {@link Activity#onDestroy}. + */ + default void onActivityPostDestroyed(@NonNull Activity activity) { + } } /** @@ -222,6 +353,18 @@ public class Application extends ContextWrapper implements ComponentCallbacks2 { } @UnsupportedAppUsage + /* package */ void dispatchActivityPreCreated(@NonNull Activity activity, + @Nullable Bundle savedInstanceState) { + Object[] callbacks = collectActivityLifecycleCallbacks(); + if (callbacks != null) { + for (int i = 0; i < callbacks.length; i++) { + ((ActivityLifecycleCallbacks) callbacks[i]).onActivityPreCreated(activity, + savedInstanceState); + } + } + } + + @UnsupportedAppUsage /* package */ void dispatchActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) { Object[] callbacks = collectActivityLifecycleCallbacks(); @@ -234,6 +377,28 @@ public class Application extends ContextWrapper implements ComponentCallbacks2 { } @UnsupportedAppUsage + /* package */ void dispatchActivityPostCreated(@NonNull Activity activity, + @Nullable Bundle savedInstanceState) { + Object[] callbacks = collectActivityLifecycleCallbacks(); + if (callbacks != null) { + for (int i = 0; i < callbacks.length; i++) { + ((ActivityLifecycleCallbacks) callbacks[i]).onActivityPostCreated(activity, + savedInstanceState); + } + } + } + + @UnsupportedAppUsage + /* package */ void dispatchActivityPreStarted(@NonNull Activity activity) { + Object[] callbacks = collectActivityLifecycleCallbacks(); + if (callbacks != null) { + for (int i = 0; i < callbacks.length; i++) { + ((ActivityLifecycleCallbacks) callbacks[i]).onActivityPreStarted(activity); + } + } + } + + @UnsupportedAppUsage /* package */ void dispatchActivityStarted(@NonNull Activity activity) { Object[] callbacks = collectActivityLifecycleCallbacks(); if (callbacks != null) { @@ -244,6 +409,26 @@ public class Application extends ContextWrapper implements ComponentCallbacks2 { } @UnsupportedAppUsage + /* package */ void dispatchActivityPostStarted(@NonNull Activity activity) { + Object[] callbacks = collectActivityLifecycleCallbacks(); + if (callbacks != null) { + for (int i = 0; i < callbacks.length; i++) { + ((ActivityLifecycleCallbacks) callbacks[i]).onActivityPostStarted(activity); + } + } + } + + @UnsupportedAppUsage + /* package */ void dispatchActivityPreResumed(@NonNull Activity activity) { + Object[] callbacks = collectActivityLifecycleCallbacks(); + if (callbacks != null) { + for (int i = 0; i < callbacks.length; i++) { + ((ActivityLifecycleCallbacks) callbacks[i]).onActivityPreResumed(activity); + } + } + } + + @UnsupportedAppUsage /* package */ void dispatchActivityResumed(@NonNull Activity activity) { Object[] callbacks = collectActivityLifecycleCallbacks(); if (callbacks != null) { @@ -254,6 +439,26 @@ public class Application extends ContextWrapper implements ComponentCallbacks2 { } @UnsupportedAppUsage + /* package */ void dispatchActivityPostResumed(@NonNull Activity activity) { + Object[] callbacks = collectActivityLifecycleCallbacks(); + if (callbacks != null) { + for (int i = 0; i < callbacks.length; i++) { + ((ActivityLifecycleCallbacks) callbacks[i]).onActivityPostResumed(activity); + } + } + } + + @UnsupportedAppUsage + /* package */ void dispatchActivityPrePaused(@NonNull Activity activity) { + Object[] callbacks = collectActivityLifecycleCallbacks(); + if (callbacks != null) { + for (int i = 0; i < callbacks.length; i++) { + ((ActivityLifecycleCallbacks) callbacks[i]).onActivityPrePaused(activity); + } + } + } + + @UnsupportedAppUsage /* package */ void dispatchActivityPaused(@NonNull Activity activity) { Object[] callbacks = collectActivityLifecycleCallbacks(); if (callbacks != null) { @@ -264,6 +469,26 @@ public class Application extends ContextWrapper implements ComponentCallbacks2 { } @UnsupportedAppUsage + /* package */ void dispatchActivityPostPaused(@NonNull Activity activity) { + Object[] callbacks = collectActivityLifecycleCallbacks(); + if (callbacks != null) { + for (int i = 0; i < callbacks.length; i++) { + ((ActivityLifecycleCallbacks) callbacks[i]).onActivityPostPaused(activity); + } + } + } + + @UnsupportedAppUsage + /* package */ void dispatchActivityPreStopped(@NonNull Activity activity) { + Object[] callbacks = collectActivityLifecycleCallbacks(); + if (callbacks != null) { + for (int i = 0; i < callbacks.length; i++) { + ((ActivityLifecycleCallbacks) callbacks[i]).onActivityPreStopped(activity); + } + } + } + + @UnsupportedAppUsage /* package */ void dispatchActivityStopped(@NonNull Activity activity) { Object[] callbacks = collectActivityLifecycleCallbacks(); if (callbacks != null) { @@ -274,6 +499,28 @@ public class Application extends ContextWrapper implements ComponentCallbacks2 { } @UnsupportedAppUsage + /* package */ void dispatchActivityPostStopped(@NonNull Activity activity) { + Object[] callbacks = collectActivityLifecycleCallbacks(); + if (callbacks != null) { + for (int i = 0; i < callbacks.length; i++) { + ((ActivityLifecycleCallbacks) callbacks[i]).onActivityPostStopped(activity); + } + } + } + + @UnsupportedAppUsage + /* package */ void dispatchActivityPreSaveInstanceState(@NonNull Activity activity, + @NonNull Bundle outState) { + Object[] callbacks = collectActivityLifecycleCallbacks(); + if (callbacks != null) { + for (int i = 0; i < callbacks.length; i++) { + ((ActivityLifecycleCallbacks) callbacks[i]).onActivityPreSaveInstanceState( + activity, outState); + } + } + } + + @UnsupportedAppUsage /* package */ void dispatchActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) { Object[] callbacks = collectActivityLifecycleCallbacks(); @@ -286,6 +533,28 @@ public class Application extends ContextWrapper implements ComponentCallbacks2 { } @UnsupportedAppUsage + /* package */ void dispatchActivityPostSaveInstanceState(@NonNull Activity activity, + @NonNull Bundle outState) { + Object[] callbacks = collectActivityLifecycleCallbacks(); + if (callbacks != null) { + for (int i = 0; i < callbacks.length; i++) { + ((ActivityLifecycleCallbacks) callbacks[i]).onActivityPostSaveInstanceState( + activity, outState); + } + } + } + + @UnsupportedAppUsage + /* package */ void dispatchActivityPreDestroyed(@NonNull Activity activity) { + Object[] callbacks = collectActivityLifecycleCallbacks(); + if (callbacks != null) { + for (int i = 0; i < callbacks.length; i++) { + ((ActivityLifecycleCallbacks) callbacks[i]).onActivityPreDestroyed(activity); + } + } + } + + @UnsupportedAppUsage /* package */ void dispatchActivityDestroyed(@NonNull Activity activity) { Object[] callbacks = collectActivityLifecycleCallbacks(); if (callbacks != null) { @@ -295,6 +564,16 @@ public class Application extends ContextWrapper implements ComponentCallbacks2 { } } + @UnsupportedAppUsage + /* package */ void dispatchActivityPostDestroyed(@NonNull Activity activity) { + Object[] callbacks = collectActivityLifecycleCallbacks(); + if (callbacks != null) { + for (int i = 0; i < callbacks.length; i++) { + ((ActivityLifecycleCallbacks) callbacks[i]).onActivityPostDestroyed(activity); + } + } + } + private Object[] collectComponentCallbacks() { Object[] callbacks = null; synchronized (mComponentCallbacks) { diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/events/StoppedDragingEvent.java b/core/java/android/app/ISmsAppService.aidl index c50d6d62d6e9..1ac2ec6b1c41 100644 --- a/packages/SystemUI/src/com/android/systemui/stackdivider/events/StoppedDragingEvent.java +++ b/core/java/android/app/ISmsAppService.aidl @@ -1,5 +1,5 @@ /* - * Copyright (C) 2016 The Android Open Source Project + * 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. @@ -11,15 +11,13 @@ * 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 + * limitations under the License. */ -package com.android.systemui.stackdivider.events; - -import com.android.systemui.recents.events.EventBus; +package android.app; /** - * Sent when the divider isn't draging anymore. + * @hide */ -public class StoppedDragingEvent extends EventBus.Event { +interface ISmsAppService { } diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 3638bc48d2b5..81df447816d1 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -4440,7 +4440,7 @@ public class Notification implements Parcelable } private CharSequence processTextSpans(CharSequence text) { - if (hasForegroundColor()) { + if (hasForegroundColor() || mInNightMode) { return ContrastColorUtil.clearColorSpans(text); } return text; diff --git a/core/java/android/app/SmsAppService.java b/core/java/android/app/SmsAppService.java new file mode 100644 index 000000000000..3f2b025016df --- /dev/null +++ b/core/java/android/app/SmsAppService.java @@ -0,0 +1,57 @@ +/* + * 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 android.app; + +import android.content.ComponentName; +import android.content.Intent; +import android.os.IBinder; + +/** + * If the default SMS app has a service that extends this class, the system always tries to bind + * it so that the process is always running, which allows the app to have a persistent connection + * to the server. + * + * <p>The service must have {@link android.telephony.TelephonyManager#ACTION_SMS_APP_SERVICE} + * action in the intent handler, and be protected with + * {@link android.Manifest.permission#BIND_SMS_APP_SERVICE}. However the service does not have to + * be exported. + * + * <p>Apps can use + * {@link android.content.pm.PackageManager#setComponentEnabledSetting(ComponentName, int, int)} + * to disable/enable the service. Apps should use it to disable the service when it no longer needs + * to be running. + * + * <p>When the owner process crashes, the service will be re-bound automatically after a + * back-off. + * + * <p>Note the process may still be killed if the system is under heavy memory pressure, in which + * case the process will be re-started later. + */ +public class SmsAppService extends Service { + private final ISmsAppService mImpl; + + public SmsAppService() { + mImpl = new ISmsAppServiceImpl(); + } + + @Override + public final IBinder onBind(Intent intent) { + return mImpl.asBinder(); + } + + private class ISmsAppServiceImpl extends ISmsAppService.Stub { + } +} diff --git a/core/java/android/content/ContentProvider.java b/core/java/android/content/ContentProvider.java index 8d9533e09cbf..a64eead04c6f 100644 --- a/core/java/android/content/ContentProvider.java +++ b/core/java/android/content/ContentProvider.java @@ -331,6 +331,7 @@ public abstract class ContentProvider implements ComponentCallbacks2 { for (int i = 0; i < numOperations; i++) { ContentProviderOperation operation = operations.get(i); Uri uri = operation.getUri(); + userIds[i] = getUserIdFromUri(uri); uri = validateIncomingUri(uri); uri = maybeGetUriWithoutUserId(uri); // Rebuild operation if we changed the Uri above diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index caaf4af247e9..d71157459fc8 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -4311,6 +4311,12 @@ public abstract class Context { public static final String TIME_ZONE_DETECTOR_SERVICE = "time_zone_detector"; /** + * Binder service name for {@link AppBindingService}. + * @hide + */ + public static final String APP_BINDING_SERVICE = "app_binding"; + + /** * Determine whether the given permission is allowed for a particular * process and user ID running in the system. * diff --git a/core/java/android/database/sqlite/SQLiteDatabase.java b/core/java/android/database/sqlite/SQLiteDatabase.java index 01557c59f8ac..eb5c720d6309 100644 --- a/core/java/android/database/sqlite/SQLiteDatabase.java +++ b/core/java/android/database/sqlite/SQLiteDatabase.java @@ -649,7 +649,7 @@ public final class SQLiteDatabase extends SQLiteClosable { * successful so far. Do not call setTransactionSuccessful before calling this. When this * returns a new transaction will have been created but not marked as successful. * @return true if the transaction was yielded - * @deprecated if the db is locked more than once (becuase of nested transactions) then the lock + * @deprecated if the db is locked more than once (because of nested transactions) then the lock * will not be yielded. Use yieldIfContendedSafely instead. */ @Deprecated diff --git a/core/java/android/hardware/biometrics/BiometricPrompt.java b/core/java/android/hardware/biometrics/BiometricPrompt.java index 92a814ca24c5..83998cc1c66a 100644 --- a/core/java/android/hardware/biometrics/BiometricPrompt.java +++ b/core/java/android/hardware/biometrics/BiometricPrompt.java @@ -348,7 +348,6 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan * @hide */ public AuthenticationResult(CryptoObject crypto) { - // For compatibility, this extends from common base class as FingerprintManager does. // Identifier and userId is not used for BiometricPrompt. super(crypto, null /* identifier */, 0 /* userId */); } @@ -410,8 +409,8 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan } /** - * This call warms up the fingerprint hardware, displays a system-provided dialog, and starts - * scanning for a fingerprint. It terminates when {@link + * This call warms up the biometric hardware, displays a system-provided dialog, and starts + * scanning for a biometric. It terminates when {@link * AuthenticationCallback#onAuthenticationError(int, CharSequence)} is called, when {@link * AuthenticationCallback#onAuthenticationSucceeded( AuthenticationResult)}, or when the user * dismisses the system-provided dialog, at which point the crypto object becomes invalid. This @@ -453,8 +452,8 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan } /** - * This call warms up the fingerprint hardware, displays a system-provided dialog, and starts - * scanning for a fingerprint. It terminates when {@link + * This call warms up the biometric hardware, displays a system-provided dialog, and starts + * scanning for a biometric. It terminates when {@link * AuthenticationCallback#onAuthenticationError(int, CharSequence)} is called, when {@link * AuthenticationCallback#onAuthenticationSucceeded( AuthenticationResult)} is called, or when * the user dismisses the system-provided dialog. This operation can be canceled by using the diff --git a/core/java/android/hardware/face/FaceManager.java b/core/java/android/hardware/face/FaceManager.java index 66613ea50357..873a24a3b53b 100644 --- a/core/java/android/hardware/face/FaceManager.java +++ b/core/java/android/hardware/face/FaceManager.java @@ -244,17 +244,17 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan } /** - * Requests a pre-enrollment auth token to tie enrollment to the confirmation of + * Requests an auth token to tie sensitive operations to the confirmation of * existing device credentials (e.g. pin/pattern/password). * * @hide */ @RequiresPermission(MANAGE_BIOMETRIC) - public long preEnroll() { + public long generateChallenge() { long result = 0; if (mService != null) { try { - result = mService.preEnroll(mToken); + result = mService.generateChallenge(mToken); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -263,16 +263,46 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan } /** - * Finishes enrollment and cancels the current auth token. + * Invalidates the current auth token. * * @hide */ @RequiresPermission(MANAGE_BIOMETRIC) - public int postEnroll() { + public int revokeChallenge() { int result = 0; if (mService != null) { try { - result = mService.postEnroll(mToken); + result = mService.revokeChallenge(mToken); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + return result; + } + + /** + * @hide + */ + @RequiresPermission(MANAGE_BIOMETRIC) + public void setRequireAttention(boolean requireAttention, byte[] token) { + if (mService != null) { + try { + mService.setRequireAttention(requireAttention, token); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + } + + /** + * @hide + */ + @RequiresPermission(MANAGE_BIOMETRIC) + public boolean getRequireAttention(byte[] token) { + boolean result = true; + if (mService != null) { + try { + mService.getRequireAttention(token); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } diff --git a/core/java/android/hardware/face/IFaceService.aidl b/core/java/android/hardware/face/IFaceService.aidl index 50d07449493e..6681bd714779 100644 --- a/core/java/android/hardware/face/IFaceService.aidl +++ b/core/java/android/hardware/face/IFaceService.aidl @@ -66,10 +66,10 @@ interface IFaceService { boolean isHardwareDetected(long deviceId, String opPackageName); // Get a pre-enrollment authentication token - long preEnroll(IBinder token); + long generateChallenge(IBinder token); // Finish an enrollment sequence and invalidate the authentication token - int postEnroll(IBinder token); + int revokeChallenge(IBinder token); // Determine if a user has at least one enrolled face boolean hasEnrolledFaces(int userId, String opPackageName); @@ -94,4 +94,8 @@ interface IFaceService { // Enumerate all faces void enumerate(IBinder token, int userId, IFaceServiceReceiver receiver); + + int setRequireAttention(boolean requireAttention, in byte [] token); + + boolean getRequireAttention(in byte [] token); } diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index aa178fb9ff36..8fd9d4fed493 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -7689,6 +7689,15 @@ public final class Settings { BOOLEAN_VALIDATOR; /** + * Whether or not face unlock is allowed for apps (through BiometricPrompt). + * @hide + */ + public static final String FACE_UNLOCK_APP_ENABLED = "face_unlock_app_enabled"; + + private static final Validator FACE_UNLOCK_APP_ENABLED_VALIDATOR = + BOOLEAN_VALIDATOR; + + /** * Whether the assist gesture should be enabled. * * @hide @@ -8189,6 +8198,7 @@ public final class Settings { NFC_PAYMENT_DEFAULT_COMPONENT, AUTOMATIC_STORAGE_MANAGER_DAYS_TO_RETAIN, FACE_UNLOCK_KEYGUARD_ENABLED, + FACE_UNLOCK_APP_ENABLED, ASSIST_GESTURE_ENABLED, ASSIST_GESTURE_SILENCE_ALERTS_ENABLED, ASSIST_GESTURE_WAKE_ENABLED, @@ -8337,6 +8347,7 @@ public final class Settings { VALIDATORS.put(AUTOMATIC_STORAGE_MANAGER_DAYS_TO_RETAIN, AUTOMATIC_STORAGE_MANAGER_DAYS_TO_RETAIN_VALIDATOR); VALIDATORS.put(FACE_UNLOCK_KEYGUARD_ENABLED, FACE_UNLOCK_KEYGUARD_ENABLED_VALIDATOR); + VALIDATORS.put(FACE_UNLOCK_APP_ENABLED, FACE_UNLOCK_APP_ENABLED_VALIDATOR); VALIDATORS.put(ASSIST_GESTURE_ENABLED, ASSIST_GESTURE_ENABLED_VALIDATOR); VALIDATORS.put(ASSIST_GESTURE_SILENCE_ALERTS_ENABLED, ASSIST_GESTURE_SILENCE_ALERTS_ENABLED_VALIDATOR); diff --git a/core/java/android/text/SpannableStringBuilder.java b/core/java/android/text/SpannableStringBuilder.java index c5fabaf2d840..0d29da00f7c9 100644 --- a/core/java/android/text/SpannableStringBuilder.java +++ b/core/java/android/text/SpannableStringBuilder.java @@ -1610,13 +1610,14 @@ public class SpannableStringBuilder implements CharSequence, GetChars, Spannable public boolean equals(Object o) { if (o instanceof Spanned && toString().equals(o.toString())) { - Spanned other = (Spanned) o; + final Spanned other = (Spanned) o; // Check span data - Object[] otherSpans = other.getSpans(0, other.length(), Object.class); + final Object[] otherSpans = other.getSpans(0, other.length(), Object.class); + final Object[] thisSpans = getSpans(0, length(), Object.class); if (mSpanCount == otherSpans.length) { for (int i = 0; i < mSpanCount; ++i) { - Object thisSpan = mSpans[i]; - Object otherSpan = otherSpans[i]; + final Object thisSpan = thisSpans[i]; + final Object otherSpan = otherSpans[i]; if (thisSpan == this) { if (other != otherSpan || getSpanStart(thisSpan) != other.getSpanStart(otherSpan) || diff --git a/core/java/android/text/SpannableStringInternal.java b/core/java/android/text/SpannableStringInternal.java index 7acd5399792c..a9866335f271 100644 --- a/core/java/android/text/SpannableStringInternal.java +++ b/core/java/android/text/SpannableStringInternal.java @@ -16,12 +16,13 @@ package android.text; +import android.annotation.UnsupportedAppUsage; + import com.android.internal.util.ArrayUtils; import com.android.internal.util.GrowingArrayUtils; import libcore.util.EmptyArray; -import android.annotation.UnsupportedAppUsage; import java.lang.reflect.Array; /* package */ abstract class SpannableStringInternal @@ -502,13 +503,14 @@ import java.lang.reflect.Array; public boolean equals(Object o) { if (o instanceof Spanned && toString().equals(o.toString())) { - Spanned other = (Spanned) o; + final Spanned other = (Spanned) o; // Check span data - Object[] otherSpans = other.getSpans(0, other.length(), Object.class); + final Object[] otherSpans = other.getSpans(0, other.length(), Object.class); + final Object[] thisSpans = getSpans(0, length(), Object.class); if (mSpanCount == otherSpans.length) { for (int i = 0; i < mSpanCount; ++i) { - Object thisSpan = mSpans[i]; - Object otherSpan = otherSpans[i]; + final Object thisSpan = thisSpans[i]; + final Object otherSpan = otherSpans[i]; if (thisSpan == this) { if (other != otherSpan || getSpanStart(thisSpan) != other.getSpanStart(otherSpan) || diff --git a/core/java/android/text/style/TextAppearanceSpan.java b/core/java/android/text/style/TextAppearanceSpan.java index c17cfd500827..2dc4f6001a06 100644 --- a/core/java/android/text/style/TextAppearanceSpan.java +++ b/core/java/android/text/style/TextAppearanceSpan.java @@ -16,11 +16,13 @@ package android.text.style; +import android.annotation.Nullable; import android.content.Context; import android.content.res.ColorStateList; import android.content.res.TypedArray; import android.graphics.LeakyTypefaceStorage; import android.graphics.Typeface; +import android.graphics.fonts.Font; import android.os.Parcel; import android.text.ParcelableSpan; import android.text.TextPaint; @@ -38,6 +40,21 @@ public class TextAppearanceSpan extends MetricAffectingSpan implements Parcelabl private final ColorStateList mTextColorLink; private final Typeface mTypeface; + private final int mTextFontWeight; + + private final float mShadowRadius; + private final float mShadowDx; + private final float mShadowDy; + private final int mShadowColor; + + private final boolean mHasElegantTextHeight; + private final boolean mElegantTextHeight; + private final boolean mHasLetterSpacing; + private final float mLetterSpacing; + + private final String mFontFeatureSettings; + private final String mFontVariationSettings; + /** * Uses the specified TextAppearance resource to determine the * text appearance. The <code>appearance</code> should be, for example, @@ -104,6 +121,34 @@ public class TextAppearanceSpan extends MetricAffectingSpan implements Parcelabl } } + mTextFontWeight = a.getInt(com.android.internal.R.styleable + .TextAppearance_textFontWeight, -1); + + mShadowRadius = a.getFloat(com.android.internal.R.styleable + .TextAppearance_shadowRadius, 0.0f); + mShadowDx = a.getFloat(com.android.internal.R.styleable + .TextAppearance_shadowDx, 0.0f); + mShadowDy = a.getFloat(com.android.internal.R.styleable + .TextAppearance_shadowDy, 0.0f); + mShadowColor = a.getInt(com.android.internal.R.styleable + .TextAppearance_shadowColor, 0); + + mHasElegantTextHeight = a.hasValue(com.android.internal.R.styleable + .TextAppearance_elegantTextHeight); + mElegantTextHeight = a.getBoolean(com.android.internal.R.styleable + .TextAppearance_elegantTextHeight, false); + + mHasLetterSpacing = a.hasValue(com.android.internal.R.styleable + .TextAppearance_letterSpacing); + mLetterSpacing = a.getFloat(com.android.internal.R.styleable + .TextAppearance_letterSpacing, 0.0f); + + mFontFeatureSettings = a.getString(com.android.internal.R.styleable + .TextAppearance_fontFeatureSettings); + + mFontVariationSettings = a.getString(com.android.internal.R.styleable + .TextAppearance_fontVariationSettings); + a.recycle(); if (colorList >= 0) { @@ -129,6 +174,21 @@ public class TextAppearanceSpan extends MetricAffectingSpan implements Parcelabl mTextColor = color; mTextColorLink = linkColor; mTypeface = null; + + mTextFontWeight = -1; + + mShadowRadius = 0.0f; + mShadowDx = 0.0f; + mShadowDy = 0.0f; + mShadowColor = 0; + + mHasElegantTextHeight = false; + mElegantTextHeight = false; + mHasLetterSpacing = false; + mLetterSpacing = 0.0f; + + mFontFeatureSettings = null; + mFontVariationSettings = null; } public TextAppearanceSpan(Parcel src) { @@ -146,6 +206,21 @@ public class TextAppearanceSpan extends MetricAffectingSpan implements Parcelabl mTextColorLink = null; } mTypeface = LeakyTypefaceStorage.readTypefaceFromParcel(src); + + mTextFontWeight = src.readInt(); + + mShadowRadius = src.readFloat(); + mShadowDx = src.readFloat(); + mShadowDy = src.readFloat(); + mShadowColor = src.readInt(); + + mHasElegantTextHeight = src.readBoolean(); + mElegantTextHeight = src.readBoolean(); + mHasLetterSpacing = src.readBoolean(); + mLetterSpacing = src.readFloat(); + + mFontFeatureSettings = src.readString(); + mFontVariationSettings = src.readString(); } public int getSpanTypeId() { @@ -183,6 +258,21 @@ public class TextAppearanceSpan extends MetricAffectingSpan implements Parcelabl dest.writeInt(0); } LeakyTypefaceStorage.writeTypefaceToParcel(mTypeface, dest); + + dest.writeInt(mTextFontWeight); + + dest.writeFloat(mShadowRadius); + dest.writeFloat(mShadowDx); + dest.writeFloat(mShadowDy); + dest.writeInt(mShadowColor); + + dest.writeBoolean(mHasElegantTextHeight); + dest.writeBoolean(mElegantTextHeight); + dest.writeBoolean(mHasLetterSpacing); + dest.writeFloat(mLetterSpacing); + + dest.writeString(mFontFeatureSettings); + dest.writeString(mFontVariationSettings); } /** @@ -225,6 +315,81 @@ public class TextAppearanceSpan extends MetricAffectingSpan implements Parcelabl return mStyle; } + /** + * Returns the text font weight specified by this span, or <code>-1</code> + * if it does not specify one. + */ + public int getTextFontWeight() { + return mTextFontWeight; + } + + /** + * Returns the typeface specified by this span, or <code>null</code> + * if it does not specify one. + */ + @Nullable + public Typeface getTypeface() { + return mTypeface; + } + + /** + * Returns the color of the text shadow specified by this span, or <code>0</code> + * if it does not specify one. + */ + public int getShadowColor() { + return mShadowColor; + } + + /** + * Returns the horizontal offset of the text shadow specified by this span, or <code>0.0f</code> + * if it does not specify one. + */ + public float getShadowDx() { + return mShadowDx; + } + + /** + * Returns the vertical offset of the text shadow specified by this span, or <code>0.0f</code> + * if it does not specify one. + */ + public float getShadowDy() { + return mShadowDy; + } + + /** + * Returns the blur radius of the text shadow specified by this span, or <code>0.0f</code> + * if it does not specify one. + */ + public float getShadowRadius() { + return mShadowRadius; + } + + /** + * Returns the font feature settings specified by this span, or <code>null</code> + * if it does not specify one. + */ + @Nullable + public String getFontFeatureSettings() { + return mFontFeatureSettings; + } + + /** + * Returns the font variation settings specified by this span, or <code>null</code> + * if it does not specify one. + */ + @Nullable + public String getFontVariationSettings() { + return mFontVariationSettings; + } + + /** + * Returns the value of elegant height metrics flag specified by this span, + * or <code>false</code> if it does not specify one. + */ + public boolean isElegantTextHeight() { + return mElegantTextHeight; + } + @Override public void updateDrawState(TextPaint ds) { updateMeasureState(ds); @@ -236,6 +401,10 @@ public class TextAppearanceSpan extends MetricAffectingSpan implements Parcelabl if (mTextColorLink != null) { ds.linkColor = mTextColorLink.getColorForState(ds.drawableState, 0); } + + if (mShadowColor != 0) { + ds.setShadowLayer(mShadowRadius, mShadowDx, mShadowDy, mShadowColor); + } } @Override @@ -267,7 +436,16 @@ public class TextAppearanceSpan extends MetricAffectingSpan implements Parcelabl } if (styledTypeface != null) { - int fake = style & ~styledTypeface.getStyle(); + final Typeface readyTypeface; + if (mTextFontWeight >= 0) { + final int weight = Math.min(Font.FONT_WEIGHT_MAX, mTextFontWeight); + final boolean italic = (style & Typeface.ITALIC) != 0; + readyTypeface = ds.setTypeface(Typeface.create(styledTypeface, weight, italic)); + } else { + readyTypeface = styledTypeface; + } + + int fake = style & ~readyTypeface.getStyle(); if ((fake & Typeface.BOLD) != 0) { ds.setFakeBoldText(true); @@ -277,11 +455,27 @@ public class TextAppearanceSpan extends MetricAffectingSpan implements Parcelabl ds.setTextSkewX(-0.25f); } - ds.setTypeface(styledTypeface); + ds.setTypeface(readyTypeface); } if (mTextSize > 0) { ds.setTextSize(mTextSize); } + + if (mHasElegantTextHeight) { + ds.setElegantTextHeight(mElegantTextHeight); + } + + if (mHasLetterSpacing) { + ds.setLetterSpacing(mLetterSpacing); + } + + if (mFontFeatureSettings != null) { + ds.setFontFeatureSettings(mFontFeatureSettings); + } + + if (mFontVariationSettings != null) { + ds.setFontVariationSettings(mFontVariationSettings); + } } } diff --git a/core/java/android/transition/TransitionManager.java b/core/java/android/transition/TransitionManager.java index f8e8762ef592..c4ef77a3e7ae 100644 --- a/core/java/android/transition/TransitionManager.java +++ b/core/java/android/transition/TransitionManager.java @@ -189,6 +189,8 @@ public class TransitionManager { final ViewGroup sceneRoot = scene.getSceneRoot(); if (!sPendingTransitions.contains(sceneRoot)) { if (transition == null) { + exitPreviousScene(sceneRoot); + scene.enter(); } else { sPendingTransitions.add(sceneRoot); @@ -210,6 +212,14 @@ public class TransitionManager { } } + private static void exitPreviousScene(final ViewGroup sceneRoot) { + // Notify previous scene that it is being exited + final Scene previousScene = Scene.getCurrentScene(sceneRoot); + if (previousScene != null) { + previousScene.exit(); + } + } + @UnsupportedAppUsage private static ArrayMap<ViewGroup, ArrayList<Transition>> getRunningTransitions() { WeakReference<ArrayMap<ViewGroup, ArrayList<Transition>>> runningTransitions = @@ -339,11 +349,7 @@ public class TransitionManager { transition.captureValues(sceneRoot, true); } - // Notify previous scene that it is being exited - Scene previousScene = Scene.getCurrentScene(sceneRoot); - if (previousScene != null) { - previousScene.exit(); - } + exitPreviousScene(sceneRoot); } /** diff --git a/core/java/android/view/DisplayListCanvas.java b/core/java/android/view/DisplayListCanvas.java index 4b946d7f430f..667fab5537c9 100644 --- a/core/java/android/view/DisplayListCanvas.java +++ b/core/java/android/view/DisplayListCanvas.java @@ -19,6 +19,7 @@ package android.view; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.UnsupportedAppUsage; +import android.graphics.BaseRecordingCanvas; import android.graphics.Bitmap; import android.graphics.CanvasProperty; import android.graphics.Paint; @@ -35,7 +36,7 @@ import dalvik.annotation.optimization.FastNative; * * @hide */ -public final class DisplayListCanvas extends RecordingCanvas { +public final class DisplayListCanvas extends BaseRecordingCanvas { // The recording canvas pool should be large enough to handle a deeply nested // view hierarchy because display lists are generated recursively. private static final int POOL_LIMIT = 25; diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/events/StartedDragingEvent.java b/core/java/android/view/NativeVectorDrawableAnimator.java index 5d1985123b32..b0556a3f8a91 100644 --- a/packages/SystemUI/src/com/android/systemui/stackdivider/events/StartedDragingEvent.java +++ b/core/java/android/view/NativeVectorDrawableAnimator.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2016 The Android Open Source Project + * 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. @@ -11,15 +11,19 @@ * 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 + * limitations under the License. */ -package com.android.systemui.stackdivider.events; - -import com.android.systemui.recents.events.EventBus; +package android.view; /** - * Sent when the divider is being draged either manually or by an animation. + * Exists just to allow for android.graphics & android.view package separation + * + * TODO: Get off of this coupling more cleanly somehow + * + * @hide */ -public class StartedDragingEvent extends EventBus.Event { +public interface NativeVectorDrawableAnimator { + /** @hide */ + long getAnimatorNativePtr(); } diff --git a/core/java/android/view/RenderNode.java b/core/java/android/view/RenderNode.java index 982e5c2a6924..8ae912762fdb 100644 --- a/core/java/android/view/RenderNode.java +++ b/core/java/android/view/RenderNode.java @@ -24,7 +24,6 @@ import android.graphics.Matrix; import android.graphics.Outline; import android.graphics.Paint; import android.graphics.Rect; -import android.graphics.drawable.AnimatedVectorDrawable; import dalvik.annotation.optimization.CriticalNative; import dalvik.annotation.optimization.FastNative; @@ -148,12 +147,12 @@ public class RenderNode { * @hide */ final long mNativeRenderNode; - private final View mOwningView; + private final AnimationHost mAnimationHost; - private RenderNode(String name, View owningView) { + private RenderNode(String name, AnimationHost animationHost) { mNativeRenderNode = nCreate(name); NoImagePreloadHolder.sRegistry.registerNativeAllocation(this, mNativeRenderNode); - mOwningView = owningView; + mAnimationHost = animationHost; } /** @@ -162,7 +161,7 @@ public class RenderNode { private RenderNode(long nativePtr) { mNativeRenderNode = nativePtr; NoImagePreloadHolder.sRegistry.registerNativeAllocation(this, mNativeRenderNode); - mOwningView = null; + mAnimationHost = null; } /** @@ -174,8 +173,8 @@ public class RenderNode { * @return A new RenderNode. */ @UnsupportedAppUsage - public static RenderNode create(String name, @Nullable View owningView) { - return new RenderNode(name, owningView); + public static RenderNode create(String name, @Nullable AnimationHost animationHost) { + return new RenderNode(name, animationHost); } /** @@ -189,10 +188,37 @@ public class RenderNode { } /** + * Listens for RenderNode position updates for synchronous window movement. + * + * This is not suitable for generic position listening, it is only designed & intended + * for use by things which require external position events like SurfaceView, PopupWindow, etc.. + * + * @hide + */ + interface PositionUpdateListener { + + /** + * Called by native by a Rendering Worker thread to update window position + * + * @hide + */ + void positionChanged(long frameNumber, int left, int top, int right, int bottom); + + /** + * Called by native on RenderThread to notify that the view is no longer in the + * draw tree. UI thread is blocked at this point. + * + * @hide + */ + void positionLost(long frameNumber); + + } + + /** * Enable callbacks for position changes. */ - public void requestPositionUpdates(SurfaceView view) { - nRequestPositionUpdates(mNativeRenderNode, view); + public void requestPositionUpdates(PositionUpdateListener listener) { + nRequestPositionUpdates(mNativeRenderNode, listener); } @@ -873,26 +899,42 @@ public class RenderNode { // Animations /////////////////////////////////////////////////////////////////////////// + /** + * TODO: Figure out if this can be eliminated/refactored away + * + * For now this interface exists to de-couple RenderNode from anything View-specific in a + * bit of a kludge. + * + * @hide */ + interface AnimationHost { + void registerAnimatingRenderNode(RenderNode animator); + void registerVectorDrawableAnimator(NativeVectorDrawableAnimator animator); + boolean isAttached(); + } + + /** @hide */ public void addAnimator(RenderNodeAnimator animator) { - if (mOwningView == null || mOwningView.mAttachInfo == null) { + if (!isAttached()) { throw new IllegalStateException("Cannot start this animator on a detached view!"); } nAddAnimator(mNativeRenderNode, animator.getNativeAnimator()); - mOwningView.mAttachInfo.mViewRootImpl.registerAnimatingRenderNode(this); + mAnimationHost.registerAnimatingRenderNode(this); } + /** @hide */ public boolean isAttached() { - return mOwningView != null && mOwningView.mAttachInfo != null; + return mAnimationHost != null && mAnimationHost.isAttached(); } - public void registerVectorDrawableAnimator( - AnimatedVectorDrawable.VectorDrawableAnimatorRT animatorSet) { - if (mOwningView == null || mOwningView.mAttachInfo == null) { + /** @hide */ + public void registerVectorDrawableAnimator(NativeVectorDrawableAnimator animatorSet) { + if (!isAttached()) { throw new IllegalStateException("Cannot start this animator on a detached view!"); } - mOwningView.mAttachInfo.mViewRootImpl.registerVectorDrawableAnimator(animatorSet); + mAnimationHost.registerVectorDrawableAnimator(animatorSet); } + /** @hide */ public void endAllAnimators() { nEndAllAnimators(mNativeRenderNode); } @@ -906,7 +948,8 @@ public class RenderNode { private static native long nGetNativeFinalizer(); private static native void nOutput(long renderNode); private static native int nGetDebugSize(long renderNode); - private static native void nRequestPositionUpdates(long renderNode, SurfaceView callback); + private static native void nRequestPositionUpdates(long renderNode, + PositionUpdateListener callback); // Animations diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java index 514a11ebf713..e71182c33c12 100644 --- a/core/java/android/view/SurfaceView.java +++ b/core/java/android/view/SurfaceView.java @@ -209,7 +209,7 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb public SurfaceView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); - mRenderNode.requestPositionUpdates(this); + mRenderNode.requestPositionUpdates(mPositionListener); setWillNotDraw(true); } @@ -826,81 +826,80 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb private Rect mRTLastReportedPosition = new Rect(); - /** - * Called by native by a Rendering Worker thread to update the window position - * @hide - */ - @UnsupportedAppUsage - public final void updateSurfacePosition_renderWorker(long frameNumber, - int left, int top, int right, int bottom) { - if (mSurfaceControl == null) { - return; - } + private RenderNode.PositionUpdateListener mPositionListener = + new RenderNode.PositionUpdateListener() { - // TODO: This is teensy bit racey in that a brand new SurfaceView moving on - // its 2nd frame if RenderThread is running slowly could potentially see - // this as false, enter the branch, get pre-empted, then this comes along - // and reports a new position, then the UI thread resumes and reports - // its position. This could therefore be de-sync'd in that interval, but - // the synchronization would violate the rule that RT must never block - // on the UI thread which would open up potential deadlocks. The risk of - // a single-frame desync is therefore preferable for now. - mRtHandlingPositionUpdates = true; - if (mRTLastReportedPosition.left == left - && mRTLastReportedPosition.top == top - && mRTLastReportedPosition.right == right - && mRTLastReportedPosition.bottom == bottom) { - return; - } - try { - if (DEBUG) { - Log.d(TAG, String.format("%d updateSurfacePosition RenderWorker, frameNr = %d, " + - "postion = [%d, %d, %d, %d]", System.identityHashCode(this), - frameNumber, left, top, right, bottom)); + @Override + public void positionChanged(long frameNumber, int left, int top, int right, int bottom) { + if (mSurfaceControl == null) { + return; } - mRTLastReportedPosition.set(left, top, right, bottom); - setParentSpaceRectangle(mRTLastReportedPosition, frameNumber); - // Now overwrite mRTLastReportedPosition with our values - } catch (Exception ex) { - Log.e(TAG, "Exception from repositionChild", ex); - } - } - /** - * Called by native on RenderThread to notify that the view is no longer in the - * draw tree. UI thread is blocked at this point. - * @hide - */ - @UnsupportedAppUsage - public final void surfacePositionLost_uiRtSync(long frameNumber) { - if (DEBUG) { - Log.d(TAG, String.format("%d windowPositionLost, frameNr = %d", - System.identityHashCode(this), frameNumber)); + // TODO: This is teensy bit racey in that a brand new SurfaceView moving on + // its 2nd frame if RenderThread is running slowly could potentially see + // this as false, enter the branch, get pre-empted, then this comes along + // and reports a new position, then the UI thread resumes and reports + // its position. This could therefore be de-sync'd in that interval, but + // the synchronization would violate the rule that RT must never block + // on the UI thread which would open up potential deadlocks. The risk of + // a single-frame desync is therefore preferable for now. + mRtHandlingPositionUpdates = true; + if (mRTLastReportedPosition.left == left + && mRTLastReportedPosition.top == top + && mRTLastReportedPosition.right == right + && mRTLastReportedPosition.bottom == bottom) { + return; + } + try { + if (DEBUG) { + Log.d(TAG, String.format( + "%d updateSurfacePosition RenderWorker, frameNr = %d, " + + "postion = [%d, %d, %d, %d]", + System.identityHashCode(this), frameNumber, + left, top, right, bottom)); + } + mRTLastReportedPosition.set(left, top, right, bottom); + setParentSpaceRectangle(mRTLastReportedPosition, frameNumber); + // Now overwrite mRTLastReportedPosition with our values + } catch (Exception ex) { + Log.e(TAG, "Exception from repositionChild", ex); + } } - mRTLastReportedPosition.setEmpty(); - if (mSurfaceControl == null) { - return; - } - if (mRtHandlingPositionUpdates) { - mRtHandlingPositionUpdates = false; - // This callback will happen while the UI thread is blocked, so we can - // safely access other member variables at this time. - // So do what the UI thread would have done if RT wasn't handling position - // updates. - if (!mScreenRect.isEmpty() && !mScreenRect.equals(mRTLastReportedPosition)) { - try { - if (DEBUG) Log.d(TAG, String.format("%d updateSurfacePosition, " + - "postion = [%d, %d, %d, %d]", System.identityHashCode(this), - mScreenRect.left, mScreenRect.top, - mScreenRect.right, mScreenRect.bottom)); - setParentSpaceRectangle(mScreenRect, frameNumber); - } catch (Exception ex) { - Log.e(TAG, "Exception configuring surface", ex); + @Override + public void positionLost(long frameNumber) { + if (DEBUG) { + Log.d(TAG, String.format("%d windowPositionLost, frameNr = %d", + System.identityHashCode(this), frameNumber)); + } + mRTLastReportedPosition.setEmpty(); + + if (mSurfaceControl == null) { + return; + } + if (mRtHandlingPositionUpdates) { + mRtHandlingPositionUpdates = false; + // This callback will happen while the UI thread is blocked, so we can + // safely access other member variables at this time. + // So do what the UI thread would have done if RT wasn't handling position + // updates. + if (!mScreenRect.isEmpty() && !mScreenRect.equals(mRTLastReportedPosition)) { + try { + if (DEBUG) { + Log.d(TAG, String.format("%d updateSurfacePosition, " + + "postion = [%d, %d, %d, %d]", + System.identityHashCode(this), + mScreenRect.left, mScreenRect.top, + mScreenRect.right, mScreenRect.bottom)); + } + setParentSpaceRectangle(mScreenRect, frameNumber); + } catch (Exception ex) { + Log.e(TAG, "Exception configuring surface", ex); + } } } } - } + }; private SurfaceHolder.Callback[] getSurfaceCallbacks() { SurfaceHolder.Callback callbacks[]; diff --git a/core/java/android/view/ThreadedRenderer.java b/core/java/android/view/ThreadedRenderer.java index 6737839993ed..42690cef9da3 100644 --- a/core/java/android/view/ThreadedRenderer.java +++ b/core/java/android/view/ThreadedRenderer.java @@ -25,7 +25,6 @@ import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.Point; import android.graphics.Rect; -import android.graphics.drawable.AnimatedVectorDrawable; import android.os.IBinder; import android.os.ParcelFileDescriptor; import android.os.RemoteException; @@ -914,8 +913,7 @@ public final class ThreadedRenderer { nRegisterAnimatingRenderNode(mRootNode.mNativeRenderNode, animator.mNativeRenderNode); } - void registerVectorDrawableAnimator( - AnimatedVectorDrawable.VectorDrawableAnimatorRT animator) { + void registerVectorDrawableAnimator(NativeVectorDrawableAnimator animator) { nRegisterVectorDrawableAnimator(mRootNode.mNativeRenderNode, animator.getAnimatorNativePtr()); } @@ -976,6 +974,25 @@ public final class ThreadedRenderer { } } + /** The root of everything */ + public @NonNull RenderNode getRootNode() { + return mRootNode; + } + + private boolean mForceDark = false; + + /** + * Whether or not the force-dark feature should be used for this renderer. + */ + public boolean setForceDark(boolean enable) { + if (mForceDark != enable) { + mForceDark = enable; + nSetForceDark(mNativeProxy, enable); + return true; + } + return false; + } + /** * Basic synchronous renderer. Currently only used to render the Magnifier, so use with care. * TODO: deduplicate against ThreadedRenderer. @@ -1255,4 +1272,5 @@ public final class ThreadedRenderer { private static native void nSetIsolatedProcess(boolean enabled); private static native void nSetContextPriority(int priority); private static native void nAllocateBuffers(long nativeProxy, Surface window); + private static native void nSetForceDark(long nativeProxy, boolean enabled); } diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index f4be9f2d7949..78e6dd8fb139 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -4864,7 +4864,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, setOverScrollMode(OVER_SCROLL_IF_CONTENT_SCROLLS); mUserPaddingStart = UNDEFINED_PADDING; mUserPaddingEnd = UNDEFINED_PADDING; - mRenderNode = RenderNode.create(getClass().getName(), this); + mRenderNode = RenderNode.create(getClass().getName(), new ViewAnimationHostBridge(this)); if (!sCompatibilityDone && context != null) { final int targetSdkVersion = context.getApplicationInfo().targetSdkVersion; @@ -5732,7 +5732,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, @UnsupportedAppUsage View() { mResources = null; - mRenderNode = RenderNode.create(getClass().getName(), this); + mRenderNode = RenderNode.create(getClass().getName(), new ViewAnimationHostBridge(this)); } final boolean debugDraw() { @@ -15255,6 +15255,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * a value of 'true' will not override any 'false' value in its parent chain nor will * it prevent any 'false' in any of its children. * + * The default behavior of force dark is also influenced by the Theme's + * {@link android.R.styleable#Theme_isLightTheme isLightTheme} attribute. + * If a theme is isLightTheme="false", then force dark is globally disabled for that theme. + * * @param allow Whether or not to allow force dark. * * @hide @@ -20600,7 +20604,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, */ private RenderNode getDrawableRenderNode(Drawable drawable, RenderNode renderNode) { if (renderNode == null) { - renderNode = RenderNode.create(drawable.getClass().getName(), this); + renderNode = RenderNode.create(drawable.getClass().getName(), + new ViewAnimationHostBridge(this)); renderNode.setUsageHint(RenderNode.USAGE_BACKGROUND); } diff --git a/core/java/android/view/ViewAnimationHostBridge.java b/core/java/android/view/ViewAnimationHostBridge.java new file mode 100644 index 000000000000..58f555dfa305 --- /dev/null +++ b/core/java/android/view/ViewAnimationHostBridge.java @@ -0,0 +1,48 @@ +/* + * 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 android.view; + +/** + * Maps a View to a RenderNode's AnimationHost + * + * @hide + */ +public class ViewAnimationHostBridge implements RenderNode.AnimationHost { + private final View mView; + + /** + * @param view the View to bridge to an AnimationHost + */ + public ViewAnimationHostBridge(View view) { + mView = view; + } + + @Override + public void registerAnimatingRenderNode(RenderNode animator) { + mView.mAttachInfo.mViewRootImpl.registerAnimatingRenderNode(animator); + } + + @Override + public void registerVectorDrawableAnimator(NativeVectorDrawableAnimator animator) { + mView.mAttachInfo.mViewRootImpl.registerVectorDrawableAnimator(animator); + } + + @Override + public boolean isAttached() { + return mView.mAttachInfo != null; + } +} diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 9be9ed04d049..bef8e8fedfdf 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -43,6 +43,7 @@ import android.content.pm.PackageManager; import android.content.res.CompatibilityInfo; import android.content.res.Configuration; import android.content.res.Resources; +import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Matrix; @@ -52,7 +53,6 @@ import android.graphics.PointF; import android.graphics.PorterDuff; import android.graphics.Rect; import android.graphics.Region; -import android.graphics.drawable.AnimatedVectorDrawable; import android.graphics.drawable.Drawable; import android.hardware.display.DisplayManager; import android.hardware.display.DisplayManager.DisplayListener; @@ -991,6 +991,9 @@ public final class ViewRootImpl implements ViewParent, ThreadedRenderer.invokeFunctor(functor, waitForCompletion); } + /** + * @param animator animator to register with the hardware renderer + */ public void registerAnimatingRenderNode(RenderNode animator) { if (mAttachInfo.mThreadedRenderer != null) { mAttachInfo.mThreadedRenderer.registerAnimatingRenderNode(animator); @@ -1002,8 +1005,10 @@ public final class ViewRootImpl implements ViewParent, } } - public void registerVectorDrawableAnimator( - AnimatedVectorDrawable.VectorDrawableAnimatorRT animator) { + /** + * @param animator animator to register with the hardware renderer + */ + public void registerVectorDrawableAnimator(NativeVectorDrawableAnimator animator) { if (mAttachInfo.mThreadedRenderer != null) { mAttachInfo.mThreadedRenderer.registerVectorDrawableAnimator(animator); } @@ -1073,6 +1078,7 @@ public final class ViewRootImpl implements ViewParent, mAttachInfo.mThreadedRenderer = ThreadedRenderer.create(mContext, translucent, attrs.getTitle().toString()); mAttachInfo.mThreadedRenderer.setWideGamut(wideGamut); + updateForceDarkMode(); if (mAttachInfo.mThreadedRenderer != null) { mAttachInfo.mHardwareAccelerated = mAttachInfo.mHardwareAccelerationRequested = true; @@ -1081,6 +1087,27 @@ public final class ViewRootImpl implements ViewParent, } } + private int getNightMode() { + return mContext.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK; + } + + private void updateForceDarkMode() { + if (mAttachInfo.mThreadedRenderer == null) return; + + boolean nightMode = getNightMode() == Configuration.UI_MODE_NIGHT_YES; + TypedArray a = mContext.obtainStyledAttributes(R.styleable.Theme); + boolean isLightTheme = a.getBoolean(R.styleable.Theme_isLightTheme, false); + a.recycle(); + + boolean changed = mAttachInfo.mThreadedRenderer.setForceDark(nightMode); + changed |= mAttachInfo.mThreadedRenderer.getRootNode().setAllowForceDark(isLightTheme); + + if (changed) { + // TODO: Don't require regenerating all display lists to apply this setting + invalidateWorld(mView); + } + } + @UnsupportedAppUsage public View getView() { return mView; @@ -4073,6 +4100,8 @@ public final class ViewRootImpl implements ViewParent, mForceNextWindowRelayout = true; requestLayout(); } + + updateForceDarkMode(); } /** diff --git a/core/java/android/view/inputmethod/InputMethod.java b/core/java/android/view/inputmethod/InputMethod.java index e1600c4a92c8..d09323d3f8ad 100644 --- a/core/java/android/view/inputmethod/InputMethod.java +++ b/core/java/android/view/inputmethod/InputMethod.java @@ -124,7 +124,8 @@ public interface InputMethod { * @hide */ @MainThread - public void updateInputMethodDisplay(int displayId); + default void updateInputMethodDisplay(int displayId) { + } /** * Bind a new application environment in to the input method, so that it diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index bbfac440d414..f95b3ce98264 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -321,6 +321,12 @@ import java.util.function.Supplier; * @attr ref android.R.styleable#TextView_autoSizeMaxTextSize * @attr ref android.R.styleable#TextView_autoSizeStepGranularity * @attr ref android.R.styleable#TextView_autoSizePresetSizes + * @attr ref android.R.styleable#TextView_textCursorDrawable + * @attr ref android.R.styleable#TextView_textSelectHandle + * @attr ref android.R.styleable#TextView_textSelectHandleLeft + * @attr ref android.R.styleable#TextView_textSelectHandleRight + * @attr ref android.R.styleable#TextView_allowUndo + * @attr ref android.R.styleable#TextView_enabled */ @RemoteView public class TextView extends View implements ViewTreeObserver.OnPreDrawListener { diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index 31f13c33c167..33b9ff7cee4f 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -337,6 +337,9 @@ public class BatteryStatsImpl extends BatteryStats { private final PlatformIdleStateCallback mPlatformIdleStateCallback; + /** + * This handler is running on {@link BackgroundThread}. + */ final class MyHandler extends Handler { public MyHandler(Looper looper) { super(looper, null, true); diff --git a/core/jni/android/opengl/util.cpp b/core/jni/android/opengl/util.cpp index b16359727e40..a45b4933a900 100644 --- a/core/jni/android/opengl/util.cpp +++ b/core/jni/android/opengl/util.cpp @@ -622,13 +622,17 @@ void util_multiplyMV(JNIEnv *env, jclass clazz, // --------------------------------------------------------------------------- +// The internal format is no longer the same as pixel format, per Table 2 in +// https://www.khronos.org/registry/OpenGL-Refpages/es3.1/html/glTexImage2D.xhtml static int checkInternalFormat(SkColorType colorType, int internalformat, int type) { switch(colorType) { case kN32_SkColorType: return (type == GL_UNSIGNED_BYTE && - internalformat == GL_RGBA) ? 0 : -1; + internalformat == GL_RGBA) || + (type == GL_UNSIGNED_BYTE && + internalformat == GL_SRGB8_ALPHA8) ? 0 : -1; case kAlpha_8_SkColorType: return (type == GL_UNSIGNED_BYTE && internalformat == GL_ALPHA) ? 0 : -1; diff --git a/core/jni/android_graphics_Canvas.cpp b/core/jni/android_graphics_Canvas.cpp index eba4c50b0855..343aef291720 100644 --- a/core/jni/android_graphics_Canvas.cpp +++ b/core/jni/android_graphics_Canvas.cpp @@ -674,7 +674,7 @@ int register_android_graphics_Canvas(JNIEnv* env) { int ret = 0; ret |= RegisterMethodsOrDie(env, "android/graphics/Canvas", gMethods, NELEM(gMethods)); ret |= RegisterMethodsOrDie(env, "android/graphics/BaseCanvas", gDrawMethods, NELEM(gDrawMethods)); - ret |= RegisterMethodsOrDie(env, "android/view/RecordingCanvas", gDrawMethods, NELEM(gDrawMethods)); + ret |= RegisterMethodsOrDie(env, "android/graphics/BaseRecordingCanvas", gDrawMethods, NELEM(gDrawMethods)); return ret; } diff --git a/core/jni/android_view_RenderNode.cpp b/core/jni/android_view_RenderNode.cpp index 0701f3e0d2ed..63b004681df9 100644 --- a/core/jni/android_view_RenderNode.cpp +++ b/core/jni/android_view_RenderNode.cpp @@ -473,8 +473,8 @@ static void android_view_RenderNode_endAllAnimators(JNIEnv* env, jobject clazz, // SurfaceView position callback // ---------------------------------------------------------------------------- -jmethodID gSurfaceViewPositionUpdateMethod; -jmethodID gSurfaceViewPositionLostMethod; +jmethodID gPositionListener_PositionChangedMethod; +jmethodID gPositionListener_PositionLostMethod; static void android_view_RenderNode_requestPositionUpdates(JNIEnv* env, jobject, jlong renderNodePtr, jobject surfaceview) { @@ -531,7 +531,7 @@ static void android_view_RenderNode_requestPositionUpdates(JNIEnv* env, jobject, return; } - env->CallVoidMethod(localref, gSurfaceViewPositionLostMethod, + env->CallVoidMethod(localref, gPositionListener_PositionLostMethod, info ? info->canvasContext.getFrameNumber() : 0); env->DeleteLocalRef(localref); } @@ -555,7 +555,7 @@ static void android_view_RenderNode_requestPositionUpdates(JNIEnv* env, jobject, env->DeleteWeakGlobalRef(mWeakRef); mWeakRef = nullptr; } else { - env->CallVoidMethod(localref, gSurfaceViewPositionUpdateMethod, + env->CallVoidMethod(localref, gPositionListener_PositionChangedMethod, frameNumber, left, top, right, bottom); env->DeleteLocalRef(localref); } @@ -588,7 +588,7 @@ static const JNINativeMethod gMethods[] = { { "nGetDebugSize", "(J)I", (void*) android_view_RenderNode_getDebugSize }, { "nAddAnimator", "(JJ)V", (void*) android_view_RenderNode_addAnimator }, { "nEndAllAnimators", "(J)V", (void*) android_view_RenderNode_endAllAnimators }, - { "nRequestPositionUpdates", "(JLandroid/view/SurfaceView;)V", (void*) android_view_RenderNode_requestPositionUpdates }, + { "nRequestPositionUpdates", "(JLandroid/view/RenderNode$PositionUpdateListener;)V", (void*) android_view_RenderNode_requestPositionUpdates }, { "nSetDisplayList", "(JJ)V", (void*) android_view_RenderNode_setDisplayList }, @@ -677,11 +677,11 @@ static const JNINativeMethod gMethods[] = { }; int register_android_view_RenderNode(JNIEnv* env) { - jclass clazz = FindClassOrDie(env, "android/view/SurfaceView"); - gSurfaceViewPositionUpdateMethod = GetMethodIDOrDie(env, clazz, - "updateSurfacePosition_renderWorker", "(JIIII)V"); - gSurfaceViewPositionLostMethod = GetMethodIDOrDie(env, clazz, - "surfacePositionLost_uiRtSync", "(J)V"); + jclass clazz = FindClassOrDie(env, "android/view/RenderNode$PositionUpdateListener"); + gPositionListener_PositionChangedMethod = GetMethodIDOrDie(env, clazz, + "positionChanged", "(JIIII)V"); + gPositionListener_PositionLostMethod = GetMethodIDOrDie(env, clazz, + "positionLost", "(J)V"); return RegisterMethodsOrDie(env, kClassPathName, gMethods, NELEM(gMethods)); } diff --git a/core/jni/android_view_ThreadedRenderer.cpp b/core/jni/android_view_ThreadedRenderer.cpp index 3c59bd1e3856..7a5b60493dcd 100644 --- a/core/jni/android_view_ThreadedRenderer.cpp +++ b/core/jni/android_view_ThreadedRenderer.cpp @@ -1064,6 +1064,12 @@ static void android_view_ThreadedRenderer_allocateBuffers(JNIEnv* env, jobject c proxy->allocateBuffers(surface); } +static void android_view_ThreadedRenderer_setForceDark(JNIEnv* env, jobject clazz, + jlong proxyPtr, jboolean enable) { + RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); + proxy->setForceDark(enable); +} + // ---------------------------------------------------------------------------- // FrameMetricsObserver // ---------------------------------------------------------------------------- @@ -1177,6 +1183,7 @@ static const JNINativeMethod gMethods[] = { { "nSetIsolatedProcess", "(Z)V", (void*)android_view_ThreadedRenderer_setIsolatedProcess }, { "nSetContextPriority", "(I)V", (void*)android_view_ThreadedRenderer_setContextPriority }, { "nAllocateBuffers", "(JLandroid/view/Surface;)V", (void*)android_view_ThreadedRenderer_allocateBuffers }, + { "nSetForceDark", "(JZ)V", (void*)android_view_ThreadedRenderer_setForceDark }, }; static JavaVM* mJvm = nullptr; diff --git a/core/proto/android/server/activitymanagerservice.proto b/core/proto/android/server/activitymanagerservice.proto index 9d5f0bcc54d9..ab50ad147107 100644 --- a/core/proto/android/server/activitymanagerservice.proto +++ b/core/proto/android/server/activitymanagerservice.proto @@ -130,6 +130,13 @@ message KeyguardControllerProto { option (.android.msg_privacy).dest = DEST_AUTOMATIC; optional bool keyguard_showing = 1; + repeated KeyguardOccludedProto keyguard_occluded_states= 2; +} + +message KeyguardOccludedProto { + option (.android.msg_privacy).dest = DEST_AUTOMATIC; + + optional int32 display_id = 1; optional bool keyguard_occluded = 2; } diff --git a/core/proto/android/server/backup_chunks_metadata.proto b/core/proto/android/server/backup_chunks_metadata.proto new file mode 100644 index 000000000000..a375f02545c5 --- /dev/null +++ b/core/proto/android/server/backup_chunks_metadata.proto @@ -0,0 +1,134 @@ +/* + * 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 + */ + +syntax = "proto2"; +package com.android.server.backup.encryption.chunk; + +option java_outer_classname = "ChunksMetadataProto"; + +// Cipher type with which the chunks are encrypted. For now we only support AES/GCM/NoPadding, but +// this is for backwards-compatibility in case we need to change the default Cipher in the future. +enum CipherType { + UNKNOWN_CIPHER_TYPE = 0; + // Chunk is prefixed with a 12-byte nonce. The tag length is 16 bytes. + AES_256_GCM = 1; +} + +// Checksum type with which the plaintext is verified. +enum ChecksumType { + UNKNOWN_CHECKSUM_TYPE = 0; + SHA_256 = 1; +} + +enum ChunkOrderingType { + CHUNK_ORDERING_TYPE_UNSPECIFIED = 0; + // The chunk ordering contains a list of the start position of each chunk in the encrypted file, + // ordered as in the plaintext file. This allows us to recreate the original plaintext file + // during decryption. We use this mode for full backups where the order of the data in the file + // is important. + EXPLICIT_STARTS = 1; + // The chunk ordering does not contain any start positions, and instead each encrypted chunk in + // the backup file is prefixed with its length. This allows us to decrypt each chunk but does + // not give any information about the order. However, we use this mode for key value backups + // where the order does not matter. + INLINE_LENGTHS = 2; +} + +// Chunk entry (for local state) +message Chunk { + // SHA-256 MAC of the plaintext of the chunk + optional bytes hash = 1; + // Number of bytes in encrypted chunk + optional int32 length = 2; +} + +// List of the chunks in the blob, along with the length of each chunk. From this is it possible to +// extract individual chunks. (i.e., start position is equal to the sum of the lengths of all +// preceding chunks.) +// +// This is local state stored on the device. It is never sent to the backup server. See +// ChunkOrdering for how the device restores the chunks in the correct order. +// Next tag : 6 +message ChunkListing { + repeated Chunk chunks = 1; + + // Cipher algorithm with which the chunks are encrypted. + optional CipherType cipher_type = 2; + + // Defines the type of chunk order used to encode the backup file on the server, so that we can + // consistently use the same type between backups. If unspecified this backup file was created + // before INLINE_LENGTHS was supported, thus assume it is EXPLICIT_STARTS. + optional ChunkOrderingType chunk_ordering_type = 5; + + // The document ID returned from Scotty server after uploading the blob associated with this + // listing. This needs to be sent when uploading new diff scripts. + optional string document_id = 3; + + // Fingerprint mixer salt used for content defined chunking. This is randomly generated for each + // package during the initial non-incremental backup and reused for incremental backups. + optional bytes fingerprint_mixer_salt = 4; +} + +// Ordering information about plaintext and checksum. This is used on restore to reconstruct the +// blob in its correct order. (The chunk order is randomized so as to give the server less +// information about which parts of the backup are changing over time.) This proto is encrypted +// before being uploaded to the server, with a key unknown to the server. +message ChunkOrdering { + // For backups where ChunksMetadata#chunk_ordering_type = EXPLICIT STARTS: + // Ordered start positions of chunks. i.e., the file is the chunk starting at this position, + // followed by the chunk starting at this position, followed by ... etc. You can compute the + // lengths of the chunks by sorting this list then looking at the start position of the next + // chunk after the chunk you care about. This is guaranteed to work as all chunks are + // represented in this list. + // + // For backups where ChunksMetadata#chunk_ordering_type = INLINE_LENGTHS: + // This field is unused. See ChunkOrderingType#INLINE_LENGTHS. + repeated int32 starts = 1 [packed = true]; + + // Checksum of plaintext content. (i.e., in correct order.) + // + // Each chunk also has a MAC, as generated by GCM, so this is NOT Mac-then-Encrypt, which has + // security implications. This is an additional checksum to verify that once the chunks have + // been reordered, that the file matches the expected plaintext. This prevents the device + // restoring garbage data in case of a mismatch between the ChunkOrdering and the backup blob. + optional bytes checksum = 2; +} + +// Additional metadata about a backup blob that needs to be synced to the server. This is used on +// restore to reconstruct the blob in its correct order. (The chunk order is randomized so as to +// give the server less information about which parts of the backup are changing over time.) This +// data structure is only ever uploaded to the server encrypted with a key unknown to the server. +// Next tag : 6 +message ChunksMetadata { + // Cipher algorithm with which the chunk listing and chunks are encrypted. + optional CipherType cipher_type = 1; + + // Defines the type of chunk order this metadata contains. If unspecified this backup file was + // created before INLINE_LENGTHS was supported, thus assume it is EXPLICIT_STARTS. + optional ChunkOrderingType chunk_ordering_type = 5 + [default = CHUNK_ORDERING_TYPE_UNSPECIFIED]; + + // Encrypted bytes of ChunkOrdering + optional bytes chunk_ordering = 2; + + // The type of algorithm used for the checksum of the plaintext. (See ChunkOrdering.) This is + // for forwards compatibility in case we change the algorithm in the future. For now, always + // SHA-256. + optional ChecksumType checksum_type = 3; + + // This used to be the plaintext tertiary key. No longer used. + reserved 4; +}
\ No newline at end of file diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 5a1f2e8d870c..85a52d5f714f 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -4144,6 +4144,10 @@ <permission android:name="android.permission.MONITOR_DEFAULT_SMS_PACKAGE" android:protectionLevel="signature" /> + <!-- A subclass of {@link android.app.SmsAppService} must be protected with this permission. --> + <permission android:name="android.permission.BIND_SMS_APP_SERVICE" + android:protectionLevel="signature" /> + <application android:process="system" android:persistent="true" android:hasCode="false" @@ -4459,14 +4463,6 @@ android:permission="android.permission.LOCATION_HARDWARE" android:exported="false" /> - <service android:name="com.android.internal.backup.LocalTransportService" - android:permission="android.permission.CONFIRM_FULL_BACKUP" - android:exported="false"> - <intent-filter> - <action android:name="android.backup.TRANSPORT_HOST" /> - </intent-filter> - </service> - <service android:name="com.android.server.MountServiceIdler" android:exported="true" android:permission="android.permission.BIND_JOB_SERVICE" > diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index 3b124dabed88..5028150edda2 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Nie herken nie"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Vingerafdruk is gestaaf"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Gesig is gestaaf"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Gesig is gestaaf; druk asseblief bevestig"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Vingerafdrukhardeware is nie beskikbaar nie."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Vingerafdruk kan nie gestoor word nie. Verwyder asseblief \'n bestaande vingerafdruk."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Vingerafdrukuittelling is bereik. Probeer weer."</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Gesiguittelling is bereik. Probeer weer."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Gesig kan nie geberg word nie."</string> <string name="face_error_canceled" msgid="283945501061931023">"Gesighandeling is gekanselleer."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Gesigstawing is deur gebruiker gekanselleer."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Te veel pogings. Probeer later weer."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Te veel pogings. Gesigstawingsensor is gedeaktiveer."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Probeer weer."</string> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index 3cd1b5024d20..217d6317c328 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"አልታወቀም"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"የጣት አሻራ ትክክለኛነት ተረጋግጧል"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"ፊት ተረጋግጧል"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"ፊት ተረጋግጧል፣ እባክዎ አረጋግጥን ይጫኑ"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"የጣት አሻራ ሃርድዌር አይገኝም።"</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"የጣት አሻራ ሊከማች አይችልም። እባክዎ አሁን ያለውን የጣት አሻራ ያስወግዱ።"</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"የጣት አሻራ ማብቂያ ጊዜ ደርሷል። እንደገና ይሞክሩ።"</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"የፊት ማብቂያ ጊዜ ደርሷል። እንደገና ይሞክሩ።"</string> <string name="face_error_no_space" msgid="8224993703466381314">"ፊት ሊከማች አይችልም።"</string> <string name="face_error_canceled" msgid="283945501061931023">"የፊት ሥርዓተ ክወና ተሰርዟል።"</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"ፊትን ማረጋገጥ በተጠቃሚ ተሰርዟል።"</string> <string name="face_error_lockout" msgid="3407426963155388504">"ከልክ በላይ ብዙ ሙከራዎች። በኋላ ላይ እንደገና ይሞክሩ።"</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"በጣም ብዙ ሙከራዎች። የፊት ማረጋገጫ ተሰናክሏል።"</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"እንደገና ይሞክሩ።"</string> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index cf3b0351959e..c11279a428e3 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -540,10 +540,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"لم يتم التعرف عليها."</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"تم مصادقة بصمة الإصبع"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"تمّت مصادقة الوجه"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"تمّت مصادقة الوجه، يُرجى الضغط على \"تأكيد\"."</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"جهاز بصمة الإصبع غير متاح."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"يتعذر تخزين بصمة الإصبع؛ يرجى إزالة إحدى البصمات المخزنة."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"تم بلوغ مهلة إدخال بصمة الإصبع. أعد المحاولة."</string> @@ -580,8 +578,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"انتهت مهلة التعرُّف على الوجه. أعِد المحاولة."</string> <string name="face_error_no_space" msgid="8224993703466381314">"يتعذَّر حفظ الوجه."</string> <string name="face_error_canceled" msgid="283945501061931023">"تمّ إلغاء عملية مصادقة الوجه."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"ألغَى المستخدم مصادقة الوجه."</string> <string name="face_error_lockout" msgid="3407426963155388504">"تمّ إجراء محاولات كثيرة. أعِد المحاولة لاحقًا."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"تمّ إجراء محاولات كثيرة. ميزة مصادقة الوجه متوقفة."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"يُرجى إعادة المحاولة."</string> diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml index 997486778665..5a0a7ec253a0 100644 --- a/core/res/res/values-as/strings.xml +++ b/core/res/res/values-as/strings.xml @@ -312,7 +312,7 @@ <string name="permgrouprequest_visual" msgid="6907523945030290376">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ক আপোনাৰ ফট’ আৰু ভিডিঅ’সমূহ এক্সেছ কৰিবলৈ দিবনে?"</string> <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ৱিণ্ড\' সমল বিচাৰি উলিয়াওক"</string> <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"আপুনি যোগাযোগ কৰি থকা ৱিণ্ড\'খনৰ সমল পৰীক্ষা কৰক।"</string> - <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"স্পৰ্শৰদ্বাৰা অন্বেষণ কৰাৰ সুবিধা অন কৰক"</string> + <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"স্পৰ্শৰ দ্বাৰা অন্বেষণ কৰাৰ সুবিধা অন কৰক"</string> <string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"টেপ কৰা বস্তুসমূহ ডাঙৰকৈ কোৱা হ\'ব আৰু আঙুলিৰ স্পৰ্শেৰে নিৰ্দেশ দি স্ক্ৰীণ অন্বেষণ কৰিব পাৰিব।"</string> <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"আপুনি লিখা পাঠ নিৰীক্ষণ কৰক"</string> <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"ক্ৰেডিট কাৰ্ডৰ নম্বৰ আৰু পাছৱৰ্ডৰ দৰে ব্যক্তিগত ডেটা অন্তৰ্ভুক্ত হ\'ব পাৰে।"</string> @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"চিনাক্ত কৰিব পৰা নাই"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"ফিংগাৰপ্ৰিণ্টৰ সত্যাপন কৰা হ’ল"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"মুখমণ্ডলৰ বিশ্বাসযোগ্যতা প্ৰমাণীকৰণ কৰা হ\'ল"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"মুখমণ্ডলৰ বিশ্বাসযোগ্যতা প্ৰমাণীকৰণ কৰা হ\'ল, অনুগ্ৰহ কৰি ‘নিশ্চিত কৰক’ বুটামটো টিপক"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"ফিংগাৰপ্ৰিণ্ট হাৰ্ডৱেৰ নাই।"</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"ফিংগাৰপ্ৰিণ্ট সঞ্চয় কৰিব পৰা নগ\'ল। পূর্বে সঞ্চিত ফিংগাৰপ্ৰিণ্ট এটা আঁতৰাওক।"</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"ফিংগাৰপ্ৰিণ্ট গ্ৰহণৰ সময়সীমা উকলি গৈছে। আকৌ চেষ্টা কৰক।"</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"মুখমণ্ডল গ্ৰহণৰ সময়সীমা উকলি গৈছে। আকৌ চেষ্টা কৰক।"</string> <string name="face_error_no_space" msgid="8224993703466381314">"মুখমণ্ডল সঞ্চয় কৰিব নোৱাৰি।"</string> <string name="face_error_canceled" msgid="283945501061931023">"মুখমণ্ডলৰ প্ৰক্ৰিয়া বাতিল কৰা হ’ল।"</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"ব্যৱহাৰকাৰীয়ে মুখমণ্ডলৰ বিশ্বাসযোগ্যতা প্ৰমাণীকৰণ বাতিল কৰিছে।"</string> <string name="face_error_lockout" msgid="3407426963155388504">"অত্যধিক ভুল প্ৰয়াস। কিছুসময়ৰ পাছত আকৌ চেষ্টা কৰক।"</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"অত্যধিক প্ৰয়াস। মুখমণ্ডলৰ জৰিয়তে সত্যাপন অক্ষম কৰা হ’ল।"</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"আকৌ চেষ্টা কৰক।"</string> diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml index 3236b5237c8e..af65bbbf35e8 100644 --- a/core/res/res/values-az/strings.xml +++ b/core/res/res/values-az/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Tanınmır"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Barmaq izi doğrulandı"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Üz doğrulandı"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Üz təsdiq edildi, təsdiq düyməsinə basın"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Barmaq izi üçün avadanlıq yoxdur."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Barmaq izi saxlana bilməz. Lütfən, mövcud barmaq izini silin."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Barmaq izinin vaxtı başa çatdı. Yenidən cəhd edin."</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Üz proqramı taymerinin vaxtı bitdi. Yenidən cəhd edin."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Üz bərpa edilmədi."</string> <string name="face_error_canceled" msgid="283945501061931023">"Üz əməliyyatı ləğv edildi."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Üz dorğulaması istifadəçi tərəfindən ləğv edildi."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Həddindən çox cəhd. Sonraya saxlayın."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Həddindən çox cəhd. Üz identifikasiyası deaktiv edildi."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Yenidən cəhd edin."</string> diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml index 2bbf9b276349..805082a1785e 100644 --- a/core/res/res/values-b+sr+Latn/strings.xml +++ b/core/res/res/values-b+sr+Latn/strings.xml @@ -531,10 +531,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Nije prepoznato"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Otisak prsta je potvrđen"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Lice je potvrđeno"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Lice je potvrđeno. Pritisnite Potvrdi"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardver za otiske prstiju nije dostupan."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Nije moguće sačuvati otisak prsta. Uklonite neki od postojećih otisaka prstiju."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Vremensko ograničenje za otisak prsta je isteklo. Probajte ponovo."</string> @@ -571,8 +569,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Isteklo je vreme za proveru lica. Probajte ponovo."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Nije moguće sačuvati lice."</string> <string name="face_error_canceled" msgid="283945501061931023">"Obrada lica je otkazana."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Korisnik je otkazao potvrdu lica."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Previše pokušaja. Probajte ponovo kasnije."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Više pokušaja. Potvrda identiteta je onemogućena."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Probajte ponovo."</string> diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml index 0ec976fedef6..7692220c70dc 100644 --- a/core/res/res/values-be/strings.xml +++ b/core/res/res/values-be/strings.xml @@ -534,10 +534,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Не распазнана"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Адбітак пальца распазнаны"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Твар распазнаны"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Твар распазнаны. Націсніце, каб пацвердзіць"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Апаратныя сродкі адбіткаў пальцаў недаступныя."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Адбіткі пальцаў нельга захаваць. Выдаліце існы адбітак."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Час чакання адбіткаў пальцаў выйшаў. Паспрабуйце яшчэ раз."</string> @@ -574,8 +572,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Час чакання твару выйшаў. Паўтарыце спробу."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Не ўдалося захаваць твар."</string> <string name="face_error_canceled" msgid="283945501061931023">"Распазнаванне твару скасавана."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Распазнаванне твару скасавана карыстальнікам."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Занадта шмат спроб. Паўтарыце спробу пазней."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Занадта шмат спроб. Аўтэнтыфікацыя твару адключана"</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Паўтарыце спробу."</string> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index 3af930f6db4d..33c489839002 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Не е разпознато"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Отпечатъкът е удостоверен"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Лицето е удостоверено"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Лицето е удостоверено. Моля, натиснете „Потвърждаване“"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Хардуерът за отпечатъци не е налице."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Отпечатъкът не може да бъде съхранен. Моля, премахнете съществуващ."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Времето за изчакване за отпечатък изтече. Опитайте отново."</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Времето за изчакване изтече. Опитайте отново."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Лицето не може да бъде съхранено."</string> <string name="face_error_canceled" msgid="283945501061931023">"Операцията с лице е анулирана."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Удостоверяв. на лицето е анулирано от потребителя."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Твърде много опити. Опитайте отново по-късно."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Твърде много опити. Удост. с лице е деактивирано."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Опитайте отново."</string> diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml index 301bcc07876f..f0787b44a5b2 100644 --- a/core/res/res/values-bn/strings.xml +++ b/core/res/res/values-bn/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"স্বীকৃত নয়"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"আঙ্গুলের ছাপ যাচাই করা হয়েছে"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"ফেস যাচাই করা হয়েছে"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"ফেস যাচাই করা হয়েছে, \'কনফার্ম করুন\' বোতাম প্রেস করুন"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"আঙ্গুলের ছাপ নেওয়ার হার্ডওয়্যার অনুপলব্ধ৷"</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"আঙ্গুলের ছাপ সংরক্ষণ করা যাবে না৷ অনুগ্রহ করে একটি বিদ্যমান আঙ্গুলের ছাপ সরান৷"</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"আঙ্গুলের ছাপ নেওয়ার সময়সীমা শেষ হযেছে৷ আবার চেষ্টা করুন৷"</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"ফেসের ছাপ নেওয়ার সময়সীমা শেষ৷ আবার চেষ্টা করুন৷"</string> <string name="face_error_no_space" msgid="8224993703466381314">"ফেস স্টোর করা যাবে না।"</string> <string name="face_error_canceled" msgid="283945501061931023">"ফেস অপারেশন বাতিল করা হয়েছে৷"</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"ফেস যাচাইকরণ ব্যবহারকারীর দ্বারা বাতিল করা হয়েছে।"</string> <string name="face_error_lockout" msgid="3407426963155388504">"অনেকবার চেষ্টা করা হয়েছে। পরে আবার চেষ্টা করুন।"</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"অনেকবার চেষ্টা করা হয়েছে৷ ফেস যাচাইকরণ বন্ধ আছে।"</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"আবার চেষ্টা করুন।"</string> diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml index e6fde5b1f3bc..e210d90e4c2b 100644 --- a/core/res/res/values-bs/strings.xml +++ b/core/res/res/values-bs/strings.xml @@ -531,10 +531,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Nije prepoznato"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Otisak prsta je potvrđen"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Lice je provjereno"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Lice je provjereno, pritisnite dugme za potvrdu"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardver za otisak prsta nije dostupan."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Otisak prsta se ne može pohraniti. Uklonite postojeći otisak prsta."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Vrijeme za prepoznavanje otiska prsta je isteklo. Pokušajte ponovo."</string> @@ -571,8 +569,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Vrijeme za prepoznavanje lica je isteklo. Pokušajte ponovo."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Nije moguće pohraniti lice."</string> <string name="face_error_canceled" msgid="283945501061931023">"Prepoznavanje lica je otkazano."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Korisnik je otkazao provjeru lica."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Previše pokušaja. Pokušajte ponovo kasnije."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Previše pokušaja. Autentifikacija lica onemogućena."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Pokušajte ponovo."</string> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index 9318715935e5..b1d4994080c0 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"No s\'ha reconegut"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"L\'empremta digital s\'ha autenticat"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Cara autenticada"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Cara autenticada; prem el botó per confirmar"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"El maquinari per a empremtes digitals no està disponible."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"L\'empremta digital no es pot desar. Suprimeix-ne una."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"S\'ha esgotat el temps d\'espera per a l\'empremta digital. Torna-ho a provar."</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"S\'ha esgotat el temps d\'espera. Torna-ho a provar."</string> <string name="face_error_no_space" msgid="8224993703466381314">"La cara no es pot desar."</string> <string name="face_error_canceled" msgid="283945501061931023">"S\'ha cancel·lat el reconeixement facial."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Autenticació facial cancel·lada per l\'usuari."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Massa intents. Torna-ho a provar més tard."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Massa intents. Autenticació facial desactivada."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Torna-ho a provar."</string> @@ -814,8 +811,8 @@ <string name="lockscreen_missing_sim_instructions_long" msgid="3526573099019319472">"Falta la targeta SIM o no es pot llegir. Insereix-ne una."</string> <string name="lockscreen_permanent_disabled_sim_message_short" msgid="5096149665138916184">"Targeta SIM no utilitzable."</string> <string name="lockscreen_permanent_disabled_sim_instructions" msgid="910904643433151371">"La targeta SIM està desactivada permanentment.\n Contacta amb el teu proveïdor de serveis sense fil per obtenir-ne una altra."</string> - <string name="lockscreen_transport_prev_description" msgid="6300840251218161534">"Ruta anterior"</string> - <string name="lockscreen_transport_next_description" msgid="573285210424377338">"Ruta següent"</string> + <string name="lockscreen_transport_prev_description" msgid="6300840251218161534">"Pista anterior"</string> + <string name="lockscreen_transport_next_description" msgid="573285210424377338">"Pista següent"</string> <string name="lockscreen_transport_pause_description" msgid="3980308465056173363">"Posa en pausa"</string> <string name="lockscreen_transport_play_description" msgid="1901258823643886401">"Reprodueix"</string> <string name="lockscreen_transport_stop_description" msgid="5907083260651210034">"Atura"</string> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index 45c57d0007d4..a537d6d2f9ca 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -534,10 +534,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Nerozpoznáno"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Otisk byl ověřen"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Obličej byl ověřen"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Obličej byl ověřen, stiskněte tlačítko pro potvrzení"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Není k dispozici hardware ke snímání otisků prstů."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Otisk prstu nelze uložit. Odstraňte existující otisk prstu."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Časový limit sejmutí otisku prstu vypršel. Zkuste to znovu."</string> @@ -574,8 +572,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Limit ověření obličeje vypršel. Zkuste to znovu."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Obličej nelze uložit."</string> <string name="face_error_canceled" msgid="283945501061931023">"Operace snímání obličeje byla zrušena."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Ověření obličeje bylo zrušeno uživatelem."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Příliš mnoho pokusů. Zkuste to později."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Příliš mnoho pokusů. Ověření obličeje je zakázáno."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Zkuste to znovu."</string> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index f279f0bb650d..28c08b151b12 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Ikke genkendt"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Fingeraftrykket blev godkendt"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Ansigtet er godkendt"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Ansigtet er godkendt. Tryk på Bekræft."</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardwaren til fingeraftryk er ikke tilgængelig."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Fingeraftrykket kan ikke gemmes. Fjern et eksisterende fingeraftryk."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Registrering af fingeraftryk fik timeout. Prøv igen."</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Ansigtsgenkendelse fik timeout. Prøv igen."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Ansigtet kan ikke gemmes."</string> <string name="face_error_canceled" msgid="283945501061931023">"Ansigtshandlingen blev annulleret."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Ansigtsgodkendelsen blev annulleret af brugeren."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Du har prøvet for mange gange. Prøv igen senere."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"For mange forsøg – Ansigtsgenkendelse deaktiveret."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Prøv igen."</string> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 7ec4401180db..4a2efbda2700 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Nicht erkannt"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Fingerabdruck wurde authentifiziert"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Gesicht authentifiziert"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Gesicht authentifiziert, bitte bestätigen"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Fingerabdruckhardware nicht verfügbar"</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Fingerabdruck kann nicht gespeichert werden. Entferne einen vorhandenen Fingerabdruck."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Zeitüberschreitung für Fingerabdruck. Bitte versuche es noch einmal."</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Zeitüberschreitung für Gesicht. Versuch es erneut."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Gesicht kann nicht gespeichert werden."</string> <string name="face_error_canceled" msgid="283945501061931023">"Gesichtserkennung abgebrochen."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Gesichtsauthentifizierung vom Nutzer abgebrochen."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Zu viele Versuche. Versuch es später noch einmal."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Zu viele Versuche. Gesichtserkennung deaktiviert."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Versuch es noch einmal."</string> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index f2309e84b71b..04b9749852fd 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Δεν αναγνωρίστηκε"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Η ταυτότητα του δακτυλικού αποτυπώματος ελέγχθηκε"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Έγινε έλεγχος ταυτότητας προσώπου"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Έγινε έλεγχος ταυτότητας προσώπου, πατήστε \"Επιβεβαίωση\""</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Ο εξοπλισμός μοναδικού χαρακτηριστικού δεν είναι διαθέσιμος."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Δεν είναι δυνατή η αποθήκευση μοναδικού χαρακτηριστικού. Καταργήστε το υπάρχον μοναδικό χαρακτηριστικό."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Λήξη χρονικού ορίου μοναδικού χαρακτηριστικού. Δοκιμάστε ξανά."</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Λήξη χρονικού ορίου προσώπου. Δοκιμάστε ξανά."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Δεν είναι δυνατή η αποθήκευση του προσώπου."</string> <string name="face_error_canceled" msgid="283945501061931023">"Η ενέργεια προσώπου ακυρώθηκε."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Ο έλεγχος ταυτότητας προσώπου ακυρώθηκε από τον χρήστη."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Πάρα πολλές προσπάθειες. Δοκιμάστε ξανά αργότερα."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Πολλές προσπάθειες. Αποτυχία ελέγ. ταυτ. προσώπου."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Δοκιμάστε ξανά."</string> diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml index 1eeb1c33c4e0..85923550bc30 100644 --- a/core/res/res/values-en-rAU/strings.xml +++ b/core/res/res/values-en-rAU/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Not recognised"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Fingerprint authenticated"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Face authenticated"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Face authenticated. Please press confirm"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Fingerprint hardware not available."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Fingerprint can\'t be stored. Please remove an existing fingerprint."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Fingerprint timeout reached. Try again."</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Face time out reached. Try again."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Face can’t be stored."</string> <string name="face_error_canceled" msgid="283945501061931023">"Face operation cancelled."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Face authentication cancelled by user."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Too many attempts. Try again later."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Too many attempts. Facial authentication disabled."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Try again."</string> diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml index 699e50f33050..1e075f8c60f8 100644 --- a/core/res/res/values-en-rCA/strings.xml +++ b/core/res/res/values-en-rCA/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Not recognised"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Fingerprint authenticated"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Face authenticated"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Face authenticated. Please press confirm"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Fingerprint hardware not available."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Fingerprint can\'t be stored. Please remove an existing fingerprint."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Fingerprint timeout reached. Try again."</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Face time out reached. Try again."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Face can’t be stored."</string> <string name="face_error_canceled" msgid="283945501061931023">"Face operation cancelled."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Face authentication cancelled by user."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Too many attempts. Try again later."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Too many attempts. Facial authentication disabled."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Try again."</string> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index 1eeb1c33c4e0..85923550bc30 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Not recognised"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Fingerprint authenticated"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Face authenticated"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Face authenticated. Please press confirm"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Fingerprint hardware not available."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Fingerprint can\'t be stored. Please remove an existing fingerprint."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Fingerprint timeout reached. Try again."</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Face time out reached. Try again."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Face can’t be stored."</string> <string name="face_error_canceled" msgid="283945501061931023">"Face operation cancelled."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Face authentication cancelled by user."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Too many attempts. Try again later."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Too many attempts. Facial authentication disabled."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Try again."</string> diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml index 1eeb1c33c4e0..85923550bc30 100644 --- a/core/res/res/values-en-rIN/strings.xml +++ b/core/res/res/values-en-rIN/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Not recognised"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Fingerprint authenticated"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Face authenticated"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Face authenticated. Please press confirm"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Fingerprint hardware not available."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Fingerprint can\'t be stored. Please remove an existing fingerprint."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Fingerprint timeout reached. Try again."</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Face time out reached. Try again."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Face can’t be stored."</string> <string name="face_error_canceled" msgid="283945501061931023">"Face operation cancelled."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Face authentication cancelled by user."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Too many attempts. Try again later."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Too many attempts. Facial authentication disabled."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Try again."</string> diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml index 63726f8dc906..91380980c5c2 100644 --- a/core/res/res/values-en-rXC/strings.xml +++ b/core/res/res/values-en-rXC/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Not recognized"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Fingerprint authenticated"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Face authenticated"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Face authenticated, please press confirm"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Fingerprint hardware not available."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Fingerprint can\'t be stored. Please remove an existing fingerprint."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Fingerprint time out reached. Try again."</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Face time out reached. Try again."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Face can’t be stored."</string> <string name="face_error_canceled" msgid="283945501061931023">"Face operation canceled."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Face authentication canceled by user."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Too many attempts. Try again later."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Too many attempts. Facial authentication disabled."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Try again."</string> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 6a49e033d811..6176b7b57d75 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"No se reconoció"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Se autenticó la huella digital"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Se autenticó el rostro"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Se autenticó el rostro; presiona Confirmar"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"El hardware para detectar huellas digitales no está disponible."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"No se puede almacenar la huella digital. Elimina una de las existentes."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Finalizó el tiempo de espera para la huella digital. Vuelve a intentarlo."</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Se agotó el tiempo. Vuelve a intentarlo."</string> <string name="face_error_no_space" msgid="8224993703466381314">"No se puede almacenar el rostro."</string> <string name="face_error_canceled" msgid="283945501061931023">"Se canceló el reconocimiento facial."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"El usuario canceló la autenticación de rostro."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Demasiados intentos. Inténtalo de nuevo más tarde."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Demasiados intentos. Autent. facial inhabilitada."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Vuelve a intentarlo."</string> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index b62f4c9b435e..dd766f765940 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"No se reconoce"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Se ha autenticado la huella digital"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Cara autenticada"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Se ha autenticado la cara, pulsa para confirmar"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"El hardware de huella digital no está disponible."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"No se puede almacenar la huella digital. Elimina una ya creada."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Se ha alcanzado el tiempo de espera de la huella digital. Vuelve a intentarlo."</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Has sobrepasado el tiempo. Inténtalo de nuevo."</string> <string name="face_error_no_space" msgid="8224993703466381314">"No se pueden registrar más caras."</string> <string name="face_error_canceled" msgid="283945501061931023">"Se ha cancelado el reconocimiento facial."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"El usuario ha cancelado la autenticación de la cara."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Demasiados intentos. Inténtalo de nuevo más tarde."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Demasiados intentos. Autent. facial inhabilitada."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Inténtalo de nuevo."</string> diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml index 8f011f859c35..650fcb662c60 100644 --- a/core/res/res/values-et/strings.xml +++ b/core/res/res/values-et/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Ei tuvastatud"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Sõrmejälg autenditi"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Nägu on autenditud"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Nägu on autenditud, vajutage käsku Kinnita"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Sõrmejälje riistvara pole saadaval."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Sõrmejälge ei saa salvestada. Eemaldage olemasolev sõrmejälg."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Sõrmejälje riistvara taimeri ajalõpp. Proovige uuesti."</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Näotuvastuse taimeri ajalõpp. Proovige uuesti."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Nägu ei saa salvestada."</string> <string name="face_error_canceled" msgid="283945501061931023">"Näotuvastuse toiming tühistati."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Kasutaja tühistas näo autentimise."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Liiga palju katseid. Proovige hiljem uuesti."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Liiga palju katseid. Näotuvastus on keelatud."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Proovige uuesti."</string> diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index a070cc523e93..6a6fdbf91038 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Ez da ezagutu"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Autentifikatu da hatz-marka"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Autentifikatu da aurpegia"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Autentifikatu da aurpegia; sakatu Berretsi"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hatz-markaren hardwarea ez dago erabilgarri."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Ezin da gorde hatz-marka digitala. Kendu lehendik gordeta duzunetako bat."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Hatz-marka digitalak prozesatzeko denbora-muga gainditu da. Saiatu berriro."</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Gainditu da aurpegiak prozesatzeko denbora-muga. Saiatu berriro."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Ezin da gorde aurpegia."</string> <string name="face_error_canceled" msgid="283945501061931023">"Utzi da aurpegiaren bidezko eragiketa."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Erabiltzaileak utzi du aurpegi-autentifikazioa."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Saiakera gehiegi egin dituzu. Saiatu berriro geroago."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Saiakera gehiegi egin dituzu. Desgaitu egin da autentifikazioa."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Saiatu berriro."</string> @@ -1139,7 +1136,7 @@ <string name="aerr_application_repeated" msgid="3146328699537439573">"Behin eta berriz gelditzen ari da <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> <string name="aerr_process_repeated" msgid="6235302956890402259">"Behin eta berriz gelditzen ari da <xliff:g id="PROCESS">%1$s</xliff:g>"</string> <string name="aerr_restart" msgid="7581308074153624475">"Ireki aplikazioa berriro"</string> - <string name="aerr_report" msgid="5371800241488400617">"Bidali iritzia"</string> + <string name="aerr_report" msgid="5371800241488400617">"Bidali oharrak"</string> <string name="aerr_close" msgid="2991640326563991340">"Itxi"</string> <string name="aerr_mute" msgid="1974781923723235953">"Ezkutatu gailua berrabiarazi arte"</string> <string name="aerr_wait" msgid="3199956902437040261">"Itxaron"</string> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index 3101b7262df0..2310f9eb3407 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"شناسایی نشد"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"اثر انگشت احراز هویت شد"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"چهره احراز هویت شد"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"چهره احراز هویت شد، لطفاً تأیید را فشار دهید"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"سختافزار اثرانگشت در دسترس نیست."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"ذخیره اثر انگشت ممکن نیست. لطفاً یک اثر انگشت موجود را حذف کنید."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"مهلت زمانی ثبت اثر انگشت به پایان رسید. دوباره امتحان کنید."</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"مهلت زمانی شناسایی چهره تمام شد. دوباره امتحان کنید"</string> <string name="face_error_no_space" msgid="8224993703466381314">"نمیتوان چهره را ذخیره کرد."</string> <string name="face_error_canceled" msgid="283945501061931023">"عملیات شناسایی چهره لغو شد."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"احراز هویت چهره توسط کاربر لغو شد."</string> <string name="face_error_lockout" msgid="3407426963155388504">"تعداد زیادی تلاش ناموفق. بعداً دوباره امتحان کنید."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"چندین تلاش ناموفق. احراز هویت با چهره غیرفعال شد."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"دوباره امتحان کنید."</string> @@ -900,7 +897,7 @@ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"ماندن در این صفحه"</string> <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>\n\nمطمئنید میخواهید این صفحه را ترک کنید؟"</string> <string name="save_password_label" msgid="6860261758665825069">"تأیید"</string> - <string name="double_tap_toast" msgid="4595046515400268881">"نکته: برای بزرگنمایی و کوچکنمایی، دو بار ضربه بزنید."</string> + <string name="double_tap_toast" msgid="4595046515400268881">"نکته: برای نزدیکنمایی و دورنمایی، دو بار ضربه بزنید."</string> <string name="autofill_this_form" msgid="4616758841157816676">"تکمیل خودکار"</string> <string name="setup_autofill" msgid="7103495070180590814">"راهاندازی تکمیل خودکار"</string> <string name="autofill_window_title" msgid="4107745526909284887">"تکمیل خودکار با <xliff:g id="SERVICENAME">%1$s</xliff:g>"</string> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index 346992f89b85..4f2531c838fb 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Ei tunnistettu"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Sormenjälki tunnistettu"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Kasvot tunnistettu"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Kasvot tunnistettu, valitse Vahvista"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Sormenjälkilaitteisto ei ole käytettävissä."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Sormenjälkeä ei voida tallentaa. Poista aiemmin lisätty sormenjälki."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Sormenjälkitunnistimen toiminta aikakatkaistiin. Yritä uudelleen."</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Kasvotoiminto aikakatkaistiin. Yritä uudelleen."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Kasvoja ei voi tallentaa."</string> <string name="face_error_canceled" msgid="283945501061931023">"Kasvotoiminto peruutettu"</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Käyttäjä peruutti kasvojentunnistuksen."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Liian monta yritystä. Yritä myöhemmin uudelleen."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Liikaa yrityksiä. Kasvojentodennus ei käytössä."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Yritä uudelleen."</string> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index 16fd62a2bedd..39889ec88b9b 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Données biométriques non reconnues"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Empreinte digitale authentifiée"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Visage authentifié"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Visage authentifié, veuillez appuyer sur le bouton Confirmer"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Matériel d\'empreinte numérique indisponible."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"L\'empreinte digitale ne peut pas être enregistrée. Veuillez supprimer une empreinte existante."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Le temps attribué pour lire l\'empreinte est écoulé. Veuillez essayer de nouveau."</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Temps de reconn. visage écoulé. Veuillez réessayer."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Impossible de stocker le visage."</string> <string name="face_error_canceled" msgid="283945501061931023">"Opération de reconnaissance du visage annulée."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Authentification du visage annulée par l\'utilisateur"</string> <string name="face_error_lockout" msgid="3407426963155388504">"Trop de tentatives. Veuillez réessayer plus tard."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Trop de tentatives. Capt. reconn. visage désactivé."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Réessayez."</string> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 76eed1f5782c..975941563ea7 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Non reconnu"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Empreinte digitale authentifiée"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Visage authentifié"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Visage authentifié, veuillez appuyer sur \"Confirmer\""</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Matériel d\'empreinte numérique indisponible."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Impossible d\'enregistrer l\'empreinte numérique. Veuillez supprimer une empreinte."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Délai de détection de l\'empreinte numérique expiré. Veuillez réessayer."</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Délai de détection du visage expiré. Réessayez."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Impossible de stocker les informations du visage."</string> <string name="face_error_canceled" msgid="283945501061931023">"Opération de reconnaissance faciale annulée."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Authentification faciale annulée par l\'utilisateur."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Trop de tentatives. Réessayez plus tard."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Trop d\'essais. Authentification faciale désactivée."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Réessayez."</string> diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml index f64491986cdb..318dd3ed7aa7 100644 --- a/core/res/res/values-gl/strings.xml +++ b/core/res/res/values-gl/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Non se recoñeceu"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Autenticouse a impresión dixital"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Autenticouse a cara"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Autenticouse a cara, preme Confirmar"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardware de impresión dixital non dispoñible."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Non se pode almacenar a impresión dixital. Elimina unha impresión dixital existente."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Esgotouse o tempo de espera da impresión dixital. Téntao de novo."</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Esgotouse o tempo de espera. Téntao de novo."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Non se puido almacenar a cara."</string> <string name="face_error_canceled" msgid="283945501061931023">"Cancelouse a operación relacionada coa cara"</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"O usuario cancelou a autenticación da cara."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Demasiados intentos. Téntao de novo máis tarde."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Demasiados intentos. Autenticación desactivada."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Téntao de novo."</string> diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml index 4ea553cb0043..13090c6bbb48 100644 --- a/core/res/res/values-gu/strings.xml +++ b/core/res/res/values-gu/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"ઓળખાયેલ નથી"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"ફિંગરપ્રિન્ટ પ્રમાણિત કરી"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"ચહેરા પ્રમાણિત"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"ચહેરા પ્રમાણિત, કૃપા કરીને કન્ફર્મ કરો"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"ફિંગરપ્રિન્ટ હાર્ડવેર ઉપલબ્ધ નથી."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"ફિંગરપ્રિન્ટ સંગ્રહિત કરી શકાતી નથી. કૃપા કરીને અસ્તિત્વમાંની ફિંગરપ્રિન્ટ દૂર કરો."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"ફિંગરપ્રિન્ટનો સમય બાહ્ય થયો. ફરી પ્રયાસ કરો."</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"ચહેરા માટેનો સમય સમાપ્ત થયો. ફરી પ્રયાસ કરો."</string> <string name="face_error_no_space" msgid="8224993703466381314">"ચહેરો સંગ્રહિત કરી શકાશે નહીં."</string> <string name="face_error_canceled" msgid="283945501061931023">"ચહેરા સંબંધિત કાર્યવાહી રદ કરવામાં આવી છે."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"વપરાશકર્તાએ ચહેરા પ્રમાણીકરણ રદ કર્યુ."</string> <string name="face_error_lockout" msgid="3407426963155388504">"ઘણા બધા પ્રયત્નો. થોડા સમય પછી ફરી પ્રયાસ કરો."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"ઘણા બધા પ્રયત્નો. ચહેરાનું પ્રમાણીકરણ બંધ કરવામાં આવ્યું છે."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"ફરી પ્રયાસ કરો."</string> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index c24b0ae0ca43..6ae25417e386 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -530,10 +530,8 @@ <!-- no translation found for biometric_not_recognized (5770511773560736082) --> <skip /> <string name="fingerprint_authenticated" msgid="5309333983002526448">"फ़िंगरप्रिंट की पुष्टि हो गई"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"चेहरे की पहचान की गई"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"चेहरा की पहचान की गई, कृपया पुष्टि बटन दबाएं"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"फ़िंगरप्रिंट हार्डवेयर उपलब्ध नहीं है."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"फ़िंगरप्रिंट को संग्रहित नहीं किया जा सका. कृपया कोई मौजूदा फ़िंगरप्रिंट निकालें."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"फ़िंगरप्रिंट का समय समाप्त हो गया. पुनः प्रयास करें."</string> @@ -570,8 +568,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"चेहरे की पहचान का समय खत्म हुआ. फिर से कोशिश करें."</string> <string name="face_error_no_space" msgid="8224993703466381314">"चेहरा सेव करने की सीमा पूरी हो गई है."</string> <string name="face_error_canceled" msgid="283945501061931023">"चेहरा पहचानने की कार्रवाई रद्द की गई."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"उपयोगकर्ता ने चेहरे की पहचान रद्द कर दी."</string> <string name="face_error_lockout" msgid="3407426963155388504">"कई बार कोशिश की गई. बाद में कोशिश करें."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"कई बार कोशिश की. चेहरा पहचानने की सुविधा बंद हुई."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"फिर से कोशिश करें."</string> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index 6a9d307070d9..839d423ea16f 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -531,10 +531,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Nije prepoznato"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Autentificirano otiskom prsta"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Lice je autentificirano"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Lice je autentificirano, pritisnite Potvrdi"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardver za otisak prsta nije dostupan."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Otisak prsta nije pohranjen. Uklonite postojeći otisak prsta."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Isteklo je vrijeme čekanja za otisak prsta. Pokušajte ponovo."</string> @@ -571,8 +569,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Isteklo je vrijeme čekanja za lice. Pokušajte opet"</string> <string name="face_error_no_space" msgid="8224993703466381314">"Nije moguće pohraniti lice."</string> <string name="face_error_canceled" msgid="283945501061931023">"Otkazana je radnja s licem."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Autentifikaciju lica otkazao je korisnik."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Previše pokušaja. Pokušajte ponovo kasnije."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Previše pokušaja. Autentifikacija lica onemogućena"</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Pokušajte ponovo."</string> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index 474c73a287f4..bc54bfa2f913 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Nem ismerhető fel"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Ujjlenyomat hitelesítve"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Arc hitelesítve"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Arc hitelesítve; nyomja meg a Megerősítés lehetőséget"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Az ujjlenyomathoz szükséges hardver nem érhető el."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Az ujjlenyomat nem tárolható. Távolítson el egy meglévő ujjlenyomatot."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Az ujjlenyomat-beolvasási műveletkor időtúllépés történt. Próbálkozzon újra."</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Időtúllépés az arcbeolvasásnál. Próbálja újra."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Az arc nem tárolható."</string> <string name="face_error_canceled" msgid="283945501061931023">"Az arccal kapcsolatos művelet törölve."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Az arc hitelesítését a felhasználó visszavonta."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Túl sok próbálkozás. Próbálja újra később."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Túl sok próbálkozás. Arcfelismerés letiltva."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Próbálkozzon újra."</string> diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml index b9e6c6263e96..4a828fa3148a 100644 --- a/core/res/res/values-hy/strings.xml +++ b/core/res/res/values-hy/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Չհաջողվեց ճանաչել"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Մատնահետքը նույնականացվեց"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Դեմքը ճանաչվեց"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Դեմքը ճանաչվեց: Սեղմեք «Հաստատել»:"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Մատնահետքի սարքն անհասանելի է:"</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Հնարավոր չէ պահել մատնահետքը: Հեռացրեք առկա մատնահետքը:"</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Մատնահետքի գրանցման ժամանակը սպառվել է: Փորձեք նորից:"</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Ժամանակը սպառվել է: Նորից փորձեք:"</string> <string name="face_error_no_space" msgid="8224993703466381314">"Դեմքը հնարավոր չէ պահել։"</string> <string name="face_error_canceled" msgid="283945501061931023">"Դեմքի ճանաչումը չեղարկվել է։"</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Դեմքի ճանաչումը չեղարկվել է օգտատիրոջ կողմից:"</string> <string name="face_error_lockout" msgid="3407426963155388504">"Չափից շատ փորձեր եք կատարել: Փորձեք ավելի ուշ:"</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Չափից շատ փորձեր եք կատարել: Դեմքի ճանաչման գործառույթն անջատվել է։"</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Նորից փորձեք:"</string> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index 8298a18eae03..167082db7a01 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Tidak dikenali"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Sidik jari diautentikasi"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Wajah diautentikasi"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Wajah diautentikasi, silakan tekan konfirmasi"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardware sidik jari tidak tersedia."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Sidik jari tidak dapat disimpan. Hapus sidik jari yang ada."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Waktu sidik jari habis. Coba lagi."</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Waktu tunggu wajah habis. Harap coba lagi."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Wajah tidak dapat disimpan."</string> <string name="face_error_canceled" msgid="283945501061931023">"Pemrosesan wajah dibatalkan."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Autentikasi wajah dibatalkan oleh pengguna."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Terlalu banyak percobaan. Coba lagi nanti."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Terlalu sering dicoba. Autentikasi wajah dinonaktifkan."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Coba lagi."</string> diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml index 2649a1a05b1f..0c7e6b8ed5fd 100644 --- a/core/res/res/values-is/strings.xml +++ b/core/res/res/values-is/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Þekktist ekki"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Fingrafar staðfest"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Andlit staðfest"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Andlit staðfest, ýttu til að staðfesta"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Fingrafarsvélbúnaður ekki til staðar."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Ekki er hægt að vista fingrafarið. Fjarlægðu eitthvert af fingraförunum sem fyrir eru."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Tímamörk runnu út fyrir fingrafar. Reyndu aftur."</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Tímamörk runnu út fyrir andlit. Reyndu aftur."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Ekki tókst að geyma andlit."</string> <string name="face_error_canceled" msgid="283945501061931023">"Hætt við andlitsgreiningu."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Notandi hætti við andlitsgreiningu."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Of margar tilraunir. Reyndu aftur síðar."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Of margar tilraunir. Slökkt á andlitsgreiningu."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Reyndu aftur."</string> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 5c28097f3dc2..a6d5d2394de5 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Non riconosciuto"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Impronta digitale autenticata"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Volto autenticato"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Volto autenticato, premi Conferma"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardware per l\'impronta digitale non disponibile."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Impossibile memorizzare l\'impronta digitale. Rimuovi un\'impronta esistente."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Timeout impronta digitale. Riprova."</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Timeout operazione associata al volto. Riprova."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Il volto non può essere memorizzato."</string> <string name="face_error_canceled" msgid="283945501061931023">"Operazione associata al volto annullata."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Autenticazione del volto annullata dall\'utente."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Troppi tentativi. Riprova più tardi."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Troppi tentativi. Autenticazione disattivata."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Riprova."</string> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index 5dd16172d3c3..48933f99f727 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -534,10 +534,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"לא זוהתה"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"טביעת האצבע אומתה"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"זיהוי הפנים בוצע"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"זיהוי הפנים בוצע. יש ללחוץ על אישור"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"החומרה בשביל טביעת אצבע אינה זמינה."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"לא ניתן לאחסן טביעת אצבע. הסר טביעת אצבע קיימת."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"חלף הזמן הקצוב לטביעת אצבע. נסה שוב."</string> @@ -574,8 +572,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"חלף הזמן הקצוב לזיהוי הפנים. יש לנסות שוב."</string> <string name="face_error_no_space" msgid="8224993703466381314">"לא ניתן לשמור את הפנים."</string> <string name="face_error_canceled" msgid="283945501061931023">"פעולת הפנים בוטלה."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"זיהוי הפנים בוטל על ידי המשתמש."</string> <string name="face_error_lockout" msgid="3407426963155388504">"יותר מדי ניסיונות. יש לנסות שוב מאוחר יותר."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"יותר מדי ניסיונות. אימות הפנים הושבת."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"יש לנסות שוב."</string> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index 7b53ed4e44d2..994039c17741 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"認識されませんでした"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"指紋認証を完了しました"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"顔を認証しました"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"顔を認証しました。[確認] を押してください"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"指紋ハードウェアは使用できません。"</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"指紋を保存できません。既存の指紋を削除してください。"</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"指紋の読み取りがタイムアウトになりました。もう一度お試しください。"</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"読み取りのタイムアウトです。もう一度お試しください。"</string> <string name="face_error_no_space" msgid="8224993703466381314">"顔の情報を保存できません。"</string> <string name="face_error_canceled" msgid="283945501061931023">"顔の操作をキャンセルしました。"</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"顔の認証がユーザーによりキャンセルされました。"</string> <string name="face_error_lockout" msgid="3407426963155388504">"試行回数の上限です。後でもう一度お試しください。"</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"試行回数の上限です。顔認証は無効になりました。"</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"もう一度お試しください。"</string> diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml index 722629698789..a9ce748de573 100644 --- a/core/res/res/values-ka/strings.xml +++ b/core/res/res/values-ka/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"არ არის ამოცნობილი"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"თითის ანაბეჭდი ავტორიზებულია"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"სახე ავტორიზებულია"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"სახე ავტორიზებულია, დააჭირეთ დადასტურებას"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"თითის ანაბეჭდის აპარატურა არ არის ხელმისაწვდომი."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"თითის ანაბეჭდის შენახვა ვერ ხერხდება. გთხოვთ, ამოშალოთ არსებული თითის ანაბეჭდი."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"თითის ანაბეჭდის ლოდინის დრო ამოიწურა. სცადეთ ხელახლა."</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"სახის ამოცნობის დრო ამოიწურა. ცადეთ ხელახლა."</string> <string name="face_error_no_space" msgid="8224993703466381314">"სახის შენახვა ვერ მოხერხდა."</string> <string name="face_error_canceled" msgid="283945501061931023">"სახის ამოცნობა გაუქმდა."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"სახის ავტორიზაცია გაუქმდა მომხმარებლის მიერ."</string> <string name="face_error_lockout" msgid="3407426963155388504">"დაფიქსირდა ბევრი მცდელობა. ცადეთ მოგვიანებით."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"დაფიქსირდა ბევრი მცდელობა. სახის ამოცნობა გაითიშა."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"ცადეთ ხელახლა."</string> diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml index 457933e16444..a8b527bb1f97 100644 --- a/core/res/res/values-kk/strings.xml +++ b/core/res/res/values-kk/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Танылмады"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Саусақ ізі аутентификацияланды"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Бет танылды"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Бет танылды, \"Растау\" түймесін басыңыз"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Саусақ ізі жабдығы қолжетімді емес."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Саусақ ізін сақтау мүмкін емес. Бар саусақ ізін жойыңыз."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Саусақ ізін күту уақыты бітті. Әрекетті қайталаңыз."</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Күту уақыты бітті. Әрекетті қайталаңыз."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Бетті сақтау мүмкін емес."</string> <string name="face_error_canceled" msgid="283945501061931023">"Бетті танудан бас тартылды."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Пайдаланушы бетті тану әрекетінен бас тартты."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Тым көп әрекет жасалды. Кейінірек қайталаңыз."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Тым көп әрекет жасалды. Бетті тану функциясы өшірілді."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Қайталап көріңіз."</string> diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml index b3a3a01c7564..2620ce45d234 100644 --- a/core/res/res/values-km/strings.xml +++ b/core/res/res/values-km/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"មិនអាចសម្គាល់បានទេ"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"បានផ្ទៀងផ្ទាត់ស្នាមម្រាមដៃ"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"បានផ្ទៀងផ្ទាត់មុខ"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"បានផ្ទៀងផ្ទាត់មុខ សូមចុចបញ្ជាក់"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"ផ្នែករឹងស្នាមម្រាមដៃមិនមានទេ។"</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"មិនអាចផ្ទុកស្នាមម្រាមដៃទេ។ សូមយកស្នាមម្រាមដៃដែលមានស្រាប់ចេញ។"</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"ការផ្តិតម្រាមដៃបានអស់ពេល។ សូមព្យាយាមម្តងទៀត។"</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"ការសម្គាល់ផ្ទៃមុខបានអស់ម៉ោង។ សូមព្យាយាមម្ដងទៀត។"</string> <string name="face_error_no_space" msgid="8224993703466381314">"មិនអាចរក្សាទុកផ្ទៃមុខបានទេ។"</string> <string name="face_error_canceled" msgid="283945501061931023">"បានបោះបង់ប្រតិបត្តិការចាប់ផ្ទៃមុខ។"</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"ការផ្ទៀងផ្ទាត់មុខត្រូវបានបោះបង់ដោយអ្នកប្រើប្រាស់។"</string> <string name="face_error_lockout" msgid="3407426963155388504">"ព្យាយាមចូលច្រើនពេកហើយ។ សូមព្យាយាមម្តងទៀតពេលក្រោយ។"</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"ព្យាយាមចូលច្រើនពេកហើយ។ បានបិទការផ្ទៀងផ្ទាត់ផ្ទៃមុខ។"</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"សូមព្យាយាមម្ដងទៀត។"</string> diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml index 2dc0bb1cfcec..1b83ec2e621c 100644 --- a/core/res/res/values-kn/strings.xml +++ b/core/res/res/values-kn/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"ಗುರುತಿಸಲಾಗಿಲ್ಲ"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಅನ್ನು ಪ್ರಮಾಣೀಕರಣ ಮಾಡಲಾಗಿದೆ"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"ಮುಖವನ್ನು ದೃಢೀಕರಿಸಲಾಗಿದೆ"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"ಮುಖವನ್ನು ದೃಢೀಕರಿಸಲಾಗಿದೆ, ದೃಢೀಕರಣವನ್ನು ಒತ್ತಿ"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"ಬೆರಳಚ್ಚು ಹಾರ್ಡ್ವೇರ್ ಲಭ್ಯವಿಲ್ಲ."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"ಬೆರಳಚ್ಚು ಸಂಗ್ರಹಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಬೆರಳಚ್ಚು ತೆಗೆದುಹಾಕಿ."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"ಬೆರಳಚ್ಚು ಅವಧಿ ಮೀರಿದೆ. ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"ಮುಖ ಸಮಯದ ಅವಧಿಯನ್ನು ತಲುಪಿದೆ. ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string> <string name="face_error_no_space" msgid="8224993703466381314">"ಮುಖವನ್ನು ಸಂಗ್ರಹಿಸಲಾಗುವುದಿಲ್ಲ."</string> <string name="face_error_canceled" msgid="283945501061931023">"ಮುಖದ ಕಾರ್ಯಚರಣೆಯನ್ನು ರದ್ದುಗೊಳಿಸಲಾಗಿದೆ."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"ಮುಖ ದೃಢೀಕರಣವನ್ನು ಬಳಕೆದಾರರ ಮೂಲಕ ರದ್ದುಗೊಳಿಸಲಾಗಿದೆ."</string> <string name="face_error_lockout" msgid="3407426963155388504">"ಹಲವು ಬಾರಿ ಪ್ರಯತ್ನಿಸಿದ್ದೀರಿ. ನಂತರ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"ಹಲವು ಪ್ರಯತ್ನ. ಮುಖದ ದೃಢೀಕರಣ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index abed24c1070d..6223dab94da1 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"인식할 수 없음"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"지문이 인증됨"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"얼굴이 인증되었습니다"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"얼굴이 인증되었습니다. 확인을 누르세요"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"지문 인식 하드웨어를 사용할 수 없습니다."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"지문을 저장할 수 없습니다. 기존 지문을 삭제하세요."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"지문 인식 시간이 초과되었습니다. 다시 시도하세요."</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"얼굴 인식 시간이 초과되었습니다. 다시 시도하세요."</string> <string name="face_error_no_space" msgid="8224993703466381314">"얼굴을 저장할 수 없습니다."</string> <string name="face_error_canceled" msgid="283945501061931023">"얼굴 인식 작업이 취소되었습니다."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"사용자가 얼굴 인증을 취소했습니다."</string> <string name="face_error_lockout" msgid="3407426963155388504">"시도 횟수가 너무 많습니다. 나중에 다시 시도하세요."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"시도 횟수가 너무 많아 얼굴 인증이 사용 중지되었습니다."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"다시 시도해 보세요."</string> diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml index fb8a81656499..f49746f756fa 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Таанылган жок"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Манжа изинин аныктыгы текшерилди"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Жүздүн аныктыгы текшерилди"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Жүздүн аныктыгы текшерилди, эми \"Ырастоону\" басыңыз"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Манжа изинин аппараттык камсыздоосу жеткиликтүү эмес."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Манжа изин сактоо мүмкүн эмес. Учурдагы манжа изин алып салыңыз."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Манжа изин күтүү мөөнөтү бүттү. Кайра аракет кылыңыз."</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Жүздүн аныктыгын текшерүүнү күтүү мөөнөтү бүттү. Кайра аракет кылыңыз."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Жүздү сактоо мүмкүн эмес."</string> <string name="face_error_canceled" msgid="283945501061931023">"Жүздүн аныктыгын текшерүү жокко чыгарылды."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Жүздүн аныктыгын текшерүү колдонуучу аркылуу жокко чыгарылды."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Өтө көп жолу аракет жасадыңыз. Кийинчерээк кайра аракет кылыңыз."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Өтө көп жолу аракет жасадыңыз. Жүздүн аныктыгын текшерүү сенсору өчүрүлдү."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Кайра аракет кылыңыз."</string> diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml index 8b6a052369fe..9fc60333c7ec 100644 --- a/core/res/res/values-lo/strings.xml +++ b/core/res/res/values-lo/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"ບໍ່ຮັບຮູ້"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"ພິສູດຢືນຢັນລາຍນິ້ວມືແລ້ວ"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"ພິສູດຢືນຢັນໃບໜ້າແລ້ວ"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"ພິສູດຢືນຢັນໃບໜ້າແລ້ວ, ກະລຸນາກົດຢືນຢັນ"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"ບໍ່ມີຮາດແວລາຍນີ້ວມືໃຫ້ຢູ່."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"ບໍ່ສາມາດເກັບຮັກສາລາຍນີ້ວມືໄວ້ໄດ້. ກະລຸນາເອົາລາຍນີ້ວມືທີ່ມີຢູ່ອອກໄປ."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"ເວລາລາຍນີ້ວມືບໍ່ເຂົ້າເຖິງໄດ້. ລອງໃໝ່ອີກ."</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"ໝົດເວລາກວດໃບໜ້າແລ້ວ. ກະລຸນາລອງອີກຄັ້ງ."</string> <string name="face_error_no_space" msgid="8224993703466381314">"ບໍ່ສາມາດເກັບຮັກສາໃບໜ້າໄວ້ໄດ້."</string> <string name="face_error_canceled" msgid="283945501061931023">"ຍົກເລີກການດຳເນີນການກັບໃບໜ້າແລ້ວ."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"ຜູ້ໃຊ້ຍົກເລີກການພິສູດຢືນຢັນໃບໜ້າແລ້ວ."</string> <string name="face_error_lockout" msgid="3407426963155388504">"ມີຄວາມພະຍາຍາມຫຼາຍຄັ້ງເກີນໄປ. ກະລຸນາລອງໃໝ່ໃນພາຍຫຼັງ."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"ມີຄວາມພະຍາຍາມຫຼາຍຄັ້ງເກີນໄປ. ປິດນຳໃຊ້ການກວດສອບຄວາມຖືກຕ້ອງດ້ວຍໃບໜ້າແລ້ວ."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"ລອງອີກຄັ້ງ."</string> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index 7fc1c9893539..d6869c108264 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -534,10 +534,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Neatpažinta"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Kontrolinis kodas autentifikuotas"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Veidas autentifikuotas"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Veidas autentifikuotas, paspauskite patvirtinimo mygtuką"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Kontrolinio kodo aparatinė įranga nepasiekiama."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Negalima išsaugoti kontrolinio kodo. Pašalinkite esamą kontrolinį kodą."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Baigėsi kontrolinio kodo nustatymo skirtasis laikas. Bandykite dar kartą."</string> @@ -574,8 +572,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Baigėsi veido atpaž. skirt. laik. Band. dar kartą."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Nepavyko išsaugoti veido duomenų."</string> <string name="face_error_canceled" msgid="283945501061931023">"Veido atpažinimo operacija atšaukta."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Veido autentifikavimą atšaukė naudotojas."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Per daug bandymų. Vėliau bandykite dar kartą."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Per daug bandymų. Veido autentifik. išjungtas."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Bandykite dar kartą."</string> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index 60a32de5d585..156a1a9adbf6 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -531,10 +531,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Dati nav atpazīti"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Pirksta nospiedums tika autentificēts."</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Seja autentificēta"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Seja ir autentificēta. Nospiediet pogu Apstiprināt."</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Nospieduma aparatūra nav pieejama."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Pirkstu nospiedumu nevar saglabāt. Lūdzu, noņemiet esošu pirksta nospiedumu."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Pirkstu nospiedumu nolasīšanas aparatūras noildze. Mēģiniet vēlreiz."</string> @@ -571,8 +569,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Sejas datu nolasīšanas noildze. Mēģiniet vēlreiz."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Sejas datus nevar saglabāt."</string> <string name="face_error_canceled" msgid="283945501061931023">"Darbība ar sejas datiem atcelta."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Lietotājs atcēla sejas autentificēšanu."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Pārāk daudz mēģinājumu. Vēlāk mēģiniet vēlreiz."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Par daudz mēģinājumu. Sejas atpazīšana atspējota."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Mēģiniet vēlreiz."</string> diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml index 4ae6f31b4c4d..8bca75e0b764 100644 --- a/core/res/res/values-mk/strings.xml +++ b/core/res/res/values-mk/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Непознат"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Отпечатокот е проверен"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Лицето е проверено"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Лицето е проверено, притиснете го копчето „Потврди“"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Хардвер за отпечаток од прст не е достапен."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Отпечатокот не може да се складира. Отстранете го постоечкиот отпечаток."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Се достигна времето на истекување на отпечатокот. Обидете се повторно."</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Истече времето за проверка на лице. Повторен обид."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Лицето не може да се чува."</string> <string name="face_error_canceled" msgid="283945501061931023">"Операцијата со лице се откажа."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Проверката на лицето е откажана од корисникот."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Премногу обиди. Обидете се повторно подоцна."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Премногу обиди. Проверката на лице е оневозможена."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Обидете се повторно."</string> diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml index 2cd83cc95ba4..1efdc7274cd5 100644 --- a/core/res/res/values-ml/strings.xml +++ b/core/res/res/values-ml/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"തിരിച്ചറിഞ്ഞില്ല"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"ഫിംഗർപ്രിന്റ് പരിശോധിച്ചുറപ്പിച്ചു"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"മുഖം പരിശോധിച്ചുറപ്പിച്ചു"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"മുഖം പരിശോധിച്ചുറപ്പിച്ചു, സ്ഥിരീകരിക്കുക അമർത്തുക"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"ഫിംഗർപ്രിന്റ് ഹാർഡ്വെയർ ലഭ്യമല്ല."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"വിരലടയാളം സംഭരിക്കാനാവില്ല. നിലവിലുള്ള വിരലടയാളം നീക്കംചെയ്യുക."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"വിരലടയാളം നൽകേണ്ട സമയം കഴിഞ്ഞു. വീണ്ടും ശ്രമിക്കുക."</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"മുഖം നൽകേണ്ട സമയം കഴിഞ്ഞു. വീണ്ടും ശ്രമിക്കുക."</string> <string name="face_error_no_space" msgid="8224993703466381314">"മുഖം സൂക്ഷിക്കാനാവില്ല."</string> <string name="face_error_canceled" msgid="283945501061931023">"മുഖത്തിന്റെ പ്രവർത്തനം റദ്ദാക്കി."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"മുഖം പരിശോധിച്ചുറപ്പിക്കൽ ഉപയോക്താവ് റദ്ദാക്കി."</string> <string name="face_error_lockout" msgid="3407426963155388504">"നിരവധി തവണ ശ്രമിച്ചു. പിന്നീട് വീണ്ടും ശ്രമിക്കുക."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"നിരവധി തവണ ശ്രമിച്ചു. മുഖം തിരിച്ചറിയൽ പ്രവർത്തനരഹിതമാക്കി."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"വീണ്ടും ശ്രമിക്കുക."</string> diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml index 35936eec055a..86ae178d49c3 100644 --- a/core/res/res/values-mn/strings.xml +++ b/core/res/res/values-mn/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Таниагүй"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Хурууны хээг нотолсон"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Царайг баталгаажууллаа"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Царайг баталгаажууллаа. Баталгаажуулах товчлуурыг дарна уу"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Хурууны хээний тоног төхөөрөмж бэлэн бус байна."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Хурууны хээг хадгалах боломжгүй байна. Одоо байгаа хурууны хээг арилгана уу."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Хурууны хээ оруулах хугацаа өнгөрсөн байна. Дахин оруулна уу."</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Царай таниулах хугацаа дууслаа. Дахин оролдоно уу."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Царайг хадгалах боломжгүй байна."</string> <string name="face_error_canceled" msgid="283945501061931023">"Царайны үйл ажиллагааг цуцаллаа."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Хэрэглэгч царайгаар баталгаажуулахыг цуцалсан байна."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Хэт олон удаа оролдлоо. Дараа дахин оролдоно уу."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Хэт олон удаа оролдлоо. Царай танилтыг идэвхгүй болголоо."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Дахин оролдоно уу."</string> diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml index ec96ec17baa4..70ed01221dc5 100644 --- a/core/res/res/values-mr/strings.xml +++ b/core/res/res/values-mr/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"ओळखले नाही"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"फिंगरप्रिंट ऑथेंटिकेट केली आहे"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"चेहरा ऑथेंटिकेशन केलेला आहे"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"चेहरा ऑथेंटिकेशन केलेला आहे, कृपया कंफर्म दाबा"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"फिंगरप्रिंट हार्डवेअर उपलब्ध नाही."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"फिंगरप्रिंट स्टोअर केले जाऊ शकत नाही. कृपया विद्यमान फिंगरप्रिंट काढा."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"फिंगरप्रिंट टाइमआउट झाले. पुन्हा प्रयत्न करा."</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"चेहरा टाइमआउट झाला. पुन्हा प्रयत्न करा."</string> <string name="face_error_no_space" msgid="8224993703466381314">"चेहरा स्टोअर केला जाऊ शकत नाही."</string> <string name="face_error_canceled" msgid="283945501061931023">"चेहरा ऑपरेशन रद्द केले गेले."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"वापरकर्त्याने चेहरा ऑथेंटिकेशन रद्द केले."</string> <string name="face_error_lockout" msgid="3407426963155388504">"खूप जास्त प्रयत्न केले. नंतर पुन्हा प्रयत्न करा."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"खूप जास्त प्रयत्न केले. चेहरा ऑथेंटिकेशन बंद केले गेले."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"पुन्हा प्रयत्न करा."</string> diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml index 7de8dc110f46..208fed6d89ac 100644 --- a/core/res/res/values-ms/strings.xml +++ b/core/res/res/values-ms/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Tidak dikenali"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Cap jari disahkan"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Wajah disahkan"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Wajah disahkan, sila tekan sahkan"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Perkakasan cap jari tidak tersedia."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Cap jari tidak dapat disimpan. Sila alih keluar cap jari sedia ada."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Tamat masa cap jari dicapai. Cuba lagi."</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Tamat masa wajah dicapai. Cuba lagi."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Wajah tidak dapat disimpan."</string> <string name="face_error_canceled" msgid="283945501061931023">"Pengendalian wajah dibatalkan."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Pengesahan wajah dibatalkan oleh pengguna."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Terlalu banyak percubaan. Cuba sebentar lagi."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Terlalu banyak percubaan. Pengesahan wajah dilumpuhkan."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Cuba lagi."</string> diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml index 9f107f88362b..71dd4b65aeee 100644 --- a/core/res/res/values-my/strings.xml +++ b/core/res/res/values-my/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"မသိပါ"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"လက်ဗွေကို အထောက်အထား စိစစ်ပြီးပါပြီ"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"မျက်နှာ အထောက်အထားစိစစ်ပြီးပြီ"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"မျက်နှာ အထောက်အထားစိစစ်ပြီးပြီ၊ အတည်ပြုရန်ကို နှိပ်ပါ"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"လက်ဗွေရာ ဟာ့ဒ်ဝဲ မရနိုင်ပါ။"</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"လက်ဗွေရာ သိုလှောင်၍မရပါ။ ကျေးဇူးပြု၍ ရှိပြီးလက်ဗွေရာအား ဖယ်ရှားပါ။"</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"လက်ဗွေရာအချိန်ကုန် သွားပါသည်။ ထပ်မံကြိုးစားပါ။"</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"မျက်နှာ သက်တမ်းကုန်သွားပါပြီ။ ထပ်စမ်းကြည့်ပါ။"</string> <string name="face_error_no_space" msgid="8224993703466381314">"မျက်နှာကို သိမ်း၍မရပါ။"</string> <string name="face_error_canceled" msgid="283945501061931023">"မျက်နှာ ဆောင်ရွက်ခြင်းကို ပယ်ဖျက်လိုက်ပါပြီ။"</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"အသုံးပြုသူက မျက်နှာအထောက်အထားစိစစ်မှု မလုပ်တော့ပါ။"</string> <string name="face_error_lockout" msgid="3407426963155388504">"အကြိမ်များစွာ စမ်းပြီးပါပြီ။ နောက်မှထပ်စမ်းပါ။"</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"အကြိမ်များစွာ စမ်းပြီးပါပြီ။ ပိတ်လိုက်ပါပြီ။"</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"ထပ်စမ်းကြည့်ပါ။"</string> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index d315acaa8bfe..28e7d334e0cf 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Ikke gjenkjent"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Fingeravtrykket er godkjent"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Ansiktet er autentisert"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Ansiktet er autentisert. Trykk på Bekreft"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Maskinvare for fingeravtrykk er ikke tilgjengelig."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Fingeravtrykket kan ikke lagres. Fjern et eksisterende fingeravtrykk."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Tidsavbrudd for fingeravtrykk er nådd. Prøv på nytt."</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Tidsavbrudd for ansikt er nådd. Prøv igjen."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Ansiktet kan ikke lagres."</string> <string name="face_error_canceled" msgid="283945501061931023">"Ansikt-operasjonen ble avbrutt."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Ansiktsautentiseringen ble avbrutt av brukeren."</string> <string name="face_error_lockout" msgid="3407426963155388504">"For mange forsøk. Prøv igjen senere."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"For mange forsøk. Ansiktsautentisering er slått av."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Prøv igjen."</string> diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml index c67a871e08a1..875f87deb12e 100644 --- a/core/res/res/values-ne/strings.xml +++ b/core/res/res/values-ne/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"पहिचान भएन"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"फिंगरप्रिन्ट प्रमाणीकरण गरियो"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"अनुहार प्रमाणीकरण गरियो"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"अनुहार प्रमाणीकरण गरियो, कृपया पुष्टि गर्नुहोस् थिच्नुहोस्"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"औँठाछाप हार्डवेयर उपलब्ध छैन।"</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"औँठाछाप भण्डारण गर्न सकिँदैन। कृपया अवस्थित औठाछाप हटाउनुहोस्।"</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"औँठाछापको समय सकिएको छ। फेरि प्रयास गर्नुहोस्।"</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"अनुहारको समय सकिएको छ। फेरि प्रयास गर्नुहोस्।"</string> <string name="face_error_no_space" msgid="8224993703466381314">"अनुहार भण्डारण गर्न सकिँदैन।"</string> <string name="face_error_canceled" msgid="283945501061931023">"अनुहार पहिचान रद्द गरियो।"</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"प्रयोगकर्ताले अनुहार प्रमाणीकरण रद्द गर्नु भयो।"</string> <string name="face_error_lockout" msgid="3407426963155388504">"धेरैपटक प्रयासहरू भए। पछि फेरि प्रयास गर्नुहोस्।"</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"अत्यधिक धेरैपटक गलत प्रयासहरू भए। अनुहार प्रमाणिकरणलाई असक्षम पारियो।"</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"फेरि प्रयास गर्नुहोस्।"</string> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index 345d9d49d60e..b95ba194a326 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Niet herkend"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Vingerafdruk geverifieerd"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Gezicht geverifieerd"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Gezicht geverifieerd. Druk op Bevestigen."</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardware voor vingerafdruk niet beschikbaar."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Vingerafdruk kan niet worden opgeslagen. Verwijder een bestaande vingerafdruk."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Time-out bereikt voor vingerafdruk. Probeer het opnieuw."</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Time-out voor gezicht bereikt. Probeer opnieuw."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Gezicht kan niet worden opgeslagen."</string> <string name="face_error_canceled" msgid="283945501061931023">"Bewerking voor gezichtsherkenning geannuleerd."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Gezichtsverificatie geannuleerd door gebruiker."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Te veel pogingen. Probeer het later opnieuw."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Te veel pogingen. Gezichtsherkenning inactief."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Probeer het opnieuw."</string> diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml index 3e4260f4ca0f..9d3fa8e06765 100644 --- a/core/res/res/values-or/strings.xml +++ b/core/res/res/values-or/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"ଚିହ୍ନଟ ହେଲାନାହିଁ"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"ଆଙ୍ଗୁଠି ଚିହ୍ନ ପ୍ରମାଣୀକୃତ ହେଲା"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"ମୁହଁ ଚିହ୍ନଟ ହୋଇଛି"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"ମୁହଁ ଚିହ୍ନଟ ହୋଇଛି, ଦୟାକରି ସୁନିଶ୍ଚିତ ଦବାନ୍ତୁ"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"ଆଙ୍ଗୁଠି ଚିହ୍ନ ହାର୍ଡୱେର୍ ଉପଲବ୍ଧ ନାହିଁ।"</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"ଆଙ୍ଗୁଠି ଚିହ୍ନ ଷ୍ଟୋର୍ କରାଯାଇପାରିବ ନାହିଁ। ଦୟାକରି ପୂର୍ବରୁ ଥିବା ଆଙ୍ଗୁଠି ଚିହ୍ନକୁ ବାହାର କରିଦିଅନ୍ତୁ।"</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"ଆଙ୍ଗୁଠି ଚିହ୍ନର ସମୟ ଶେଷ ହେଲା । ପୁଣିଥରେ ଚେଷ୍ଟା କରନ୍ତୁ।"</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"ଫେସ୍ର ସମୟସୀମା ସରିଗଲା। ପୁଣିଥରେ ଚେଷ୍ଟା କରନ୍ତୁ।"</string> <string name="face_error_no_space" msgid="8224993703466381314">"ଫେସ୍ ମେମୋରୀରେ ଷ୍ଟୋର୍ କରାଯାଇପାରିବ ନାହିଁ।"</string> <string name="face_error_canceled" msgid="283945501061931023">"ଫେସ୍ର ଅପରେଶନ୍ କ୍ୟାନ୍ସଲ୍ ହୋଇଗଲା"</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"ଉପଯୋଗକର୍ତ୍ତା ମୁହଁ ଚିହ୍ନଟକରଣ ବାତିଲ୍ କରିଛନ୍ତି।"</string> <string name="face_error_lockout" msgid="3407426963155388504">"ବାରମ୍ବାର ଚେଷ୍ଟା। ପରେ ପୁଣିଥରେ ଚେଷ୍ଟା କରନ୍ତୁ।"</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"ବାରମ୍ବାର ଚେଷ୍ଟା। ଫେସ୍ ପ୍ରମାଣୀକରଣ ଅକ୍ଷମ କରାଗଲା।"</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"ପୁଣିଥରେ ଚେଷ୍ଟା କରନ୍ତୁ।"</string> diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml index bdcf2fec85a1..6e615a88119b 100644 --- a/core/res/res/values-pa/strings.xml +++ b/core/res/res/values-pa/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"ਪਛਾਣ ਨਹੀਂ ਹੋਈ"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਪ੍ਰਮਾਣਿਤ ਹੋਇਆ"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"ਚਿਹਰਾ ਪੁਸ਼ਟੀਕਰਨ"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"ਚਿਹਰਾ ਪੁਸ਼ਟੀਕਰਨ, ਕਿਰਪਾ ਕਰਕੇ \'ਪੁਸ਼ਟੀ ਕਰੋ\' ਦਬਾਓ"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਹਾਰਡਵੇਅਰ ਉਪਲਬਧ ਨਹੀਂ।"</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਸਟੋਰ ਨਹੀਂ ਕੀਤਾ ਸਕਦਾ। ਕਿਰਪਾ ਕਰਕੇ ਇੱਕ ਮੌਜੂਦਾ ਫਿੰਗਰਪ੍ਰਿੰਟ ਹਟਾਓ।"</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਦਾ ਸਮਾਂ ਸਮਾਪਤ ਹੋ ਗਿਆ ਹੈ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"ਚਿਹਰਾ ਪਛਾਣਨ ਦਾ ਸਮਾਂ ਸਮਾਪਤ ਹੋਇਆ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string> <string name="face_error_no_space" msgid="8224993703466381314">"ਚਿਹਰੇ ਦੀ ਜਾਣਕਾਰੀ ਨੂੰ ਸਟੋਰ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ।"</string> <string name="face_error_canceled" msgid="283945501061931023">"ਚਿਹਰਾ ਪਛਾਣਨ ਦੀ ਪ੍ਰਕਿਰਿਆ ਰੱਦ ਕੀਤੀ ਗਈ।"</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"ਵਰਤੋਂਕਾਰ ਵੱਲੋਂ ਚਿਹਰਾ ਪੁਸ਼ਟੀਕਰਨ ਨੂੰ ਰੱਦ ਕੀਤਾ ਗਿਆ।"</string> <string name="face_error_lockout" msgid="3407426963155388504">"ਹੱਦੋਂ ਵੱਧ ਕੋਸ਼ਿਸ਼ਾਂ। ਬਾਅਦ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"ਹੱਦੋਂ ਵੱਧ ਕੋਸ਼ਿਸ਼ਾਂ। ਚਿਹਰਾ ਪ੍ਰਮਾਣੀਕਰਨ ਬੰਦ ਹੈ।"</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index 3e08d500520a..81a869addd25 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -534,10 +534,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Nie rozpoznano"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Uwierzytelniono odciskiem palca"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Twarz rozpoznana"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Twarz rozpoznana, kliknij Potwierdź"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Czytnik linii papilarnych nie jest dostępny."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Nie można zapisać odcisku palca. Usuń istniejący odcisk palca."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Osiągnięto limit czasu odczytu linii papilarnych. Spróbuj ponownie."</string> @@ -574,8 +572,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Upłynął limit czasu analizy twarzy. Spróbuj ponownie."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Nie można zapisać informacji o twarzy."</string> <string name="face_error_canceled" msgid="283945501061931023">"Analiza twarzy została anulowana."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Użytkownik anulował uwierzytelnianie twarzą."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Zbyt wiele prób. Spróbuj ponownie później."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Zbyt wiele prób. Wyłączono uwierzytelnianie za pomocą twarzy."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Spróbuj ponownie."</string> diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index d604aab7b9a1..5ac7c2e5db5d 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Não reconhecido"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Impressão digital autenticada"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Rosto autenticado"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Rosto autenticado, pressione \"Confirmar\""</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardware de impressão digital não disponível."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Não foi possível armazenar a impressão digital. Remova uma impressão digital já existente."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Tempo máximo para captura da impressão digital atingido. Tente novamente."</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Tempo máx. p/ captura facial atingido. Tente novamente."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Não é possível armazenar um rosto."</string> <string name="face_error_canceled" msgid="283945501061931023">"Operação facial cancelada."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Autenticação facial cancelada pelo usuário."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Excesso de tentativas. Tente novamente mais tarde."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Excesso de tentativas. Autenticação facial desat."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Tente novamente."</string> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index cde63d54d2b7..52f067fb1d09 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -423,11 +423,11 @@ <string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"alterar as suas definições de áudio"</string> <string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Permite que a aplicação modifique definições de áudio globais, tais como o volume e qual o altifalante utilizado para a saída de som."</string> <string name="permlab_recordAudio" msgid="3876049771427466323">"gravar áudio"</string> - <string name="permdesc_recordAudio" msgid="4245930455135321433">"Esta aplicação pode gravar áudio através do microfone a qualquer momento."</string> + <string name="permdesc_recordAudio" msgid="4245930455135321433">"Esta aplicação pode gravar áudio através do microfone em qualquer altura."</string> <string name="permlab_sim_communication" msgid="2935852302216852065">"enviar comandos para o SIM"</string> <string name="permdesc_sim_communication" msgid="5725159654279639498">"Permite que a aplicação envie comandos para o SIM. Esta ação é muito perigosa."</string> <string name="permlab_camera" msgid="3616391919559751192">"tirar fotos e vídeos"</string> - <string name="permdesc_camera" msgid="5392231870049240670">"Esta aplicação pode tirar fotos e gravar vídeos através da câmara a qualquer momento."</string> + <string name="permdesc_camera" msgid="5392231870049240670">"Esta aplicação pode tirar fotos e gravar vídeos através da câmara em qualquer altura."</string> <string name="permlab_vibrate" msgid="7696427026057705834">"controlar vibração"</string> <string name="permdesc_vibrate" msgid="6284989245902300945">"Permite à aplicação controlar o vibrador."</string> <string name="permlab_callPhone" msgid="3925836347681847954">"marcar números de telefone diretamente"</string> @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Não reconhecido."</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"A impressão digital foi autenticada."</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Rosto autenticado."</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Rosto autenticado. Prima Confirmar."</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardware de impressão digital não disponível."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Não é possível armazenar a impressão digital. Remova uma impressão digital existente."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Foi atingido o limite de tempo da impressão digital. Tente novamente."</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Limite de tempo de rosto atingido. Tente novamente."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Não é possível armazenar o rosto."</string> <string name="face_error_canceled" msgid="283945501061931023">"Operação de rosto cancelada."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Autenticação facial cancelada pelo utilizador."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Demasiadas tentativas. Tente novamente mais tarde."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Demasiadas tentativas. Autenticação facial desativada."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Tente novamente."</string> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index d604aab7b9a1..5ac7c2e5db5d 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Não reconhecido"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Impressão digital autenticada"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Rosto autenticado"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Rosto autenticado, pressione \"Confirmar\""</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardware de impressão digital não disponível."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Não foi possível armazenar a impressão digital. Remova uma impressão digital já existente."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Tempo máximo para captura da impressão digital atingido. Tente novamente."</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Tempo máx. p/ captura facial atingido. Tente novamente."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Não é possível armazenar um rosto."</string> <string name="face_error_canceled" msgid="283945501061931023">"Operação facial cancelada."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Autenticação facial cancelada pelo usuário."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Excesso de tentativas. Tente novamente mais tarde."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Excesso de tentativas. Autenticação facial desat."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Tente novamente."</string> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index add43b849234..0c945f71cab1 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -531,10 +531,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Nu este recunoscut"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Amprentă autentificată"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Chip autentificat"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Chip autentificat, apăsați Confirmați"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardware-ul pentru amprentă nu este disponibil."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Amprenta nu poate fi stocată. Eliminați o amprentă existentă."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Timpul pentru amprentare a expirat. Încercați din nou."</string> @@ -571,8 +569,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Timpul pentru reunoaștere facială a expirat. Încercați din nou."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Chipul nu poate fi stocat."</string> <string name="face_error_canceled" msgid="283945501061931023">"Operațiunea privind chipul a fost anulată."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Autentificarea chipului anulată de utilizator."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Prea multe încercări. Reîncercați mai târziu."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Prea multe încercări. Autentificarea facială este dezactivată."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Încercați din nou."</string> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index 3a4ed8242875..fd70e9c7a4ae 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -534,10 +534,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Не распознано"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Отпечаток пальца проверен"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Лицо распознано"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Лицо распознано, нажмите кнопку \"Подтвердить\""</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Сканер недоступен"</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Чтобы сохранить новый отпечаток, удалите существующий."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Превышено время ожидания. Повторите попытку."</string> @@ -574,8 +572,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Превышено время ожидания. Повторите попытку."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Невозможно сохранить распознанное лицо"</string> <string name="face_error_canceled" msgid="283945501061931023">"Распознавание отменено"</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Распознавание лица отменено пользователем."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Слишком много попыток. Повторите позже."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Слишком много попыток. Сканер отключен."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Попробуйте ещё раз"</string> diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml index 17ead66d2c81..3bd8ceb5b0f9 100644 --- a/core/res/res/values-si/strings.xml +++ b/core/res/res/values-si/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"හඳුනා නොගන්නා ලදී"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"ඇඟිලි සලකුණ සත්යාපනය කරන ලදී"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"මුහුණ සත්යාපනය කරන ලදී"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"මුහුණ සත්යාපනය කරන ලදී, කරුණාකර තහවුරු කරන්න ඔබන්න"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"ඇඟිලි සලකුණු දෘඪාංගය ලද නොහැකිය."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"ඇඟිලි සලකුණ ගබඩා කළ නොහැක. දැනට පවතින ඇඟිලි සලකුණක් ඉවත් කරන්න."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"ඇඟිලි සලකුණු කාල නිමාව ළඟා විය. නැවත උත්සාහ කරන්න."</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"මුහුණු කාල නිමාව ළඟා විය. නැවත උත්සාහ කරන්න."</string> <string name="face_error_no_space" msgid="8224993703466381314">"මුහුණ ගබඩා කළ නොහැක."</string> <string name="face_error_canceled" msgid="283945501061931023">"මුහුණු මෙහෙයුම අවලංගු කරන ලදී."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"පරිශීලකයා විසින් මුහුණ සත්යාපනය අවලංගු කරන ලදී."</string> <string name="face_error_lockout" msgid="3407426963155388504">"උත්සාහයන් ඉතා වැඩි ගණනකි. පසුව නැවත උත්සාහ කරන්න."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"උත්සාහයන් ඉතා වැඩි ගණනකි. මුහුණු සත්යාපනය අබල කරන ලදී."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"නැවත උත්සාහ කරන්න."</string> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index cb44b7422e3b..c0981cefa32d 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -534,10 +534,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Nerozpoznané"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Odtlačok bol overený"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Tvár bola overená"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Tvár bola overená, stlačte tlačidlo potvrdenia"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardvér na snímanie odtlačku prsta nie je k dispozícii"</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Odtlačok prsta nie je možné uložiť. Odstráňte existujúci odtlačok."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Časový limit rozpoznania odtlačku vypršal. Skúste to znova."</string> @@ -574,8 +572,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Limit rozpoznania tváre vypršal. Skúste to znova."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Tvár sa nedá uchovať."</string> <string name="face_error_canceled" msgid="283945501061931023">"Operácia týkajúca sa tváre bola zrušená"</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Overenie tváre bolo zrušené používateľom."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Príliš veľa pokusov. Skúste to znova neskôr."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Príliš veľa pokusov. Overenie tváre je zakázané."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Skúste to znova."</string> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index 039bbaa47b3e..261e6ed61bfc 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -534,10 +534,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Ni prepoznano"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Pristnost prstnega odtisa je preverjena"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Pristnost obraza je potrjena"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Pristnost obraza je preverjena. Pritisnite gumb »Potrdi«."</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Strojna oprema za prstne odtise ni na voljo."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Prstnega odtisa ni mogoče shraniti. Odstranite obstoječi prstni odtis."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Dosežena časovna omejitev za prstni odtis. Poskusite znova."</string> @@ -574,8 +572,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Dosežena časovna omejitev za obraz. Poskusite znova."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Obraza ni mogoče shraniti."</string> <string name="face_error_canceled" msgid="283945501061931023">"Dejanje z obrazom je bilo preklicano."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Preverjanje pristnosti obraza preklical uporabnik"</string> <string name="face_error_lockout" msgid="3407426963155388504">"Preveč poskusov. Poskusite znova pozneje."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Preveč poskusov. Preverjanje pristnosti obraza je onemogočeno."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Poskusite znova."</string> diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml index ee0960bb10b0..4b6cb099e4b6 100644 --- a/core/res/res/values-sq/strings.xml +++ b/core/res/res/values-sq/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Nuk njihet"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Gjurma e gishtit u vërtetua"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Fytyra u vërtetua"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Fytyra u vërtetua, shtyp \"Konfirmo\""</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardueri i gjurmës së gishtit nuk mundësohet."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Gjurma e gishtit nuk mund të ruhet. Hiq një gjurmë gishti ekzistuese."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Koha e veprimit për gjurmën e gishtit skadoi. Provo përsëri."</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Mbaroi afati për fytyrën. Provo sërish."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Fytyra nuk mund të ruhet."</string> <string name="face_error_canceled" msgid="283945501061931023">"Veprimi me fytyrën u anulua."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Vërtetimi me fytyrë u anulua nga përdoruesi."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Shumë përpjekje. Provo sërish më vonë."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Shumë përpjekje. Vërtetimi për fytyrën joaktiv."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Provo sërish."</string> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index 6ff3a7837e12..449fdfc89448 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -531,10 +531,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Није препознато"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Отисак прста је потврђен"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Лице је потврђено"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Лице је потврђено. Притисните Потврди"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Хардвер за отиске прстију није доступан."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Није могуће сачувати отисак прста. Уклоните неки од постојећих отисака прстију."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Временско ограничење за отисак прста је истекло. Пробајте поново."</string> @@ -571,8 +569,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Истекло је време за проверу лица. Пробајте поново."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Није могуће сачувати лице."</string> <string name="face_error_canceled" msgid="283945501061931023">"Обрада лица је отказана."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Корисник је отказао потврду лица."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Превише покушаја. Пробајте поново касније."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Више покушаја. Потврда идентитета је онемогућена."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Пробајте поново."</string> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index 20969d3daf2e..9f46514ba1f0 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Identifierades inte"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Fingeravtrycket har autentiserats"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Ansiktet har autentiserats"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Ansiktet har autentiserats. Tryck på Bekräfta"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Det finns ingen maskinvara för fingeravtryck."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Fingeravtrycket kan inte lagras. Ta bort ett befintligt fingeravtryck."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Tidsgränsen för fingeravtrycket har uppnåtts. Försök igen."</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Tidsgränsen för ansikte har nåtts. Försök igen."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Det gick inte att lagra ansiktet."</string> <string name="face_error_canceled" msgid="283945501061931023">"Ansiktsåtgärden har avbrutits."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Autentiseringen av ansiktet avbröts av användaren."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Du har gjort för många försök. Försök igen senare."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"För många försök. Ansiktsautentisering inaktiverad"</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Försök igen."</string> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index ce81bc7c3adb..b0858dc0d4c8 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -130,9 +130,9 @@ </string-array> <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> - <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g>Kupiga simu Kupitia Wi-Fi"</string> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Kupiga Simu Kupitia Wi-Fi ya <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Simu ya WLAN"</string> - <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> Simu ya WLAN"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"Simu ya WLAN ya <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wi-Fi ya <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Kupiga Simu kupitia WiFi | <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"VoWifi ya <xliff:g id="SPN">%s</xliff:g>"</string> @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Hayatambuliki"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Imethibitisha alama ya kidole"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Uso umethibitishwa"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Uso umethibitishwa, tafadhali bonyeza thibitisha"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Maunzi ya kitambulisho hayapatikani."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Kitambulisho hakiwezi kuhifadhiwa. Tafadhali ondoa kitambulisho kilichopo."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Muda wa kitambulisho umekwisha. Jaribu tena."</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Muda wa kutambua uso umeisha. Jaribu tena."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Huwezi kuhifadhi uso."</string> <string name="face_error_canceled" msgid="283945501061931023">"Utendaji wa kitambulisho umeghairiwa."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Uthibitishaji wa uso umeghairiwa na mtumiaji."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Umejaribu mara nyingi mno. Jaribu tena baadaye."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Umejaribu mara nyingi mno. Kitambuzi cha uso kimezimwa."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Jaribu tena."</string> diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml index 9683e4cb21ce..b84d68e7cc02 100644 --- a/core/res/res/values-ta/strings.xml +++ b/core/res/res/values-ta/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"அடையாளங்காணபடவில்லை"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"கைரேகை அங்கீகரிக்கப்பட்டது"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"முகம் அங்கீகரிக்கப்பட்டது"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"முகம் அங்கீகரிக்கப்பட்டது. ’உறுதிப்படுத்துக’ என்பதை அழுத்துக"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"கைரேகை வன்பொருள் இல்லை."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"கைரேகையைச் சேமிக்க முடியவில்லை. ஏற்கனவே உள்ள கைரேகையை அகற்றவும்."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"கைரேகைக்கான நேரம் முடிந்தது. மீண்டும் முயலவும்."</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"முகப் பதிவிற்கான நேரம் முடிந்தது. மீண்டும் முயல்க."</string> <string name="face_error_no_space" msgid="8224993703466381314">"முகத்தைச் சேமிக்க இயலாது."</string> <string name="face_error_canceled" msgid="283945501061931023">"முக அங்கீகாரச் செயல்பாடு ரத்துசெய்யப்பட்டது."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"பயனர், முக அங்கீகாரத்தை ரத்துசெய்தார்."</string> <string name="face_error_lockout" msgid="3407426963155388504">"பலமுறை முயன்றுவிட்டீர்கள். பிறகு முயலவும்."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"பலமுறை தோல்வி. முக அங்கீகாரம் முடக்கப்பட்டது."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"மீண்டும் முயலவும்."</string> diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index 975772061516..a5430b684b6c 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"గుర్తించలేదు"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"వేలిముద్ర ప్రమాణీకరించబడింది"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"ముఖం ప్రమాణీకరించబడింది"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"ముఖం ప్రమాణీకరించబడింది, దయచేసి ధృవీకరించును నొక్కండి"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"వేలిముద్ర హార్డ్వేర్ అందుబాటులో లేదు."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"వేలిముద్రను నిల్వ చేయడం సాధ్యపడదు. దయచేసి ఇప్పటికే ఉన్న వేలిముద్రను తీసివేయండి."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"వేలిముద్ర గడువు సమయం చేరుకుంది. మళ్లీ ప్రయత్నించండి."</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"ముఖ గడువు సమయం చేరుకుంది. మళ్లీ ప్రయత్నించండి."</string> <string name="face_error_no_space" msgid="8224993703466381314">"ముఖం నిల్వ చేయబడదు."</string> <string name="face_error_canceled" msgid="283945501061931023">"ముఖ కార్యకలాపం రద్దయింది."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"వినియోగదారు ద్వారా ముఖ ప్రమాణీకరణ రద్దు చేయబడింది."</string> <string name="face_error_lockout" msgid="3407426963155388504">"చాలా ఎక్కువ ప్రయత్నాలు చేసారు. తర్వాత మళ్లీ ప్రయత్నించండి."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"చాలా ఎక్కువ ప్రయత్నాలు చేసారు. ముఖ ప్రమాణీకరణ నిలిపివేయబడింది."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"మళ్లీ ప్రయత్నించండి."</string> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index 89202ca06866..0b7e0310fe26 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"ไม่รู้จัก"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"ตรวจสอบสิทธิ์ลายนิ้วมือแล้ว"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"ตรวจสอบสิทธิ์ใบหน้าแล้ว"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"ตรวจสอบสิทธิ์ใบหน้าแล้ว โปรดกดยืนยัน"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"ฮาร์ดแวร์ลายนิ้วมือไม่พร้อมใช้งาน"</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"ไม่สามารถเก็บลายนิ้วมือได้ โปรดนำลายนิ้วมือที่มีอยู่ออก"</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"หมดเวลาใช้ลายนิ้วมือแล้ว โปรดลองอีกครั้ง"</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"หมดเวลาใช้ใบหน้าแล้ว โปรดลองอีกครั้ง"</string> <string name="face_error_no_space" msgid="8224993703466381314">"จัดเก็บข้อมูลใบหน้าไม่ได้"</string> <string name="face_error_canceled" msgid="283945501061931023">"ยกเลิกการดำเนินการกับใบหน้าแล้ว"</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"ผู้ใช้ยกเลิกการตรวจสอบสิทธิ์ใบหน้า"</string> <string name="face_error_lockout" msgid="3407426963155388504">"ดำเนินการหลายครั้งเกินไป ลองอีกครั้งในภายหลัง"</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"ดำเนินการหลายครั้งเกินไป ปิดใช้การตรวจสอบสิทธิ์ด้วยใบหน้าแล้ว"</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"ลองอีกครั้ง"</string> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index 983b53f81450..e21f59cad183 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Hindi nakilala"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Na-authenticate ang fingerprint"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Na-authenticate ang mukha"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Na-authenticate ang mukha, pakipindot ang kumpirmahin"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hindi available ang hardware na ginagamitan ng fingerprint."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Hindi maiimbak ang fingerprint. Mangyaring mag-alis ng umiiral nang fingerprint."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Nag-time out ang fingerprint. Subukang muli."</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Nag-time out ang mukha. Subukang muli."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Hindi ma-store ang mukha."</string> <string name="face_error_canceled" msgid="283945501061931023">"Nakansela ang operation kaugnay ng mukha."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Kinansela ng user ang pag-authenticate ng mukha."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Masyadong maraming pagsubok. Subukang muli mamaya."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Sobrang pagsubok. Bawal na: facial authentication."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Subukang muli."</string> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index 031527623c57..41616df4209d 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Tanınmadı"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Parmak izi kimlik doğrulaması yapıldı"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Yüz kimliği doğrulandı"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Yüz kimliği doğrulandı, lütfen doğrula\'ya basın"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Parmak izi donanımı kullanılamıyor."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Parmak izi depolanamıyor. Lütfen mevcut parmak izlerinden birini kaldırın."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Parmak izi için zaman aşımı oluştu. Tekrar deneyin."</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Yüz için zaman aşımı oluştu. Tekrar deneyin."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Yüz kaydedilemiyor."</string> <string name="face_error_canceled" msgid="283945501061931023">"Yüz işlemi iptal edildi."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Yüz kimlik doğrulama işlemini kullanıcı iptal etti."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Çok fazla deneme yapıldı. Daha sonra tekrar deneyin."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Çok fazla deneme yapıldı. Yüz kimlik doğrulaması devre dışı bırakıldı."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Tekrar deneyin."</string> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index 88e2475ffe6c..f84e3e2e67f6 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -534,10 +534,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Не розпізнано"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Відбиток автентифіковано"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Обличчя автентифіковано"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Обличчя автентифіковано. Натисніть \"Підтвердити\""</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Апаратне забезпечення для сканування відбитка недоступне."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Не вдалося зберегти відбиток. Видаліть наявний відбиток."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Час очікування відбитка минув. Повторіть спробу."</string> @@ -574,8 +572,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Час очікування обличчя минув. Повторіть спробу."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Не вдається зберегти обличчя."</string> <string name="face_error_canceled" msgid="283945501061931023">"Дію з обличчям скасовано."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Користувач скасував автентифікацію облич."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Забагато спроб. Повторіть пізніше."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Забагато спроб. Автентифікацію обличчя вимкнено."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Повторіть спробу."</string> diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml index 6e98ebbd275d..dc801cd96d78 100644 --- a/core/res/res/values-ur/strings.xml +++ b/core/res/res/values-ur/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"تسلیم شدہ نہیں ہے"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"فنگر پرنٹ کی تصدیق ہو گئی"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"چہرے کی تصدیق ہو گئی"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"چہرے کی تصدیق ہو گئی، براہ کرم \'تصدیق کریں\' کو دبائيں"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"فنگر پرنٹ ہارڈ ویئر دستیاب نہیں ہے۔"</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"فنگر پرنٹ اسٹور نہیں کیا جا سکتا ہے۔ براہ کرم ایک موجودہ فنگر پرنٹ ہٹائیں۔"</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"فنگر پرنٹ کی میعاد ختم ہوگئی۔ دوبارہ کوشش کریں۔"</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"چہرہ پہچانے کی میعاد ختم ہو گئی۔ دوبارہ کوشش کریں۔"</string> <string name="face_error_no_space" msgid="8224993703466381314">"چہرے کو اسٹور نہیں کیا جا سکتا۔"</string> <string name="face_error_canceled" msgid="283945501061931023">"چہرے پر ہونے والی کارروائی منسوخ ہو گئی۔"</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"صارف نے چہرے کی تصدیق کو مسترد کر دیا۔"</string> <string name="face_error_lockout" msgid="3407426963155388504">"کافی زیادہ کوششیں کی گئیں۔ دوبارہ کوشش کریں۔"</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"کافی زیادہ کوششیں کی گئیں۔ چہرے کی توثیق منسوخ ہو گئی۔"</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"دوبارہ کوشش کریں۔"</string> diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml index 15671d18056f..e51b8103f7df 100644 --- a/core/res/res/values-uz/strings.xml +++ b/core/res/res/values-uz/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Aniqlanmadi"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Barmoq izi tekshirildi"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Yuzingiz aniqlandi"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Yuzingiz aniqlandi, tasdiqlash uchun bosing"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Barmoq izi skaneri ish holatida emas."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Barmoq izini saqlab bo‘lmadi. Mavjud barmoq izlaridan birini o‘chirib tashlang."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Barmoq izini aniqlash vaqti tugab qoldi. Qayta urinib ko‘ring."</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Yuzni aniqlash vaqti tugadi. Qaytadan urining."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Aniqlangan yuz saqlanmadi."</string> <string name="face_error_canceled" msgid="283945501061931023">"Yuzni aniqlash bekor qilindi."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Yuz tekshiruvi bekor qilindi."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Juda ko‘p urinildi. Keyinroq qaytadan urining."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Juda ko‘p urinildi. Skaner faolsizlantirildi."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Qaytadan urining."</string> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index 00ebbbcd342e..4d8a20b5dade 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Không nhận dạng được"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Đã xác thực vân tay"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Đã xác thực khuôn mặt"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Đã xác thực khuôn mặt, vui lòng nhấn để xác nhận"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Phần cứng vân tay không khả dụng."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Không thể lưu vân tay. Vui lòng xóa vân tay hiện có."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Đã hết thời gian chờ vân tay. Hãy thử lại."</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Đã hết thời gian chờ khuôn mặt. Hãy thử lại."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Không thể lưu khuôn mặt."</string> <string name="face_error_canceled" msgid="283945501061931023">"Đã hủy thao tác dùng khuôn mặt."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Người dùng đã hủy thao tác xác thực khuôn mặt."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Bạn đã thử quá nhiều lần. Hãy thử lại sau."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Đã thử quá nhiều lần. Đã tắt xác thực khuôn mặt."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Hãy thử lại."</string> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index e60afa731f9a..609f9bcfb71d 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"无法识别"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"已验证指纹"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"面孔已验证"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"面孔已验证,请按确认按钮"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"指纹硬件无法使用。"</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"无法存储指纹。请移除一个现有的指纹。"</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"指纹录入操作超时,请重试。"</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"面孔处理操作超时,请重试。"</string> <string name="face_error_no_space" msgid="8224993703466381314">"无法存储面孔。"</string> <string name="face_error_canceled" msgid="283945501061931023">"面孔处理操作已取消。"</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"用户已取消面孔验证。"</string> <string name="face_error_lockout" msgid="3407426963155388504">"尝试次数过多,请稍后重试。"</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"尝试次数过多,系统已停用人脸身份验证功能。"</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"请重试。"</string> diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index cb93c61df88f..2e3c7d75857a 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"未能識別"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"驗證咗指紋"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"面孔已經驗證"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"面孔已經驗證,請㩒一下 [確認]"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"無法使用指紋軟件。"</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"指紋無法儲存。請移除現有指紋。"</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"指紋已逾時。請再試一次。"</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"臉孔操作已逾時,請再試一次。"</string> <string name="face_error_no_space" msgid="8224993703466381314">"無法儲存臉孔。"</string> <string name="face_error_canceled" msgid="283945501061931023">"臉孔操作已取消。"</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"使用者已取消臉孔驗證。"</string> <string name="face_error_lockout" msgid="3407426963155388504">"嘗試次數過多,請稍後再試。"</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"嘗試次數過多,臉孔驗證已停用。"</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"請再試一次。"</string> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index 9c3d75ba68e5..9149f47e86d6 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"無法辨識"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"指紋驗證成功"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"臉孔驗證成功"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"臉孔驗證成功,請按下 [確認] 按鈕"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"指紋硬體無法使用。"</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"無法儲存指紋,請先移除現有指紋。"</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"指紋處理作業逾時,請再試一次。"</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"臉孔處理作業逾時,請再試一次。"</string> <string name="face_error_no_space" msgid="8224993703466381314">"無法儲存臉孔。"</string> <string name="face_error_canceled" msgid="283945501061931023">"臉孔處理作業已取消。"</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"使用者已取消臉孔驗證。"</string> <string name="face_error_lockout" msgid="3407426963155388504">"嘗試次數過多,請稍後再試。"</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"嘗試次數過多,臉孔驗證功能已停用。"</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"請再試一次。"</string> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index 07c05aac0836..75709ca90174 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -528,10 +528,8 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Akwaziwa"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Isingxivizo somunwe sigunyaziwe"</string> - <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> - <skip /> - <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> - <skip /> + <string name="face_authenticated_no_confirmation_required" msgid="4018680978348659031">"Ubuso bufakazelwe ubuqiniso"</string> + <string name="face_authenticated_confirmation_required" msgid="8778347003507633610">"Ukuqinisekiswa kobuso, sicela ucindezele okuthi qinisekisa"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Izingxenyekazi zekhompuyutha zezingxivizo zeminwe azitholakali."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Izigxivizo zeminwe azikwazi ukugcinwa. Sicela ususe izigxivizo zeminwe ezikhona."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Kufinyelelwe isikhathi sokuvala sezigxivizo zeminwe. Zama futhi"</string> @@ -568,8 +566,7 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Kufinyelelwe kusikhathi sokuvala sobuso. Zama futhi."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Ubuso abukwazi ukugcinwa."</string> <string name="face_error_canceled" msgid="283945501061931023">"Umsebenzi wobuso ukhanselwe."</string> - <!-- no translation found for face_error_user_canceled (8943921120862164539) --> - <skip /> + <string name="face_error_user_canceled" msgid="8943921120862164539">"Ukufakazela ubuqiniso kobuso kukhanselwe umsebenzisi"</string> <string name="face_error_lockout" msgid="3407426963155388504">"Imizamo eminingi kakhulu. Zama futhi emuva kwesikhathi."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Imizamo eminingi kakhulu. Ukufakazela ubuqiniso kobuso kukhutshaziwe."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Zama futhi."</string> diff --git a/core/res/res/values/colors_car.xml b/core/res/res/values/colors_car.xml index 6053728369e1..32671ac8f752 100644 --- a/core/res/res/values/colors_car.xml +++ b/core/res/res/values/colors_car.xml @@ -17,15 +17,271 @@ */ --> <resources> - <!-- car support colors from - https://cs.corp.google.com/android/frameworks/support/car/res/values/colors.xml --> - <color name="car_user_switcher_user_image_bgcolor">@color/car_grey_50</color> - <color name="car_user_switcher_user_image_fgcolor">@color/car_grey_900</color> - <color name="car_card_dark">@color/car_dark_blue_grey_700</color> - <color name="car_body1_light">@color/car_grey_100</color> - - <color name="car_grey_50">#fffafafa</color> - <color name="car_grey_900">#ff212121</color> - <color name="car_dark_blue_grey_700">#ff172026</color> - <color name="car_grey_100">#fff5f5f5</color> + <color name="car_background">@color/black</color> + + <color name="car_colorPrimary">@color/car_grey_868</color> + <color name="car_colorSecondary">@color/car_grey_900</color> + <color name="car_colorPrimaryDark">@color/car_grey_958</color> + + + <!-- Various colors for text sizes. "Light" and "dark" here refer to the lighter or darker + shades. --> + <color name="car_title_light">@color/car_grey_100</color> + <color name="car_title_dark">@color/car_grey_900</color> + <color name="car_title">@color/car_title_light</color> + + <color name="car_title2_light">@color/car_grey_100</color> + <color name="car_title2_dark">@color/car_grey_900</color> + <color name="car_title2">@color/car_title2_light</color> + + <color name="car_headline1_light">@color/car_grey_100</color> + <color name="car_headline1_dark">@color/car_grey_800</color> + <color name="car_headline1">@color/car_headline1_light</color> + + <color name="car_headline2_light">@color/car_grey_100</color> + <color name="car_headline2_dark">@color/car_grey_900</color> + <color name="car_headline2">@color/car_headline2_light</color> + + <color name="car_headline3_light">@android:color/white</color> + <color name="car_headline3_dark">@color/car_grey_900</color> + <color name="car_headline3">@color/car_headline3_light</color> + + <color name="car_headline4_light">@android:color/white</color> + <color name="car_headline4_dark">@android:color/black</color> + <color name="car_headline4">@color/car_headline4_light</color> + + <color name="car_body1_light">@color/car_grey_100</color> + <color name="car_body1_dark">@color/car_grey_900</color> + <color name="car_body1">@color/car_body1_light</color> + + <color name="car_body2_light">@color/car_grey_300</color> + <color name="car_body2_dark">@color/car_grey_700</color> + <color name="car_body2">@color/car_body2_light</color> + + <color name="car_body3_light">@android:color/white</color> + <color name="car_body3_dark">@android:color/black</color> + <color name="car_body3">@color/car_body3_light</color> + + <color name="car_body4_light">@android:color/white</color> + <color name="car_body4_dark">@android:color/black</color> + <color name="car_body4">@color/car_body4_light</color> + + <color name="car_action1_light">@color/car_grey_900</color> + <color name="car_action1_dark">@color/car_grey_50</color> + <color name="car_action1">@color/car_action1_light</color> + + <!-- The tinting colors to create a light- and dark-colored icon respectively. --> + <color name="car_tint_light">@color/car_grey_50</color> + <color name="car_tint_dark">@color/car_grey_900</color> + + <!-- The tinting color for an icon. This icon is assumed to be on a light background. --> + <color name="car_tint">@color/car_tint_light</color> + + <!-- An inverted tinting from car_tint. --> + <color name="car_tint_inverse">@color/car_tint_dark</color> + + <!-- The color of the divider. The color here is a lighter shade. --> + <color name="car_list_divider_light">#1fffffff</color> + + <!-- The color of the divider. The color here is a darker shade. --> + <color name="car_list_divider_dark">#1f000000</color> + + <!-- The color of the dividers in the list. This color is assumed to be on a light colored + view. --> + <color name="car_list_divider">@color/car_list_divider_light</color> + + <!-- A light and dark colored card. --> + <color name="car_card_light">@color/car_grey_50</color> + <color name="car_card_dark">@color/car_dark_blue_grey_700</color> + + <!-- The default color of a card in car UI. --> + <color name="car_card">@color/car_card_dark</color> + + <!-- The ripple colors. The "dark" and "light" designation here refers to the color of the + ripple itself. --> + <color name="car_card_ripple_background_dark">#8F000000</color> + <color name="car_card_ripple_background_light">#27ffffff</color> + + <!-- The ripple color for a light colored card. --> + <color name="car_card_ripple_background">@color/car_card_ripple_background_light</color> + + <!-- The ripple color for a dark-colored card. This color is the opposite of + car_card_ripple_background. --> + <color name="car_card_ripple_background_inverse">@color/car_card_ripple_background_dark</color> + + <!-- The top margin before the start of content in an application. --> + <dimen name="app_header_height">96dp</dimen> + + <!-- The lighter and darker color for the scrollbar thumb. --> + <color name="car_scrollbar_thumb_light">#99ffffff</color> + <color name="car_scrollbar_thumb_dark">#7f0b0f12</color> + + <!-- The color of the scroll bar indicator in the PagedListView. This color is assumed to be on + a light-colored background. --> + <color name="car_scrollbar_thumb">@color/car_scrollbar_thumb_light</color> + + <!-- The inverted color of the scroll bar indicator. This color is always the opposite of + car_scrollbar_thumb. --> + <color name="car_scrollbar_thumb_inverse">@color/car_scrollbar_thumb_dark</color> + + <!-- The color of the seekbar track secondary progress in SeekbarListItem. --> + <color name="car_seekbar_track_secondary_progress">@color/car_grey_500</color> + + <!-- The lighter and darker color for the seekbar track background. --> + <color name="car_seekbar_track_background_light">@color/car_grey_400</color> + <color name="car_seekbar_track_background_dark">@color/car_grey_700</color> + <!-- The color of the seekbar track background in SeekbarListItem. This color is assumed to be + on a light-colored background. --> + <color name="car_seekbar_track_background">@color/car_seekbar_track_background_dark</color> + <!-- background is car_grey_868 with .9 alpha --> + <color name="car_toast_background">#E6282a2d</color> + + <!-- Misc colors --> + <color name="car_highlight_light">@color/car_teal_700</color> + <color name="car_highlight_dark">@color/car_teal_200</color> + <color name="car_highlight">@color/car_highlight_dark</color> + <color name="car_accent_light">@color/car_highlight_light</color> + <color name="car_accent_dark">@color/car_highlight_dark</color> + <color name="car_accent">@color/car_highlight_dark</color> + + <color name="car_user_switcher_user_image_bgcolor">@color/car_grey_50</color> + <color name="car_user_switcher_user_image_fgcolor">@color/car_grey_900</color> + + <!-- Color palette for cars --> + <color name="car_grey_958">#ff0e1013</color> + <color name="car_grey_928">#ff17181b</color> + <color name="car_grey_900">#ff202124</color> + <color name="car_grey_868">#ff282a2d</color> + <color name="car_grey_846">#ff2e3234</color> + <color name="car_grey_800">#ff3c4043</color> + <color name="car_grey_772">#ff464a4d</color> + <color name="car_grey_746">#ff4d5256</color> + <color name="car_grey_700">#ff5f6368</color> + <color name="car_grey_600">#ff80868b</color> + <color name="car_grey_500">#ff9aa0a6</color> + <color name="car_grey_400">#ffbdc1c6</color> + <color name="car_grey_300">#ffdadce0</color> + <color name="car_grey_200">#ffe8eaed</color> + <color name="car_grey_100">#fff1f3f4</color> + <color name="car_grey_50">#fff8f9fa</color> + + <color name="car_blue_900">#ff1d57a9</color> + <color name="car_blue_800">#ff2065bb</color> + <color name="car_blue_700">#ff2374ce</color> + <color name="car_blue_600">#ff2581df</color> + <color name="car_blue_500">#ff5195ea</color> + <color name="car_blue_400">#ff6ba5ed</color> + <color name="car_blue_300">#ff96bff2</color> + <color name="car_blue_200">#ffb9d4f6</color> + <color name="car_blue_100">#ffd9e6f9</color> + <color name="car_blue_50">#ffebf1fc</color> + + <color name="car_green_900">#ff136e39</color> + <color name="car_green_800">#ff1b7e42</color> + <color name="car_green_700">#ff218c48</color> + <color name="car_green_600">#ff28994f</color> + <color name="car_green_500">#ff41af6a</color> + <color name="car_green_400">#ff5dba80</color> + <color name="car_green_300">#ff8dcfa5</color> + <color name="car_green_200">#ffb3dfc3</color> + <color name="car_green_100">#ffd5ebdf</color> + <color name="car_green_50">#ffe8f3ee</color> + + <color name="car_red_900">#ffa81314</color> + <color name="car_red_800">#ffb41b1a</color> + <color name="car_red_700">#ffc22a2a</color> + <color name="car_red_600">#ffd33b30</color> + <color name="car_red_500">#ffe25142</color> + <color name="car_red_400">#ffe66a5e</color> + <color name="car_red_300">#ffed968d</color> + <color name="car_red_200">#fff3b9b3</color> + <color name="car_red_100">#fff7d8d9</color> + <color name="car_red_50">#fffaebeb</color> + + <color name="car_yellow_900">#ffdd860e</color> + <color name="car_yellow_800">#ffe59810</color> + <color name="car_yellow_700">#ffeda912</color> + <color name="car_yellow_600">#fff3b713</color> + <color name="car_yellow_500">#fff5c518</color> + <color name="car_yellow_400">#fff6cd3a</color> + <color name="car_yellow_300">#fff9dc74</color> + <color name="car_yellow_200">#fffbe7a2</color> + <color name="car_yellow_100">#fffcf0ce</color> + <color name="car_yellow_50">#fffdf7e6</color> + + <color name="car_orange_900">#ffb06000</color> + <color name="car_orange_800">#ffc26401</color> + <color name="car_orange_700">#ffd56e0c</color> + <color name="car_orange_600">#ffe8710a</color> + <color name="car_orange_500">#fffa7b17</color> + <color name="car_orange_400">#fffa903e</color> + <color name="car_orange_300">#fffcad70</color> + <color name="car_orange_200">#fffdc69c</color> + <color name="car_orange_100">#fffedfc8</color> + <color name="car_orange_50">#fffeefe3</color> + + <color name="car_pink_900">#ff9c166b</color> + <color name="car_pink_800">#ffb80672</color> + <color name="car_pink_700">#ffd01884</color> + <color name="car_pink_600">#ffe52592</color> + <color name="car_pink_500">#fff439a0</color> + <color name="car_pink_400">#ffff63b8</color> + <color name="car_pink_300">#ffff8bcb</color> + <color name="car_pink_200">#fffba9d6</color> + <color name="car_pink_100">#fffdcfe8</color> + <color name="car_pink_50">#fffde7f3</color> + + <color name="car_teal_900">#ff004d40</color> + <color name="car_teal_800">#ff00695c</color> + <color name="car_teal_700">#ff00796b</color> + <color name="car_teal_600">#ff00897b</color> + <color name="car_teal_500">#ff009688</color> + <color name="car_teal_400">#ff26a69a</color> + <color name="car_teal_300">#ff4db6ac</color> + <color name="car_teal_200">#ff80cbc4</color> + <color name="car_teal_100">#ffb2dfdb</color> + <color name="car_teal_50">#ffe0f2f1</color> + + <color name="car_purple_900">#ff681da8</color> + <color name="car_purple_800">#ff7627bb</color> + <color name="car_purple_700">#ff8430ce</color> + <color name="car_purple_600">#ff9334e6</color> + <color name="car_purple_500">#ffa142f4</color> + <color name="car_purple_400">#ffaf5cf7</color> + <color name="car_purple_300">#ffc58af9</color> + <color name="car_purple_200">#ffd7aefb</color> + <color name="car_purple_100">#ffe9d2fd</color> + <color name="car_purple_50">#fff3e8fd</color> + + <color name="car_cyan_900">#ff01877e</color> + <color name="car_cyan_800">#ff099091</color> + <color name="car_cyan_700">#ff12a4af</color> + <color name="car_cyan_600">#ff12b5cb</color> + <color name="car_cyan_500">#ff24c1e0</color> + <color name="car_cyan_400">#ff4ecde6</color> + <color name="car_cyan_300">#ff78d9ec</color> + <color name="car_cyan_200">#ffa1e4f2</color> + <color name="car_cyan_100">#ffcbf0f8</color> + <color name="car_cyan_50">#ffe4f7fb</color> + + + <color name="car_grey_1000">#cc000000</color> + <color name="car_white_1000">#1effffff</color> + <color name="car_blue_grey_800">#ff37474F</color> + <color name="car_blue_grey_900">#ff263238</color> + <color name="car_dark_blue_grey_600">#ff1d272d</color> + <color name="car_dark_blue_grey_700">#ff172026</color> + <color name="car_dark_blue_grey_800">#ff11181d</color> + <color name="car_dark_blue_grey_900">#ff0c1013</color> + <color name="car_dark_blue_grey_1000">#ff090c0f</color> + <color name="car_light_blue_300">#ff4fc3f7</color> + <color name="car_light_blue_500">#ff03A9F4</color> + <color name="car_light_blue_600">#ff039be5</color> + <color name="car_light_blue_700">#ff0288d1</color> + <color name="car_light_blue_800">#ff0277bd</color> + <color name="car_light_blue_900">#ff01579b</color> + + + <color name="car_red_500a">#ffd50000</color> + <color name="car_red_a700">#ffd50000</color> </resources> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 1404383bc234..9aebf6c4597f 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -3541,4 +3541,13 @@ <!-- Brand value for attestation of misprovisioned device. --> <string name="config_misprovisionedBrandValue" translatable="false"></string> + + <!-- Pre-scale volume at volume step 1 for Absolute Volume --> + <fraction name="config_prescaleAbsoluteVolume_index1">50%</fraction> + + <!-- Pre-scale volume at volume step 2 for Absolute Volume --> + <fraction name="config_prescaleAbsoluteVolume_index2">70%</fraction> + + <!-- Pre-scale volume at volume step 3 for Absolute Volume --> + <fraction name="config_prescaleAbsoluteVolume_index3">85%</fraction> </resources> diff --git a/core/res/res/values/dimens_car.xml b/core/res/res/values/dimens_car.xml index 7d14f868fefc..a0c02ede1890 100644 --- a/core/res/res/values/dimens_car.xml +++ b/core/res/res/values/dimens_car.xml @@ -16,12 +16,86 @@ */ --> <resources> - <!-- TODO replace with car support lib sizes when available --> <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_padding_4">20dp</dimen> + + + <!-- Application Bar --> + <dimen name="car_app_bar_height">80dp</dimen> + <!-- Margin --> + <dimen name="car_margin">20dp</dimen> + <!-- Lists --> + <dimen name="car_single_line_list_item_height">96dp</dimen> + <dimen name="car_double_line_list_item_height">@dimen/car_single_line_list_item_height</dimen> + <dimen name="car_list_divider_height">1dp</dimen> + <!-- The diff between keyline 1 and keyline 3. --> + <dimen name="car_keyline_1_keyline_3_diff">88dp</dimen> + <dimen name="car_dialog_action_bar_height">@dimen/car_card_action_bar_height</dimen> + <dimen name="car_primary_icon_size">44dp</dimen> + + <!-- 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> -</resources>
\ No newline at end of file + <dimen name="car_body2_size">26sp</dimen> + <dimen name="car_body3_size">16sp</dimen> + <dimen name="car_body4_size">14sp</dimen> + <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> + + <!-- Common icon size for car app --> + <dimen name="car_icon_size">56dp</dimen> + + <dimen name="car_card_header_height">96dp</dimen> + <dimen name="car_card_action_bar_height">96dp</dimen> + + <!-- Paddings --> + <dimen name="car_padding_1">4dp</dimen> + <dimen name="car_padding_2">10dp</dimen> + <dimen name="car_padding_3">16dp</dimen> + <dimen name="car_padding_4">28dp</dimen> + <dimen name="car_padding_5">32dp</dimen> + + <!-- Radius --> + <dimen name="car_radius_1">4dp</dimen> + <dimen name="car_radius_2">8dp</dimen> + <dimen name="car_radius_3">16dp</dimen> + <dimen name="car_radius_5">100dp</dimen> + + <!-- Keylines for content. --> + <dimen name="car_keyline_1">48dp</dimen> + <dimen name="car_keyline_2">108dp</dimen> + <dimen name="car_keyline_3">152dp</dimen> + <dimen name="car_keyline_4">182dp</dimen> + + <!-- Buttons --> + <dimen name="car_button_height">56dp</dimen> + <dimen name="car_button_min_width">158dp</dimen> + <dimen name="car_button_horizontal_padding">@dimen/car_padding_4</dimen> + <dimen name="car_borderless_button_horizontal_padding">0dp</dimen> + <dimen name="car_button_radius">@dimen/car_radius_1</dimen> + <dimen name="car_pill_button_size">56dp</dimen> + + <!-- Seekbar --> + <dimen name="car_seekbar_height">6dp</dimen> + <dimen name="car_seekbar_padding">26dp</dimen> + <dimen name="car_seekbar_thumb_size">24dp</dimen> + <dimen name="car_seekbar_thumb_stroke">1dp</dimen> + <!-- The space between seekbar and text in ListItem. This value is based on car_seekbar_padding. + It brings seekbar and text closer for visual balance while maintaining touch area. --> + <dimen name="car_seekbar_text_overlap">-20dp</dimen> + + <!-- Progress Bar --> + <dimen name="car_progress_bar_height">@dimen/car_seekbar_height</dimen> + +</resources> diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index cc99a4e4e640..cdaff18cf38a 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -2912,6 +2912,7 @@ <!-- @hide For use by platform and tools only. Developers should not specify this value. --> <public name="usesNonSdkApi" /> <public name="minimumUiTimeout" /> + <public name="isLightTheme" /> </public-group> <public-group type="drawable" first-id="0x010800b4"> diff --git a/core/res/res/values/styles_car.xml b/core/res/res/values/styles_car.xml new file mode 100644 index 000000000000..f6ff1b651788 --- /dev/null +++ b/core/res/res/values/styles_car.xml @@ -0,0 +1,89 @@ +<?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. +--> +<resources> + <!-- Car text --> + <style name="CarBody1"> + <item name="textStyle">normal</item> + <item name="textSize">@dimen/car_body1_size</item> + <item name="textColor">@color/car_body1</item> + </style> + + <style name="CarBody1.Light"> + <item name="textColor">@color/car_body1_light</item> + </style> + + <style name="CarBody1.Dark"> + <item name="textColor">@color/car_body2_dark</item> + </style> + + <style name="CarBody2"> + <item name="textStyle">normal</item> + <item name="textSize">@dimen/car_body2_size</item> + <item name="textColor">@color/car_body2</item> + </style> + + <style name="CarBody2.Dark"> + <item name="textColor">@color/car_body2_dark</item> + </style> + <style name="CarBody2.Light"> + <item name="textColor">@color/car_body2_light</item> + </style> + + <style name="CarBody3"> + <item name="textStyle">normal</item> + <item name="textSize">@dimen/car_body3_size</item> + <item name="textColor">@color/car_body3</item> + </style> + + <!-- The smallest styling for body text. The color of this text changes based on the day/night + mode. --> + <style name="CarBody4"> + <item name="textStyle">normal</item> + <item name="textSize">@dimen/car_body4_size</item> + <item name="textColor">@color/car_body4</item> + </style> + + <style name="CarAction1"> + <item name="textStyle">bold</item> + <item name="textSize">@dimen/car_action1_size</item> + <item name="textColor">@color/car_highlight</item> + </style> + + <style name="CarAction1.Dark"> + <item name="textColor">@color/car_highlight_dark</item> + </style> + <style name="CarAction1.Light"> + <item name="textColor">@color/car_highlight_light</item> + </style> + + <!-- The styling for title text. The color of this text changes based on day/night mode. --> + <style name="CarTitle" > + <item name="textStyle">bold</item> + <item name="textSize">@dimen/car_title2_size</item> + <item name="textColor">@color/car_title</item> + </style> + + <!-- Title text that is permanently a dark color. --> + <style name="CarTitle.Dark" > + <item name="textColor">@color/car_title_dark</item> + </style> + + <!-- Title text that is permanently a light color. --> + <style name="CarTitle.Light" > + <item name="textColor">@color/car_title_light</item> + </style> + +</resources> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 21f0dad69e2c..9f2256a6461a 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -3470,4 +3470,9 @@ <java-symbol type="integer" name="db_wal_truncate_size" /> <java-symbol type="integer" name="config_wakeUpDelayDoze" /> <java-symbol type="string" name="config_dozeWakeScreenSensorType" /> + + <!-- For Bluetooth AbsoluteVolume --> + <java-symbol type="fraction" name="config_prescaleAbsoluteVolume_index1" /> + <java-symbol type="fraction" name="config_prescaleAbsoluteVolume_index2" /> + <java-symbol type="fraction" name="config_prescaleAbsoluteVolume_index3" /> </resources> diff --git a/core/res/res/values/themes_device_defaults.xml b/core/res/res/values/themes_device_defaults.xml index 442106b988e1..3385527ee6ff 100644 --- a/core/res/res/values/themes_device_defaults.xml +++ b/core/res/res/values/themes_device_defaults.xml @@ -1716,4 +1716,10 @@ easier. <item name="colorAccent">@color/accent_device_default_dark</item> </style> + <style name="Theme.DeviceDefault.Light.Dialog.Alert.UserSwitchingDialog" parent="Theme.DeviceDefault.NoActionBar.Fullscreen"> + <item name="colorBackground">@color/background_device_default_light</item> + <item name="colorBackgroundFloating">@color/background_device_default_light</item> + <item name="layout_gravity">center</item> + </style> + </resources> diff --git a/core/tests/coretests/src/android/provider/SettingsValidatorsTest.java b/core/tests/coretests/src/android/provider/SettingsValidatorsTest.java index 890929374159..b0d29bd1d8f0 100644 --- a/core/tests/coretests/src/android/provider/SettingsValidatorsTest.java +++ b/core/tests/coretests/src/android/provider/SettingsValidatorsTest.java @@ -73,7 +73,7 @@ public class SettingsValidatorsTest { @Test public void testComponentNameValidator() { assertTrue(SettingsValidators.COMPONENT_NAME_VALIDATOR.validate( - "android/com.android.internal.backup.LocalTransport")); + "com.android.localtransport/.LocalTransport")); assertFalse(SettingsValidators.COMPONENT_NAME_VALIDATOR.validate("rectangle")); } @@ -90,7 +90,7 @@ public class SettingsValidatorsTest { @Test public void testNullableComponentNameValidator_onValidComponentName_returnsTrue() { assertTrue(SettingsValidators.NULLABLE_COMPONENT_NAME_VALIDATOR.validate( - "android/com.android.internal.backup.LocalTransport")); + "com.android.localtransport/.LocalTransport")); } @Test @@ -185,7 +185,7 @@ public class SettingsValidatorsTest { @Test public void testComponentNameListValidator() { Validator v = new SettingsValidators.ComponentNameListValidator(","); - assertTrue(v.validate("android/com.android.internal.backup.LocalTransport," + assertTrue(v.validate("com.android.localtransport/.LocalTransport," + "com.google.android.gms/.backup.migrate.service.D2dTransport")); assertFalse(v.validate("com.google.5android,android")); } @@ -200,7 +200,7 @@ public class SettingsValidatorsTest { @Test public void testPackageNameListValidator() { Validator v = new SettingsValidators.PackageNameListValidator(","); - assertTrue(v.validate("com.android.internal.backup.LocalTransport,com.google.android.gms")); + assertTrue(v.validate("com.android.localtransport.LocalTransport,com.google.android.gms")); assertFalse(v.validate("5com.android.internal.backup.LocalTransport,android")); } diff --git a/data/etc/framework-sysconfig.xml b/data/etc/framework-sysconfig.xml index ae6a7f6d6808..b0d2de17527d 100644 --- a/data/etc/framework-sysconfig.xml +++ b/data/etc/framework-sysconfig.xml @@ -28,7 +28,7 @@ <!-- Whitelist of what components are permitted as backup data transports. The 'service' attribute here is a flattened ComponentName string. --> <backup-transport-whitelisted-service - service="android/com.android.internal.backup.LocalTransportService" /> + service="com.android.localtransport/.LocalTransportService" /> <!-- Whitelist of bundled applications which all handle URLs to their websites by default --> <app-link package="com.android.carrierdefaultapp" /> diff --git a/graphics/java/android/graphics/BaseCanvas.java b/graphics/java/android/graphics/BaseCanvas.java index 53e9826998f3..fa37bedb06c4 100644 --- a/graphics/java/android/graphics/BaseCanvas.java +++ b/graphics/java/android/graphics/BaseCanvas.java @@ -28,11 +28,10 @@ import android.text.PrecomputedText; import android.text.SpannableString; import android.text.SpannedString; import android.text.TextUtils; -import android.view.RecordingCanvas; /** * This class is a base class for Canvas's drawing operations. Any modifications here - * should be accompanied by a similar modification to {@link RecordingCanvas}. + * should be accompanied by a similar modification to {@link BaseRecordingCanvas}. * * The purpose of this class is to minimize the cost of deciding between regular JNI * and @FastNative JNI to just the virtual call that Canvas already has. diff --git a/core/java/android/view/RecordingCanvas.java b/graphics/java/android/graphics/BaseRecordingCanvas.java index 33644832bdf1..6e936910ef40 100644 --- a/core/java/android/view/RecordingCanvas.java +++ b/graphics/java/android/graphics/BaseRecordingCanvas.java @@ -14,25 +14,12 @@ * limitations under the License. */ -package android.view; +package android.graphics; import android.annotation.ColorInt; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.Size; -import android.graphics.BaseCanvas; -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.Matrix; -import android.graphics.NinePatch; -import android.graphics.Paint; -import android.graphics.Path; -import android.graphics.Picture; -import android.graphics.PorterDuff; -import android.graphics.Rect; -import android.graphics.RectF; -import android.graphics.TemporaryBuffer; import android.text.GraphicsOperations; import android.text.MeasuredParagraph; import android.text.PrecomputedText; @@ -49,9 +36,9 @@ import dalvik.annotation.optimization.FastNative; * * @hide */ -public class RecordingCanvas extends Canvas { +public class BaseRecordingCanvas extends Canvas { - public RecordingCanvas(long nativeCanvas) { + public BaseRecordingCanvas(long nativeCanvas) { super(nativeCanvas); } diff --git a/graphics/java/android/graphics/Typeface.java b/graphics/java/android/graphics/Typeface.java index 492c236c014e..e6ac06011e23 100644 --- a/graphics/java/android/graphics/Typeface.java +++ b/graphics/java/android/graphics/Typeface.java @@ -34,7 +34,6 @@ import android.os.Build; import android.provider.FontRequest; import android.provider.FontsContract; import android.text.FontConfig; -import android.util.ArrayMap; import android.util.Base64; import android.util.LongSparseArray; import android.util.LruCache; @@ -1112,13 +1111,6 @@ public class Typeface { } } - // Following methods are left for layoutlib - // TODO: Remove once layoutlib stop calling buildSystemFallback - /** @hide */ - public static void buildSystemFallback(String xmlPath, String fontDir, - ArrayMap<String, Typeface> fontMap, ArrayMap<String, FontFamily[]> fallbackMap) { - } - static { final HashMap<String, Typeface> systemFontMap = new HashMap<>(); initSystemDefaultTypefaces(systemFontMap, SystemFonts.getRawSystemFallbackMap(), diff --git a/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java b/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java index 76f2cfb33824..6c1372ff25b4 100644 --- a/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java +++ b/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java @@ -51,6 +51,7 @@ import android.util.Property; import android.util.TimeUtils; import android.view.Choreographer; import android.view.DisplayListCanvas; +import android.view.NativeVectorDrawableAnimator; import android.view.RenderNode; import android.view.RenderNodeAnimatorSetHelper; import android.view.View; @@ -1231,7 +1232,8 @@ public class AnimatedVectorDrawable extends Drawable implements Animatable2 { /** * @hide */ - public static class VectorDrawableAnimatorRT implements VectorDrawableAnimator { + public static class VectorDrawableAnimatorRT implements VectorDrawableAnimator, + NativeVectorDrawableAnimator { private static final int START_ANIMATION = 1; private static final int REVERSE_ANIMATION = 2; private static final int RESET_ANIMATION = 3; @@ -1704,6 +1706,7 @@ public class AnimatedVectorDrawable extends Drawable implements Animatable2 { } } + @Override public long getAnimatorNativePtr() { return mSetPtr; } diff --git a/graphics/java/android/graphics/fonts/Font.java b/graphics/java/android/graphics/fonts/Font.java index 1458c66a2c54..bd1ac25bf8df 100644 --- a/graphics/java/android/graphics/fonts/Font.java +++ b/graphics/java/android/graphics/fonts/Font.java @@ -422,9 +422,10 @@ public final class Font { nAddAxis(builderPtr, axis.getOpenTypeTagValue(), axis.getStyleValue()); } } - final long ptr = nBuild(builderPtr, mBuffer, mWeight, italic, mTtcIndex); - final Font font = new Font(ptr, mBuffer, mFile, mWeight, italic, mTtcIndex, mAxes, - mLocaleList); + final ByteBuffer readonlyBuffer = mBuffer.asReadOnlyBuffer(); + final long ptr = nBuild(builderPtr, readonlyBuffer, mWeight, italic, mTtcIndex); + final Font font = new Font(ptr, readonlyBuffer, mFile, mWeight, italic, mTtcIndex, + mAxes, mLocaleList); sFontRegistory.registerNativeAllocation(font, ptr); return font; } @@ -477,7 +478,7 @@ public final class Font { } /** - * Retuns a font file buffer. + * Returns a font file buffer. * * @return a font buffer */ diff --git a/graphics/java/android/graphics/fonts/SystemFonts.java b/graphics/java/android/graphics/fonts/SystemFonts.java index f4a2199a6688..5e80749e9233 100644 --- a/graphics/java/android/graphics/fonts/SystemFonts.java +++ b/graphics/java/android/graphics/fonts/SystemFonts.java @@ -45,7 +45,7 @@ import java.util.Set; /** * Provides the system font configurations. */ -public class SystemFonts { +public final class SystemFonts { private static final String TAG = "SystemFonts"; private static final String DEFAULT_FAMILY = "sans-serif"; @@ -58,8 +58,7 @@ public class SystemFonts { /** * Returns all available font files in the system. * - * Note: The order of this font doesn't indicates anything. - * @return an array of system fonts + * @return a set of system fonts */ public static @NonNull Set<Font> getAvailableFonts() { HashSet<Font> set = new HashSet<>(); diff --git a/libs/hwui/Android.bp b/libs/hwui/Android.bp index 11dad2e0d731..494e5135d5bb 100644 --- a/libs/hwui/Android.bp +++ b/libs/hwui/Android.bp @@ -229,6 +229,7 @@ cc_defaults { "ResourceCache.cpp", "SkiaCanvas.cpp", "Snapshot.cpp", + "TreeInfo.cpp", "VectorDrawable.cpp", "protos/graphicsstats.proto", ], diff --git a/libs/hwui/DeviceInfo.cpp b/libs/hwui/DeviceInfo.cpp index 21fbbdca7ad0..0b9d82b105a3 100644 --- a/libs/hwui/DeviceInfo.cpp +++ b/libs/hwui/DeviceInfo.cpp @@ -61,18 +61,6 @@ DisplayInfo QueryDisplayInfo() { return displayInfo; } -void QueryCompositionPreference(ui::Dataspace* dataSpace, - ui::PixelFormat* pixelFormat) { - if (Properties::isolatedProcess) { - *dataSpace = ui::Dataspace::V0_SRGB; - *pixelFormat = ui::PixelFormat::RGBA_8888; - } - - status_t status = - SurfaceComposerClient::getCompositionPreference(dataSpace, pixelFormat); - LOG_ALWAYS_FATAL_IF(status, "Failed to get composition preference, error %d", status); -} - DeviceInfo::DeviceInfo() { #if HWUI_NULL_GPU mMaxTextureSize = NULL_GPU_MAX_TEXTURE_SIZE; @@ -80,7 +68,6 @@ DeviceInfo::DeviceInfo() { mMaxTextureSize = -1; #endif mDisplayInfo = QueryDisplayInfo(); - QueryCompositionPreference(&mTargetDataSpace, &mTargetPixelFormat); } int DeviceInfo::maxTextureSize() const { diff --git a/libs/hwui/DeviceInfo.h b/libs/hwui/DeviceInfo.h index 1d7477416077..595621573e6e 100644 --- a/libs/hwui/DeviceInfo.h +++ b/libs/hwui/DeviceInfo.h @@ -17,7 +17,6 @@ #define DEVICEINFO_H #include <ui/DisplayInfo.h> -#include <ui/GraphicTypes.h> #include "utils/Macros.h" @@ -37,9 +36,6 @@ public: // this value is only valid after the GPU has been initialized and there is a valid graphics // context or if you are using the HWUI_NULL_GPU int maxTextureSize() const; - - ui::Dataspace getTargetDataSpace() const { return mTargetDataSpace; } - ui::PixelFormat getTargetPixelFormat() const { return mTargetPixelFormat; } const DisplayInfo& displayInfo() const { return mDisplayInfo; } private: @@ -50,10 +46,6 @@ private: int mMaxTextureSize; DisplayInfo mDisplayInfo; - - // TODO(lpy) Replace below with android_ prefix types. - ui::Dataspace mTargetDataSpace; - ui::PixelFormat mTargetPixelFormat; }; } /* namespace uirenderer */ diff --git a/libs/hwui/Properties.cpp b/libs/hwui/Properties.cpp index 17bec1934490..a699e2f7195b 100644 --- a/libs/hwui/Properties.cpp +++ b/libs/hwui/Properties.cpp @@ -61,6 +61,7 @@ bool Properties::filterOutTestOverhead = false; bool Properties::disableVsync = false; bool Properties::skpCaptureEnabled = false; bool Properties::forceDarkMode = false; +bool Properties::enableForceDarkSupport = false; bool Properties::enableRTAnimations = true; bool Properties::runningInEmulator = false; @@ -149,6 +150,9 @@ bool Properties::load() { forceDarkMode = property_get_bool(PROPERTY_FORCE_DARK, false); + // TODO: make this on by default + enableForceDarkSupport = property_get_bool(PROPERTY_ENABLE_FORCE_DARK, false); + return (prevDebugLayersUpdates != debugLayersUpdates) || (prevDebugOverdraw != debugOverdraw) || (prevDebugStencilClip != debugStencilClip); } diff --git a/libs/hwui/Properties.h b/libs/hwui/Properties.h index ea017a72cd74..542bc71f7c72 100644 --- a/libs/hwui/Properties.h +++ b/libs/hwui/Properties.h @@ -192,6 +192,8 @@ enum DebugLevel { #define PROPERTY_FORCE_DARK "debug.hwui.force_dark" +#define PROPERTY_ENABLE_FORCE_DARK "debug.hwui.force_dark_enabled" + /////////////////////////////////////////////////////////////////////////////// // Misc /////////////////////////////////////////////////////////////////////////////// @@ -266,6 +268,7 @@ public: static bool skpCaptureEnabled; static bool forceDarkMode; + static bool enableForceDarkSupport; // For experimentation b/68769804 ANDROID_API static bool enableRTAnimations; diff --git a/libs/hwui/TreeInfo.cpp b/libs/hwui/TreeInfo.cpp new file mode 100644 index 000000000000..808a12a311e2 --- /dev/null +++ b/libs/hwui/TreeInfo.cpp @@ -0,0 +1,29 @@ +/* + * 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. + */ + +#include "TreeInfo.h" + +#include "renderthread/CanvasContext.h" + +namespace android::uirenderer { + +TreeInfo::TreeInfo(TraversalMode mode, renderthread::CanvasContext& canvasContext) + : mode(mode) + , prepareTextures(mode == MODE_FULL) + , canvasContext(canvasContext) + , disableForceDark(canvasContext.useForceDark() ? 0 : 1) {} + +} // namespace android::uirenderer diff --git a/libs/hwui/TreeInfo.h b/libs/hwui/TreeInfo.h index caa5762d174a..a0d960527ca6 100644 --- a/libs/hwui/TreeInfo.h +++ b/libs/hwui/TreeInfo.h @@ -16,8 +16,8 @@ #pragma once -#include "utils/Macros.h" #include "Properties.h" +#include "utils/Macros.h" #include <utils/Timers.h> @@ -40,7 +40,7 @@ public: virtual void onError(const std::string& message) = 0; protected: - virtual ~ErrorHandler() {} + virtual ~ErrorHandler() = default; }; class TreeObserver { @@ -52,7 +52,7 @@ public: virtual void onMaybeRemovedFromTree(RenderNode* node) = 0; protected: - virtual ~TreeObserver() {} + virtual ~TreeObserver() = default; }; // This would be a struct, but we want to PREVENT_COPY_AND_ASSIGN @@ -71,8 +71,7 @@ public: MODE_RT_ONLY, }; - TreeInfo(TraversalMode mode, renderthread::CanvasContext& canvasContext) - : mode(mode), prepareTextures(mode == MODE_FULL), canvasContext(canvasContext) {} + TreeInfo(TraversalMode mode, renderthread::CanvasContext& canvasContext); TraversalMode mode; // TODO: Remove this? Currently this is used to signal to stop preparing @@ -94,7 +93,7 @@ public: bool updateWindowPositions = false; - int disableForceDark = Properties::forceDarkMode ? 0 : 1; + int disableForceDark; struct Out { bool hasFunctors = false; diff --git a/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp b/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp index e8bf4922cd46..d401b385075e 100644 --- a/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp +++ b/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp @@ -167,6 +167,12 @@ bool SkiaOpenGLPipeline::setSurface(Surface* surface, SwapBehavior swapBehavior, mEglSurface = mEglManager.createSurface(surface, colorMode); } + if (colorMode == ColorMode::SRGB) { + mSurfaceColorType = SkColorType::kN32_SkColorType; + } else if (colorMode == ColorMode::WideColorGamut) { + mSurfaceColorType = SkColorType::kRGBA_F16_SkColorType; + } + if (mEglSurface != EGL_NO_SURFACE) { const bool preserveBuffer = (swapBehavior != SwapBehavior::kSwap_discardBuffer); mBufferPreserved = mEglManager.setPreserveBuffer(mEglSurface, preserveBuffer); @@ -184,14 +190,6 @@ bool SkiaOpenGLPipeline::isContextReady() { return CC_LIKELY(mEglManager.hasEglContext()); } -SkColorType SkiaOpenGLPipeline::getSurfaceColorType() const { - return mEglManager.getSurfaceColorType(); -} - -sk_sp<SkColorSpace> SkiaOpenGLPipeline::getSurfaceColorSpace() { - return mEglManager.getSurfaceColorSpace(); -} - void SkiaOpenGLPipeline::invokeFunctor(const RenderThread& thread, Functor* functor) { DrawGlInfo::Mode mode = DrawGlInfo::kModeProcessNoContext; if (thread.eglManager().hasEglContext()) { diff --git a/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.h b/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.h index 086a76088a75..4ab3541d447b 100644 --- a/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.h +++ b/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.h @@ -47,8 +47,6 @@ public: void onStop() override; bool isSurfaceReady() override; bool isContextReady() override; - SkColorType getSurfaceColorType() const override; - sk_sp<SkColorSpace> getSurfaceColorSpace() override; static void invokeFunctor(const renderthread::RenderThread& thread, Functor* functor); diff --git a/libs/hwui/pipeline/skia/SkiaPipeline.h b/libs/hwui/pipeline/skia/SkiaPipeline.h index ee9158c5ffc1..42a411a6808c 100644 --- a/libs/hwui/pipeline/skia/SkiaPipeline.h +++ b/libs/hwui/pipeline/skia/SkiaPipeline.h @@ -48,6 +48,9 @@ public: bool createOrUpdateLayer(RenderNode* node, const DamageAccumulator& damageAccumulator, ErrorHandler* errorHandler) override; + SkColorType getSurfaceColorType() const { return mSurfaceColorType; } + sk_sp<SkColorSpace> getSurfaceColorSpace() override { return mSurfaceColorSpace; } + void renderFrame(const LayerUpdateQueue& layers, const SkRect& clip, const std::vector<sp<RenderNode>>& nodes, bool opaque, const Rect& contentDrawBounds, sk_sp<SkSurface> surface); @@ -106,6 +109,8 @@ protected: void dumpResourceCacheUsage() const; renderthread::RenderThread& mRenderThread; + SkColorType mSurfaceColorType; + sk_sp<SkColorSpace> mSurfaceColorSpace; private: void renderFrameImpl(const LayerUpdateQueue& layers, const SkRect& clip, diff --git a/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp b/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp index e34f160467af..a2d811993f2f 100644 --- a/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp +++ b/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp @@ -123,8 +123,7 @@ bool SkiaVulkanPipeline::setSurface(Surface* surface, SwapBehavior swapBehavior, } if (surface) { - // TODO: handle color mode - mVkSurface = mVkManager.createSurface(surface); + mVkSurface = mVkManager.createSurface(surface, colorMode); } return mVkSurface != nullptr; @@ -138,14 +137,6 @@ bool SkiaVulkanPipeline::isContextReady() { return CC_LIKELY(mVkManager.hasVkContext()); } -SkColorType SkiaVulkanPipeline::getSurfaceColorType() const { - return mVkManager.getSurfaceColorType(); -} - -sk_sp<SkColorSpace> SkiaVulkanPipeline::getSurfaceColorSpace() { - return mVkManager.getSurfaceColorSpace(); -} - void SkiaVulkanPipeline::invokeFunctor(const RenderThread& thread, Functor* functor) { VkFunctorDrawable::vkInvokeFunctor(functor); } diff --git a/libs/hwui/pipeline/skia/SkiaVulkanPipeline.h b/libs/hwui/pipeline/skia/SkiaVulkanPipeline.h index 6e723a8373e1..14c0d69dba33 100644 --- a/libs/hwui/pipeline/skia/SkiaVulkanPipeline.h +++ b/libs/hwui/pipeline/skia/SkiaVulkanPipeline.h @@ -43,8 +43,6 @@ public: void onStop() override; bool isSurfaceReady() override; bool isContextReady() override; - SkColorType getSurfaceColorType() const override; - sk_sp<SkColorSpace> getSurfaceColorSpace() override; static void invokeFunctor(const renderthread::RenderThread& thread, Functor* functor); static sk_sp<Bitmap> allocateHardwareBitmap(renderthread::RenderThread& thread, diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index c8c394a72541..92a749f3da33 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -144,8 +144,7 @@ void CanvasContext::setSurface(sp<Surface>&& surface) { mNativeSurface = std::move(surface); - // TODO(b/111436479) Introduce a way for app to specify DisplayColorGamut mode. - ColorMode colorMode = mWideColorGamut ? ColorMode::WideColorGamut : ColorMode::Legacy; + ColorMode colorMode = mWideColorGamut ? ColorMode::WideColorGamut : ColorMode::SRGB; bool hasSurface = mRenderPipeline->setSurface(mNativeSurface.get(), mSwapBehavior, colorMode); mFrameNumber = -1; diff --git a/libs/hwui/renderthread/CanvasContext.h b/libs/hwui/renderthread/CanvasContext.h index 2315cb9c73f9..2307ee4801d3 100644 --- a/libs/hwui/renderthread/CanvasContext.h +++ b/libs/hwui/renderthread/CanvasContext.h @@ -182,6 +182,23 @@ public: mFrameCompleteCallbacks.push_back(std::move(func)); } + void setForceDark(bool enable) { + mUseForceDark = enable; + } + + bool useForceDark() { + // The force-dark override has the highest priority, followed by the disable setting + // for the feature as a whole, followed last by whether or not this context has had + // force dark set (typically automatically done via UIMode) + if (Properties::forceDarkMode) { + return true; + } + if (!Properties::enableForceDarkSupport) { + return false; + } + return mUseForceDark; + } + private: CanvasContext(RenderThread& thread, bool translucent, RenderNode* rootRenderNode, IContextFactory* contextFactory, std::unique_ptr<IRenderPipeline> renderPipeline); @@ -228,6 +245,7 @@ private: bool mOpaque; bool mWideColorGamut = false; + bool mUseForceDark = false; LightInfo mLightInfo; LightGeometry mLightGeometry = {{0, 0, 0}, 0}; diff --git a/libs/hwui/renderthread/EglManager.cpp b/libs/hwui/renderthread/EglManager.cpp index 0cb23e532064..d4ffddde8def 100644 --- a/libs/hwui/renderthread/EglManager.cpp +++ b/libs/hwui/renderthread/EglManager.cpp @@ -126,17 +126,6 @@ void EglManager::initialize() { createContext(); createPBufferSurface(); makeCurrent(mPBufferSurface, nullptr, /* force */ true); - - mSurfaceColorGamut = DataSpaceToColorGamut( - static_cast<android_dataspace>(DeviceInfo::get()->getTargetDataSpace())); - - LOG_ALWAYS_FATAL_IF(mSurfaceColorGamut == SkColorSpace::kDCIP3_D65_Gamut && - !EglExtensions.displayP3, "EGL doesn't support Display P3."); - - mSurfaceColorType = PixelFormatToColorType( - static_cast<android_pixel_format>(DeviceInfo::get()->getTargetPixelFormat())); - mSurfaceColorSpace = DataSpaceToColorSpace( - static_cast<android_dataspace>(DeviceInfo::get()->getTargetDataSpace())); } void EglManager::initExtensions() { @@ -309,21 +298,13 @@ EGLSurface EglManager::createSurface(EGLNativeWindowType window, ColorMode color if (wideColorGamut) { attribs[1] = EGL_GL_COLORSPACE_SCRGB_LINEAR_EXT; } else { - if (mSurfaceColorGamut == SkColorSpace::kDCIP3_D65_Gamut) { - attribs[1] = EGL_GL_COLORSPACE_DISPLAY_P3_EXT; - } else { - attribs[1] = EGL_GL_COLORSPACE_SRGB_KHR; - } + attribs[1] = EGL_GL_COLORSPACE_SRGB_KHR; } #else if (wideColorGamut) { attribs[1] = EGL_GL_COLORSPACE_SCRGB_EXT; } else { - if (mSurfaceColorGamut == SkColorSpace::kDCIP3_D65_Gamut) { - attribs[1] = EGL_GL_COLORSPACE_DISPLAY_P3_EXT; - } else { - attribs[1] = EGL_GL_COLORSPACE_LINEAR_KHR; - } + attribs[1] = EGL_GL_COLORSPACE_LINEAR_KHR; } #endif } diff --git a/libs/hwui/renderthread/EglManager.h b/libs/hwui/renderthread/EglManager.h index e97228cd0a39..55c81d42d8a0 100644 --- a/libs/hwui/renderthread/EglManager.h +++ b/libs/hwui/renderthread/EglManager.h @@ -78,9 +78,6 @@ public: // Depending on installed extensions, the result is either Android native fence or EGL fence. status_t createReleaseFence(bool useFenceSync, EGLSyncKHR* eglFence, sp<Fence>& nativeFence); - SkColorType getSurfaceColorType() const { return mSurfaceColorType; } - sk_sp<SkColorSpace> getSurfaceColorSpace() { return mSurfaceColorSpace; } - private: void initExtensions(); @@ -95,9 +92,6 @@ private: EGLContext mEglContext; EGLSurface mPBufferSurface; EGLSurface mCurrentSurface; - SkColorSpace::Gamut mSurfaceColorGamut; - SkColorType mSurfaceColorType; - sk_sp<SkColorSpace> mSurfaceColorSpace; enum class SwapBehavior { Discard, diff --git a/libs/hwui/renderthread/IRenderPipeline.h b/libs/hwui/renderthread/IRenderPipeline.h index 0297c9c141ff..4972554c65cc 100644 --- a/libs/hwui/renderthread/IRenderPipeline.h +++ b/libs/hwui/renderthread/IRenderPipeline.h @@ -43,15 +43,8 @@ namespace renderthread { enum class MakeCurrentResult { AlreadyCurrent, Failed, Succeeded }; enum class ColorMode { - // Legacy means HWUI will produce buffer with whatever platform prefers - // HWUI to produce, however, HWUI doesn't accurately convert color from - // source color space to destination color space, instead HWUI will take - // the pixel value directly and interpret it destination color space. - Legacy, - // DisplayColorGamut means HWUI will produce buffer with whatever platform - // prefers HWUI to produce and accurately convert color from source color - // space to destination color space. - DisplayColorGamut, + // SRGB means HWUI will produce buffer in SRGB color space. + SRGB, // WideColorGamut means HWUI would support rendering scRGB non-linear into // a signed buffer with enough range to support the wide color gamut of the // display. diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp index 6106e24c093b..54219b5a1489 100644 --- a/libs/hwui/renderthread/RenderProxy.cpp +++ b/libs/hwui/renderthread/RenderProxy.cpp @@ -298,6 +298,12 @@ void RenderProxy::removeFrameMetricsObserver(FrameMetricsObserver* observerPtr) }); } +void RenderProxy::setForceDark(bool enable) { + mRenderThread.queue().post([this, enable]() { + mContext->setForceDark(enable); + }); +} + int RenderProxy::copySurfaceInto(sp<Surface>& surface, int left, int top, int right, int bottom, SkBitmap* bitmap) { auto& thread = RenderThread::getInstance(); diff --git a/libs/hwui/renderthread/RenderProxy.h b/libs/hwui/renderthread/RenderProxy.h index d22f56ef38fd..d29fcc49d7a6 100644 --- a/libs/hwui/renderthread/RenderProxy.h +++ b/libs/hwui/renderthread/RenderProxy.h @@ -119,7 +119,7 @@ public: ANDROID_API void addFrameMetricsObserver(FrameMetricsObserver* observer); ANDROID_API void removeFrameMetricsObserver(FrameMetricsObserver* observer); - ANDROID_API long getDroppedFrameReportCount(); + ANDROID_API void setForceDark(bool enable); ANDROID_API static int copySurfaceInto(sp<Surface>& surface, int left, int top, int right, int bottom, SkBitmap* bitmap); diff --git a/libs/hwui/renderthread/VulkanManager.cpp b/libs/hwui/renderthread/VulkanManager.cpp index 285a1a5f4540..83e9db359356 100644 --- a/libs/hwui/renderthread/VulkanManager.cpp +++ b/libs/hwui/renderthread/VulkanManager.cpp @@ -618,7 +618,8 @@ void VulkanManager::createBuffers(VulkanSurface* surface, VkFormat format, VkExt VulkanSurface::ImageInfo& imageInfo = surface->mImageInfos[i]; imageInfo.mSurface = SkSurface::MakeFromBackendRenderTarget( mRenderThread.getGrContext(), backendRT, kTopLeft_GrSurfaceOrigin, - kRGBA_8888_SkColorType, nullptr, &props); + surface->mColorMode == ColorMode::WideColorGamut ? kRGBA_F16_SkColorType + : kRGBA_8888_SkColorType, nullptr, &props); } SkASSERT(mCommandPool != VK_NULL_HANDLE); @@ -733,24 +734,22 @@ bool VulkanManager::createSwapchain(VulkanSurface* surface) { ? VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR : VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR; - // Pick our surface format. For now, just make sure it matches our sRGB request: - VkFormat surfaceFormat = VK_FORMAT_UNDEFINED; + VkFormat surfaceFormat = VK_FORMAT_R8G8B8A8_UNORM; VkColorSpaceKHR colorSpace = VK_COLORSPACE_SRGB_NONLINEAR_KHR; - - bool wantSRGB = false; -#ifdef ANDROID_ENABLE_LINEAR_BLENDING - wantSRGB = true; -#endif + if (surface->mColorMode == ColorMode::WideColorGamut) { + surfaceFormat = VK_FORMAT_R16G16B16A16_SFLOAT; + colorSpace = VK_COLOR_SPACE_EXTENDED_SRGB_NONLINEAR_EXT; + } + bool foundSurfaceFormat = false; for (uint32_t i = 0; i < surfaceFormatCount; ++i) { - // We are assuming we can get either R8G8B8A8_UNORM or R8G8B8A8_SRGB - VkFormat desiredFormat = wantSRGB ? VK_FORMAT_R8G8B8A8_SRGB : VK_FORMAT_R8G8B8A8_UNORM; - if (desiredFormat == surfaceFormats[i].format) { - surfaceFormat = surfaceFormats[i].format; - colorSpace = surfaceFormats[i].colorSpace; + if (surfaceFormat == surfaceFormats[i].format + && colorSpace == surfaceFormats[i].colorSpace) { + foundSurfaceFormat = true; + break; } } - if (VK_FORMAT_UNDEFINED == surfaceFormat) { + if (!foundSurfaceFormat) { return false; } @@ -812,14 +811,14 @@ bool VulkanManager::createSwapchain(VulkanSurface* surface) { return true; } -VulkanSurface* VulkanManager::createSurface(ANativeWindow* window) { +VulkanSurface* VulkanManager::createSurface(ANativeWindow* window, ColorMode colorMode) { initialize(); if (!window) { return nullptr; } - VulkanSurface* surface = new VulkanSurface(); + VulkanSurface* surface = new VulkanSurface(colorMode); VkAndroidSurfaceCreateInfoKHR surfaceCreateInfo; memset(&surfaceCreateInfo, 0, sizeof(VkAndroidSurfaceCreateInfoKHR)); diff --git a/libs/hwui/renderthread/VulkanManager.h b/libs/hwui/renderthread/VulkanManager.h index c211f5d2b5d7..7c59b6d340d2 100644 --- a/libs/hwui/renderthread/VulkanManager.h +++ b/libs/hwui/renderthread/VulkanManager.h @@ -26,6 +26,7 @@ #include <ui/Fence.h> #include <utils/StrongPointer.h> #include <vk/GrVkBackendContext.h> +#include "IRenderPipeline.h" class GrVkExtensions; @@ -37,7 +38,7 @@ class RenderThread; class VulkanSurface { public: - VulkanSurface() {} + VulkanSurface(ColorMode colorMode) : mColorMode(colorMode) {} sk_sp<SkSurface> getBackBufferSurface() { return mBackbuffer; } @@ -73,6 +74,7 @@ private: VkImage* mImages = nullptr; ImageInfo* mImageInfos; uint16_t mCurrentTime = 0; + ColorMode mColorMode; }; // This class contains the shared global Vulkan objects, such as VkInstance, VkDevice and VkQueue, @@ -90,7 +92,7 @@ public: // Given a window this creates a new VkSurfaceKHR and VkSwapchain and stores them inside a new // VulkanSurface object which is returned. - VulkanSurface* createSurface(ANativeWindow* window); + VulkanSurface* createSurface(ANativeWindow* window, ColorMode colorMode); // Destroy the VulkanSurface and all associated vulkan objects. void destroySurface(VulkanSurface* surface); @@ -118,10 +120,6 @@ public: // Creates a fence that is signaled, when all the pending Vulkan commands are flushed. status_t createReleaseFence(sp<Fence>& nativeFence); - // TODO(b/115636873): Handle composition preference. - SkColorType getSurfaceColorType() const { return SkColorType::kN32_SkColorType; } - sk_sp<SkColorSpace> getSurfaceColorSpace() { return SkColorSpace::MakeSRGB(); } - private: friend class RenderThread; diff --git a/libs/hwui/tests/unit/SkiaPipelineTests.cpp b/libs/hwui/tests/unit/SkiaPipelineTests.cpp index 680fcb3a732b..cdf31da37074 100644 --- a/libs/hwui/tests/unit/SkiaPipelineTests.cpp +++ b/libs/hwui/tests/unit/SkiaPipelineTests.cpp @@ -386,7 +386,7 @@ RENDERTHREAD_SKIA_PIPELINE_TEST(SkiaPipeline, clip_replace) { RENDERTHREAD_SKIA_PIPELINE_TEST(SkiaPipeline, context_lost) { auto pipeline = std::make_unique<SkiaOpenGLPipeline>(renderThread); EXPECT_FALSE(pipeline->isSurfaceReady()); - EXPECT_TRUE(pipeline->setSurface((Surface*)0x01, SwapBehavior::kSwap_default, ColorMode::Legacy)); + EXPECT_TRUE(pipeline->setSurface((Surface*)0x01, SwapBehavior::kSwap_default, ColorMode::SRGB)); EXPECT_TRUE(pipeline->isSurfaceReady()); renderThread.destroyGlContext(); EXPECT_FALSE(pipeline->isSurfaceReady()); diff --git a/libs/hwui/utils/Color.cpp b/libs/hwui/utils/Color.cpp index 9f71e91629fb..3fb6a31a7d97 100644 --- a/libs/hwui/utils/Color.cpp +++ b/libs/hwui/utils/Color.cpp @@ -57,21 +57,6 @@ bool transferFunctionCloseToSRGB(const SkColorSpace* colorSpace) { return false; } -SkColorType PixelFormatToColorType(android_pixel_format pixelFormat) { - switch (pixelFormat) { - case HAL_PIXEL_FORMAT_RGBA_8888: - case HAL_PIXEL_FORMAT_BGRA_8888: - return SkColorType::kN32_SkColorType; - case HAL_PIXEL_FORMAT_RGBA_FP16: - return SkColorType::kRGBA_F16_SkColorType; - case HAL_PIXEL_FORMAT_RGBA_1010102: - return SkColorType::kRGBA_1010102_SkColorType; - default: - ALOGW("Unsupported pixel format: %d, return kN32 by default", pixelFormat); - return SkColorType::kN32_SkColorType; - } -} - android::PixelFormat ColorTypeToPixelFormat(SkColorType colorType) { switch (colorType) { case kRGBA_8888_SkColorType: @@ -92,30 +77,6 @@ android::PixelFormat ColorTypeToPixelFormat(SkColorType colorType) { } } -SkColorSpace::Gamut DataSpaceToColorGamut(android_dataspace dataSpace) { - switch (dataSpace & HAL_DATASPACE_STANDARD_MASK) { - case HAL_DATASPACE_STANDARD_BT709: - return SkColorSpace::kSRGB_Gamut; - case HAL_DATASPACE_STANDARD_BT2020: - return SkColorSpace::kRec2020_Gamut; - case HAL_DATASPACE_STANDARD_DCI_P3: - return SkColorSpace::kDCIP3_D65_Gamut; - case HAL_DATASPACE_STANDARD_ADOBE_RGB: - return SkColorSpace::kAdobeRGB_Gamut; - case HAL_DATASPACE_STANDARD_UNSPECIFIED: - case HAL_DATASPACE_STANDARD_BT601_625: - case HAL_DATASPACE_STANDARD_BT601_625_UNADJUSTED: - case HAL_DATASPACE_STANDARD_BT601_525: - case HAL_DATASPACE_STANDARD_BT601_525_UNADJUSTED: - case HAL_DATASPACE_STANDARD_BT2020_CONSTANT_LUMINANCE: - case HAL_DATASPACE_STANDARD_BT470M: - case HAL_DATASPACE_STANDARD_FILM: - default: - ALOGW("Unsupported Gamut: %d, return SRGB gamut by default", dataSpace); - return SkColorSpace::kSRGB_Gamut; - } -} - sk_sp<SkColorSpace> DataSpaceToColorSpace(android_dataspace dataspace) { SkColorSpace::Gamut gamut; diff --git a/libs/hwui/utils/Color.h b/libs/hwui/utils/Color.h index e935a0d5ec8b..4daccda78e23 100644 --- a/libs/hwui/utils/Color.h +++ b/libs/hwui/utils/Color.h @@ -115,12 +115,8 @@ static constexpr float EOCF(float srgb) { // returns true for sRGB, gamma 2.2 and Display P3 for instance bool transferFunctionCloseToSRGB(const SkColorSpace* colorSpace); -SkColorType PixelFormatToColorType(android_pixel_format pixelFormat); - android::PixelFormat ColorTypeToPixelFormat(SkColorType colorType); -SkColorSpace::Gamut DataSpaceToColorGamut(android_dataspace dataSpace); - sk_sp<SkColorSpace> DataSpaceToColorSpace(android_dataspace dataspace); struct Lab { diff --git a/media/java/android/media/MediaPlayer2Impl.java b/media/java/android/media/MediaPlayer2Impl.java index 6b48f09f5fb2..84d246f50ee3 100644 --- a/media/java/android/media/MediaPlayer2Impl.java +++ b/media/java/android/media/MediaPlayer2Impl.java @@ -254,22 +254,6 @@ public final class MediaPlayer2Impl extends MediaPlayer2 { void process() { stayAwake(false); - // TODO: remove this block when native code allows prepared -> pause - // and sends MEDIA_INFO_DATA_SOURCE_START when pipeline is created. - if (getState() == PLAYER_STATE_PREPARED) { - final DataSourceDesc dsd; - synchronized (mSrcLock) { - dsd = mCurrentDSD; - } - sendEvent(new EventNotifier() { - @Override - public void notify(EventCallback callback) { - callback.onInfo( - MediaPlayer2Impl.this, dsd, MEDIA_INFO_DATA_SOURCE_START, 0); - } - }); - } - _pause(); } }); @@ -287,7 +271,10 @@ public final class MediaPlayer2Impl extends MediaPlayer2 { addTask(new Task(CALL_COMPLETED_SKIP_TO_NEXT, false) { @Override void process() { - // TODO: switch to next data source and play + if (getState() == PLAYER_STATE_PLAYING) { + pause(); + } + playNextDataSource(); } }); } diff --git a/media/lib/remotedisplay/OWNERS b/media/lib/remotedisplay/OWNERS new file mode 100644 index 000000000000..7e7335d68d3b --- /dev/null +++ b/media/lib/remotedisplay/OWNERS @@ -0,0 +1 @@ +michaelwr@google.com diff --git a/packages/LocalTransport/Android.mk b/packages/LocalTransport/Android.mk new file mode 100644 index 000000000000..3484b0f7a537 --- /dev/null +++ b/packages/LocalTransport/Android.mk @@ -0,0 +1,35 @@ +# +# 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. +# + +LOCAL_PATH := $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_MODULE_TAGS := optional + +LOCAL_SRC_FILES := $(call all-java-files-under, src) + +LOCAL_PROGUARD_FLAG_FILES := proguard.flags + +LOCAL_PACKAGE_NAME := LocalTransport +LOCAL_PRIVATE_PLATFORM_APIS := true +LOCAL_CERTIFICATE := platform +LOCAL_PRIVILEGED_MODULE := true + +include $(BUILD_PACKAGE) + +######################## +include $(call all-makefiles-under,$(LOCAL_PATH)) + diff --git a/packages/LocalTransport/AndroidManifest.xml b/packages/LocalTransport/AndroidManifest.xml new file mode 100644 index 000000000000..196be1e998f3 --- /dev/null +++ b/packages/LocalTransport/AndroidManifest.xml @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* + * Copyright (c) 2018 Google Inc. + * + * 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.localtransport" + android:sharedUserId="android.uid.system" > + + + <application android:allowBackup="false" > + <!-- This service does not need to be exported because it shares uid with the system server + which is the only client. --> + <service android:name=".LocalTransportService" + android:permission="android.permission.CONFIRM_FULL_BACKUP" + android:exported="false"> + <intent-filter> + <action android:name="android.backup.TRANSPORT_HOST" /> + </intent-filter> + </service> + + </application> +</manifest> diff --git a/packages/LocalTransport/proguard.flags b/packages/LocalTransport/proguard.flags new file mode 100644 index 000000000000..c1f51b892d40 --- /dev/null +++ b/packages/LocalTransport/proguard.flags @@ -0,0 +1,5 @@ +-keep class com.android.localTransport.LocalTransport +-keep class com.android.localTransport.LocalTransportParameters +-keep class com.android.localTransport.LocalTransportService + + diff --git a/core/java/com/android/internal/backup/LocalTransport.java b/packages/LocalTransport/src/com/android/localtransport/LocalTransport.java index d0f02725b1a0..0bf8bc1051c2 100644 --- a/core/java/com/android/internal/backup/LocalTransport.java +++ b/packages/LocalTransport/src/com/android/localtransport/LocalTransport.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.internal.backup; +package com.android.localtransport; import android.app.backup.BackupAgent; import android.app.backup.BackupDataInput; @@ -26,7 +26,6 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.pm.PackageInfo; -import android.os.Environment; import android.os.ParcelFileDescriptor; import android.system.ErrnoException; import android.system.Os; @@ -56,7 +55,7 @@ public class LocalTransport extends BackupTransport { private static final boolean DEBUG = false; private static final String TRANSPORT_DIR_NAME - = "com.android.internal.backup.LocalTransport"; + = "com.android.localtransport.LocalTransport"; private static final String TRANSPORT_DESTINATION_STRING = "Backing up to debug-only private cache"; @@ -75,10 +74,10 @@ public class LocalTransport extends BackupTransport { private static final long KEY_VALUE_BACKUP_SIZE_QUOTA = 5 * 1024 * 1024; private Context mContext; - private File mDataDir = new File(Environment.getDownloadCacheDirectory(), "backup"); - private File mCurrentSetDir = new File(mDataDir, Long.toString(CURRENT_SET_TOKEN)); - private File mCurrentSetIncrementalDir = new File(mCurrentSetDir, INCREMENTAL_DIR); - private File mCurrentSetFullDir = new File(mCurrentSetDir, FULL_DATA_DIR); + private File mDataDir; + private File mCurrentSetDir; + private File mCurrentSetIncrementalDir; + private File mCurrentSetFullDir; private PackageInfo[] mRestorePackages = null; private int mRestorePackage = -1; // Index into mRestorePackages @@ -101,6 +100,11 @@ public class LocalTransport extends BackupTransport { private final LocalTransportParameters mParameters; private void makeDataDirs() { + mDataDir = mContext.getFilesDir(); + mCurrentSetDir = new File(mDataDir, Long.toString(CURRENT_SET_TOKEN)); + mCurrentSetIncrementalDir = new File(mCurrentSetDir, INCREMENTAL_DIR); + mCurrentSetFullDir = new File(mCurrentSetDir, FULL_DATA_DIR); + mCurrentSetDir.mkdirs(); mCurrentSetFullDir.mkdir(); mCurrentSetIncrementalDir.mkdir(); diff --git a/core/java/com/android/internal/backup/LocalTransportParameters.java b/packages/LocalTransport/src/com/android/localtransport/LocalTransportParameters.java index 2427d39fd65e..784be224f367 100644 --- a/core/java/com/android/internal/backup/LocalTransportParameters.java +++ b/packages/LocalTransport/src/com/android/localtransport/LocalTransportParameters.java @@ -14,7 +14,7 @@ * limitations under the License */ -package com.android.internal.backup; +package com.android.localtransport; import android.util.KeyValueSettingObserver; import android.content.ContentResolver; diff --git a/core/java/com/android/internal/backup/LocalTransportService.java b/packages/LocalTransport/src/com/android/localtransport/LocalTransportService.java index 69c48e2a48cf..ac4f418b68f6 100644 --- a/core/java/com/android/internal/backup/LocalTransportService.java +++ b/packages/LocalTransport/src/com/android/localtransport/LocalTransportService.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.internal.backup; +package com.android.localtransport; import android.app.Service; import android.content.Intent; diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml index 3859092ebfa8..bd9a6ec335b7 100644 --- a/packages/SettingsLib/res/values-hi/strings.xml +++ b/packages/SettingsLib/res/values-hi/strings.xml @@ -446,7 +446,6 @@ <string name="alarm_template_far" msgid="3779172822607461675">"अलार्म <xliff:g id="WHEN">%1$s</xliff:g> को बजेगा"</string> <string name="zen_mode_duration_settings_title" msgid="229547412251222757">"अवधि"</string> <string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"हर बार पूछें"</string> - <!-- no translation found for zen_mode_forever (2704305038191592967) --> - <skip /> + <string name="zen_mode_forever" msgid="2704305038191592967">"जब तक आप इसे बंद नहीं करते"</string> <string name="time_unit_just_now" msgid="6363336622778342422">"अभी-अभी"</string> </resources> diff --git a/packages/SettingsLib/src/com/android/settingslib/net/ChartDataLoaderCompat.java b/packages/SettingsLib/src/com/android/settingslib/net/ChartDataLoaderCompat.java index c3241bbd2123..74bd97f40ff7 100644 --- a/packages/SettingsLib/src/com/android/settingslib/net/ChartDataLoaderCompat.java +++ b/packages/SettingsLib/src/com/android/settingslib/net/ChartDataLoaderCompat.java @@ -36,7 +36,12 @@ import com.android.settingslib.AppItem; /** * Loader for historical chart data for both network and UID details. + * + * Deprecated in favor of {@link NetworkCycleDataLoader} + * + * @deprecated */ +@Deprecated public class ChartDataLoaderCompat extends AsyncTaskLoader<ChartData> { private static final String KEY_TEMPLATE = "template"; private static final String KEY_APP = "app"; diff --git a/packages/SettingsLib/src/com/android/settingslib/net/NetworkCycleData.java b/packages/SettingsLib/src/com/android/settingslib/net/NetworkCycleData.java new file mode 100644 index 000000000000..2d8c0de42ba4 --- /dev/null +++ b/packages/SettingsLib/src/com/android/settingslib/net/NetworkCycleData.java @@ -0,0 +1,69 @@ +/* + * 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.settingslib.net; + +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * Data structure representing usage data in a billing cycle. + */ +public class NetworkCycleData { + public static final long BUCKET_DURATION_MS = TimeUnit.DAYS.toMillis(1); + public long startTime; + public long endTime; + public long totalUsage; + public List<NetworkCycleData> usageBuckets; + + private NetworkCycleData(Builder builder) { + startTime = builder.mStart; + endTime = builder.mEnd; + totalUsage = builder.mTotalUsage; + usageBuckets = builder.mUsageBuckets; + } + + public static class Builder { + private long mStart; + private long mEnd; + private long mTotalUsage; + private List<NetworkCycleData> mUsageBuckets; + + public Builder setStartTime(long start) { + mStart = start; + return this; + } + + public Builder setEndTime(long end) { + mEnd = end; + return this; + } + + public Builder setTotalUsage(long total) { + mTotalUsage = total; + return this; + } + + public Builder setUsageBuckets(List<NetworkCycleData> buckets) { + mUsageBuckets = buckets; + return this; + } + + public NetworkCycleData build() { + return new NetworkCycleData(this); + } + } +} diff --git a/packages/SettingsLib/src/com/android/settingslib/net/NetworkCycleDataLoader.java b/packages/SettingsLib/src/com/android/settingslib/net/NetworkCycleDataLoader.java new file mode 100644 index 000000000000..80e13563d74b --- /dev/null +++ b/packages/SettingsLib/src/com/android/settingslib/net/NetworkCycleDataLoader.java @@ -0,0 +1,219 @@ +/* + * 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.settingslib.net; + +import static android.net.NetworkStatsHistory.FIELD_RX_BYTES; +import static android.net.NetworkStatsHistory.FIELD_TX_BYTES; + +import android.app.usage.NetworkStats; +import android.app.usage.NetworkStatsManager; +import android.content.Context; +import android.net.INetworkStatsService; +import android.net.INetworkStatsSession; +import android.net.NetworkPolicy; +import android.net.NetworkPolicyManager; +import android.net.NetworkStatsHistory; +import android.net.NetworkTemplate; +import android.net.TrafficStats; +import android.os.RemoteException; +import android.os.ServiceManager; +import android.text.format.DateUtils; +import android.util.Log; +import android.util.Pair; + +import java.time.ZonedDateTime; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import androidx.annotation.NonNull; +import androidx.annotation.VisibleForTesting; +import androidx.loader.content.AsyncTaskLoader; + +/** + * Loader for network data usage history. It returns a list of usage data per billing cycle. + */ +public class NetworkCycleDataLoader extends AsyncTaskLoader<List<NetworkCycleData>> { + private static final String TAG = "CycleDataSummaryLoader"; + private final NetworkStatsManager mNetworkStatsManager; + private final String mSubId; + private final int mNetworkType; + private final NetworkPolicy mPolicy; + private final NetworkTemplate mNetworkTemplate; + @VisibleForTesting + final INetworkStatsService mNetworkStatsService; + + private NetworkCycleDataLoader(Builder builder) { + super(builder.mContext); + mPolicy = builder.mPolicy; + mSubId = builder.mSubId; + mNetworkType = builder.mNetworkType; + mNetworkTemplate = builder.mNetworkTemplate; + mNetworkStatsManager = (NetworkStatsManager) + builder.mContext.getSystemService(Context.NETWORK_STATS_SERVICE); + mNetworkStatsService = INetworkStatsService.Stub.asInterface( + ServiceManager.getService(Context.NETWORK_STATS_SERVICE)); + } + + @Override + protected void onStartLoading() { + super.onStartLoading(); + forceLoad(); + } + + @Override + public List<NetworkCycleData> loadInBackground() { + if (mPolicy == null) { + return loadFourWeeksData(); + } + final List<NetworkCycleData> data = new ArrayList<>(); + final Iterator<Pair<ZonedDateTime, ZonedDateTime>> iterator = NetworkPolicyManager + .cycleIterator(mPolicy); + while (iterator.hasNext()) { + final Pair<ZonedDateTime, ZonedDateTime> cycle = iterator.next(); + final long cycleStart = cycle.first.toInstant().toEpochMilli(); + final long cycleEnd = cycle.second.toInstant().toEpochMilli(); + getUsage(cycleStart, cycleEnd, data); + } + return data; + } + + @Override + protected void onStopLoading() { + super.onStopLoading(); + cancelLoad(); + } + + @Override + protected void onReset() { + super.onReset(); + cancelLoad(); + } + + @VisibleForTesting + List<NetworkCycleData> loadFourWeeksData() { + final List<NetworkCycleData> data = new ArrayList<>(); + try { + final INetworkStatsSession networkSession = mNetworkStatsService.openSession(); + final NetworkStatsHistory networkHistory = networkSession.getHistoryForNetwork( + mNetworkTemplate, FIELD_RX_BYTES | FIELD_TX_BYTES); + final long historyStart = networkHistory.getStart(); + final long historyEnd = networkHistory.getEnd(); + + long cycleEnd = historyEnd; + while (cycleEnd > historyStart) { + final long cycleStart = cycleEnd - (DateUtils.WEEK_IN_MILLIS * 4); + getUsage(cycleStart, cycleEnd, data); + cycleEnd = cycleStart; + } + + TrafficStats.closeQuietly(networkSession); + } catch (RemoteException e) { + throw new RuntimeException(e); + } + return data; + } + + @VisibleForTesting + void getUsage(long start, long end, @NonNull List<NetworkCycleData> data) { + try { + final NetworkStats stats = mNetworkStatsManager.querySummary( + mNetworkType, mSubId, start, end); + final long total = getTotalUsage(stats); + if (total > 0L) { + data.add(new NetworkCycleData.Builder() + .setStartTime(start) + .setEndTime(end) + .setTotalUsage(total) + .setUsageBuckets(getUsageBuckets(start, end)) + .build()); + } + } catch (RemoteException e) { + Log.e(TAG, "Exception querying network detail.", e); + } + } + + private long getTotalUsage(NetworkStats stats) { + long bytes = 0L; + if (stats != null) { + final NetworkStats.Bucket bucket = new NetworkStats.Bucket(); + while (stats.hasNextBucket() && stats.getNextBucket(bucket)) { + bytes += bucket.getRxBytes() + bucket.getTxBytes(); + } + stats.close(); + } + return bytes; + } + + private List<NetworkCycleData> getUsageBuckets(long start, long end) { + final List<NetworkCycleData> data = new ArrayList<>(); + long bucketStart = start; + long bucketEnd = start + NetworkCycleData.BUCKET_DURATION_MS; + while (bucketEnd <= end) { + long usage = 0L; + try { + final NetworkStats stats = mNetworkStatsManager.querySummary( + mNetworkType, mSubId, bucketStart, bucketEnd); + usage = getTotalUsage(stats); + } catch (RemoteException e) { + Log.e(TAG, "Exception querying network detail.", e); + } + data.add(new NetworkCycleData.Builder() + .setStartTime(bucketStart).setEndTime(bucketEnd).setTotalUsage(usage).build()); + bucketStart = bucketEnd; + bucketEnd += NetworkCycleData.BUCKET_DURATION_MS; + } + return data; + } + + public static class Builder { + private final Context mContext; + private NetworkPolicy mPolicy; + private String mSubId; + private int mNetworkType; + private NetworkTemplate mNetworkTemplate; + + public Builder(Context context) { + mContext = context; + } + + public Builder setNetworkPolicy(NetworkPolicy policy) { + mPolicy = policy; + return this; + } + + public Builder setSubscriberId(String subId) { + mSubId = subId; + return this; + } + + public Builder setNetworkType(int networkType) { + mNetworkType = networkType; + return this; + } + + public Builder setNetworkTemplate(NetworkTemplate template) { + mNetworkTemplate = template; + return this; + } + + public NetworkCycleDataLoader build() { + return new NetworkCycleDataLoader(this); + } + } + +} diff --git a/packages/SettingsLib/src/com/android/settingslib/net/NetworkStatsDetailLoader.java b/packages/SettingsLib/src/com/android/settingslib/net/NetworkStatsSummaryLoader.java index a070b2a5f768..34e6097ea46e 100644 --- a/packages/SettingsLib/src/com/android/settingslib/net/NetworkStatsDetailLoader.java +++ b/packages/SettingsLib/src/com/android/settingslib/net/NetworkStatsSummaryLoader.java @@ -20,25 +20,23 @@ import android.app.usage.NetworkStatsManager; import android.app.usage.NetworkStats; import android.content.Context; import android.os.RemoteException; -import android.telephony.TelephonyManager; import android.util.Log; import androidx.loader.content.AsyncTaskLoader; /** - * Loader for retrieving the network stats details for all UIDs. + * Loader for retrieving the network stats summary for all UIDs. */ -public class NetworkStatsDetailLoader extends AsyncTaskLoader<NetworkStats> { +public class NetworkStatsSummaryLoader extends AsyncTaskLoader<NetworkStats> { private static final String TAG = "NetworkDetailLoader"; private final NetworkStatsManager mNetworkStatsManager; - private final TelephonyManager mTelephonyManager; private final long mStart; private final long mEnd; - private final int mSubId; + private final String mSubId; private final int mNetworkType; - private NetworkStatsDetailLoader(Builder builder) { + private NetworkStatsSummaryLoader(Builder builder) { super(builder.mContext); mStart = builder.mStart; mEnd = builder.mEnd; @@ -46,8 +44,6 @@ public class NetworkStatsDetailLoader extends AsyncTaskLoader<NetworkStats> { mNetworkType = builder.mNetworkType; mNetworkStatsManager = (NetworkStatsManager) builder.mContext.getSystemService(Context.NETWORK_STATS_SERVICE); - mTelephonyManager = - (TelephonyManager) builder.mContext.getSystemService(Context.TELEPHONY_SERVICE); } @Override @@ -59,8 +55,7 @@ public class NetworkStatsDetailLoader extends AsyncTaskLoader<NetworkStats> { @Override public NetworkStats loadInBackground() { try { - return mNetworkStatsManager.queryDetails( - mNetworkType, mTelephonyManager.getSubscriberId(mSubId), mStart, mEnd); + return mNetworkStatsManager.querySummary(mNetworkType, mSubId, mStart, mEnd); } catch (RemoteException e) { Log.e(TAG, "Exception querying network detail.", e); return null; @@ -83,7 +78,7 @@ public class NetworkStatsDetailLoader extends AsyncTaskLoader<NetworkStats> { private final Context mContext; private long mStart; private long mEnd; - private int mSubId; + private String mSubId; private int mNetworkType; public Builder(Context context) { @@ -100,7 +95,7 @@ public class NetworkStatsDetailLoader extends AsyncTaskLoader<NetworkStats> { return this; } - public Builder setSubscriptionId(int subId) { + public Builder setSubscriberId(String subId) { mSubId = subId; return this; } @@ -110,8 +105,8 @@ public class NetworkStatsDetailLoader extends AsyncTaskLoader<NetworkStats> { return this; } - public NetworkStatsDetailLoader build() { - return new NetworkStatsDetailLoader(this); + public NetworkStatsSummaryLoader build() { + return new NetworkStatsSummaryLoader(this); } } } diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/lifecycle/LifecycleTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/lifecycle/LifecycleTest.java index c23ad79a52fe..887c1d57c870 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/lifecycle/LifecycleTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/lifecycle/LifecycleTest.java @@ -38,13 +38,13 @@ import com.android.settingslib.core.lifecycle.events.OnPrepareOptionsMenu; import com.android.settingslib.core.lifecycle.events.OnResume; import com.android.settingslib.core.lifecycle.events.OnStart; import com.android.settingslib.core.lifecycle.events.OnStop; -import com.android.settingslib.testutils.FragmentTestUtils; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.Robolectric; import org.robolectric.android.controller.ActivityController; +import org.robolectric.shadows.androidx.fragment.FragmentController; @RunWith(SettingsLibRobolectricTestRunner.class) public class LifecycleTest { @@ -184,7 +184,7 @@ public class LifecycleTest { @Test public void runThroughDialogFragmentLifecycles_shouldObserveEverything() { final TestDialogFragment fragment = new TestDialogFragment(); - FragmentTestUtils.startFragment(fragment); + FragmentController.setupFragment(fragment); fragment.onCreateOptionsMenu(null, null); fragment.onPrepareOptionsMenu(null); @@ -208,7 +208,7 @@ public class LifecycleTest { @Test public void runThroughFragmentLifecycles_shouldObserveEverything() { final TestFragment fragment = new TestFragment(); - FragmentTestUtils.startFragment(fragment); + FragmentController.setupFragment(fragment); fragment.onCreateOptionsMenu(null, null); fragment.onPrepareOptionsMenu(null); @@ -248,7 +248,7 @@ public class LifecycleTest { @Test public void onOptionItemSelectedShortCircuitsIfAnObserverHandlesTheMenuItem() { final TestFragment fragment = new TestFragment(); - FragmentTestUtils.startFragment(fragment); + FragmentController.setupFragment(fragment); final OptionItemAccepter accepter = new OptionItemAccepter(); fragment.getLifecycle().addObserver(accepter); diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/NetworkCycleDataLoaderTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/NetworkCycleDataLoaderTest.java new file mode 100644 index 000000000000..4c4207b23cab --- /dev/null +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/NetworkCycleDataLoaderTest.java @@ -0,0 +1,123 @@ +/* + * 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.settingslib.net; + +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyInt; +import static org.mockito.Mockito.anyLong; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Matchers.nullable; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.app.usage.NetworkStatsManager; +import android.content.Context; +import android.net.ConnectivityManager; +import android.net.INetworkStatsService; +import android.net.INetworkStatsSession; +import android.net.NetworkPolicy; +import android.net.NetworkStatsHistory; +import android.net.NetworkTemplate; +import android.os.RemoteException; +import android.text.format.DateUtils; +import android.util.Range; + +import com.android.settingslib.SettingsLibRobolectricTestRunner; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.util.ReflectionHelpers; + +import java.time.ZonedDateTime; +import java.util.Iterator; + +@RunWith(SettingsLibRobolectricTestRunner.class) +public class NetworkCycleDataLoaderTest { + + @Mock + private NetworkStatsManager mNetworkStatsManager; + @Mock + private Context mContext; + @Mock + private NetworkPolicy mPolicy; + @Mock + private Iterator<Range<ZonedDateTime>> mIterator; + @Mock + private INetworkStatsService mNetworkStatsService; + + private NetworkCycleDataLoader mLoader; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + when(mContext.getSystemService(Context.NETWORK_STATS_SERVICE)) + .thenReturn(mNetworkStatsManager); + when(mPolicy.cycleIterator()).thenReturn(mIterator); + } + + @Test + public void loadInBackground_noNetworkPolicy_shouldLoad4WeeksData() { + mLoader = spy(new NetworkCycleDataLoader.Builder(mContext).build()); + doReturn(null).when(mLoader).loadFourWeeksData(); + + mLoader.loadInBackground(); + + verify(mLoader).loadFourWeeksData(); + } + + @Test + public void loadInBackground_shouldQueryNetworkSummary() throws RemoteException { + final int networkType = ConnectivityManager.TYPE_MOBILE; + final String subId = "TestSubscriber"; + final ZonedDateTime now = ZonedDateTime.now(); + final Range<ZonedDateTime> cycle = new Range<>(now, now); + // mock 1 cycle data. + // hasNext() will be called internally in next(), hence setting it to return true twice. + when(mIterator.hasNext()).thenReturn(true).thenReturn(true).thenReturn(false); + when(mIterator.next()).thenReturn(cycle); + mLoader = new NetworkCycleDataLoader.Builder(mContext) + .setNetworkPolicy(mPolicy).setNetworkType(networkType).setSubscriberId(subId).build(); + + mLoader.loadInBackground(); + + verify(mNetworkStatsManager).querySummary(eq(networkType), eq(subId), anyLong(), anyLong()); + } + + @Test + public void loadFourWeeksData_shouldGetUsageForLast4Weeks() throws RemoteException { + mLoader = spy(new NetworkCycleDataLoader.Builder(mContext).build()); + ReflectionHelpers.setField(mLoader, "mNetworkStatsService", mNetworkStatsService); + final INetworkStatsSession networkSession = mock(INetworkStatsSession.class); + when(mNetworkStatsService.openSession()).thenReturn(networkSession); + final NetworkStatsHistory networkHistory = mock(NetworkStatsHistory.class); + when(networkSession.getHistoryForNetwork(nullable(NetworkTemplate.class), anyInt())).thenReturn(networkHistory); + final long now = System.currentTimeMillis(); + final long fourWeeksAgo = now - (DateUtils.WEEK_IN_MILLIS * 4); + when(networkHistory.getStart()).thenReturn(fourWeeksAgo); + when(networkHistory.getEnd()).thenReturn(now); + + mLoader.loadFourWeeksData(); + + verify(mLoader).getUsage(eq(fourWeeksAgo), eq(now), any()); + } +} diff --git a/packages/SettingsProvider/res/values/defaults.xml b/packages/SettingsProvider/res/values/defaults.xml index c53417b4e0f5..de86789053e9 100644 --- a/packages/SettingsProvider/res/values/defaults.xml +++ b/packages/SettingsProvider/res/values/defaults.xml @@ -55,7 +55,7 @@ <bool name="def_networks_available_notification_on">true</bool> <bool name="def_backup_enabled">false</bool> - <string name="def_backup_transport" translatable="false">android/com.android.internal.backup.LocalTransport</string> + <string name="def_backup_transport" translatable="false">com.android.localtransport/.LocalTransport</string> <!-- Default value for whether or not to pulse the notification LED when there is a pending notification --> diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java index 63978ba60171..3d193db392a4 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java @@ -3285,8 +3285,8 @@ public class SettingsProvider extends ContentProvider { if (currentVersion == 133) { // Version 133: Add default end button behavior final SettingsState systemSettings = getSystemSettingsLocked(userId); - if (systemSettings.getSettingLocked(Settings.System.END_BUTTON_BEHAVIOR) == - null) { + if (systemSettings.getSettingLocked(Settings.System.END_BUTTON_BEHAVIOR) + .isNull()) { String defaultEndButtonBehavior = Integer.toString(getContext() .getResources().getInteger(R.integer.def_end_button_behavior)); systemSettings.insertSettingLocked(Settings.System.END_BUTTON_BEHAVIOR, diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index 1bc2bcc84cce..157934f879bc 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"maak kamera oop"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Kies nuwe taakuitleg"</string> <string name="cancel" msgid="6442560571259935130">"Kanselleer"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Hulpboodskapgebied"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Bevestig"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Raak die vingerafdruksensor"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Vingerafdrukikoon"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Soek tans vir jou …"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Gesig-ikoon"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Versoenbaarheid-zoem se knoppie."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zoem kleiner na groter skerm."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth gekoppel."</string> @@ -829,9 +825,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Berging"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Wenke"</string> <string name="instant_apps" msgid="6647570248119804907">"Kitsprogramme"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Kitsprogramme hoef nie geïnstalleer te word nie."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> loop tans"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"Program is oopgemaak sonder dat dit geïnstalleer is."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"Program is oopgemaak sonder dat dit geïnstalleer is. Tik om meer te wete te kom."</string> <string name="app_info" msgid="6856026610594615344">"Programinligting"</string> - <string name="go_to_web" msgid="2650669128861626071">"Gaan na blaaier"</string> + <string name="go_to_web" msgid="1106022723459948514">"Gaan na web"</string> <string name="mobile_data" msgid="7094582042819250762">"Mobiele data"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> – <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi is af"</string> diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index b663fbd0e5bd..492fa8c0606e 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"ካሜራ ክፈት"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"የአዲስ ተግባር አቀማመጥን ይምረጡ"</string> <string name="cancel" msgid="6442560571259935130">"ይቅር"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"የእገዛ መልዕክት አካባቢ"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"አረጋግጥ"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"የጣት አሻራ ዳሳሹን ይንኩ"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"የጣት አሻራ አዶ"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"እርስዎን በመፈለግ ላይ…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"የፊት አዶ"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"የተኳኋኝአጉላ አዝራር።"</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"አነስተኛውን ማያ ወደ ትልቅ አጉላ።"</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"ብሉቱዝ ተያይዟል።"</string> @@ -829,9 +825,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"ማከማቻ"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"ፍንጮች"</string> <string name="instant_apps" msgid="6647570248119804907">"የቅጽበት መተግበሪያዎች"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"ቅጽበታዊ መተግበሪያዎች መጫን አያስፈልጋቸውም።"</string> + <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> አሂድ"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"መተግበሪያ ሳይጫን ተከፍቷል።"</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"መተግበሪያ ሳይጫን ተከፍቷል። ተጨማሪ ለማወቅ መታ ያድርጉ።"</string> <string name="app_info" msgid="6856026610594615344">"የመተግበሪያ መረጃ"</string> - <string name="go_to_web" msgid="2650669128861626071">"ወደ አሳሽ ሂድ"</string> + <string name="go_to_web" msgid="1106022723459948514">"ወደ ድር ሂድ"</string> <string name="mobile_data" msgid="7094582042819250762">"የተንቀሳቃሽ ስልክ ውሂብ"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g>— <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi ጠፍቷል"</string> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index 5f63aaf23b96..fe27bb705cb1 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -107,16 +107,12 @@ <string name="camera_label" msgid="7261107956054836961">"فتح الكاميرا"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"تحديد تنسيق جديد للمهمة"</string> <string name="cancel" msgid="6442560571259935130">"إلغاء"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"منطقة رسالة المساعدة"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"تأكيد"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"المس جهاز استشعار بصمات الإصبع"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"رمز بصمة الإصبع"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"جارٍ البحث عن وجهك…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"رمز الوجه"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"زر تكبير/تصغير للتوافق."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"استخدام التكبير/التصغير لتحويل شاشة صغيرة إلى شاشة أكبر"</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"تم توصيل البلوتوث."</string> @@ -853,9 +849,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"سعة التخزين"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"تلميحات"</string> <string name="instant_apps" msgid="6647570248119804907">"التطبيقات الفورية"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"لا تتطلب التطبيقات الفورية إجراء التثبيت."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"التطبيق <xliff:g id="APP">%1$s</xliff:g> قيد التشغيل"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"تمّ فتح التطبيق بدون تثبيته."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"تمّ فتح التطبيق بدون تثبيته. انقر لمعرفة مزيد من المعلومات."</string> <string name="app_info" msgid="6856026610594615344">"معلومات عن التطبيق"</string> - <string name="go_to_web" msgid="2650669128861626071">"الانتقال إلى المتصفح"</string> + <string name="go_to_web" msgid="1106022723459948514">"الانتقال إلى الويب"</string> <string name="mobile_data" msgid="7094582042819250762">"بيانات الجوّال"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"تم إيقاف شبكة Wi-Fi"</string> diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index d217663cfc52..8cde52453b8d 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"কেমেৰা খোলক"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"নতুন কাৰ্যৰ চানেকি বাছনি কৰক"</string> <string name="cancel" msgid="6442560571259935130">"বাতিল কৰক"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"সহায় বাৰ্তাৰ ক্ষেত্ৰ"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"নিশ্চিত কৰক"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"ফিংগাৰপ্ৰিণ্ট ছেন্সৰটো স্পৰ্শ কৰক"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ফিংগাৰপ্ৰিণ্ট আইকন"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"আপোনাৰ মুখমণ্ডল বিচাৰি আছে…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"মুখমণ্ডলৰ আইকন"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"উপযোগিতা অনুসৰি জুম কৰা বুটাম।"</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"স্ক্ৰীণৰ আকাৰ ডাঙৰ কৰিবলৈ জুম কৰক।"</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"ব্লুটুথ সংযোগ হ\'ল।"</string> @@ -829,9 +825,14 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"সঞ্চয়াগাৰ"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"ইংগিতবোৰ"</string> <string name="instant_apps" msgid="6647570248119804907">"তাৎক্ষণিক এপসমূহ"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"তাৎক্ষণিক এপসমূহক ইনষ্টল কৰাৰ প্ৰয়োজন নাই।"</string> + <!-- no translation found for instant_apps_title (8738419517367449783) --> + <skip /> + <!-- no translation found for instant_apps_message (1183313016396018086) --> + <skip /> + <!-- no translation found for instant_apps_message_with_help (6179830437630729747) --> + <skip /> <string name="app_info" msgid="6856026610594615344">"এপ্ সম্পৰ্কীয় তথ্য"</string> - <string name="go_to_web" msgid="2650669128861626071">"ব্ৰাউজাৰলৈ যাওক"</string> + <string name="go_to_web" msgid="1106022723459948514">"ৱেবলৈ যাওক"</string> <string name="mobile_data" msgid="7094582042819250762">"ম\'বাইল ডেটা"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"ৱাই-ফাই অফ অৱস্থাত আছে"</string> diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index b4f6b4a8bdb1..2342a89abf8e 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"kemaranı açın"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Yeni tapşırıq sxemi seçin"</string> <string name="cancel" msgid="6442560571259935130">"Ləğv et"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Yardım mesajı bölməsi"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Təsdiq"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Barmaq izi sensoruna klikləyin"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Barmaq izi ikonası"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Siz axtarılırsınız…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Üz işarəsi"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Uyğunluq zoom düyməsi."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Daha böyük ekranda uzaqlaşdır."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth qoşulub."</string> @@ -829,9 +825,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Yaddaş"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Məsləhətlər"</string> <string name="instant_apps" msgid="6647570248119804907">"Ani Tətbiqlər"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Ani tətbiqlər quraşdırma tələb etmir."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> işləyir"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"Quraşdırılmadan açılan tətbiq."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"Quraşdırılmadan açılan tətbiq. Ətraflı məlumat üçün klikləyin."</string> <string name="app_info" msgid="6856026610594615344">"Tətbiq məlumatı"</string> - <string name="go_to_web" msgid="2650669128861626071">"Brauzerə daxil edin"</string> + <string name="go_to_web" msgid="1106022723459948514">"Vebə keçin"</string> <string name="mobile_data" msgid="7094582042819250762">"Mobil data"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi deaktivdir"</string> diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index fde90bcf6670..47422b2fa2fd 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -104,16 +104,12 @@ <string name="camera_label" msgid="7261107956054836961">"otvori kameru"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Izaberi novi raspored zadataka"</string> <string name="cancel" msgid="6442560571259935130">"Otkaži"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Oblast poruke za pomoć"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Potvrdi"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Dodirnite senzor za otisak prsta"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona otiska prsta"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Tražimo vas…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Ikona lica"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Dugme Zum kompatibilnosti."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zumiranje sa manjeg na veći ekran."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth je priključen."</string> @@ -835,9 +831,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Memorijski prostor"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Saveti"</string> <string name="instant_apps" msgid="6647570248119804907">"Instant aplikacije"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Instant aplikacije ne zahtevaju instalaciju."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"Aplikacija <xliff:g id="APP">%1$s</xliff:g> je pokrenuta"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"Aplikacija se otvorila bez instaliranja."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"Aplikacija se otvorila bez instaliranja. Dodirnite da biste saznali više."</string> <string name="app_info" msgid="6856026610594615344">"Informacije o aplikaciji"</string> - <string name="go_to_web" msgid="2650669128861626071">"Idi na pregledač"</string> + <string name="go_to_web" msgid="1106022723459948514">"Idi na veb"</string> <string name="mobile_data" msgid="7094582042819250762">"Mobilni podaci"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> – <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi je isključen"</string> diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index c8fbb92ceae0..de01516dca7b 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -105,16 +105,12 @@ <string name="camera_label" msgid="7261107956054836961">"адкрыць камеру"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Выберыце новы макет заданняў"</string> <string name="cancel" msgid="6442560571259935130">"Скасаваць"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Поле даведачнага паведамлення"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Пацвердзіць"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Дакраніцеся да сканера адбіткаў пальцаў"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Значок адбіткаў пальцаў"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Ідзе пошук вашага твару…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Значок твару"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Кнопка сумяшчальнасці маштаба."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Маштабаванне малых элементаў для большага экрана."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth-сувязь."</string> @@ -843,9 +839,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Захоўванне"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Падказкі"</string> <string name="instant_apps" msgid="6647570248119804907">"Імгненныя праграмы"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Імгненныя праграмы не патрабуюць усталёўкі."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"Праграма \"<xliff:g id="APP">%1$s</xliff:g>\" запушчана"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"Праграма адкрыта без усталёўкі."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"Праграма адкрыта без усталёўкі. Націсніце, каб даведацца больш."</string> <string name="app_info" msgid="6856026610594615344">"Інфармацыя пра праграму"</string> - <string name="go_to_web" msgid="2650669128861626071">"Перайсці ў браўзер"</string> + <string name="go_to_web" msgid="1106022723459948514">"Перайсці ў інтэрнэт"</string> <string name="mobile_data" msgid="7094582042819250762">"Маб. перадача даных"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi выключаны"</string> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index 75a63e6ffb12..29d89ecba9a0 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"отваряне на камерата"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Избиране на ново оформление за задачите"</string> <string name="cancel" msgid="6442560571259935130">"Отказ"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Област за помощно съобщение"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Потвърждаване"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Докоснете сензора за отпечатъци"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Икона за отпечатък"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Търсим ви…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Икона на лице"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Бутон за промяна на мащаба с цел съвместимост."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Промяна на мащаба на екрана от по-малък до по-голям."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth е включен."</string> @@ -829,9 +825,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Хранилище"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Съвети"</string> <string name="instant_apps" msgid="6647570248119804907">"Мигновени приложения"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"За мигновените приложения не се изисква инсталиране."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> работи"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"Приложението се отвори, без да бъде инсталирано."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"Приложението се отвори, без да бъде инсталирано. Докоснете, за да научите повече."</string> <string name="app_info" msgid="6856026610594615344">"Информация за приложението"</string> - <string name="go_to_web" msgid="2650669128861626071">"Към браузъра"</string> + <string name="go_to_web" msgid="1106022723459948514">"Към мрежата"</string> <string name="mobile_data" msgid="7094582042819250762">"Мобилни данни"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> – <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Функцията за Wi‑Fi е изключена"</string> diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index 38cfc8a519d8..d2f6401b4394 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -31,7 +31,7 @@ </plurals> <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"কোনো বিজ্ঞপ্তি নেই"</string> <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"চলতে-থাকা"</string> - <string name="status_bar_latest_events_title" msgid="6594767438577593172">"বিজ্ঞপ্তিগুলি"</string> + <string name="status_bar_latest_events_title" msgid="6594767438577593172">"বিজ্ঞপ্তি"</string> <string name="battery_low_title" msgid="9187898087363540349">"চার্জ শীঘ্রই শেষ হয়ে যেতে পারে"</string> <string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> অবশিষ্ট আছে"</string> <string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> বাকি আছে, বর্তমান ব্যবহারের ভিত্তিতে আর <xliff:g id="TIME">%2$s</xliff:g> চলবে"</string> @@ -49,7 +49,7 @@ <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"অটো-রোটেট স্ক্রিন"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"মিউট করুন"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"স্বতঃ"</string> - <string name="status_bar_settings_notifications" msgid="397146176280905137">"বিজ্ঞপ্তিগুলি"</string> + <string name="status_bar_settings_notifications" msgid="397146176280905137">"বিজ্ঞপ্তি"</string> <string name="bluetooth_tethered" msgid="7094101612161133267">"ব্লুটুথ টিথার করা হয়েছে"</string> <string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"ইনপুট পদ্ধতিগুলি সেট আপ করুন"</string> <string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"ফিজিক্যাল কীবোর্ড"</string> @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"ক্যামেরা খুলুন"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"নতুন কার্য লেআউট বেছে নিন"</string> <string name="cancel" msgid="6442560571259935130">"বাতিল করুন"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"সহায়তার মেসেজ দেখানোর জায়গা"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"কনফার্ম করুন"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"আঙ্গুলের ছাপের সেন্সর স্পর্শ করুন"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"আঙ্গুলের ছাপের আইকন"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"আপনার জন্য খোঁজা হচ্ছে…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"ফেস আইকন"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"সামঞ্জস্যের জুম বোতাম৷"</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"ছোট থেকে বৃহৎ স্ক্রীণে জুম করুন৷"</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"ব্লুটুথ সংযুক্ত হয়েছে৷"</string> @@ -180,7 +176,7 @@ <string name="accessibility_battery_level" msgid="7451474187113371965">"<xliff:g id="NUMBER">%d</xliff:g> শতাংশ ব্যাটারি রয়েছে৷"</string> <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"ব্যাটারি চার্জ হচ্ছে, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> শতাংশ৷"</string> <string name="accessibility_settings_button" msgid="799583911231893380">"সিস্টেম সেটিংস৷"</string> - <string name="accessibility_notifications_button" msgid="4498000369779421892">"বিজ্ঞপ্তিগুলি৷"</string> + <string name="accessibility_notifications_button" msgid="4498000369779421892">"বিজ্ঞপ্তি৷"</string> <string name="accessibility_overflow_action" msgid="5681882033274783311">"সমস্ত বিজ্ঞপ্তি দেখুন"</string> <string name="accessibility_remove_notification" msgid="3603099514902182350">"বিজ্ঞপ্তি সাফ করুন৷"</string> <string name="accessibility_gps_enabled" msgid="3511469499240123019">"GPS সক্ষম করা হয়েছে৷"</string> @@ -340,7 +336,7 @@ <item quantity="one">%dটি ডিভাইস</item> <item quantity="other">%dটি ডিভাইস</item> </plurals> - <string name="quick_settings_notifications_label" msgid="4818156442169154523">"বিজ্ঞপ্তিগুলি"</string> + <string name="quick_settings_notifications_label" msgid="4818156442169154523">"বিজ্ঞপ্তি"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"ফ্ল্যাশলাইট"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"মোবাইল ডেটা"</string> <string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"ডেটার ব্যবহার"</string> @@ -685,7 +681,7 @@ <string name="keyboard_shortcut_group_system_home" msgid="3054369431319891965">"হোম"</string> <string name="keyboard_shortcut_group_system_recents" msgid="3154851905021926744">"সাম্প্রতিকগুলি"</string> <string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"পিছনে"</string> - <string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"বিজ্ঞপ্তিগুলি"</string> + <string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"বিজ্ঞপ্তি"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"কীবোর্ড শর্টকাট"</string> <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"কীবোর্ড লে-আউট পাল্টান"</string> <string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"অ্যাপ্লিকেশানগুলি"</string> @@ -829,9 +825,14 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"স্টোরেজ"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"হিন্ট"</string> <string name="instant_apps" msgid="6647570248119804907">"ঝটপট অ্যাপ"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"ঝটপট অ্যাপ ইনস্টল করার প্রয়োজন হয় না।"</string> + <!-- no translation found for instant_apps_title (8738419517367449783) --> + <skip /> + <!-- no translation found for instant_apps_message (1183313016396018086) --> + <skip /> + <!-- no translation found for instant_apps_message_with_help (6179830437630729747) --> + <skip /> <string name="app_info" msgid="6856026610594615344">"অ্যাপের তথ্য"</string> - <string name="go_to_web" msgid="2650669128861626071">"ব্রাউজারে যান"</string> + <string name="go_to_web" msgid="1106022723459948514">"ওয়েবে যান"</string> <string name="mobile_data" msgid="7094582042819250762">"মোবাইল ডেটা"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"ওয়াই ফাই বন্ধ আছে"</string> diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index 9865cb8c85e5..ac0c05ecb0f7 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -104,16 +104,12 @@ <string name="camera_label" msgid="7261107956054836961">"otvori kameru"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Odaberite novi raspored zadataka"</string> <string name="cancel" msgid="6442560571259935130">"Otkaži"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Prostor za poruku za pomoć"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Potvrdite"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Dodirnite senzor za otisak prsta"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona za otisak prsta"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Tražimo vas…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Ikona lica"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Dugme za uvećavanje u slučaju nekompatibilnosti."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Uvećani prikaz manjeg ekrana na većem ekranu."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth je povezan."</string> @@ -837,9 +833,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Pohrana"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Savjeti"</string> <string name="instant_apps" msgid="6647570248119804907">"Instant-aplikacije"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Za instant aplikacije nije potrebna instalacija"</string> + <string name="instant_apps_title" msgid="8738419517367449783">"Pokrenuta je aplikacija <xliff:g id="APP">%1$s</xliff:g>"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"Aplikacija je otvorena bez prethodne instalacije."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"Aplikacija je otvorena bez prethodne instalacije. Dodirnite da saznate više."</string> <string name="app_info" msgid="6856026610594615344">"Informacije o aplikaciji"</string> - <string name="go_to_web" msgid="2650669128861626071">"Idi na preglednik"</string> + <string name="go_to_web" msgid="1106022723459948514">"Idite na internet"</string> <string name="mobile_data" msgid="7094582042819250762">"Prijenos podataka"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"WiFi veza je isključena"</string> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index 1613613c0e53..b4a2f3bfc1d2 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"obre la càmera"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Selecciona el disseny de la tasca nova"</string> <string name="cancel" msgid="6442560571259935130">"Cancel·la"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Àrea de missatge d\'ajuda"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirma"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Toca el sensor d\'empremtes digitals"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icona d\'empremta digital"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"S\'està cercant la teva cara…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Icona facial"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Botó de zoom de compatibilitat."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Amplia menys com més gran sigui la pantalla."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth connectat."</string> @@ -829,9 +825,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Emmagatzematge"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Suggeriments"</string> <string name="instant_apps" msgid="6647570248119804907">"Aplicacions instantànies"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"No cal instal·lar les aplicacions instantànies."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"S\'està executant <xliff:g id="APP">%1$s</xliff:g>"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"L\'aplicació s\'ha obert sense instal·lar-se."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"L\'aplicació s\'ha obert sense instal·lar-se. Toca per obtenir més informació."</string> <string name="app_info" msgid="6856026610594615344">"Informació de l\'aplicació"</string> - <string name="go_to_web" msgid="2650669128861626071">"Ves al navegador"</string> + <string name="go_to_web" msgid="1106022723459948514">"Ves al web"</string> <string name="mobile_data" msgid="7094582042819250762">"Dades mòbils"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> - <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"La Wi-Fi està desactivada"</string> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index 867225c089d9..6d4af4acac45 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -105,16 +105,12 @@ <string name="camera_label" msgid="7261107956054836961">"spustit fotoaparát"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Vybrat nové rozvržení úkolů"</string> <string name="cancel" msgid="6442560571259935130">"Zrušit"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Oblast pro zprávu nápovědy"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Potvrdit"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Dotkněte se snímače otisků prstů"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona otisku prstu"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Hledáme vás…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Ikona obličeje"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Tlačítko úpravy velikosti z důvodu kompatibility"</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zvětšit menší obrázek na větší obrazovku."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Rozhraní Bluetooth je připojeno."</string> @@ -843,9 +839,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Úložiště"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Tipy"</string> <string name="instant_apps" msgid="6647570248119804907">"Okamžité aplikace"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Okamžité aplikace není třeba instalovat."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"Aplikace <xliff:g id="APP">%1$s</xliff:g> je spuštěna"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"Aplikace byla otevřena bez instalace."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"Aplikace byla otevřena bez instalace. Klepnutím zobrazíte další informace."</string> <string name="app_info" msgid="6856026610594615344">"O aplikaci"</string> - <string name="go_to_web" msgid="2650669128861626071">"Přejít do prohlížeče"</string> + <string name="go_to_web" msgid="1106022723459948514">"Přejít na web"</string> <string name="mobile_data" msgid="7094582042819250762">"Mobilní data"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> – <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi je vypnuta"</string> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index baba3ac82483..ade7db114aa8 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"åbn kamera"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Vælg nyt opgavelayout"</string> <string name="cancel" msgid="6442560571259935130">"Annuller"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Område med hjælpemeddelelse"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Bekræft"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Sæt fingeren på fingeraftrykslæseren"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikon for fingeraftryk"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Forsøger at finde dig…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Ansigt"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Knap for kompatibilitetszoom."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zoom mindre til større skærm."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth tilsluttet."</string> @@ -829,9 +825,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Lagerplads"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Tips"</string> <string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Instant apps kræver ingen installation."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> kører"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"En app blev åbnet uden at blive installeret."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"En app blev åbnet uden at blive installeret. Tryk for at få flere oplysninger."</string> <string name="app_info" msgid="6856026610594615344">"Appinfo"</string> - <string name="go_to_web" msgid="2650669128861626071">"Gå til en browser"</string> + <string name="go_to_web" msgid="1106022723459948514">"Gå til website"</string> <string name="mobile_data" msgid="7094582042819250762">"Mobildata"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> – <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi er slået fra"</string> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index e8c8c5c8ed76..06aac5c5d1a6 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"Kamera öffnen"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Neues Aufgabenlayout auswählen"</string> <string name="cancel" msgid="6442560571259935130">"Abbrechen"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Bereich für die Hilfemeldung"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Bestätigen"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Berühre den Fingerabdrucksensor"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Fingerabdruck-Symbol"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Wir suchen nach dir…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Gesichtssymbol"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Schaltfläche für Kompatibilitätszoom"</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zoom auf einen größeren Bildschirm"</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Mit Bluetooth verbunden"</string> @@ -833,9 +829,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Speicher"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Hinweise"</string> <string name="instant_apps" msgid="6647570248119804907">"Instant-Apps"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Bei Instant-Apps ist keine vorherige Installation erforderlich."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> wird ausgeführt"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"App wurde geöffnet, ohne vorher installiert zu werden."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"App wurde geöffnet, ohne vorher installiert zu werden. Tippe, um weitere Informationen zu erhalten."</string> <string name="app_info" msgid="6856026610594615344">"App-Informationen"</string> - <string name="go_to_web" msgid="2650669128861626071">"Browser öffnen"</string> + <string name="go_to_web" msgid="1106022723459948514">"Web aufrufen"</string> <string name="mobile_data" msgid="7094582042819250762">"Mobile Daten"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> – <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"WLAN ist deaktiviert"</string> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index 4765c9b2fd29..1892da634d3b 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"άνοιγμα φωτογραφικής μηχανής"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Επιλέξτε τη νέα διάταξη εργασίας"</string> <string name="cancel" msgid="6442560571259935130">"Ακύρωση"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Περιοχή μηνυμάτων βοήθειας"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Επιβεβαίωση"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Αγγίξτε τον αισθητήρα δακτυλικών αποτυπωμάτων"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Εικονίδιο δακτυλικών αποτυπωμάτων"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Αναζήτηση για εσάς…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Εικονίδιο προσώπου"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Κουμπί εστίασης συμβατότητας."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Ζουμ από μικρότερη σε μεγαλύτερη οθόνη."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Το Bluetooth είναι συνδεδεμένο."</string> @@ -829,9 +825,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Αποθηκευτικός χώρος"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Συμβουλές"</string> <string name="instant_apps" msgid="6647570248119804907">"Instant Εφαρμογές"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Οι Instant Εφαρμογές δεν απαιτούν εγκατάσταση."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"Η εφαρμογή <xliff:g id="APP">%1$s</xliff:g> εκτελείται"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"Η εφαρμογή άνοιξε χωρίς να έχει εγκατασταθεί."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"Η εφαρμογή άνοιξε χωρίς να έχει εγκατασταθεί. Πατήστε για να μάθετε περισσότερα."</string> <string name="app_info" msgid="6856026610594615344">"Πληροφορίες εφαρμογής"</string> - <string name="go_to_web" msgid="2650669128861626071">"Μετάβ. σε πρόγ. περ."</string> + <string name="go_to_web" msgid="1106022723459948514">"Μετάβαση στον ιστό"</string> <string name="mobile_data" msgid="7094582042819250762">"Δεδομένα κινητής τηλεφωνίας"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> - <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Το Wi-Fi είναι ανενεργό"</string> diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index 0a2fec28dcef..65034700ec21 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"open camera"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Select new task layout"</string> <string name="cancel" msgid="6442560571259935130">"Cancel"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Help message area"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirm"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Touch the fingerprint sensor"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Fingerprint icon"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Looking for you…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Face icon"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Compatibility zoom button."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zoom smaller to larger screen."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth connected."</string> @@ -829,9 +825,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Storage"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Hints"</string> <string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Instant apps don\'t require installation."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> running"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"App opened without being installed."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"App opened without being installed. Tap to find out more."</string> <string name="app_info" msgid="6856026610594615344">"App info"</string> - <string name="go_to_web" msgid="2650669128861626071">"Go to browser"</string> + <string name="go_to_web" msgid="1106022723459948514">"Go to web"</string> <string name="mobile_data" msgid="7094582042819250762">"Mobile data"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> – <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi is off"</string> diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml index 7b1021230379..9e4081c71845 100644 --- a/packages/SystemUI/res/values-en-rCA/strings.xml +++ b/packages/SystemUI/res/values-en-rCA/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"open camera"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Select new task layout"</string> <string name="cancel" msgid="6442560571259935130">"Cancel"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Help message area"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirm"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Touch the fingerprint sensor"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Fingerprint icon"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Looking for you…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Face icon"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Compatibility zoom button."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zoom smaller to larger screen."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth connected."</string> @@ -829,9 +825,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Storage"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Hints"</string> <string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Instant apps don\'t require installation."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> running"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"App opened without being installed."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"App opened without being installed. Tap to find out more."</string> <string name="app_info" msgid="6856026610594615344">"App info"</string> - <string name="go_to_web" msgid="2650669128861626071">"Go to browser"</string> + <string name="go_to_web" msgid="1106022723459948514">"Go to web"</string> <string name="mobile_data" msgid="7094582042819250762">"Mobile data"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> – <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi is off"</string> diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index 0a2fec28dcef..65034700ec21 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"open camera"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Select new task layout"</string> <string name="cancel" msgid="6442560571259935130">"Cancel"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Help message area"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirm"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Touch the fingerprint sensor"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Fingerprint icon"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Looking for you…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Face icon"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Compatibility zoom button."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zoom smaller to larger screen."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth connected."</string> @@ -829,9 +825,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Storage"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Hints"</string> <string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Instant apps don\'t require installation."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> running"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"App opened without being installed."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"App opened without being installed. Tap to find out more."</string> <string name="app_info" msgid="6856026610594615344">"App info"</string> - <string name="go_to_web" msgid="2650669128861626071">"Go to browser"</string> + <string name="go_to_web" msgid="1106022723459948514">"Go to web"</string> <string name="mobile_data" msgid="7094582042819250762">"Mobile data"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> – <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi is off"</string> diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index 0a2fec28dcef..65034700ec21 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"open camera"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Select new task layout"</string> <string name="cancel" msgid="6442560571259935130">"Cancel"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Help message area"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirm"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Touch the fingerprint sensor"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Fingerprint icon"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Looking for you…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Face icon"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Compatibility zoom button."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zoom smaller to larger screen."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth connected."</string> @@ -829,9 +825,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Storage"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Hints"</string> <string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Instant apps don\'t require installation."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> running"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"App opened without being installed."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"App opened without being installed. Tap to find out more."</string> <string name="app_info" msgid="6856026610594615344">"App info"</string> - <string name="go_to_web" msgid="2650669128861626071">"Go to browser"</string> + <string name="go_to_web" msgid="1106022723459948514">"Go to web"</string> <string name="mobile_data" msgid="7094582042819250762">"Mobile data"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> – <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi is off"</string> diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml index 259d3cab5439..40205b942caa 100644 --- a/packages/SystemUI/res/values-en-rXC/strings.xml +++ b/packages/SystemUI/res/values-en-rXC/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"open camera"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Select new task layout"</string> <string name="cancel" msgid="6442560571259935130">"Cancel"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Help message area"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirm"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Touch the fingerprint sensor"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Fingerprint icon"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Looking for you…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Face icon"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Compatibility zoom button."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zoom smaller to larger screen."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth connected."</string> @@ -829,9 +825,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Storage"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Hints"</string> <string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Instant apps don\'t require installation."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> running"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"App opened without being installed."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"App opened without being installed. Tap to learn more."</string> <string name="app_info" msgid="6856026610594615344">"App info"</string> - <string name="go_to_web" msgid="2650669128861626071">"Go to browser"</string> + <string name="go_to_web" msgid="1106022723459948514">"Go to web"</string> <string name="mobile_data" msgid="7094582042819250762">"Mobile data"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi is off"</string> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index 33177f0dd2d2..d4adfdcb42d9 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"abrir cámara"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Selecciona el nuevo diseño de la tarea."</string> <string name="cancel" msgid="6442560571259935130">"Cancelar"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Área de mensajes de ayuda"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirmar"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Toca el sensor de huellas digitales"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ícono de huella digital"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Autenticando tu rostro…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Ícono de rostro"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Botón de zoom de compatibilidad"</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zoom de pantalla más pequeña a más grande"</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth conectado"</string> @@ -831,9 +827,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Almacenamiento"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Sugerencias"</string> <string name="instant_apps" msgid="6647570248119804907">"Apps instantáneas"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Las Apps instantáneas no requieren instalación."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> en ejecución"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"La app se abrió sin instalarse."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"La app se abrió sin instalarse. Presiona para obtener más información."</string> <string name="app_info" msgid="6856026610594615344">"Información de apps"</string> - <string name="go_to_web" msgid="2650669128861626071">"Ir al navegador"</string> + <string name="go_to_web" msgid="1106022723459948514">"Ir a la Web"</string> <string name="mobile_data" msgid="7094582042819250762">"Datos móviles"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi desactivado"</string> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index c80c495020a0..00c179cee16f 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/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="7164937344850004466">"IU del sistema"</string> + <string name="app_label" msgid="7164937344850004466">"UI del sistema"</string> <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Borrar"</string> <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Quitar de la lista"</string> <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Información de la aplicación"</string> @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"abrir cámara"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Seleccionar diseño de tarea nueva"</string> <string name="cancel" msgid="6442560571259935130">"Cancelar"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Área de mensaje de ayuda"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirmar"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Toca el sensor de huellas digitales"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icono de huella digital"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Buscando tu cara…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Icono de cara"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Botón de zoom de compatibilidad"</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zoom de pantalla más pequeña a más grande"</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth conectado"</string> @@ -567,13 +563,13 @@ <string name="output_service_bt" msgid="6224213415445509542">"Bluetooth"</string> <string name="output_service_wifi" msgid="3749735218931825054">"Wi‑Fi"</string> <string name="output_service_bt_wifi" msgid="4486837869988770896">"Bluetooth y Wi‑Fi"</string> - <string name="system_ui_tuner" msgid="708224127392452018">"Configurador de IU del sistema"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"Configurador de UI del sistema"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Mostrar porcentaje de batería insertado"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Mostrar el porcentaje del nivel de batería en el icono de la barra de estado cuando no se esté cargando"</string> <string name="quick_settings" msgid="10042998191725428">"Ajustes rápidos"</string> <string name="status_bar" msgid="4877645476959324760">"Barra de estado"</string> <string name="overview" msgid="4018602013895926956">"Aplicaciones recientes"</string> - <string name="demo_mode" msgid="2532177350215638026">"Modo de demostración de IU del sistema"</string> + <string name="demo_mode" msgid="2532177350215638026">"Modo de demostración de UI del sistema"</string> <string name="enable_demo_mode" msgid="4844205668718636518">"Habilitar modo de demostración"</string> <string name="show_demo_mode" msgid="2018336697782464029">"Mostrar modo de demostración"</string> <string name="status_bar_ethernet" msgid="5044290963549500128">"Ethernet"</string> @@ -590,12 +586,12 @@ <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Zona Wi-Fi"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Perfil de trabajo"</string> <string name="tuner_warning_title" msgid="7094689930793031682">"Diversión solo para algunos"</string> - <string name="tuner_warning" msgid="8730648121973575701">"El configurador de IU del sistema te ofrece otras formas de modificar y personalizar la interfaz de usuario de Android. Estas funciones experimentales pueden cambiar, fallar o desaparecer en futuras versiones. Te recomendamos que tengas cuidado."</string> + <string name="tuner_warning" msgid="8730648121973575701">"El configurador de UI del sistema te ofrece otras formas de modificar y personalizar la interfaz de usuario de Android. Estas funciones experimentales pueden cambiar, fallar o desaparecer en futuras versiones. Te recomendamos que tengas cuidado."</string> <string name="tuner_persistent_warning" msgid="8597333795565621795">"Estas funciones experimentales pueden cambiar, fallar o desaparecer en futuras versiones. Te recomendamos que tengas cuidado."</string> <string name="got_it" msgid="2239653834387972602">"Entendido"</string> - <string name="tuner_toast" msgid="603429811084428439">"¡Enhorabuena! El configurador de IU del sistema se ha añadido a Ajustes"</string> + <string name="tuner_toast" msgid="603429811084428439">"¡Enhorabuena! El configurador de UI del sistema se ha añadido a Ajustes"</string> <string name="remove_from_settings" msgid="8389591916603406378">"Quitar de Ajustes"</string> - <string name="remove_from_settings_prompt" msgid="6069085993355887748">"¿Quitar el configurador de IU del sistema de Ajustes y dejar de utilizar sus funciones?"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"¿Quitar el configurador de UI del sistema de Ajustes y dejar de utilizar sus funciones?"</string> <string name="activity_not_found" msgid="348423244327799974">"La aplicación no está instalada en tu dispositivo"</string> <string name="clock_seconds" msgid="7689554147579179507">"Mostrar los segundos del reloj"</string> <string name="clock_seconds_desc" msgid="6282693067130470675">"Muestra los segundos del reloj en la barra de estado. Puede afectar a la duración de la batería."</string> @@ -831,9 +827,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Almacenamiento"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Sugerencias"</string> <string name="instant_apps" msgid="6647570248119804907">"Aplicaciones Instantáneas"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"No es necesario instalar las Aplicaciones Instantáneas."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> se está ejecutando"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"La aplicación se abre sin necesidad de instalarla."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"La aplicación se abre sin necesidad de instalarla. Toca para obtener más información."</string> <string name="app_info" msgid="6856026610594615344">"Información de la aplicación"</string> - <string name="go_to_web" msgid="2650669128861626071">"Ir al navegador"</string> + <string name="go_to_web" msgid="1106022723459948514">"Ir a la Web"</string> <string name="mobile_data" msgid="7094582042819250762">"Datos móviles"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> ‑ <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi desactivado"</string> diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml index d4923e2a67ee..246f1f82fef3 100644 --- a/packages/SystemUI/res/values-et/strings.xml +++ b/packages/SystemUI/res/values-et/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"ava kaamera"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Uue toimingu paigutuse valimine"</string> <string name="cancel" msgid="6442560571259935130">"Tühista"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Abisõnumi ala"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Kinnita"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Puudutage sõrmejäljeandurit"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Sõrmejälje ikoon"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Otsitakse teid …"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Näoikoon"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Sobivussuumi nupp."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Suumi suuremale ekraanile vähem."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth on ühendatud."</string> @@ -831,9 +827,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Salvestusruum"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Vihjed"</string> <string name="instant_apps" msgid="6647570248119804907">"Installimata avatavad rakendused"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Installimata avatavaid rakendusi pole vaja installida."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"Rakendus <xliff:g id="APP">%1$s</xliff:g> töötab"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"Rakendus avati installimata."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"Rakendus avati installimata. Lisateabe saamiseks puudutage."</string> <string name="app_info" msgid="6856026610594615344">"Rakenduse teave"</string> - <string name="go_to_web" msgid="2650669128861626071">"Ava brauser"</string> + <string name="go_to_web" msgid="1106022723459948514">"Avage veebis"</string> <string name="mobile_data" msgid="7094582042819250762">"Mobiilne andmeside"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> – <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"WiFi on välja lülitatud"</string> diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index 379683fa35c4..b73946efa1fa 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"ireki kamera"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Hautatu zereginen diseinua"</string> <string name="cancel" msgid="6442560571259935130">"Utzi"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Laguntza-mezuaren eremua"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Berretsi"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Sakatu hatz-marken sentsorea"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Hatz-markaren ikonoa"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Zure bila…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Aurpegiaren ikonoa"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Zoom-bateragarritasunaren botoia."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Handiagotu pantaila txikia."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetootha konektatuta."</string> @@ -831,9 +827,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Memoria"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Aholkuak"</string> <string name="instant_apps" msgid="6647570248119804907">"Zuzeneko aplikazioak"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Zuzeneko aplikazioak ez dira instalatu behar."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> exekutatzen ari da"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"Ezer instalatu gabe ireki da aplikazioa."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"Ezer instalatu gabe ireki da aplikazioa. Sakatu informazio gehiago lortzeko."</string> <string name="app_info" msgid="6856026610594615344">"Aplikazioari buruzko informazioa"</string> - <string name="go_to_web" msgid="2650669128861626071">"Joan arakatzailera"</string> + <string name="go_to_web" msgid="1106022723459948514">"Joan sarera"</string> <string name="mobile_data" msgid="7094582042819250762">"Datu-konexioa"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> - <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi konexioa desaktibatuta dago"</string> diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index cafba14ca4ed..3997f1aa9ce5 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -47,7 +47,7 @@ <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"تنظیمات"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"چرخش خودکار صفحه"</string> - <string name="status_bar_settings_mute_label" msgid="554682549917429396">"بیصدا"</string> + <string name="status_bar_settings_mute_label" msgid="554682549917429396">"صامت"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"خودکار"</string> <string name="status_bar_settings_notifications" msgid="397146176280905137">"اعلانها"</string> <string name="bluetooth_tethered" msgid="7094101612161133267">"اتصال اینترنتی با بلوتوث تلفن همراه"</string> @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"باز کردن دوربین"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"انتخاب طرحبندی جدید کار"</string> <string name="cancel" msgid="6442560571259935130">"لغو"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"بخش پیام راهنما"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"تأیید"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"حسگر اثر انگشت را لمس کنید"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"نماد اثر انگشت"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"درحال جستجوی شما…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"نماد چهره"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"دکمه بزرگنمایی سازگار."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"بزرگنمایی از صفحههای کوچک تا بزرگ."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"بلوتوث متصل است."</string> @@ -545,14 +541,14 @@ <string name="ring_toggle_title" msgid="3281244519428819576">"تماسها"</string> <string name="volume_ringer_status_normal" msgid="4273142424125855384">"زنگ زدن"</string> <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"لرزش"</string> - <string name="volume_ringer_status_silent" msgid="6896394161022916369">"بیصدا"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"صامت"</string> <string name="qs_status_phone_vibrate" msgid="204362991135761679">"تلفن در حالت لرزش است"</string> <string name="qs_status_phone_muted" msgid="5437668875879171548">"تلفن بیصدا است"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. برای باصدا کردن ضربه بزنید."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. برای تنظیم روی لرزش ضربه بزنید. ممکن است سرویسهای دسترسپذیری بیصدا شوند."</string> - <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. برای بیصدا کردن ضربه بزنید. ممکن است سرویسهای دسترسپذیری بیصدا شوند."</string> + <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. برای صامت کردن ضربه بزنید. ممکن است سرویسهای دسترسپذیری صامت شود."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. برای تنظیم روی لرزش، ضربه بزنید."</string> - <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. برای بیصدا کردن ضربه بزنید."</string> + <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. برای صامت کردن ضربه بزنید."</string> <string name="volume_ringer_hint_mute" msgid="9199811307292269601">"صامت کردن"</string> <string name="volume_ringer_hint_unmute" msgid="6602880133293060368">"باصدا کردن"</string> <string name="volume_ringer_hint_vibrate" msgid="4036802135666515202">"لرزش"</string> @@ -829,9 +825,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"فضای ذخیرهسازی"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"نکات"</string> <string name="instant_apps" msgid="6647570248119804907">"برنامههای فوری"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"برنامههای فوری نیاز به نصب ندارند."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> درحال اجرا"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"برنامه بدون نصب شدن باز شد."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"برنامه بدون نصب شدن باز شد. برای اطلاعات بیشتر ضربه بزنید."</string> <string name="app_info" msgid="6856026610594615344">"اطلاعات برنامه"</string> - <string name="go_to_web" msgid="2650669128861626071">"رفتن به مرورگر"</string> + <string name="go_to_web" msgid="1106022723459948514">"رفتن به وب"</string> <string name="mobile_data" msgid="7094582042819250762">"داده تلفن همراه"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi خاموش است"</string> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 311d3bdef685..6e8cb4c3cb3f 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"avaa kamera"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Valitse uusi tehtävien asettelu"</string> <string name="cancel" msgid="6442560571259935130">"Peruuta"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Ohjeviestialue"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Vahvista"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Kosketa sormenjälkitunnistinta"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Sormenjälkikuvake"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Etsitään kasvoja…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Kasvokuvake"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Yhteensopivuuszoomaus-painike."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zoomaa pienemmältä suuremmalle ruudulle."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth yhdistetty."</string> @@ -829,9 +825,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Tallennustila"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Vihjeet"</string> <string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Pikasovelluksia ei tarvitse asentaa."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> on käynnissä"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"Sovellus avattiin ilman asennusta."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"Sovellus avattiin ilman asennusta. Katso lisätietoja napauttamalla."</string> <string name="app_info" msgid="6856026610594615344">"Sovelluksen tiedot"</string> - <string name="go_to_web" msgid="2650669128861626071">"Siirry selaimeen"</string> + <string name="go_to_web" msgid="1106022723459948514">"Avaa verkossa"</string> <string name="mobile_data" msgid="7094582042819250762">"Mobiilitiedonsiirto"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> – <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi on pois käytöstä"</string> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index 253496159e2a..f6d66b7301be 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"Ouvrir l\'appareil photo"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Sélectionner un nouveau format de tâche"</string> <string name="cancel" msgid="6442560571259935130">"Annuler"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Zone de message d\'aide"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirmer"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Touchez le capteur d\'empreintes digitales"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icône d\'empreinte digitale"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Recherche de votre visage…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Icône de visage"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Bouton \"Zoom de compatibilité\""</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zoom de compatibilité avec la taille de l\'écran"</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth connecté"</string> @@ -831,9 +827,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Stockage"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Conseils"</string> <string name="instant_apps" msgid="6647570248119804907">"Applications instantanées"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Les applications instantanées ne nécessitent pas d\'installation."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> en cours d\'exécution"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"Application ouverte sans avoir été installée."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"Application ouverte sans avoir été installée. Touchez ici pour en savoir plus."</string> <string name="app_info" msgid="6856026610594615344">"Détails de l\'application"</string> - <string name="go_to_web" msgid="2650669128861626071">"Ouvrir le navigateur"</string> + <string name="go_to_web" msgid="1106022723459948514">"Accéder au Web"</string> <string name="mobile_data" msgid="7094582042819250762">"Données cellulaires"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> : <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Le Wi-Fi est désactivé"</string> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index a82ae24ae9f2..326b7c75a9c9 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"ouvrir l\'appareil photo"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Sélectionner un nouveau plan de tâche"</string> <string name="cancel" msgid="6442560571259935130">"Annuler"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Zone de message d\'aide"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirmer"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Appuyez sur le lecteur d\'empreinte digitale"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icône d\'empreinte digitale"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Recherche de votre visage…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Icône représentant un visage"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Bouton \"Zoom de compatibilité\""</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zoom de compatibilité avec la taille de l\'écran"</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth connecté"</string> @@ -831,9 +827,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Espace de stockage"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Astuces"</string> <string name="instant_apps" msgid="6647570248119804907">"Applis instantanées"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Les applis instantanées ne nécessitent pas d\'installation."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> en cours d\'exécution"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"Vous pouvez ouvrir cette application sans l\'installer."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"Vous pouvez ouvrir cette application sans l\'installer. Appuyez pour en savoir plus."</string> <string name="app_info" msgid="6856026610594615344">"Infos sur l\'appli"</string> - <string name="go_to_web" msgid="2650669128861626071">"Accéder au navigateur"</string> + <string name="go_to_web" msgid="1106022723459948514">"Accéder au site Web"</string> <string name="mobile_data" msgid="7094582042819250762">"Données mobiles"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> – <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi désactivé"</string> diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index d987c568f15c..192c132dee18 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"abrir cámara"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Seleccionar novo deseño de tarefas"</string> <string name="cancel" msgid="6442560571259935130">"Cancelar"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Área de mensaxes de axuda"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirmar"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Toca o sensor de impresión dixital"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icona de impresión dixital"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Buscándote…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Icona de cara"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Botón de zoom de compatibilidade"</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zoom de compatibilidade co tamaño da pantalla."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth conectado"</string> @@ -831,9 +827,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Almacenamento"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Consellos"</string> <string name="instant_apps" msgid="6647570248119804907">"Aplicacións instantáneas"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"As aplicacións instantáneas non precisan instalación."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"Estase executando <xliff:g id="APP">%1$s</xliff:g>"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"Abriuse a aplicación sen ter que instalala."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"Abriuse a aplicación sen ter que instalala. Tocar para obter máis información."</string> <string name="app_info" msgid="6856026610594615344">"Info. da aplicación"</string> - <string name="go_to_web" msgid="2650669128861626071">"Ir ao navegador"</string> + <string name="go_to_web" msgid="1106022723459948514">"Acceder á web"</string> <string name="mobile_data" msgid="7094582042819250762">"Datos móbiles"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g>-<xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"A wifi está desactivada"</string> diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index 70a75fcd58f6..f3922681e47f 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"કૅમેરો ખોલો"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"નવું કાર્ય લેઆઉટ પસંદ કરો"</string> <string name="cancel" msgid="6442560571259935130">"રદ કરો"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"સહાય સંદેશનું ક્ષેત્ર"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"કન્ફર્મ કરો"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"ફિંગરપ્રિન્ટના સેન્સરને સ્પર્શ કરો"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ફિંગરપ્રિન્ટનું આઇકન"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"તમારા માટે શોધી રહ્યાં છે..."</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"ચહેરા આઇકન"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"સુસંગતતા ઝૂમ બટન."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"નાનીથી મોટી સ્ક્રીન પર ઝૂમ કરો."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"બ્લૂટૂથ કનેક્ટ થયું."</string> @@ -829,9 +825,14 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"સ્ટોરેજ"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"હિન્ટ"</string> <string name="instant_apps" msgid="6647570248119804907">"ઝટપટ ઍપ્લિકેશનો"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"ઝટપટ ઍપ્લિકેશનો માટે ઇન્સ્ટૉલેશનની જરૂર નથી."</string> + <!-- no translation found for instant_apps_title (8738419517367449783) --> + <skip /> + <!-- no translation found for instant_apps_message (1183313016396018086) --> + <skip /> + <!-- no translation found for instant_apps_message_with_help (6179830437630729747) --> + <skip /> <string name="app_info" msgid="6856026610594615344">"ઍપ્લિકેશન માહિતી"</string> - <string name="go_to_web" msgid="2650669128861626071">"બ્રાઉઝર પર જાઓ"</string> + <string name="go_to_web" msgid="1106022723459948514">"વેબ પર જાઓ"</string> <string name="mobile_data" msgid="7094582042819250762">"મોબાઇલ ડેટા"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"વાઇ-ફાઇ બંધ છે"</string> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index e098657fba1b..87952643c96a 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"कैमरा खोलें"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"नया कार्य लेआउट चुनें"</string> <string name="cancel" msgid="6442560571259935130">"रद्द करें"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"सहायता का मैसेज दिखाने की जगह"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"पुष्टि करें"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"फ़िंगरप्रिंट सेंसर को छुएं"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"फ़िंगरप्रिंट आइकॉन"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"आपको पहचान रहा है…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"चेहरे का आइकॉन"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"संगतता ज़ूम बटन."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"छोटी से बड़ी स्क्रीन पर ज़ूम करें."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"ब्लूटूथ कनेक्ट किया गया."</string> @@ -829,9 +825,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"जगह"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"संकेत"</string> <string name="instant_apps" msgid="6647570248119804907">"इंस्टेंट ऐप"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"झटपट ऐप्स के लिए इंस्टॉलेशन ज़रूरी नहीं है."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> चल रहा है"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"ऐप्लिकेशन इंस्टॉल किए बिना ही खुल गया है."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"ऐप्लिकेशन इंस्टॉल किए बिना ही खुल गया है. ज़्यादा जानने के लिए टैप करें."</string> <string name="app_info" msgid="6856026610594615344">"ऐप की जानकारी"</string> - <string name="go_to_web" msgid="2650669128861626071">"ब्राउज़र पर जाएं"</string> + <string name="go_to_web" msgid="1106022723459948514">"वेब पर जाएं"</string> <string name="mobile_data" msgid="7094582042819250762">"मोबाइल डेटा"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"वाई-फ़ाई बंद है"</string> diff --git a/packages/SystemUI/res/values-hi/strings_car.xml b/packages/SystemUI/res/values-hi/strings_car.xml index 8820046cf11f..3beada5c174e 100644 --- a/packages/SystemUI/res/values-hi/strings_car.xml +++ b/packages/SystemUI/res/values-hi/strings_car.xml @@ -20,8 +20,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="car_guest" msgid="3738772168718508650">"मेहमान"</string> - <!-- no translation found for start_guest_session (7055742120180595689) --> - <skip /> + <string name="start_guest_session" msgid="7055742120180595689">"मेहमान मोड"</string> <string name="car_add_user" msgid="5245196248349230898">"उपयोगकर्ता जोड़ें"</string> <string name="car_new_user" msgid="8142927244990323906">"नया उपयोगकर्ता"</string> <string name="user_add_user_message_setup" msgid="1791011504259527329">"जब आप कोई नया उपयोगकर्ता जोड़ते हैं तो, उस व्यक्ति को अपनी जगह सेट करनी होती है."</string> diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index 53250db5ba7e..b6fa4f58cce5 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -104,16 +104,12 @@ <string name="camera_label" msgid="7261107956054836961">"otvaranje fotoaparata"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Odaberite novi izgled zadataka"</string> <string name="cancel" msgid="6442560571259935130">"Odustani"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Područje poruke za pomoć"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Potvrdi"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Dodirnite senzor otiska prsta"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona otiska prsta"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Tražimo vas…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Ikona lica"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Gumb za kompatibilnost zumiranja."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zumiranje manjeg zaslona na veći."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth povezan."</string> @@ -835,9 +831,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Pohrana"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Savjeti"</string> <string name="instant_apps" msgid="6647570248119804907">"Instant aplikacije"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Instant aplikacije nije potrebno instalirati."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"Izvodi se aplikacija <xliff:g id="APP">%1$s</xliff:g>"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"Aplikacija je otvorena bez instaliranja."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"Aplikacija je otvorena bez instaliranja. Dodirnite da biste saznali više."</string> <string name="app_info" msgid="6856026610594615344">"Informacije o aplikaciji"</string> - <string name="go_to_web" msgid="2650669128861626071">"Otvori preglednik"</string> + <string name="go_to_web" msgid="1106022723459948514">"Prijeđi na web"</string> <string name="mobile_data" msgid="7094582042819250762">"Mobilni podaci"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> – <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi je isključen"</string> diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index ee8ff0b07018..9076379fc70b 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"kamera megnyitása"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Új feladatelrendezés kiválasztása"</string> <string name="cancel" msgid="6442560571259935130">"Mégse"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Súgószöveg területe"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Megerősítés"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Érintse meg az ujjlenyomat-érzékelőt"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ujjlenyomat ikonja"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Keresem az Ön arcát…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Arcikon"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Kompatibilitási zoom gomb."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Kicsinyítsen a nagyobb képernyőhöz."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth csatlakoztatva."</string> @@ -829,9 +825,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Tárhely"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Tippek"</string> <string name="instant_apps" msgid="6647570248119804907">"Azonnali alkalmazások"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Az azonnali alkalmazásokat nem kell telepíteni."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"A(z) <xliff:g id="APP">%1$s</xliff:g> alkalmazás jelenleg fut"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"Az alkalmazás telepítés nélkül lett megnyitva."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"Az alkalmazás telepítés nélkül lett megnyitva. Ha további információra van szüksége, koppintson ide."</string> <string name="app_info" msgid="6856026610594615344">"Alkalmazásinformáció"</string> - <string name="go_to_web" msgid="2650669128861626071">"Ugrás a böngészőbe"</string> + <string name="go_to_web" msgid="1106022723459948514">"Tovább az internetre"</string> <string name="mobile_data" msgid="7094582042819250762">"Mobiladatok"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> – <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"A Wi-Fi ki van kapcsolva"</string> diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index bb8af5424f6d..54401f53347d 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"բացել ֆոտոխցիկը"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Ընտրել առաջադրանքի նոր դասավորություն"</string> <string name="cancel" msgid="6442560571259935130">"Չեղարկել"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Օգնության հաղորդագրության դաշտ"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Հաստատել"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Հպեք մատնահետքերի սկաներին"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Մատնահետքի պատկերակ"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Դեմքի ճանաչում…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Դեմքի պատկերակ"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Համատեղելիության խոշորացման կոճակը:"</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Դիտափոխել փոքրից ավելի մեծ էկրան:"</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth-ը միացված է:"</string> @@ -588,12 +584,12 @@ <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Թեժ կետ"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Աշխատանքային պրոֆիլ"</string> <string name="tuner_warning_title" msgid="7094689930793031682">"Զվարճանք մեկ՝ որոշակի մարդու համար"</string> - <string name="tuner_warning" msgid="8730648121973575701">"Համակարգի ՕՄ-ի ընդունիչը հնարավորություն է տալիս հարմարեցնել Android-ի օգտատիրոջ միջերեսը: Այս փորձնական գործառույթները կարող են հետագա թողարկումների մեջ փոփոխվել, խափանվել կամ ընդհանրապես չհայտնվել: Եթե շարունակում եք, զգուշացեք:"</string> + <string name="tuner_warning" msgid="8730648121973575701">"Համակարգի ՕՄ-ի կարգավորիչը հնարավորություն է տալիս հարմարեցնել Android-ի օգտատիրոջ միջերեսը: Այս փորձնական գործառույթները կարող են հետագա թողարկումների մեջ փոփոխվել, խափանվել կամ ընդհանրապես չհայտնվել: Եթե շարունակում եք, զգուշացեք:"</string> <string name="tuner_persistent_warning" msgid="8597333795565621795">"Այս փորձնական գործառույթները կարող են հետագա թողարկումների մեջ փոփոխվել, խափանվել կամ ընդհանրապես չհայտնվել: Եթե շարունակում եք, զգուշացեք:"</string> <string name="got_it" msgid="2239653834387972602">"Եղավ"</string> - <string name="tuner_toast" msgid="603429811084428439">"Համակարգի ՕՄ-ի ընդունիչը ավելացվել է կարգավորումներին"</string> + <string name="tuner_toast" msgid="603429811084428439">"Համակարգի ՕՄ-ի կարգավորիչը ավելացվել է կարգավորումներին"</string> <string name="remove_from_settings" msgid="8389591916603406378">"Հեռացնել կարգավորումներից"</string> - <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Հեռացնե՞լ Համակարգի ՕՄ-ի ընդունիչը կարգավորումներից և չօգտվել այլևս նրա գործառույթներից:"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Հեռացնե՞լ Համակարգի ՕՄ-ի կարգավորիչը կարգավորումներից և չօգտվել այլևս նրա գործառույթներից:"</string> <string name="activity_not_found" msgid="348423244327799974">"Հավելվածը տեղադրված չէ սարքի վրա"</string> <string name="clock_seconds" msgid="7689554147579179507">"Ցույց տալ ժամացույցի վայրկյանները"</string> <string name="clock_seconds_desc" msgid="6282693067130470675">"Ցույց տալ ժամացույցի վայրկյանները կարգավիճակի տողում: Կարող է ազդել մարտկոցի աշխատանքի ժամանակի վրա:"</string> @@ -829,9 +825,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Տարածք"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Հուշումներ"</string> <string name="instant_apps" msgid="6647570248119804907">"Ակնթարթային հավելվածներ"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Ակնթարթային հավելվածները տեղադրում չեն պահանջում։"</string> + <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> հավելվածն աշխատում է"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"Հավելվածը բացվել է առանց տեղադրման։"</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"Հավելվածը բացվել է առանց տեղադրման։ Հպեք՝ ավելին իմանալու համար։"</string> <string name="app_info" msgid="6856026610594615344">"Հավելվածի տվյալներ"</string> - <string name="go_to_web" msgid="2650669128861626071">"Անցնել դիտարկիչ"</string> + <string name="go_to_web" msgid="1106022723459948514">"Բացեք համացանցում"</string> <string name="mobile_data" msgid="7094582042819250762">"Բջջային ինտերնետ"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi-ն անջատված է"</string> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index 2b387021a65e..247415827c34 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"buka kamera"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Pilih tata letak tugas baru"</string> <string name="cancel" msgid="6442560571259935130">"Batal"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Area pesan bantuan"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Konfirmasi"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Sentuh sensor sidik jari"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikon sidik jari"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Mencari wajah Anda…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Ikon wajah"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Tombol perbesar/perkecil kompatibilitas."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Perbesar dari layar kecil ke besar."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth tersambung."</string> @@ -829,9 +825,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Penyimpanan"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Petunjuk"</string> <string name="instant_apps" msgid="6647570248119804907">"Aplikasi Instan"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Aplikasi instan tidak perlu diinstal."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> berjalan"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"Aplikasi dapat dibuka tanpa perlu diinstal."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"Aplikasi dapat dibuka tanpa perlu diinstal. Tap untuk mempelajari lebih lanjut."</string> <string name="app_info" msgid="6856026610594615344">"Info aplikasi"</string> - <string name="go_to_web" msgid="2650669128861626071">"Buka browser"</string> + <string name="go_to_web" msgid="1106022723459948514">"Buka di web"</string> <string name="mobile_data" msgid="7094582042819250762">"Data seluler"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi nonaktif"</string> diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml index 184ebed8d275..c2a020b89e3f 100644 --- a/packages/SystemUI/res/values-is/strings.xml +++ b/packages/SystemUI/res/values-is/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"opna myndavél"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Velja nýtt útlit verkefna"</string> <string name="cancel" msgid="6442560571259935130">"Hætta við"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Svæði hjálparskilaboða"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Staðfesta"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Snertu fingrafaralesarann"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Fingrafaratákn"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Leitar að þér ..."</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Andlitstákn"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Hnappur fyrir samhæfisaðdrátt."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Aðlaga forrit fyrir lítinn skjá að stærri skjá."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth tengt."</string> @@ -829,9 +825,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Geymslurými"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Vísbendingar"</string> <string name="instant_apps" msgid="6647570248119804907">"Skyndiforrit"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Skyndiforrit þurfa ekki uppsetningu."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> er í gangi"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"Forrit opnað án þess að vera uppsett."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"Forrit opnað án þess að vera uppsett. Ýttu til að fá frekari upplýsingar."</string> <string name="app_info" msgid="6856026610594615344">"Forritsupplýsingar"</string> - <string name="go_to_web" msgid="2650669128861626071">"Opna vafra"</string> + <string name="go_to_web" msgid="1106022723459948514">"Fara á vefinn"</string> <string name="mobile_data" msgid="7094582042819250762">"Farsímagögn"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> – <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Slökkt á Wi-Fi"</string> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index 9a6e38b61eb4..aefaa6dff4b8 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"apri fotocamera"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Seleziona un nuovo layout per le attività"</string> <string name="cancel" msgid="6442560571259935130">"Annulla"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Area dei messaggi di assistenza"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confermo"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Tocca il sensore di impronte digitali"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icona dell\'impronta digitale"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"In attesa del volto…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Icona volto"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Pulsante zoom compatibilità."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zoom inferiore per schermo più grande."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth collegato."</string> @@ -831,9 +827,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Spazio di archiviazione"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Suggerimenti"</string> <string name="instant_apps" msgid="6647570248119804907">"App istantanee"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Le app istantanee non richiedono l\'installazione."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"App <xliff:g id="APP">%1$s</xliff:g> in esecuzione"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"App aperta senza essere stata installata."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"App aperta senza essere stata installata. Tocca per avere ulteriori informazioni."</string> <string name="app_info" msgid="6856026610594615344">"Informazioni app"</string> - <string name="go_to_web" msgid="2650669128861626071">"Vai al browser"</string> + <string name="go_to_web" msgid="1106022723459948514">"Vai sul Web"</string> <string name="mobile_data" msgid="7094582042819250762">"Dati mobili"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> - <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi disattivato"</string> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index cf1d3370a5ac..b83f5dff6736 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -105,16 +105,12 @@ <string name="camera_label" msgid="7261107956054836961">"פתח את המצלמה"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"בחר פריסה חדשה להצגת משימות"</string> <string name="cancel" msgid="6442560571259935130">"ביטול"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"אזור הודעת עזרה"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"אישור"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"יש לגעת בחיישן טביעות האצבע"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"סמל טביעת אצבע"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"מחפש אותך…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"סמל הפנים"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"לחצן מרחק מתצוגה של תאימות."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"שנה מרחק מתצוגה של מסך קטן לגדול יותר."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth מחובר."</string> @@ -841,9 +837,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"אחסון"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"טיפים"</string> <string name="instant_apps" msgid="6647570248119804907">"אפליקציות אינסטנט"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"אפליקציות אינסטנט לא דורשות התקנה."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> פועלת"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"האפליקציה נפתחת בלי התקנה."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"האפליקציה נפתחת בלי התקנה. אפשר להקיש כדי לקבל מידע נוסף."</string> <string name="app_info" msgid="6856026610594615344">"פרטי אפליקציה"</string> - <string name="go_to_web" msgid="2650669128861626071">"מעבר אל הדפדפן"</string> + <string name="go_to_web" msgid="1106022723459948514">"התחבר לאינטרנט"</string> <string name="mobile_data" msgid="7094582042819250762">"נתונים סלולריים"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi כבוי"</string> diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index f6674d60efae..e5b0a2b7e766 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"カメラを起動"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"新しいタスクレイアウトの選択"</string> <string name="cancel" msgid="6442560571259935130">"キャンセル"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"ヘルプ メッセージ領域"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"確認"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"指紋認証センサーをタップしてください"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"指紋アイコン"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"顔を認証しています…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"顔アイコン"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"互換ズームボタン。"</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"小さい画面から大きい画面に拡大。"</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetoothに接続済み。"</string> @@ -831,9 +827,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"ストレージ"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"ヒント"</string> <string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Instant Apps はインストールせずに利用できます。"</string> + <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> を実行中"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"アプリをインストールせずに開きました。"</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"アプリをインストールせずに開きました。詳細を見るにはタップしてください。"</string> <string name="app_info" msgid="6856026610594615344">"アプリ情報"</string> - <string name="go_to_web" msgid="2650669128861626071">"ブラウザに移動"</string> + <string name="go_to_web" msgid="1106022723459948514">"ウェブページを開く"</string> <string name="mobile_data" msgid="7094582042819250762">"モバイルデータ"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi は OFF です"</string> diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml index 26de531591b6..19e9f471e226 100644 --- a/packages/SystemUI/res/values-ka/strings.xml +++ b/packages/SystemUI/res/values-ka/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"კამერის გახსნა"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"ახალი ამოცანის განლაგების არჩევა"</string> <string name="cancel" msgid="6442560571259935130">"გაუქმება"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"დამხმარე შეტყობინების არე"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"დადასტურება"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"შეეხეთ თითის ანაბეჭდის სენსორს"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"თითის ანაბეჭდის ხატულა"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"მიმდინარეობს თქვენი ძიება…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"სახის ხატულა"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"თავსებადი მასშტაბირების ღილაკი."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"შეცვალეთ პატარა ეკრანი უფრო დიდით."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth დაკავშირებულია."</string> @@ -829,9 +825,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"მეხსიერება"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"მინიშნებები"</string> <string name="instant_apps" msgid="6647570248119804907">"მყისიერი აპები"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"მყისიერი აპები ინსტალაციას არ საჭიროებს."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> გაშვებულია"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"აპი გაიხსნა ინსტალაციის გარეშე."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"აპი გაიხსნა ინსტალაციის გარეშე. შეეხეთ მეტის გასაგებად."</string> <string name="app_info" msgid="6856026610594615344">"აპის შესახებ"</string> - <string name="go_to_web" msgid="2650669128861626071">"ბრაუზერზე გადასვლა"</string> + <string name="go_to_web" msgid="1106022723459948514">"ვებზე გადასვლა"</string> <string name="mobile_data" msgid="7094582042819250762">"მობილური ინტერნეტი"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi გამორთულია"</string> diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index d06c0f54981f..15f8cd56f876 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"камераны ашу"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Жаңа тапсырма пішімін таңдау"</string> <string name="cancel" msgid="6442560571259935130">"Бас тарту"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Анықтама хабары аумағы"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Растау"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Саусақ ізін оқу сканерін түртіңіз"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Саусақ ізі белгішесі"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Бет ізделуде…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Бет белгішесі"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Үйлесімділік ұлғайту түймесі."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Үлкендеу экранда кішірейту."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth қосылған."</string> @@ -829,9 +825,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Жад"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Кеңестер"</string> <string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Лездік қолданбаларды орнатудың қажеті жоқ."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> іске қосулы"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"Қолданба орнатылмай-ақ ашылды."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"Қолданба орнатылмай-ақ ашылды. Толығырақ мәлімет алу үшін түртіңіз."</string> <string name="app_info" msgid="6856026610594615344">"Қолданба ақпараты"</string> - <string name="go_to_web" msgid="2650669128861626071">"Браузерге өту"</string> + <string name="go_to_web" msgid="1106022723459948514">"Вебке өту"</string> <string name="mobile_data" msgid="7094582042819250762">"Мобильдік деректер"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> – <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi өшірулі"</string> diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml index bf9ad75932f8..af8d4ceefc5f 100644 --- a/packages/SystemUI/res/values-km/strings.xml +++ b/packages/SystemUI/res/values-km/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"បើកម៉ាស៊ីនថត"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"ជ្រើសប្លង់ភារកិច្ចថ្មី"</string> <string name="cancel" msgid="6442560571259935130">"បោះបង់"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"តំបន់សារជំនួយ"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"បញ្ជាក់"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"ប៉ះឧបករណ៍ចាប់ស្នាមម្រាមដៃ"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"រូបតំណាងស្នាមម្រាមដៃ"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"កំពុងស្វែងរកអ្នក…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"រូបផ្ទៃមុខ"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"ប៊ូតុងពង្រីកត្រូវគ្នា។"</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"ពង្រីក/បង្រួមអេក្រង់ពីទៅធំ"</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"បានតភ្ជាប់ប៊្លូធូស។"</string> @@ -829,9 +825,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"ទំហំផ្ទុក"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"ការសម្រួល"</string> <string name="instant_apps" msgid="6647570248119804907">"កម្មវិធីប្រើភ្លាមៗ"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"កម្មវិធីប្រើភ្លាមៗមិនតម្រូវឲ្យមានការដំឡើងទេ។"</string> + <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> កំពុងដំណើរការ"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"កម្មវិធីត្រូវបានបើកដោយមិនចាំបាច់ដំឡើង។"</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"កម្មវិធីត្រូវបានបើកដោយមិនចាំបាច់ដំឡើង។ ចុចដើម្បីស្វែងយល់បន្ថែម។"</string> <string name="app_info" msgid="6856026610594615344">"ព័ត៌មានកម្មវិធី"</string> - <string name="go_to_web" msgid="2650669128861626071">"ចូលទៅកម្មវិធីរុករកតាមអ៊ីនធឺណិត"</string> + <string name="go_to_web" msgid="1106022723459948514">"ចូលទៅកាន់បណ្តាញ"</string> <string name="mobile_data" msgid="7094582042819250762">"ទិន្នន័យទូរសព្ទចល័ត"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi បានបិទ"</string> diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index 482343721f44..ac36e73d602d 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"ಕ್ಯಾಮರಾ ತೆರೆಯಿರಿ"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"ಹೊಸ ಕಾರ್ಯ ವಿನ್ಯಾಸವನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string> <string name="cancel" msgid="6442560571259935130">"ರದ್ದುಮಾಡಿ"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"ಸಹಾಯ ಸಂದೇಶ ಪ್ರದೇಶ"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"ದೃಢೀಕರಿಸಿ"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಸೆನ್ಸರ್ ಅನ್ನು ಸ್ಪರ್ಶಿಸಿ"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಐಕಾನ್"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"ನಿಮಗಾಗಿ ಹುಡುಕಲಾಗುತ್ತಿದೆ…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"ಮುಖದ ಐಕಾನ್"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"ಹೊಂದಾಣಿಕೆಯ ಝೂಮ್ ಬಟನ್."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"ಚಿಕ್ಕ ಪರದೆಯಿಂದ ದೊಡ್ಡ ಪರದೆಗೆ ಝೂಮ್ ಮಾಡು."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"ಬ್ಲೂಟೂತ್ ಸಂಪರ್ಕಗೊಂಡಿದೆ."</string> @@ -829,9 +825,14 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"ಸಂಗ್ರಹಣೆ"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"ಸುಳಿವುಗಳು"</string> <string name="instant_apps" msgid="6647570248119804907">"ತತ್ಕ್ಷಣ ಆಪ್ಗಳು"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"ತತ್ಕ್ಷಣ ಆಪ್ಗಳಿಗೆ ಸ್ಥಾಪನೆಯ ಅಗತ್ಯವಿಲ್ಲ."</string> + <!-- no translation found for instant_apps_title (8738419517367449783) --> + <skip /> + <!-- no translation found for instant_apps_message (1183313016396018086) --> + <skip /> + <!-- no translation found for instant_apps_message_with_help (6179830437630729747) --> + <skip /> <string name="app_info" msgid="6856026610594615344">"ಅಪ್ಲಿಕೇಶನ್ ಮಾಹಿತಿ"</string> - <string name="go_to_web" msgid="2650669128861626071">"ಬ್ರೌಸರ್ಗೆ ಹೋಗಿ"</string> + <string name="go_to_web" msgid="1106022723459948514">"ವೆಬ್ಗೆ ಹೋಗಿ"</string> <string name="mobile_data" msgid="7094582042819250762">"ಮೊಬೈಲ್ ಡೇಟಾ"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"ವೈ-ಫೈ ಆಫ್ ಆಗಿದೆ"</string> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index 10c1e282b1d9..1e2ab424832e 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"카메라 열기"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"새 작업 레이아웃 선택"</string> <string name="cancel" msgid="6442560571259935130">"취소"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"도움말 메시지 영역"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"확인"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"지문 센서를 터치하세요."</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"지문 아이콘"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"찾는 중..."</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"얼굴 아이콘"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"호환성 확대/축소 버튼입니다."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"작은 화면을 큰 화면으로 확대합니다."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"블루투스가 연결되었습니다."</string> @@ -831,9 +827,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"저장공간"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"힌트"</string> <string name="instant_apps" msgid="6647570248119804907">"인스턴트 앱"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"인스턴트 앱은 설치가 필요하지 않습니다."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> 실행 중"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"설치 없이 앱이 실행되었습니다."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"설치 없이 앱이 실행되었습니다. 탭하여 자세히 알아보세요."</string> <string name="app_info" msgid="6856026610594615344">"앱 정보"</string> - <string name="go_to_web" msgid="2650669128861626071">"브라우저로 이동"</string> + <string name="go_to_web" msgid="1106022723459948514">"웹으로 이동"</string> <string name="mobile_data" msgid="7094582042819250762">"모바일 데이터"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g>, <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi가 사용 중지됨"</string> diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index a0e630afaffa..585e2900eb4b 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"камераны ачуу"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Жаңы тапшырманын планын тандаңыз"</string> <string name="cancel" msgid="6442560571259935130">"Жокко чыгаруу"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Жардам билдирүүсү"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Ырастоо"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Манжа изинин сенсорун басыңыз"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Манжа изинин сүрөтчөсү"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Жүзүңүз изделүүдө…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Жүздүн сүрөтчөсү"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Масштабды сыйыштыруу баскычы."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Кичинекейди чоң экранга масштабдоо."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth байланышта"</string> @@ -829,9 +825,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Сактагыч"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Кеңештер"</string> <string name="instant_apps" msgid="6647570248119804907">"Ыкчам ачылуучу колдонмолор"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Ыкчам ачылуучу колдонмолорду орнотуу талап кылынбайт."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> иштеп жатат"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"Колдонмо орнотулбастан ачылды."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"Колдонмо орнотулбастан ачылды. Толугураак маалымат алуу үчүн таптап коюңуз."</string> <string name="app_info" msgid="6856026610594615344">"Колдонмо тууралуу"</string> - <string name="go_to_web" msgid="2650669128861626071">"Серепчиге өтүү"</string> + <string name="go_to_web" msgid="1106022723459948514">"Интернетке өтүү"</string> <string name="mobile_data" msgid="7094582042819250762">"Мобилдик Интернет"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi өчүк"</string> diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml index 3cc1ac1e857b..0952df4c1c7f 100644 --- a/packages/SystemUI/res/values-lo/strings.xml +++ b/packages/SystemUI/res/values-lo/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"ເປີດກ້ອງ"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"ເລືອກແຜນຜັງໜ້າວຽກໃໝ່"</string> <string name="cancel" msgid="6442560571259935130">"ຍົກເລີກ"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"ຊ່ວຍພື້ນທີ່ຂໍ້ຄວາມ"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"ຢືນຢັນ"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Touch the fingerprint sensor"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ໄອຄອນລາຍນິ້ວມື"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"ກຳລັງຊອກຫາທ່ານ…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"ໄອຄອນໃບໜ້າ"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"ປຸ່ມຊູມທີ່ໃຊ້ຮ່ວມກັນໄດ້."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"ຊູມຈໍນ້ອຍໄປເປັນຈໍຂະຫນາດໃຫຍ່."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"ເຊື່ອມຕໍ່ Bluetooth ແລ້ວ."</string> @@ -829,9 +825,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"ບ່ອນເກັບຂໍ້ມູນ"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"ຄຳໃບ້"</string> <string name="instant_apps" msgid="6647570248119804907">"ອິນສະແຕນແອັບ"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"ອິນສະແຕນແອັບບໍ່ຈຳເປັນຕ້ອງມີການຕິດຕັ້ງ."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> ກຳລັງເຮັດວຽກຢູ່"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"ເປີດແອັບໂດຍບໍ່ມີການຕິດຕັ້ງແລ້ວ."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"ເປີດແອັບໂດຍບໍ່ມີການຕິດຕັ້ງແລ້ວ. ແຕະເພື່ອສຶກສາເພີ່ມເຕີມ."</string> <string name="app_info" msgid="6856026610594615344">"ຂໍ້ມູນແອັບ"</string> - <string name="go_to_web" msgid="2650669128861626071">"ໄປທີ່ໂປຣແກຣມທ່ອງເວັບ"</string> + <string name="go_to_web" msgid="1106022723459948514">"ໄປທີ່ເວັບ"</string> <string name="mobile_data" msgid="7094582042819250762">"ອິນເຕີເນັດມືຖື"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi ປິດຢູ່"</string> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index e7d423b04913..ac6cfc79216c 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -105,16 +105,12 @@ <string name="camera_label" msgid="7261107956054836961">"atidaryti fotoaparatą"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Pasirinkti naują užduoties išdėstymą"</string> <string name="cancel" msgid="6442560571259935130">"Atšaukti"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Pagalbos pranešimo sritis"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Patvirtinkite"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Palieskite kontrolinio kodo jutiklį"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Kontrolinio kodo piktograma"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Ieškoma jūsų…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Veido piktograma"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Suderinamumo priartinimo mygtukas."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Padidinti ekraną."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"„Bluetooth“ prijungtas."</string> @@ -841,9 +837,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Saugykla"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Užuominos"</string> <string name="instant_apps" msgid="6647570248119804907">"Akimirksniu įkeliamos programos"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Akimirksniu įkeliamų programų nereikia įdiegti."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"Programa „<xliff:g id="APP">%1$s</xliff:g>“ paleista"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"Programa atidaryta jos neįdiegus."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"Programa atidaryta jos neįdiegus. Palieskite, kad sužinotumėte daugiau."</string> <string name="app_info" msgid="6856026610594615344">"Programos informacija"</string> - <string name="go_to_web" msgid="2650669128861626071">"Eiti į naršyklę"</string> + <string name="go_to_web" msgid="1106022723459948514">"Eiti į žiniatinklį"</string> <string name="mobile_data" msgid="7094582042819250762">"Mobilieji duomenys"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g>–<xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"„Wi-Fi“ išjungtas"</string> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index 4fd96680010a..01e2e398945d 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -104,16 +104,12 @@ <string name="camera_label" msgid="7261107956054836961">"atvērt kameru"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Atlasiet jaunu uzdevumu izkārtojumu"</string> <string name="cancel" msgid="6442560571259935130">"Atcelt"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Palīdzības ziņojuma apgabals"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Apstiprināt"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Pieskarieties pirksta nospieduma sensoram"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Pirksta nospieduma ikona"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Notiek jūsu sejas meklēšana…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Sejas ikona"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Saderības tālummaiņas poga."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Veikt tālummaiņu no mazāka ekrāna uz lielāku."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth savienojums ir izveidots."</string> @@ -835,9 +831,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Krātuve"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Padomi"</string> <string name="instant_apps" msgid="6647570248119804907">"Tūlītējās lietotnes"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Tūlītējām lietotnēm nav nepieciešama instalēšana."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"Lietotne <xliff:g id="APP">%1$s</xliff:g> darbojas"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"Lai atvērtu šo lietotni, tā nav jāinstalē."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"Lai atvērtu šo lietotni, tā nav jāinstalē. Pieskarieties, lai uzzinātu vairāk."</string> <string name="app_info" msgid="6856026610594615344">"Lietotnes informācija"</string> - <string name="go_to_web" msgid="2650669128861626071">"Atvērt pārlūku"</string> + <string name="go_to_web" msgid="1106022723459948514">"Pāriet uz tīmekli"</string> <string name="mobile_data" msgid="7094582042819250762">"Mobilie dati"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi ir izslēgts"</string> diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml index e29e649524c7..8b4b4584bab7 100644 --- a/packages/SystemUI/res/values-mk/strings.xml +++ b/packages/SystemUI/res/values-mk/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"отвори камера"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Изберете нов распоред на задача"</string> <string name="cancel" msgid="6442560571259935130">"Откажи"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Област за пораки за помош"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Потврди"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Допрете го сензорот за отпечатоци"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Икона за отпечатоци"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Ве бараме вас…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Икона за лице"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Копче за компатибилност на зум."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Зумот е помал на поголем екран."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth е поврзан."</string> @@ -829,9 +825,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Капацитет"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Совети"</string> <string name="instant_apps" msgid="6647570248119804907">"Инстант апликации"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Инстант апликациите нема потреба да се инсталираат."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"Се извршува <xliff:g id="APP">%1$s</xliff:g>"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"Апликацијата беше отворена без да се инсталира."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"Апликацијата беше отворена без да се инсталира. Допрете за да дознаете повеќе."</string> <string name="app_info" msgid="6856026610594615344">"Информации за апликација"</string> - <string name="go_to_web" msgid="2650669128861626071">"Одете на прелистувач"</string> + <string name="go_to_web" msgid="1106022723459948514">"Одете на интернет"</string> <string name="mobile_data" msgid="7094582042819250762">"Мобилен интернет"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> - <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi е исклучено"</string> diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index 8d4ce0a45a47..fc32b88d2f15 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"ക്യാമറ തുറക്കുക"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"പുതിയ ടാസ്ക് ലേഔട്ട് തിരഞ്ഞെടുക്കുക"</string> <string name="cancel" msgid="6442560571259935130">"റദ്ദാക്കുക"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"സഹായ സന്ദേശ ഏരിയ"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"സ്ഥിരീകരിക്കുക"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"വിരലടയാള സെൻസർ സ്പർശിക്കുക"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"വിരലടയാള ഐക്കൺ"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"നിങ്ങൾക്കായി തിരയുന്നു…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"മുഖത്തിന്റെ ഐക്കൺ"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"അനുയോജ്യതാ സൂം ബട്ടൺ."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"ചെറുതിൽ നിന്ന് വലിയ സ്ക്രീനിലേക്ക് സൂം ചെയ്യുക."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"ബ്ലൂടൂത്ത് കണക്റ്റുചെയ്തു."</string> @@ -829,9 +825,14 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"സ്റ്റോറേജ്"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"സൂചനകൾ"</string> <string name="instant_apps" msgid="6647570248119804907">"ഇൻസ്റ്റന്റ് ആപ്പ്"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"ഇൻസ്റ്റന്റ് ആപ്പിന് ഇൻസ്റ്റലേഷൻ ആവശ്യമില്ല."</string> + <!-- no translation found for instant_apps_title (8738419517367449783) --> + <skip /> + <!-- no translation found for instant_apps_message (1183313016396018086) --> + <skip /> + <!-- no translation found for instant_apps_message_with_help (6179830437630729747) --> + <skip /> <string name="app_info" msgid="6856026610594615344">"ആപ്പ് വിവരം"</string> - <string name="go_to_web" msgid="2650669128861626071">"ബ്രൗസറിലേക്ക് പോവുക"</string> + <string name="go_to_web" msgid="1106022723459948514">"വെബിൽ പോവുക"</string> <string name="mobile_data" msgid="7094582042819250762">"മൊബൈൽ ഡാറ്റ"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"വൈഫൈ ഓഫാണ്"</string> diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml index 421c6d81cc3e..331e9b78913a 100644 --- a/packages/SystemUI/res/values-mn/strings.xml +++ b/packages/SystemUI/res/values-mn/strings.xml @@ -101,16 +101,12 @@ <string name="camera_label" msgid="7261107956054836961">"камер нээх"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Шинэ ажиллах талбарыг сонгоно уу"</string> <string name="cancel" msgid="6442560571259935130">"Цуцлах"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Тусламжийн зурвасын хэсэг"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Баталгаажуулах"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Хурууны хээ мэдрэгчид хүрэх"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Хурууны хээний дүрс тэмдэг"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Таныг хайж байна…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Царайны дүрс тэмдэг"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Тохиромжтой өсгөх товч."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Жижгээс том дэлгэцрүү өсгөх."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth холбогдсон."</string> @@ -827,9 +823,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Хадгалах сан"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Заавар"</string> <string name="instant_apps" msgid="6647570248119804907">"Шуурхай апп"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Шуурхай аппыг суулгах шаардлагагүй."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g>-г ажиллуулж байна"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"Аппыг суулгахгүйгээр нээсэн."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"Аппыг суулгахгүйгээр нээсэн. Нэмэлт мэдээлэл авахын тулд товшино уу."</string> <string name="app_info" msgid="6856026610594615344">"Апп-н мэдээлэл"</string> - <string name="go_to_web" msgid="2650669128861626071">"Хөтчид очих"</string> + <string name="go_to_web" msgid="1106022723459948514">"Вэбэд очих"</string> <string name="mobile_data" msgid="7094582042819250762">"Мобайл дата"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi унтраалттай байна"</string> diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index 589ac527cc5d..33761caaaa75 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"कॅमेरा उघडा"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"नवीन कार्य लेआउट निवडा"</string> <string name="cancel" msgid="6442560571259935130">"रद्द करा"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"मदत मेसेज परिसर"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"खात्री करा"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"फिंगरप्रिंट सेन्सरला स्पर्श करा"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"फिंगरप्रिंट आयकन"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"तुमच्यासाठी शोधत आहे…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"चेहरा आयकन"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"सुसंगतता झूम बटण."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"लहानपासून मोठ्या स्क्रीनवर झूम करा."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"ब्लूटूथ कनेक्ट केले."</string> @@ -829,9 +825,14 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"स्टोरेज"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"सूचना"</string> <string name="instant_apps" msgid="6647570248119804907">"इन्सटंट अॅप्स"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"इन्सटंट अॅप्सना स्थापनेची आवश्यकता नसते."</string> + <!-- no translation found for instant_apps_title (8738419517367449783) --> + <skip /> + <!-- no translation found for instant_apps_message (1183313016396018086) --> + <skip /> + <!-- no translation found for instant_apps_message_with_help (6179830437630729747) --> + <skip /> <string name="app_info" msgid="6856026610594615344">"अॅप माहिती"</string> - <string name="go_to_web" msgid="2650669128861626071">"ब्राउझरवर जा"</string> + <string name="go_to_web" msgid="1106022723459948514">"वेबवर जा"</string> <string name="mobile_data" msgid="7094582042819250762">"मोबाइल डेटा"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"वाय-फाय बंद आहे"</string> diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index f13a8649af4d..d6a71ef92706 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"buka kamera"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Pilih reka letak tugas baharu"</string> <string name="cancel" msgid="6442560571259935130">"Batal"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Bahagian mesej bantuan"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Sahkan"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Sentuh penderia cap jari"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikon cap jari"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Mencari anda…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Ikon wajah"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Butang zum keserasian."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Skrin zum lebih kecil kepada lebih besar."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth disambungkan."</string> @@ -829,9 +825,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Storan"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Pembayang"</string> <string name="instant_apps" msgid="6647570248119804907">"Apl Segera"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Apl segera tidak memerlukan pemasangan."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> sedang berjalan"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"Apl dibuka tanpa dipasang."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"Apl dibuka tanpa dipasang. Ketik untuk mengetahui lebih lanjut."</string> <string name="app_info" msgid="6856026610594615344">"Maklumat apl"</string> - <string name="go_to_web" msgid="2650669128861626071">"Pergi ke penyemak imbas"</string> + <string name="go_to_web" msgid="1106022723459948514">"Pergi ke web"</string> <string name="mobile_data" msgid="7094582042819250762">"Data mudah alih"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi dimatikan"</string> diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml index b9f4cc736bfb..2a6e3c25e97b 100644 --- a/packages/SystemUI/res/values-my/strings.xml +++ b/packages/SystemUI/res/values-my/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"ကင်မရာ ဖွင့်ရန်"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"အလုပ်သစ်စီစဥ်မှုကို ရွေးပါ။"</string> <string name="cancel" msgid="6442560571259935130">"မလုပ်တော့"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"အကူအညီမက်ဆေ့ဂျ် နေရာ"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"အတည်ပြုပါ"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"လက်ဗွေအာရုံခံကိရိယာကို တို့ပါ"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"လက်ဗွေ သင်္ကေတ"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"သင့်ကို ရှာဖွေနေသည်…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"မျက်နှာသင်္ကေတ"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"အံဝင်ခွင်ကျ ဇူးမ်ခလုတ်"</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"ဖန်သားပြင်ပေါ်တွင် အသေးမှအကြီးသို့ ဇူးမ်ဆွဲခြင်း"</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"ဘလူးတုသ်ချိတ်ဆက်ထားမှု"</string> @@ -829,9 +825,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"သိုလှောင်မှုများ"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"အရိပ်အမြွက်များ"</string> <string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"ချက်ခြင်းသုံးအက်ပ်များကို ထည့်သွင်းစရာမလိုပါ။"</string> + <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> လုပ်ဆောင်နေသည်"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"အက်ပ်ကိုမထည့်သွင်းဘဲ ဖွင့်ထားသည်။"</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"အက်ပ်ကိုမထည့်သွင်းဘဲ ဖွင့်ထားသည်။ ပိုမိုလေ့လာရန် တို့ပါ။"</string> <string name="app_info" msgid="6856026610594615344">"အက်ပ်အချက်အလက်"</string> - <string name="go_to_web" msgid="2650669128861626071">"ဘရောင်ဇာသို့ သွားပါ"</string> + <string name="go_to_web" msgid="1106022723459948514">"ဝဘ်သို့ သွားရန်"</string> <string name="mobile_data" msgid="7094582042819250762">"မိုဘိုင်းဒေတာ"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> —<xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi ကို ပိတ်ထားသည်"</string> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index cb070e6e0dc0..d90eba3f2b9d 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"åpne kamera"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Velg en ny utforming for oppgaver"</string> <string name="cancel" msgid="6442560571259935130">"Avbryt"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Område for hjelpemelding"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Bekreft"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Trykk på fingeravtrykkssensoren"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikon for fingeravtrykk"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Ser etter deg …"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Ansiktikon"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Zoomknapp for kompatibilitet."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zoom fra mindre til større skjerm."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth er tilkoblet."</string> @@ -829,9 +825,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Lagring"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Hint"</string> <string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Du trenger ikke å installere instant-apper."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> kjører"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"Appen ble åpnet uten at den ble installert."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"Appen ble åpnet uten at den ble installert. Trykk for å finne ut mer."</string> <string name="app_info" msgid="6856026610594615344">"Info om appen"</string> - <string name="go_to_web" msgid="2650669128861626071">"Gå til nettleser"</string> + <string name="go_to_web" msgid="1106022723459948514">"Gå til nettstedet"</string> <string name="mobile_data" msgid="7094582042819250762">"Mobildata"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> – <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi er av"</string> diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index d922e717e63c..4e3cdddee65f 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"क्यामेरा खोल्नुहोस्"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"नयाँ कार्य लेआउट चयन गर्नुहोस्"</string> <string name="cancel" msgid="6442560571259935130">"रद्द गर्नुहोस्"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"मद्दतसम्बन्धी सन्देशको क्षेत्र"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"पुष्टि गर्नुहोस्"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"फिंगरप्रिन्ट सेन्सरमा छुनुहोस्"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"फिंगरप्रिन्ट जनाउने आइकन"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"तपाईंलाई खोज्दै…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"अनुहारको आइकन"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"मिलाउने जुम बटन।"</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"स्क्रिनलाई सानोबाट ठूलो पार्नुहोस्।"</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"ब्लुटुथ जडान भयो।"</string> @@ -829,9 +825,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"भण्डारण"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"सङ्केतहरू"</string> <string name="instant_apps" msgid="6647570248119804907">"तात्कालिक अनुप्रयोगहरू"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"तात्कालिक अनुप्रयोगहरूलाई स्थापना गर्नु पर्दैन|"</string> + <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> चलिरहेको छ"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"स्थापना नगरिकनै अनुप्रयोग खोलियो।"</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"स्थापना नगरिकनै अनुप्रयोग खोलियो। थप जान्न ट्याप गर्नुहोस्।"</string> <string name="app_info" msgid="6856026610594615344">"अनुप्रयोगका बारे जानकारी"</string> - <string name="go_to_web" msgid="2650669128861626071">"ब्राउजरमा जानुहोस्"</string> + <string name="go_to_web" msgid="1106022723459948514">"वेबमा जानुहोस्"</string> <string name="mobile_data" msgid="7094582042819250762">"मोबाइल डेटा"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi‑Fi निष्क्रिय छ"</string> diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index 8bb229af7fd7..9dda44e7c6da 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"camera openen"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Nieuwe taakindeling selecteren"</string> <string name="cancel" msgid="6442560571259935130">"Annuleren"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Gebied voor Help-berichten"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Bevestigen"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Raak de vingerafdruksensor aan"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Vingerafdrukpictogram"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Jouw gezicht zoeken…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Gezichtspictogram"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Knop voor compatibiliteitszoom."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Kleiner scherm uitzoomen naar groter scherm."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth-verbinding ingesteld."</string> @@ -829,9 +825,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Opslag"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Hints"</string> <string name="instant_apps" msgid="6647570248119804907">"Instant-apps"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Instant-apps hoeven niet te worden geïnstalleerd."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> actief"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"App geopend zonder dat deze is geïnstalleerd."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"App geopend zonder dat deze is geïnstalleerd. Tik voor meer informatie."</string> <string name="app_info" msgid="6856026610594615344">"App-info"</string> - <string name="go_to_web" msgid="2650669128861626071">"Ga naar browser"</string> + <string name="go_to_web" msgid="1106022723459948514">"Ga naar internet"</string> <string name="mobile_data" msgid="7094582042819250762">"Mobiele data"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wifi is uitgeschakeld"</string> diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml index f961bde70fdb..91c62bbfd646 100644 --- a/packages/SystemUI/res/values-or/strings.xml +++ b/packages/SystemUI/res/values-or/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"କ୍ୟାମେରା ଖୋଲନ୍ତୁ"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"ନୂଆ ଟାସ୍କ ଲେଆଉଟ୍ ଚୟନ କରନ୍ତୁ"</string> <string name="cancel" msgid="6442560571259935130">"କ୍ୟାନ୍ସଲ୍ କରନ୍ତୁ"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"ସାହାଯ୍ୟ ମେସେଜ୍ କ୍ଷେତ୍ର"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"ନିଶ୍ଚିତ କରନ୍ତୁ"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"ଆଙ୍ଗୁଠି ଚିହ୍ନ ସେନସର୍କୁ ଛୁଅଁନ୍ତୁ"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ଆଙ୍ଗୁଠି ଚିହ୍ନ ଆଇକନ୍"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"ଆପଣଙ୍କୁ ଚିହ୍ନଟ କରୁଛି…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"ମୁହଁ ଆଇକନ୍"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"କମ୍ପାଟିବିଲିଟୀ ଜୁମ୍ ବଟନ୍।"</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"ଜୁମ୍ କରି ସ୍କ୍ରୀନ୍କୁ ଛୋଟରୁ ବଡ଼ କରନ୍ତୁ।"</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"ବ୍ଲୁ-ଟୂଥ୍ ସଂଯୋଗ କରାଯାଇଛି।"</string> @@ -829,9 +825,14 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"ଷ୍ଟୋରେଜ୍"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"ହିଣ୍ଟ"</string> <string name="instant_apps" msgid="6647570248119804907">"ଇନଷ୍ଟାଣ୍ଟ ଆପ୍"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"ଇନଷ୍ଟାଣ୍ଟ ଆପ୍ ଇନଷ୍ଟଲ୍ କରିବାର ଆବଶ୍ୟକତା ନାହିଁ"</string> + <!-- no translation found for instant_apps_title (8738419517367449783) --> + <skip /> + <!-- no translation found for instant_apps_message (1183313016396018086) --> + <skip /> + <!-- no translation found for instant_apps_message_with_help (6179830437630729747) --> + <skip /> <string name="app_info" msgid="6856026610594615344">"ଆପ୍ ସୂଚନା"</string> - <string name="go_to_web" msgid="2650669128861626071">"ବ୍ରାଉଜର୍କୁ ଯାଆନ୍ତୁ"</string> + <string name="go_to_web" msgid="1106022723459948514">"ୱେବକୁ ଯାଆନ୍ତୁ"</string> <string name="mobile_data" msgid="7094582042819250762">"ମୋବାଇଲ୍ ଡାଟା"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"ୱାଇ-ଫାଇ ଅଫ୍ ଅଛି"</string> diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index 44785fbe82d7..96fb641f50d8 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"ਕੈਮਰਾ ਖੋਲ੍ਹੋ"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"ਨਵਾਂ ਕੰਮ ਲੇਆਉਟ ਚੁਣੋ"</string> <string name="cancel" msgid="6442560571259935130">"ਰੱਦ ਕਰੋ"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"ਮਦਦ ਸੁਨੇਹਾ ਖੇਤਰ"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"ਪੁਸ਼ਟੀ ਕਰੋ"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਸੈਂਸਰ ਨੂੰ ਸਪੱਰਸ਼ ਕਰੋ"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਦਾ ਪ੍ਰਤੀਕ"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"ਤੁਹਾਡੀ ਪਛਾਣ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"ਚਿਹਰਾ ਪ੍ਰਤੀਕ"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"ਅਨੁਰੂਪਤਾ ਜ਼ੂਮ ਬਟਨ।"</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"ਵੱਡੀ ਸਕ੍ਰੀਨ ਤੇ ਛੋਟਾ ਜ਼ੂਮ ਕਰੋ।"</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth ਕਨੈਕਟ ਕੀਤੀ।"</string> @@ -829,9 +825,14 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"ਸਟੋਰੇਜ"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"ਸੰਕੇਤ"</string> <string name="instant_apps" msgid="6647570248119804907">"ਤਤਕਾਲ ਐਪਾਂ"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"ਤਤਕਾਲ ਐਪਾਂ ਨੂੰ ਸਥਾਪਨਾ ਦੀ ਲੋੜ ਨਹੀਂ ਹੈ।"</string> + <!-- no translation found for instant_apps_title (8738419517367449783) --> + <skip /> + <!-- no translation found for instant_apps_message (1183313016396018086) --> + <skip /> + <!-- no translation found for instant_apps_message_with_help (6179830437630729747) --> + <skip /> <string name="app_info" msgid="6856026610594615344">"ਐਪ ਜਾਣਕਾਰੀ"</string> - <string name="go_to_web" msgid="2650669128861626071">"ਬ੍ਰਾਊਜ਼ਰ \'ਤੇ ਜਾਓ"</string> + <string name="go_to_web" msgid="1106022723459948514">"ਵੈੱਬ \'ਤੇ ਜਾਓ"</string> <string name="mobile_data" msgid="7094582042819250762">"ਮੋਬਾਈਲ ਡਾਟਾ"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"ਵਾਈ-ਫਾਈ ਬੰਦ ਹੈ"</string> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index a79634e9d9e9..28d24bf80d94 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -105,16 +105,12 @@ <string name="camera_label" msgid="7261107956054836961">"otwórz aparat"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Wybierz nowy układ zadań"</string> <string name="cancel" msgid="6442560571259935130">"Anuluj"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Obszar komunikatu pomocy"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Potwierdź"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Dotknij czytnika linii papilarnych"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona odcisku palca"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Szukam Cię…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Ikona twarzy"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Przycisk powiększenia na potrzeby zgodności."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Powiększa mniejszy ekran do większego."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth połączony."</string> @@ -841,9 +837,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Pamięć wewnętrzna"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Wskazówki"</string> <string name="instant_apps" msgid="6647570248119804907">"Aplikacje błyskawiczne"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Aplikacji błyskawicznych nie trzeba instalować."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"Aplikacja <xliff:g id="APP">%1$s</xliff:g> działa"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"Aplikacja została otwarta bez zainstalowania."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"Aplikacja została otwarta bez zainstalowania. Kliknij, by dowiedzieć się więcej."</string> <string name="app_info" msgid="6856026610594615344">"O aplikacji"</string> - <string name="go_to_web" msgid="2650669128861626071">"Otwórz przeglądarkę"</string> + <string name="go_to_web" msgid="1106022723459948514">"Wejdź na stronę internetową"</string> <string name="mobile_data" msgid="7094582042819250762">"Komórkowa transmisja danych"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> – <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi jest wyłączone"</string> diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index 1897d09705e9..ab0f5f2f2477 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"abrir câmera"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Selecionar novo layout da tarefa"</string> <string name="cancel" msgid="6442560571259935130">"Cancelar"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Área da mensagem de ajuda"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirmar"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Toque no sensor de impressão digital"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ícone de impressão digital"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Procurando você…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Ícone facial"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Botão de zoom da compatibilidade."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Aumentar a tela com zoom."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth conectado."</string> @@ -831,9 +827,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Armazenamento"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Dicas"</string> <string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Os Instant Apps não requerem instalação."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> em execução"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"O app é aberto sem precisar ser instalado."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"O app é aberto sem precisar ser instalado. Toque para saber mais."</string> <string name="app_info" msgid="6856026610594615344">"Informações do app"</string> - <string name="go_to_web" msgid="2650669128861626071">"Abrir o navegador"</string> + <string name="go_to_web" msgid="1106022723459948514">"Acessar a Web"</string> <string name="mobile_data" msgid="7094582042819250762">"Dados móveis"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"O Wi-Fi está desativado"</string> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index 6d333b1290a3..fb0675afdefd 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"abrir câmara"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Selecionar novo esquema de tarefa"</string> <string name="cancel" msgid="6442560571259935130">"Cancelar"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Área da mensagem de ajuda"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirmar"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Toque no sensor de impressões digitais."</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ícone de impressão digital"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"À sua procura…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Ícone de rosto"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Botão zoom de compatibilidade."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zoom menor para ecrã maior."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth ligado."</string> @@ -829,9 +825,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Armazenamento"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Sugestões"</string> <string name="instant_apps" msgid="6647570248119804907">"Aplicações instantâneas"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"As Aplicações instantâneas não requerem instalação."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> em execução"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"A aplicação é aberta sem ser instalada."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"A aplicação é aberta sem ser instalada. Toque para saber mais."</string> <string name="app_info" msgid="6856026610594615344">"Info. da aplicação"</string> - <string name="go_to_web" msgid="2650669128861626071">"Ir para o navegador"</string> + <string name="go_to_web" msgid="1106022723459948514">"Aceder à Web"</string> <string name="mobile_data" msgid="7094582042819250762">"Dados móveis"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> – <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi desativado"</string> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index 1897d09705e9..ab0f5f2f2477 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"abrir câmera"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Selecionar novo layout da tarefa"</string> <string name="cancel" msgid="6442560571259935130">"Cancelar"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Área da mensagem de ajuda"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirmar"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Toque no sensor de impressão digital"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ícone de impressão digital"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Procurando você…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Ícone facial"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Botão de zoom da compatibilidade."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Aumentar a tela com zoom."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth conectado."</string> @@ -831,9 +827,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Armazenamento"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Dicas"</string> <string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Os Instant Apps não requerem instalação."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> em execução"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"O app é aberto sem precisar ser instalado."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"O app é aberto sem precisar ser instalado. Toque para saber mais."</string> <string name="app_info" msgid="6856026610594615344">"Informações do app"</string> - <string name="go_to_web" msgid="2650669128861626071">"Abrir o navegador"</string> + <string name="go_to_web" msgid="1106022723459948514">"Acessar a Web"</string> <string name="mobile_data" msgid="7094582042819250762">"Dados móveis"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"O Wi-Fi está desativado"</string> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index d174ee9b7eb5..9b5f5e13c5fa 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -104,16 +104,12 @@ <string name="camera_label" msgid="7261107956054836961">"deschideți camera foto"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Selectați noul aspect pentru activitate"</string> <string name="cancel" msgid="6442560571259935130">"Anulați"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Zona mesajelor de ajutor"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirmați"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Atingeți senzorul de amprente"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Pictograma amprentă"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Vă căutăm…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Pictograma chip"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Buton zoom pentru compatibilitate."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Faceți zoom de la o imagine mai mică la una mai mare."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Conectat prin Bluetooth."</string> @@ -837,9 +833,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Stocare"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Indicii"</string> <string name="instant_apps" msgid="6647570248119804907">"Aplicații instantanee"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Aplicațiile instantanee nu necesită instalare."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> rulează"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"Aplicația a fost deschisă fără a fi instalată."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"Aplicația a fost deschisă fără a fi instalată. Atingeți pentru a afla mai multe."</string> <string name="app_info" msgid="6856026610594615344">"Informații despre aplicație"</string> - <string name="go_to_web" msgid="2650669128861626071">"Accesați browserul"</string> + <string name="go_to_web" msgid="1106022723459948514">"Accesați pe web"</string> <string name="mobile_data" msgid="7094582042819250762">"Date mobile"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> – <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Conexiunea Wi-Fi este dezactivată"</string> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index 1d968e46ef51..8069317b3d99 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -105,16 +105,12 @@ <string name="camera_label" msgid="7261107956054836961">"Открыть камеру."</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Выберите другой макет"</string> <string name="cancel" msgid="6442560571259935130">"Отмена"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Справочное сообщение"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Подтвердить"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Прикоснитесь к сканеру отпечатков пальцев."</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Значок отпечатка пальца"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Поиск лица…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Значок лица"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Кнопка масштабирования (режим совместимости)"</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Уменьшение изображения для увеличения свободного места на экране."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth-соединение установлено."</string> @@ -843,9 +839,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Хранилище"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Подсказки"</string> <string name="instant_apps" msgid="6647570248119804907">"Приложения с мгновенным запуском"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Приложения с мгновенным запуском не требуется устанавливать."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> уже здесь!"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"Приложение готово к работе, установка не требуется."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"Приложение готово к работе, установка не требуется. Нажмите, чтобы узнать больше."</string> <string name="app_info" msgid="6856026610594615344">"О приложении"</string> - <string name="go_to_web" msgid="2650669128861626071">"Перейти в браузер"</string> + <string name="go_to_web" msgid="1106022723459948514">"Перейти в браузер"</string> <string name="mobile_data" msgid="7094582042819250762">"Моб. Интернет"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> – <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Модуль Wi-Fi отключен"</string> diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml index 6d3014c18fb7..8802833da72b 100644 --- a/packages/SystemUI/res/values-si/strings.xml +++ b/packages/SystemUI/res/values-si/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"කැමරාව විවෘත කරන්න"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"නව කාර්යය සැකැස්ම තෝරන්න"</string> <string name="cancel" msgid="6442560571259935130">"අවලංගු කරන්න"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"උදවු පණිවිඩ ප්රදේශය"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"තහවුරු කරන්න"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"ඇඟිලි සලකුණු සංවේදකය ස්පර්ශ කරන්න"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ඇඟිලි සලකුණු නිරූපකය"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"ඔබව සොයමින්…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"මුහුණ නිරූපකය"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"ගැළපෙන විශාලන බොත්තම."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"විශාල තිරය වෙත කුඩාව විශාලනය කරන්න."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"බ්ලූටූත් සම්බන්ධිතයි."</string> @@ -829,9 +825,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"ගබඩාව"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"ඉඟි"</string> <string name="instant_apps" msgid="6647570248119804907">"ක්ෂණික යෙදුම්"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"ක්ෂණික යෙදුම් ස්ථාපනය කිරීම අවශ්ය නොවේ."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> ධාවනය වෙමින්"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"ස්ථාපනය නොකර යෙදුම විවෘත කර ඇත."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"ස්ථාපනය නොකර යෙදුම විවෘත කර ඇත. තව දැන ගැනීමට තට්ටු කරන්න."</string> <string name="app_info" msgid="6856026610594615344">"යෙදුම් තොරතුරු"</string> - <string name="go_to_web" msgid="2650669128861626071">"බ්රවුසරය වෙත යන්න"</string> + <string name="go_to_web" msgid="1106022723459948514">"වෙබය වෙත යන්න"</string> <string name="mobile_data" msgid="7094582042819250762">"ජංගම දත්ත"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi ක්රියා විරහිතයි"</string> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index 835289605382..233a81b9c52f 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -105,16 +105,12 @@ <string name="camera_label" msgid="7261107956054836961">"spustiť fotoaparát"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Vyberte nové rozloženie úlohy"</string> <string name="cancel" msgid="6442560571259935130">"Zrušiť"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Oblasť správy pomocníka"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Potvrdiť"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Klepnite na senzor odtlačkov prstov"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona odtlačku prsta"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Hľadáme vás…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Ikona tváre"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Tlačidlo úpravy veľkosti z dôvodu kompatibility."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zväčšiť menší obrázok na väčšiu obrazovku."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth pripojené."</string> @@ -843,9 +839,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Úložisko"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Tipy"</string> <string name="instant_apps" msgid="6647570248119804907">"Okamžité aplikácie"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Okamžité aplikácie nevyžadujú inštaláciu."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"Aplikácia <xliff:g id="APP">%1$s</xliff:g> je spustená"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"Aplikácia bola otvorená bez inštalácie."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"Aplikácia bola otvorená bez inštalácie. Klepnutím zobrazíte ďalšie informácie."</string> <string name="app_info" msgid="6856026610594615344">"Info o aplikácii"</string> - <string name="go_to_web" msgid="2650669128861626071">"Otvoriť prehliadač"</string> + <string name="go_to_web" msgid="1106022723459948514">"Prejsť na internet"</string> <string name="mobile_data" msgid="7094582042819250762">"Mobilné dáta"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> – <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Pripojenie Wi‑Fi je vypnuté"</string> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index 2611f7a3d3db..c7e661a9213b 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -105,16 +105,12 @@ <string name="camera_label" msgid="7261107956054836961">"odpri fotoaparat"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Izberite novo postavitev opravil"</string> <string name="cancel" msgid="6442560571259935130">"Prekliči"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Območje sporočila pomoči"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Potrdite"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Dotaknite se tipala prstnih odtisov"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona prstnih odtisov"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Preverjanje vašega obraza …"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Ikona obraza"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Gumb povečave za združljivost."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Povečava manjšega na večji zaslon."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Povezava Bluetooth vzpostavljena."</string> @@ -843,9 +839,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Shramba"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Namigi"</string> <string name="instant_apps" msgid="6647570248119804907">"Nenamestljive aplikacije"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Nenamestljivih aplikacij ni treba namestiti."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"Aplikacija <xliff:g id="APP">%1$s</xliff:g> se izvaja"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"Aplikacija je odprta brez namestitve."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"Aplikacija je odprta brez namestitve. Dotaknite se, če želite izvedeti več."</string> <string name="app_info" msgid="6856026610594615344">"Podatki o aplikaciji"</string> - <string name="go_to_web" msgid="2650669128861626071">"Odpri brskalnik"</string> + <string name="go_to_web" msgid="1106022723459948514">"Pojdi v splet"</string> <string name="mobile_data" msgid="7094582042819250762">"Mobilni podatki"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> – <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi je izklopljen"</string> diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index e7b32545b644..f4d3d2a27f28 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"hap kamerën"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Zgjidh strukturën e re të detyrës"</string> <string name="cancel" msgid="6442560571259935130">"Anulo"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Zona e mesazhit të ndihmës"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Konfirmo"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Prek sensorin e gjurmës së gishtit"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona e gjurmës së gishtit"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Po të kërkojmë…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Ikona e fytyrës"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Butoni i zmadhimit të pajtueshmërisë."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zmadho nga një ekran i vogël në të madh."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Pajisja është lidhur me \"bluetooth\"."</string> @@ -829,9 +825,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Hapësira ruajtëse"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Sugjerimet"</string> <string name="instant_apps" msgid="6647570248119804907">"Aplikacionet e çastit"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Aplikacionet e çastit nuk kërkojnë instalim."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"Po ekzekutohet <xliff:g id="APP">%1$s</xliff:g>"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"Aplikacioni u hap pa u instaluar."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"Aplikacioni u hap pa u instaluar. Trokit për të mësuar më shumë."</string> <string name="app_info" msgid="6856026610594615344">"Informacioni mbi aplikacionin"</string> - <string name="go_to_web" msgid="2650669128861626071">"Shko te shfletuesi"</string> + <string name="go_to_web" msgid="1106022723459948514">"Shko në ueb"</string> <string name="mobile_data" msgid="7094582042819250762">"Të dhënat celulare"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> - <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi është joaktiv"</string> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index 323d78b1d2b7..58252315ad64 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -104,16 +104,12 @@ <string name="camera_label" msgid="7261107956054836961">"отвори камеру"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Изабери нови распоред задатака"</string> <string name="cancel" msgid="6442560571259935130">"Откажи"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Област поруке за помоћ"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Потврди"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Додирните сензор за отисак прста"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Икона отиска прста"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Тражимо вас…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Икона лица"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Дугме Зум компатибилности."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Зумирање са мањег на већи екран."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth је прикључен."</string> @@ -835,9 +831,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Меморијски простор"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Савети"</string> <string name="instant_apps" msgid="6647570248119804907">"Инстант апликације"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Инстант апликације не захтевају инсталацију."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"Апликација <xliff:g id="APP">%1$s</xliff:g> је покренута"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"Апликација се отворила без инсталирања."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"Апликација се отворила без инсталирања. Додирните да бисте сазнали више."</string> <string name="app_info" msgid="6856026610594615344">"Информације о апликацији"</string> - <string name="go_to_web" msgid="2650669128861626071">"Иди на прегледач"</string> + <string name="go_to_web" msgid="1106022723459948514">"Иди на веб"</string> <string name="mobile_data" msgid="7094582042819250762">"Мобилни подаци"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> – <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi је искључен"</string> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index 97e0278577c0..7040ec2e30f0 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"öppna kameran"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Välj en ny layout för uppgiften"</string> <string name="cancel" msgid="6442560571259935130">"Avbryt"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Område för hjälpmeddelande"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Bekräfta"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Tryck på fingeravtryckssensorn"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikon för fingeravtryck"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Håller utkik efter dig …"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Ansiktsikon"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Knapp för kompatibilitetszoom."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zooma mindre skärm till större."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth ansluten."</string> @@ -829,9 +825,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Lagring"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Tips"</string> <string name="instant_apps" msgid="6647570248119804907">"Snabbappar"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Snabbappar behöver inte installeras."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> körs"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"Appen öppnades utan installation."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"Appen öppnades utan installation. Tryck om du vill veta mer."</string> <string name="app_info" msgid="6856026610594615344">"Info om appen"</string> - <string name="go_to_web" msgid="2650669128861626071">"Öppna webbläsaren"</string> + <string name="go_to_web" msgid="1106022723459948514">"Öppna webbplatsen"</string> <string name="mobile_data" msgid="7094582042819250762">"Mobildata"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi är inaktiverat"</string> diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index 1419dcee2507..0633e8ad428f 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"fungua kamera"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Chagua muundo mpya wa kazi"</string> <string name="cancel" msgid="6442560571259935130">"Ghairi"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Sehemu ya ujumbe wa usaidizi"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Thibitisha"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Gusa kitambua alama ya kidole"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Aikoni ya alama ya kidole"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Inakutafuta…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Aikoni ya uso"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Kichupo cha kukuza kwa utangamanifu"</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Kuza kidogo kwa skrini kubwa."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth imeunganishwa."</string> @@ -829,9 +825,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Hifadhi"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Vidokezo"</string> <string name="instant_apps" msgid="6647570248119804907">"Programu Zinazofunguka Papo Hapo"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Huhitaji kusakinisha programu zinazofunguka papo hapo."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> inaendelea kutumika"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"Programu inafunguka bila kusakinishwa."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"Programu inafunguka bila kusakinishwa. Gusa ili upate maelezo zaidi."</string> <string name="app_info" msgid="6856026610594615344">"Maelezo ya programu"</string> - <string name="go_to_web" msgid="2650669128861626071">"Tumia kivinjari"</string> + <string name="go_to_web" msgid="1106022723459948514">"Nenda kwenye wavuti"</string> <string name="mobile_data" msgid="7094582042819250762">"Data ya simu"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g><xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi imezimwa"</string> diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index ba75212f8bdd..469e797c7113 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"கேமராவைத் திற"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"புதிய பணி தளவமைப்பைத் தேர்ந்தெடுக்கவும்"</string> <string name="cancel" msgid="6442560571259935130">"ரத்துசெய்"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"உதவிச் செய்திக்கான பகுதி"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"உறுதிப்படுத்துக"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"கைரேகை உணர்வியைத் தொடவும்"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"கைரேகை ஐகான்"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"உங்கள் முகத்தைத் தேடுகிறது…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"முக ஐகான்"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"பொருந்துமாறு அளவை மாற்றும் பொத்தான்."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"சிறியதிலிருந்து பெரிய திரைக்கு அளவை மாற்றும்."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"புளூடூத் இணைக்கப்பட்டது."</string> @@ -829,9 +825,14 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"சேமிப்பிடம்"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"குறிப்புகள்"</string> <string name="instant_apps" msgid="6647570248119804907">"இன்ஸ்டண்ட் ஆப்ஸ்"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"இன்ஸ்டண்ட் பயன்பாடுகளுக்கு நிறுவல் தேவையில்லை."</string> + <!-- no translation found for instant_apps_title (8738419517367449783) --> + <skip /> + <!-- no translation found for instant_apps_message (1183313016396018086) --> + <skip /> + <!-- no translation found for instant_apps_message_with_help (6179830437630729747) --> + <skip /> <string name="app_info" msgid="6856026610594615344">"பயன்பாட்டுத் தகவல்"</string> - <string name="go_to_web" msgid="2650669128861626071">"உலாவிக்குச் செல்"</string> + <string name="go_to_web" msgid="1106022723459948514">"இணையத்திற்குச் செல்"</string> <string name="mobile_data" msgid="7094582042819250762">"மொபைல் டேட்டா"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"வைஃபை முடக்கத்தில் உள்ளது"</string> diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index 268ad189b8f8..5d869f130a2c 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"కెమెరాను తెరువు"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"కొత్త విధి లేఅవుట్ను ఎంచుకోండి"</string> <string name="cancel" msgid="6442560571259935130">"రద్దు చేయి"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"సహాయ సందేశ ప్రాంతం"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"నిర్ధారించు"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"వేలిముద్ర సెన్సార్ను తాకండి"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"వేలిముద్ర చిహ్నం"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"మీ కోసం చూస్తోంది…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"ముఖ చిహ్నం"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"అనుకూలత జూమ్ బటన్."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"చిన్న స్క్రీన్ నుండి పెద్దదానికి జూమ్ చేయండి."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"బ్లూటూత్ కనెక్ట్ చేయబడింది."</string> @@ -829,9 +825,14 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"నిల్వ"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"సూచనలు"</string> <string name="instant_apps" msgid="6647570248119804907">"తక్షణ యాప్లు"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"తక్షణ అనువర్తనాలకు ఇన్స్టాలేషన్ అవసరం లేదు."</string> + <!-- no translation found for instant_apps_title (8738419517367449783) --> + <skip /> + <!-- no translation found for instant_apps_message (1183313016396018086) --> + <skip /> + <!-- no translation found for instant_apps_message_with_help (6179830437630729747) --> + <skip /> <string name="app_info" msgid="6856026610594615344">"యాప్ సమాచారం"</string> - <string name="go_to_web" msgid="2650669128861626071">"బ్రౌజర్కు వెళ్లండి"</string> + <string name="go_to_web" msgid="1106022723459948514">"వెబ్కు వెళ్లు"</string> <string name="mobile_data" msgid="7094582042819250762">"మొబైల్ డేటా"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi ఆఫ్లో ఉంది"</string> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index dea18e5ea332..408c5a0fe944 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"เปิดกล้อง"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"เลือกรูปแบบงานใหม่"</string> <string name="cancel" msgid="6442560571259935130">"ยกเลิก"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"พื้นที่ข้อความช่วยเหลือ"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"ยืนยัน"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"แตะเซ็นเซอร์ลายนิ้วมือ"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ไอคอนลายนิ้วมือ"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"กำลังหาใบหน้าคุณ…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"ไอคอนใบหน้า"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"ปุ่มซูมที่ใช้งานร่วมกันได้"</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"ซูมหน้าจอให้มีขนาดใหญ่ขึ้น"</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"เชื่อมต่อบลูทูธแล้ว"</string> @@ -829,9 +825,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"พื้นที่เก็บข้อมูล"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"คำแนะนำ"</string> <string name="instant_apps" msgid="6647570248119804907">"Instant App"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Instant Apps ไม่ต้องใช้การติดตั้ง"</string> + <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> ทำงานอยู่"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"เปิดแอปได้โดยไม่ต้องติดตั้ง"</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"เปิดแอปได้โดยไม่ต้องติดตั้ง แตะเพื่อดูข้อมูลเพิ่มเติม"</string> <string name="app_info" msgid="6856026610594615344">"ข้อมูลแอป"</string> - <string name="go_to_web" msgid="2650669128861626071">"ไปที่เบราว์เซอร์"</string> + <string name="go_to_web" msgid="1106022723459948514">"ไปที่เว็บ"</string> <string name="mobile_data" msgid="7094582042819250762">"เน็ตมือถือ"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi ปิดอยู่"</string> diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index 11e07a0bb607..8da4946f1090 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"buksan ang camera"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Pumili ng bagong layout ng gawain"</string> <string name="cancel" msgid="6442560571259935130">"Kanselahin"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Lugar ng mensahe ng tulong"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Kumpirmahin"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Pindutin ang fingerprint sensor"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icon ng fingerprint"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Hinahanap ka…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Face icon"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Button ng zoom ng pagiging tugma."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Mag-zoom nang mas maliit sa mas malaking screen."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Nakakonekta ang Bluetooth."</string> @@ -829,9 +825,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Storage"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Mga Hint"</string> <string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Hindi kailangang i-install ang mga instant na app."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"Tumatakbo ang <xliff:g id="APP">%1$s</xliff:g>"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"Nabuksan ang app nang hindi ini-install."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"Nabuksan ang app nang hindi ini-install. I-tap para matuto pa."</string> <string name="app_info" msgid="6856026610594615344">"Impormasyon ng app"</string> - <string name="go_to_web" msgid="2650669128861626071">"Pumunta sa browser"</string> + <string name="go_to_web" msgid="1106022723459948514">"Pumunta sa web"</string> <string name="mobile_data" msgid="7094582042819250762">"Mobile data"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Naka-off ang Wi-Fi"</string> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index bda7fefb1f50..de8ed9d02c8a 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"kamerayı aç"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Yeni görev düzenini seçin"</string> <string name="cancel" msgid="6442560571259935130">"İptal"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Yardım mesajı alanı"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Onaylayın"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Parmak izi sensörüne dokunun"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Parmak izi simgesi"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Yüzünüz tanınmaya çalışılıyor…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Yüz simgesi"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Uyumluluk zum düğmesi."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Daha büyük ekrana daha küçük yakınlaştır."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth bağlandı."</string> @@ -829,9 +825,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Depolama alanı"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"İpuçları"</string> <string name="instant_apps" msgid="6647570248119804907">"Hazır Uygulamalar"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Hazır uygulamaların yüklenmesi gerekmez."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> çalışıyor"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"Uygulama yüklenmeden açıldı."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"Uygulama yüklenmeden açıldı. Daha fazla bilgi için dokunun."</string> <string name="app_info" msgid="6856026610594615344">"Uygulama bilgileri"</string> - <string name="go_to_web" msgid="2650669128861626071">"Tarayıcıya git"</string> + <string name="go_to_web" msgid="1106022723459948514">"Web\'e git"</string> <string name="mobile_data" msgid="7094582042819250762">"Mobil veriler"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Kablosuz bağlantı kapalı"</string> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index ce3572eef7a3..6c2e66171f60 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -105,16 +105,12 @@ <string name="camera_label" msgid="7261107956054836961">"відкрити камеру"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Виберіть новий макет завдання"</string> <string name="cancel" msgid="6442560571259935130">"Скасувати"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Область довідкового повідомлення"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Підтвердити"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Торкніться сканера відбитків пальців"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Значок відбитка пальця"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Пошук обличчя…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Значок обличчя"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Кнопка масштабування сумісності."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Збільшення екрана."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth під’єднано."</string> @@ -843,9 +839,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Пам’ять"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Поради"</string> <string name="instant_apps" msgid="6647570248119804907">"Додатки з миттєвим запуском"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Додатки з миттєвим запуском не потрібно встановлювати."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> працює"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"Додаток відкрито без встановлення."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"Додаток відкрито без встановлення. Торкніться, щоб дізнатися більше."</string> <string name="app_info" msgid="6856026610594615344">"Про додаток"</string> - <string name="go_to_web" msgid="2650669128861626071">"Веб-переглядач"</string> + <string name="go_to_web" msgid="1106022723459948514">"Перейти на веб-сайт"</string> <string name="mobile_data" msgid="7094582042819250762">"Мобільний трафік"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> – <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi вимкнено"</string> diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml index 50412d298b04..88391b0602d2 100644 --- a/packages/SystemUI/res/values-ur/strings.xml +++ b/packages/SystemUI/res/values-ur/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"کیمرا کھولیں"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"نئے کام کا لے آؤٹ منتخب کریں"</string> <string name="cancel" msgid="6442560571259935130">"منسوخ کریں"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"امدادی پیغام کا علاقہ"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"تصدیق کریں"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"فنگر پرنٹ سینسر پر ٹچ کریں"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"فنگر پرنٹ آئیکن"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"آپ کے لیے تلاش کیا جا رہا ہے…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"چہرے کا آئیکن"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"مطابقت پذیری زوم بٹن۔"</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"چھوٹی سے بڑی اسکرین پر زوم کریں۔"</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"بلوٹوتھ مربوط ہے۔"</string> @@ -829,9 +825,14 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"اسٹوریج"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"اشارات"</string> <string name="instant_apps" msgid="6647570248119804907">"فوری ایپس"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"فوری ایپس کو انسٹالیشن کی ضرورت نہیں ہے۔"</string> + <!-- no translation found for instant_apps_title (8738419517367449783) --> + <skip /> + <!-- no translation found for instant_apps_message (1183313016396018086) --> + <skip /> + <!-- no translation found for instant_apps_message_with_help (6179830437630729747) --> + <skip /> <string name="app_info" msgid="6856026610594615344">"ایپ کی معلومات"</string> - <string name="go_to_web" msgid="2650669128861626071">"براؤزر پر جائیں"</string> + <string name="go_to_web" msgid="1106022723459948514">"ویب پر جائیں"</string> <string name="mobile_data" msgid="7094582042819250762">"موبائل ڈیٹا"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi آف ہے"</string> diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml index 9446ac1b38d2..37d31c2f20a1 100644 --- a/packages/SystemUI/res/values-uz/strings.xml +++ b/packages/SystemUI/res/values-uz/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"kamerani ochish"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Yangi vazifa tartibini tanlash"</string> <string name="cancel" msgid="6442560571259935130">"Bekor qilish"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Yordam xabari"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"OK"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Barmoq izi skaneriga tegining"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Barmoq izi belgisi"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Yuzingiz tekshirilmoqda…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Yuz belgisi"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Kattalashtirish tugmasi mosligi."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Kattaroq ekran uchun kichikroqni kattalashtirish."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth ulandi."</string> @@ -831,9 +827,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Xotira"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Maslahatlar"</string> <string name="instant_apps" msgid="6647570248119804907">"Darhol ochiladigan ilovalar"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Darhol ochiladigan ilovalarni o‘rnatish shart emas."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> ishlamoqda"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"Ilova o‘rnatilmasdan ochildi."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"Ilova o‘rnatilmasdan ochildi. Batafsil axborot oolish uchun bu yerga bosing."</string> <string name="app_info" msgid="6856026610594615344">"Ilova haqida"</string> - <string name="go_to_web" msgid="2650669128861626071">"Brauzerni ochish"</string> + <string name="go_to_web" msgid="1106022723459948514">"Brauzerga o‘tish"</string> <string name="mobile_data" msgid="7094582042819250762">"Mobil internet"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> – <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi o‘chiq"</string> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index c2045afe24cf..f476790795f8 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"mở máy ảnh"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Chọn bố cục tác vụ mới"</string> <string name="cancel" msgid="6442560571259935130">"Hủy"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Vùng thông báo trợ giúp"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Xác nhận"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Chạm vào cảm biến vân tay"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Biểu tượng vân tay"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Đang tìm kiếm bạn…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Biểu tượng khuôn mặt"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Nút thu phóng khả năng tương thích."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Thu phóng màn hình lớn hơn hoặc nhỏ hơn."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Đã kết nối bluetooth."</string> @@ -829,9 +825,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Bộ nhớ"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Gợi ý"</string> <string name="instant_apps" msgid="6647570248119804907">"Ứng dụng tức thì"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Ứng dụng tức thì không yêu cầu cài đặt."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> đang chạy"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"Ứng dụng được mở mà không cần cài đặt."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"Ứng dụng được mở mà không cần cài đặt. Nhấn để tìm hiểu thêm."</string> <string name="app_info" msgid="6856026610594615344">"Thông tin ứng dụng"</string> - <string name="go_to_web" msgid="2650669128861626071">"Đi tới trình duyệt"</string> + <string name="go_to_web" msgid="1106022723459948514">"Truy cập web"</string> <string name="mobile_data" msgid="7094582042819250762">"Dữ liệu di động"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi tắt"</string> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index bc13033a49ed..aaa4c6359361 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"打开相机"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"选择新的任务布局"</string> <string name="cancel" msgid="6442560571259935130">"取消"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"帮助消息区域"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"确认"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"请触摸指纹传感器"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"指纹图标"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"正在查找中…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"面孔图标"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"兼容性缩放按钮。"</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"将小屏幕的图片放大在较大屏幕上显示。"</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"蓝牙已连接。"</string> @@ -829,9 +825,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"存储空间"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"提示"</string> <string name="instant_apps" msgid="6647570248119804907">"免安装应用"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"免安装应用无需安装就能使用。"</string> + <string name="instant_apps_title" msgid="8738419517367449783">"正在运行<xliff:g id="APP">%1$s</xliff:g>"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"已打开免安装应用。"</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"已打开免安装应用。点按即可了解详情。"</string> <string name="app_info" msgid="6856026610594615344">"应用信息"</string> - <string name="go_to_web" msgid="2650669128861626071">"转到浏览器"</string> + <string name="go_to_web" msgid="1106022723459948514">"转到网页版"</string> <string name="mobile_data" msgid="7094582042819250762">"移动数据"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> - <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"WLAN 已关闭"</string> diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index ff045b191dfa..aad4b4fe6edb 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"開啟相機"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"選取新的工作版面配置"</string> <string name="cancel" msgid="6442560571259935130">"取消"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"說明訊息區域"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"確認"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"請輕觸指紋感應器"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"指紋圖示"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"正在搜尋您的臉孔…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"面孔圖示"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"相容性縮放按鈕。"</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"將較小螢幕的畫面放大在較大螢幕上顯示。"</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"藍牙連線已建立。"</string> @@ -831,9 +827,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"儲存空間"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"提示"</string> <string name="instant_apps" msgid="6647570248119804907">"即時應用程式"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"即時應用程式無需安裝即可使用。"</string> + <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> 運作中"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"已開啟免安裝應用程式。"</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"已開啟免安裝應用程式。輕按即可瞭解詳情。"</string> <string name="app_info" msgid="6856026610594615344">"應用程式資料"</string> - <string name="go_to_web" msgid="2650669128861626071">"前往瀏覽器"</string> + <string name="go_to_web" msgid="1106022723459948514">"前往網頁版"</string> <string name="mobile_data" msgid="7094582042819250762">"流動數據"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> - <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi 已關閉"</string> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index 143bf914d60b..6b885455766c 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"開啟攝影機"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"選取新工作版面配置"</string> <string name="cancel" msgid="6442560571259935130">"取消"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"說明訊息區域"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"確認"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"請輕觸指紋感應器"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"指紋圖示"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"正在尋找你的臉孔…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"臉孔圖示"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"相容性縮放按鈕。"</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"將較小螢幕的畫面放大在較大螢幕上顯示。"</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"藍牙連線已建立。"</string> @@ -829,9 +825,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"儲存空間"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"提示"</string> <string name="instant_apps" msgid="6647570248119804907">"免安裝應用程式"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"免安裝應用程式不必安裝就能使用。"</string> + <string name="instant_apps_title" msgid="8738419517367449783">"正在執行「<xliff:g id="APP">%1$s</xliff:g>」"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"已開啟免安裝應用程式。"</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"已開啟免安裝應用程式。輕觸即可瞭解詳情。"</string> <string name="app_info" msgid="6856026610594615344">"應用程式資訊"</string> - <string name="go_to_web" msgid="2650669128861626071">"前往瀏覽器"</string> + <string name="go_to_web" msgid="1106022723459948514">"前往網頁版"</string> <string name="mobile_data" msgid="7094582042819250762">"行動數據"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> - <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi 已關閉"</string> diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index 89030b70c3aa..085c3b330a6b 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -103,16 +103,12 @@ <string name="camera_label" msgid="7261107956054836961">"vula ikhamera"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Khetha isakhiwo somsebenzi omusha"</string> <string name="cancel" msgid="6442560571259935130">"Khansela"</string> - <!-- no translation found for accessibility_biometric_dialog_help_area (8953787076940186847) --> - <skip /> - <!-- no translation found for biometric_dialog_confirm (6468457350041712674) --> - <skip /> + <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Indawo yosizo lomlayezo"</string> + <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Qinisekisa"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Thinta inzwa yesigxivizo somunwe"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Isithonjana sezigxivizo zeminwe"</string> - <!-- no translation found for face_dialog_looking_for_face (7049276266074494689) --> - <skip /> - <!-- no translation found for accessibility_face_dialog_face_icon (2658119009870383490) --> - <skip /> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Kufunwa wena…"</string> + <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Isithonjana sobuso"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Inkinobho evumelekile yokusondeza"</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Sondeza kancane esikrinini esikhudlwana"</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth ixhunyiwe"</string> @@ -829,9 +825,11 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Isitoreji"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Ukubonisa"</string> <string name="instant_apps" msgid="6647570248119804907">"Izinhlelo zokusebenza ezisheshayo"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"Izinhlelo zokusebenza ezisheshayo azidingi ukufakwa."</string> + <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> esebenzayo"</string> + <string name="instant_apps_message" msgid="1183313016396018086">"Uhlelo lokusebenza luvulwe ngaphndle kokufakwa."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"Uhlelo lokusebenza luvulwe ngaphandle kokufakwa. Thepha ukuze ufunde kabanzi."</string> <string name="app_info" msgid="6856026610594615344">"Ulwazi lohlelo lokusebenza"</string> - <string name="go_to_web" msgid="2650669128861626071">"Iya kusiphequluli"</string> + <string name="go_to_web" msgid="1106022723459948514">"Iya kuwebhu"</string> <string name="mobile_data" msgid="7094582042819250762">"Idatha yeselula"</string> <string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="1838559392210456893">"I-Wi-Fi ivaliwe"</string> diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java index b04d04717be5..c7910f97675e 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java @@ -342,6 +342,20 @@ public class ActivityManagerWrapper { } /** + * Moves an already resumed task to the side of the screen to initiate split screen. + */ + public boolean setTaskWindowingModeSplitScreenPrimary(int taskId, int createMode, + Rect initialBounds) { + try { + return ActivityTaskManager.getService().setTaskWindowingModeSplitScreenPrimary(taskId, + createMode, true /* onTop */, false /* animate */, initialBounds, + true /* showRecents */); + } catch (RemoteException e) { + return false; + } + } + + /** * Registers a task stack listener with the system. * This should be called on the main thread. */ diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityOptionsCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityOptionsCompat.java index 36fb3a7b4307..7154f5396fbd 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityOptionsCompat.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityOptionsCompat.java @@ -21,6 +21,8 @@ import static android.app.ActivityTaskManager.SPLIT_SCREEN_CREATE_MODE_TOP_OR_LE import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY; import android.app.ActivityOptions; +import android.content.Context; +import android.os.Handler; /** * Wrapper around internal ActivityOptions creation. @@ -43,4 +45,17 @@ public abstract class ActivityOptionsCompat { RemoteAnimationAdapterCompat remoteAnimationAdapter) { return ActivityOptions.makeRemoteAnimation(remoteAnimationAdapter.getWrapped()); } + + public static ActivityOptions makeCustomAnimation(Context context, int enterResId, + int exitResId, final Runnable callback, final Handler callbackHandler) { + return ActivityOptions.makeCustomAnimation(context, enterResId, exitResId, callbackHandler, + new ActivityOptions.OnAnimationStartedListener() { + @Override + public void onAnimationStarted() { + if (callback != null) { + callbackHandler.post(callback); + } + } + }); + } } diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/WindowManagerWrapper.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/WindowManagerWrapper.java index d83b36d6ea80..3191d14c5a83 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/WindowManagerWrapper.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/WindowManagerWrapper.java @@ -151,6 +151,25 @@ public class WindowManagerWrapper { } } + public void setPipVisibility(final boolean visible) { + try { + WindowManagerGlobal.getWindowManagerService().setPipVisibility(visible); + } catch (RemoteException e) { + Log.e(TAG, "Unable to reach window manager", e); + } + } + + /** + * @return whether there is a soft nav bar. + */ + public boolean hasSoftNavigationBar() { + try { + return WindowManagerGlobal.getWindowManagerService().hasNavigationBar(); + } catch (RemoteException e) { + return false; + } + } + /** * @return The side of the screen where navigation bar is positioned. * @see #NAV_BAR_POS_RIGHT diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java index b159b393862a..b8df3c067969 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java @@ -342,12 +342,11 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe case SimPuk: // Shortcut for SIM PIN/PUK to go to directly to user's security screen or home SecurityMode securityMode = mSecurityModel.getSecurityMode(targetUserId); - if (securityMode != SecurityMode.None - || !mLockPatternUtils.isLockScreenDisabled( + if (securityMode == SecurityMode.None || mLockPatternUtils.isLockScreenDisabled( KeyguardUpdateMonitor.getCurrentUser())) { - showSecurityScreen(securityMode); - } else { finish = true; + } else { + showSecurityScreen(securityMode); } break; diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index 10c8ec09bd5b..f1b53fec0714 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -86,9 +86,8 @@ import com.android.internal.telephony.TelephonyIntents; import com.android.internal.util.Preconditions; import com.android.internal.widget.LockPatternUtils; import com.android.settingslib.WirelessUtils; -import com.android.systemui.recents.misc.SysUiTaskStackChangeListener; import com.android.systemui.shared.system.ActivityManagerWrapper; - +import com.android.systemui.shared.system.TaskStackChangeListener; import com.google.android.collect.Lists; import java.io.FileDescriptor; @@ -2218,8 +2217,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { } } - private final SysUiTaskStackChangeListener - mTaskStackListener = new SysUiTaskStackChangeListener() { + private final TaskStackChangeListener + mTaskStackListener = new TaskStackChangeListener() { @Override public void onTaskStackChangedBackground() { try { diff --git a/packages/SystemUI/src/com/android/systemui/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/OverviewProxyService.java index bd2b7a577b3d..1af2156c4bbe 100644 --- a/packages/SystemUI/src/com/android/systemui/OverviewProxyService.java +++ b/packages/SystemUI/src/com/android/systemui/OverviewProxyService.java @@ -16,6 +16,11 @@ package com.android.systemui; +import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_UNAWARE; +import static com.android.systemui.shared.system.NavigationBarCompat.FLAG_DISABLE_SWIPE_UP; +import static com.android.systemui.shared.system.NavigationBarCompat.FLAG_SHOW_OVERVIEW_BUTTON; +import static com.android.systemui.shared.system.NavigationBarCompat.InteractionType; + import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; @@ -33,11 +38,7 @@ import android.os.UserHandle; import android.provider.Settings; import android.util.Log; import android.view.MotionEvent; - import com.android.systemui.OverviewProxyService.OverviewProxyListener; -import com.android.systemui.recents.events.EventBus; -import com.android.systemui.recents.events.activity.DockedFirstAnimationFrameEvent; -import com.android.systemui.recents.misc.SystemServicesProxy; import com.android.systemui.shared.recents.IOverviewProxy; import com.android.systemui.shared.recents.ISystemUiProxy; import com.android.systemui.shared.system.ActivityManagerWrapper; @@ -46,17 +47,11 @@ import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.policy.CallbackController; import com.android.systemui.statusbar.policy.DeviceProvisionedController; import com.android.systemui.statusbar.policy.DeviceProvisionedController.DeviceProvisionedListener; - import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; -import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_UNAWARE; -import static com.android.systemui.shared.system.NavigationBarCompat.FLAG_DISABLE_SWIPE_UP; -import static com.android.systemui.shared.system.NavigationBarCompat.FLAG_SHOW_OVERVIEW_BUTTON; -import static com.android.systemui.shared.system.NavigationBarCompat.InteractionType; - /** * Class to send information from overview to launcher with a binder. */ @@ -133,7 +128,10 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis } long token = Binder.clearCallingIdentity(); try { - EventBus.getDefault().post(new DockedFirstAnimationFrameEvent()); + Divider divider = SysUiServiceProvider.getComponent(mContext, Divider.class); + if (divider != null) { + divider.onDockedFirstAnimationFrame(); + } } finally { Binder.restoreCallingIdentity(token); } @@ -314,8 +312,7 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis getDefaultInteractionFlags()); // Listen for the package update changes. - if (SystemServicesProxy.getInstance(context) - .isSystemUser(mDeviceProvisionedController.getCurrentUser())) { + if (mDeviceProvisionedController.getCurrentUser() == UserHandle.USER_SYSTEM) { updateEnabledState(); mDeviceProvisionedController.addCallback(mDeviceProvisionedCallback); IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED); diff --git a/packages/SystemUI/src/com/android/systemui/RecentsComponent.java b/packages/SystemUI/src/com/android/systemui/RecentsComponent.java index f9dbf4a15e5c..fb343f9b9b45 100644 --- a/packages/SystemUI/src/com/android/systemui/RecentsComponent.java +++ b/packages/SystemUI/src/com/android/systemui/RecentsComponent.java @@ -22,27 +22,10 @@ import android.view.View; public interface RecentsComponent { void showRecentApps(boolean triggeredFromAltTab); - void showNextAffiliatedTask(); - void showPrevAffiliatedTask(); /** * Docks the top-most task and opens recents. */ - boolean splitPrimaryTask(int dragMode, int stackCreateMode, Rect initialBounds, + boolean splitPrimaryTask(int stackCreateMode, Rect initialBounds, int metricsDockAction); - - /** - * Called during a drag-from-navbar-in gesture. - * - * @param distanceFromTop the distance of the current drag in gesture from the top of the - * screen - */ - void onDraggingInRecents(float distanceFromTop); - - /** - * Called when the gesture to drag in recents ended. - * - * @param velocity the velocity of the finger when releasing it in pixels per second - */ - void onDraggingInRecentsEnded(float velocity); } diff --git a/packages/SystemUI/src/com/android/systemui/SwipeHelper.java b/packages/SystemUI/src/com/android/systemui/SwipeHelper.java index a3b539588d9b..0215fda81485 100644 --- a/packages/SystemUI/src/com/android/systemui/SwipeHelper.java +++ b/packages/SystemUI/src/com/android/systemui/SwipeHelper.java @@ -61,13 +61,14 @@ public class SwipeHelper implements Gefingerpoken { public static final float SWIPED_FAR_ENOUGH_SIZE_FRACTION = 0.6f; static final float MAX_SCROLL_SIZE_FRACTION = 0.3f; + protected final Handler mHandler; + private float mMinSwipeProgress = 0f; private float mMaxSwipeProgress = 1f; private final FlingAnimationUtils mFlingAnimationUtils; private float mPagingTouchSlop; private final Callback mCallback; - private final Handler mHandler; private final int mSwipeDirection; private final VelocityTracker mVelocityTracker; private final FalsingManager mFalsingManager; diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/DismissCallbackRegistry.java b/packages/SystemUI/src/com/android/systemui/keyguard/DismissCallbackRegistry.java index 745f312a29b4..d833c16c04b3 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/DismissCallbackRegistry.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/DismissCallbackRegistry.java @@ -19,9 +19,6 @@ package com.android.systemui.keyguard; import com.android.internal.policy.IKeyguardDismissCallback; import com.android.systemui.Dependency; import com.android.systemui.UiOffloadThread; -import com.android.systemui.recents.Recents; -import com.android.systemui.recents.misc.SystemServicesProxy; - import java.util.ArrayList; /** diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/WorkLockActivityController.java b/packages/SystemUI/src/com/android/systemui/keyguard/WorkLockActivityController.java index 0cedf9825990..74f770679cc9 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/WorkLockActivityController.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/WorkLockActivityController.java @@ -19,7 +19,6 @@ package com.android.systemui.keyguard; import android.app.ActivityManager; import android.app.ActivityOptions; import android.app.ActivityTaskManager; -import android.app.IActivityManager; import android.app.IActivityTaskManager; import android.app.KeyguardManager; import android.content.ComponentName; @@ -29,11 +28,9 @@ import android.os.Bundle; import android.os.RemoteException; import android.os.UserHandle; import android.util.Log; - import com.android.internal.annotations.VisibleForTesting; -import com.android.systemui.recents.misc.SysUiTaskStackChangeListener; -import com.android.systemui.recents.misc.SystemServicesProxy; import com.android.systemui.shared.system.ActivityManagerWrapper; +import com.android.systemui.shared.system.TaskStackChangeListener; public class WorkLockActivityController { private static final String TAG = WorkLockActivityController.class.getSimpleName(); @@ -111,7 +108,7 @@ public class WorkLockActivityController { } } - private final SysUiTaskStackChangeListener mLockListener = new SysUiTaskStackChangeListener() { + private final TaskStackChangeListener mLockListener = new TaskStackChangeListener() { @Override public void onTaskProfileLocked(int taskId, int userId) { startWorkChallengeInTask(taskId, userId); diff --git a/packages/SystemUI/src/com/android/systemui/pip/PipUI.java b/packages/SystemUI/src/com/android/systemui/pip/PipUI.java index b7164cbb3271..864a6f9185fa 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/PipUI.java +++ b/packages/SystemUI/src/com/android/systemui/pip/PipUI.java @@ -21,11 +21,12 @@ import static android.content.pm.PackageManager.FEATURE_PICTURE_IN_PICTURE; import android.content.pm.PackageManager; import android.content.res.Configuration; - +import android.os.UserHandle; +import android.os.UserManager; import com.android.systemui.SystemUI; -import com.android.systemui.recents.misc.SystemServicesProxy; +import com.android.systemui.recents.events.EventBus; +import com.android.systemui.recents.events.component.ExpandPipEvent; import com.android.systemui.statusbar.CommandQueue; - import java.io.FileDescriptor; import java.io.PrintWriter; @@ -47,8 +48,8 @@ public class PipUI extends SystemUI implements CommandQueue.Callbacks { } // Ensure that we are the primary user's SystemUI. - final int processUser = SystemServicesProxy.getInstance(mContext).getProcessUser(); - if (!SystemServicesProxy.getInstance(mContext).isSystemUser(processUser)) { + final int processUser = UserManager.get(mContext).getUserHandle(); + if (processUser != UserHandle.USER_SYSTEM) { throw new IllegalStateException("Non-primary Pip component not currently supported."); } @@ -58,6 +59,7 @@ public class PipUI extends SystemUI implements CommandQueue.Callbacks { mPipManager.initialize(mContext); getComponent(CommandQueue.class).addCallbacks(this); + putComponent(PipUI.class, this); } @Override @@ -65,6 +67,10 @@ public class PipUI extends SystemUI implements CommandQueue.Callbacks { mPipManager.showPictureInPictureMenu(); } + public void expandPip() { + EventBus.getDefault().send(new ExpandPipEvent()); + } + @Override protected void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); diff --git a/packages/SystemUI/src/com/android/systemui/recents/misc/ForegroundThread.java b/packages/SystemUI/src/com/android/systemui/pip/phone/ForegroundThread.java index 784ac4e16838..9bf46bb488f3 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/misc/ForegroundThread.java +++ b/packages/SystemUI/src/com/android/systemui/pip/phone/ForegroundThread.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.systemui.recents.misc; +package com.android.systemui.pip.phone; import android.os.Handler; import android.os.HandlerThread; diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipDismissViewController.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipDismissViewController.java index 5547e2d3985d..9ce2606a2a15 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipDismissViewController.java +++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipDismissViewController.java @@ -19,21 +19,17 @@ package com.android.systemui.pip.phone; import android.content.Context; import android.graphics.PixelFormat; import android.graphics.Point; -import android.graphics.PointF; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; -import android.view.View.OnLayoutChangeListener; -import android.view.ViewGroup; import android.view.WindowManager; import android.view.WindowManager.LayoutParams; import android.widget.FrameLayout; - import com.android.systemui.Interpolators; import com.android.systemui.R; -import com.android.systemui.recents.misc.SystemServicesProxy; +import com.android.systemui.shared.system.WindowManagerWrapper; public class PipDismissViewController { @@ -59,7 +55,7 @@ public class PipDismissViewController { if (mDismissView == null) { // Determine sizes for the view final Rect stableInsets = new Rect(); - SystemServicesProxy.getInstance(mContext).getStableInsets(stableInsets); + WindowManagerWrapper.getInstance().getStableInsets(stableInsets); final Point windowSize = new Point(); mWindowManager.getDefaultDisplay().getRealSize(windowSize); final int gradientHeight = mContext.getResources().getDimensionPixelSize( diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java index ee15655d87b2..04746c16585a 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java +++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java @@ -17,7 +17,6 @@ package com.android.systemui.pip.phone; import static android.view.Display.DEFAULT_DISPLAY; -import static android.view.WindowManager.INPUT_CONSUMER_PIP; import android.app.ActivityManager; import android.app.ActivityTaskManager; @@ -36,15 +35,15 @@ import android.view.IPinnedStackController; import android.view.IPinnedStackListener; import android.view.IWindowManager; import android.view.WindowManagerGlobal; - +import com.android.systemui.Dependency; +import com.android.systemui.UiOffloadThread; import com.android.systemui.pip.BasePipManager; import com.android.systemui.recents.events.EventBus; import com.android.systemui.recents.events.component.ExpandPipEvent; -import com.android.systemui.recents.misc.SysUiTaskStackChangeListener; -import com.android.systemui.recents.misc.SystemServicesProxy; import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.InputConsumerController; - +import com.android.systemui.shared.system.TaskStackChangeListener; +import com.android.systemui.shared.system.WindowManagerWrapper; import java.io.PrintWriter; /** @@ -72,7 +71,7 @@ public class PipManager implements BasePipManager { /** * Handler for system task stack changes. */ - SysUiTaskStackChangeListener mTaskStackListener = new SysUiTaskStackChangeListener() { + TaskStackChangeListener mTaskStackListener = new TaskStackChangeListener() { @Override public void onActivityPinned(String packageName, int userId, int taskId, int stackId) { mTouchHandler.onActivityPinned(); @@ -80,7 +79,9 @@ public class PipManager implements BasePipManager { mMenuController.onActivityPinned(); mAppOpsListener.onActivityPinned(packageName); - SystemServicesProxy.getInstance(mContext).setPipVisibility(true); + Dependency.get(UiOffloadThread.class).submit(() -> { + WindowManagerWrapper.getInstance().setPipVisibility(true); + }); } @Override @@ -93,7 +94,9 @@ public class PipManager implements BasePipManager { mTouchHandler.onActivityUnpinned(topActivity); mAppOpsListener.onActivityUnpinned(); - SystemServicesProxy.getInstance(mContext).setPipVisibility(topActivity != null); + Dependency.get(UiOffloadThread.class).submit(() -> { + WindowManagerWrapper.getInstance().setPipVisibility(topActivity != null); + }); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java index f0ab046f7dbe..ce7da79de794 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java +++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java @@ -30,7 +30,6 @@ import android.animation.RectEvaluator; import android.animation.ValueAnimator; import android.animation.ValueAnimator.AnimatorUpdateListener; import android.app.ActivityManager.StackInfo; -import android.app.ActivityTaskManager; import android.app.IActivityManager; import android.app.IActivityTaskManager; import android.content.Context; @@ -43,14 +42,11 @@ import android.os.Message; import android.os.RemoteException; import android.util.Log; import android.view.animation.Interpolator; - import com.android.internal.graphics.SfVsyncFrameCallbackProvider; import com.android.internal.os.SomeArgs; import com.android.internal.policy.PipSnapAlgorithm; -import com.android.systemui.recents.misc.ForegroundThread; -import com.android.systemui.recents.misc.SystemServicesProxy; +import com.android.systemui.shared.system.WindowManagerWrapper; import com.android.systemui.statusbar.FlingAnimationUtils; - import java.io.PrintWriter; /** @@ -116,7 +112,7 @@ public class PipMotionHelper implements Handler.Callback { */ void onConfigurationChanged() { mSnapAlgorithm.onConfigurationChanged(); - SystemServicesProxy.getInstance(mContext).getStableInsets(mStableInsets); + WindowManagerWrapper.getInstance().getStableInsets(mStableInsets); } /** diff --git a/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java b/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java index 020c5500c0a0..43e9db7f0ee5 100755 --- a/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java +++ b/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java @@ -16,6 +16,11 @@ package com.android.systemui.pip.tv; +import static android.app.ActivityTaskManager.INVALID_STACK_ID; +import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED; +import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED; +import static android.view.Display.DEFAULT_DISPLAY; + import android.app.ActivityManager; import android.app.ActivityManager.RunningTaskInfo; import android.app.ActivityManager.StackInfo; @@ -44,22 +49,17 @@ import android.view.IPinnedStackController; import android.view.IPinnedStackListener; import android.view.IWindowManager; import android.view.WindowManagerGlobal; - +import com.android.systemui.Dependency; import com.android.systemui.R; +import com.android.systemui.UiOffloadThread; import com.android.systemui.pip.BasePipManager; -import com.android.systemui.recents.misc.SysUiTaskStackChangeListener; -import com.android.systemui.recents.misc.SystemServicesProxy; import com.android.systemui.shared.system.ActivityManagerWrapper; - +import com.android.systemui.shared.system.TaskStackChangeListener; +import com.android.systemui.shared.system.WindowManagerWrapper; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; -import static android.app.ActivityTaskManager.INVALID_STACK_ID; -import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED; -import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED; -import static android.view.Display.DEFAULT_DISPLAY; - /** * Manages the picture-in-picture (PIP) UI and states. */ @@ -630,7 +630,7 @@ public class PipManager implements BasePipManager { return false; } - private SysUiTaskStackChangeListener mTaskStackListener = new SysUiTaskStackChangeListener() { + private TaskStackChangeListener mTaskStackListener = new TaskStackChangeListener() { @Override public void onTaskStackChanged() { if (DEBUG) Log.d(TAG, "onTaskStackChanged()"); @@ -754,7 +754,9 @@ public class PipManager implements BasePipManager { } private void updatePipVisibility(final boolean visible) { - SystemServicesProxy.getInstance(mContext).setPipVisibility(visible); + Dependency.get(UiOffloadThread.class).submit(() -> { + WindowManagerWrapper.getInstance().setPipVisibility(visible); + }); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java index c36cdf6ac262..79e508611750 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java @@ -256,7 +256,7 @@ public class QSFragment extends Fragment implements QS, CommandQueue.Callbacks { public void setExpanded(boolean expanded) { if (DEBUG) Log.d(TAG, "setExpanded " + expanded); mQsExpanded = expanded; - mQSPanel.setListening(mListening && mQsExpanded); + mQSPanel.setListening(mListening, mQsExpanded); updateQsState(); } @@ -287,8 +287,7 @@ public class QSFragment extends Fragment implements QS, CommandQueue.Callbacks { mListening = listening; mHeader.setListening(listening); mFooter.setListening(listening); - mQSPanel.setListening(mListening && mQsExpanded); - mQSPanel.getFooter().setListening(listening); + mQSPanel.setListening(mListening, mQsExpanded); } @Override @@ -365,7 +364,11 @@ public class QSFragment extends Fragment implements QS, CommandQueue.Callbacks { .setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { - getView().animate().setListener(null); + if (getView() != null) { + // The view could be destroyed before the animation completes when + // switching users. + getView().animate().setListener(null); + } mHeaderAnimating = false; updateQsState(); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java index 7a57fdde6712..8b2e1d5eef64 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java @@ -353,12 +353,21 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne if (mListening) { refreshAllTiles(); } - if (mBrightnessView.getVisibility() == View.VISIBLE) { - if (listening) { - mBrightnessController.registerCallbacks(); - } else { - mBrightnessController.unregisterCallbacks(); - } + } + + public void setListening(boolean listening, boolean expanded) { + setListening(listening && expanded); + getFooter().setListening(listening); + // Set the listening as soon as the QS fragment starts listening regardless of the expansion, + // so it will update the current brightness before the slider is visible. + setBrightnessListening(listening); + } + + public void setBrightnessListening(boolean listening) { + if (listening) { + mBrightnessController.registerCallbacks(); + } else { + mBrightnessController.unregisterCallbacks(); } } diff --git a/packages/SystemUI/src/com/android/systemui/recents/IRecentsNonSystemUserCallbacks.aidl b/packages/SystemUI/src/com/android/systemui/recents/IRecentsNonSystemUserCallbacks.aidl index fc1831d55c9d..90c10992bc94 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/IRecentsNonSystemUserCallbacks.aidl +++ b/packages/SystemUI/src/com/android/systemui/recents/IRecentsNonSystemUserCallbacks.aidl @@ -31,8 +31,7 @@ oneway interface IRecentsNonSystemUserCallbacks { void hideRecents(boolean triggeredFromAltTab, boolean triggeredFromHomeKey); void toggleRecents(int recentsGrowTarget); void onConfigurationChanged(); - void splitPrimaryTask(int topTaskId, int dragMode, int stackCreateMode, - in Rect initialBounds); + void splitPrimaryTask(int topTaskId, int stackCreateMode, in Rect initialBounds); void onDraggingInRecents(float distanceFromTop); void onDraggingInRecentsEnded(float velocity); void showCurrentUserToast(int msgResId, int msgLength); diff --git a/packages/SystemUI/src/com/android/systemui/recents/IRecentsSystemUserCallbacks.aidl b/packages/SystemUI/src/com/android/systemui/recents/IRecentsSystemUserCallbacks.aidl index 58d8d8fd600a..e97714486dcf 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/IRecentsSystemUserCallbacks.aidl +++ b/packages/SystemUI/src/com/android/systemui/recents/IRecentsSystemUserCallbacks.aidl @@ -29,7 +29,7 @@ oneway interface IRecentsSystemUserCallbacks { void updateRecentsVisibility(boolean visible); void startScreenPinning(int taskId); void sendRecentsDrawnEvent(); - void sendDockingTopTaskEvent(int dragMode, in Rect initialRect); + void sendDockingTopTaskEvent(in Rect initialRect); void sendLaunchRecentsEvent(); void sendDockedFirstAnimationFrameEvent(); void setWaitingForTransitionStartEvent(boolean waitingForTransitionStart); diff --git a/packages/SystemUI/src/com/android/systemui/recents/Recents.java b/packages/SystemUI/src/com/android/systemui/recents/Recents.java index 8bb3c0231a76..74f6c2dec4e7 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/Recents.java +++ b/packages/SystemUI/src/com/android/systemui/recents/Recents.java @@ -53,6 +53,7 @@ import com.android.systemui.OverviewProxyService; import com.android.systemui.R; import com.android.systemui.RecentsComponent; import com.android.systemui.SystemUIApplication; +import com.android.systemui.recents.events.ui.RecentsGrowingEvent; import com.android.systemui.shared.recents.IOverviewProxy; import com.android.systemui.SystemUI; import com.android.systemui.recents.events.EventBus; @@ -248,6 +249,10 @@ public class Recents extends SystemUI mImpl.onBootCompleted(); } + public void growRecents() { + EventBus.getDefault().send(new RecentsGrowingEvent()); + } + /** * Shows the Recents. */ @@ -463,7 +468,7 @@ public class Recents extends SystemUI } @Override - public boolean splitPrimaryTask(int dragMode, int stackCreateMode, Rect initialBounds, + public boolean splitPrimaryTask(int stackCreateMode, Rect initialBounds, int metricsDockAction) { // Ensure the device has been provisioned before allowing the user to interact with // recents @@ -495,16 +500,15 @@ public class Recents extends SystemUI runningTask.topActivity.flattenToShortString()); } if (sSystemServicesProxy.isSystemUser(currentUser)) { - mImpl.splitPrimaryTask(runningTask.id, dragMode, stackCreateMode, - initialBounds); + mImpl.splitPrimaryTask(runningTask.id, stackCreateMode, initialBounds); } else { if (mSystemToUserCallbacks != null) { IRecentsNonSystemUserCallbacks callbacks = mSystemToUserCallbacks.getNonSystemUserRecentsForUser(currentUser); if (callbacks != null) { try { - callbacks.splitPrimaryTask(runningTask.id, dragMode, - stackCreateMode, initialBounds); + callbacks.splitPrimaryTask(runningTask.id, stackCreateMode, + initialBounds); } catch (RemoteException e) { Log.e(TAG, "Callback failed", e); } @@ -552,53 +556,6 @@ public class Recents extends SystemUI } } - @Override - public void onDraggingInRecents(float distanceFromTop) { - if (sSystemServicesProxy.isSystemUser(mDraggingInRecentsCurrentUser)) { - mImpl.onDraggingInRecents(distanceFromTop); - } else { - if (mSystemToUserCallbacks != null) { - IRecentsNonSystemUserCallbacks callbacks = - mSystemToUserCallbacks.getNonSystemUserRecentsForUser( - mDraggingInRecentsCurrentUser); - if (callbacks != null) { - try { - callbacks.onDraggingInRecents(distanceFromTop); - } catch (RemoteException e) { - Log.e(TAG, "Callback failed", e); - } - } else { - Log.e(TAG, "No SystemUI callbacks found for user: " - + mDraggingInRecentsCurrentUser); - } - } - } - } - - @Override - public void onDraggingInRecentsEnded(float velocity) { - if (sSystemServicesProxy.isSystemUser(mDraggingInRecentsCurrentUser)) { - mImpl.onDraggingInRecentsEnded(velocity); - } else { - if (mSystemToUserCallbacks != null) { - IRecentsNonSystemUserCallbacks callbacks = - mSystemToUserCallbacks.getNonSystemUserRecentsForUser( - mDraggingInRecentsCurrentUser); - if (callbacks != null) { - try { - callbacks.onDraggingInRecentsEnded(velocity); - } catch (RemoteException e) { - Log.e(TAG, "Callback failed", e); - } - } else { - Log.e(TAG, "No SystemUI callbacks found for user: " - + mDraggingInRecentsCurrentUser); - } - } - } - } - - @Override public void showNextAffiliatedTask() { // Ensure the device has been provisioned before allowing the user to interact with // recents @@ -609,7 +566,6 @@ public class Recents extends SystemUI mImpl.showNextAffiliatedTask(); } - @Override public void showPrevAffiliatedTask() { // Ensure the device has been provisioned before allowing the user to interact with // recents @@ -686,7 +642,12 @@ public class Recents extends SystemUI public final void onBusEvent(DockedFirstAnimationFrameEvent event) { SystemServicesProxy ssp = Recents.getSystemServices(); int processUser = ssp.getProcessUser(); - if (!ssp.isSystemUser(processUser)) { + if (ssp.isSystemUser(processUser)) { + final Divider divider = getComponent(Divider.class); + if (divider != null) { + divider.onDockedFirstAnimationFrame(); + } + } else { postToSystemUser(new Runnable() { @Override public void run() { @@ -723,7 +684,12 @@ public class Recents extends SystemUI public final void onBusEvent(final RecentsDrawnEvent event) { int processUser = sSystemServicesProxy.getProcessUser(); - if (!sSystemServicesProxy.isSystemUser(processUser)) { + if (sSystemServicesProxy.isSystemUser(processUser)) { + final Divider divider = getComponent(Divider.class); + if (divider != null) { + divider.onRecentsDrawn(); + } + } else { postToSystemUser(new Runnable() { @Override public void run() { @@ -739,13 +705,17 @@ public class Recents extends SystemUI public final void onBusEvent(final DockedTopTaskEvent event) { int processUser = sSystemServicesProxy.getProcessUser(); - if (!sSystemServicesProxy.isSystemUser(processUser)) { + if (sSystemServicesProxy.isSystemUser(processUser)) { + final Divider divider = getComponent(Divider.class); + if (divider != null) { + divider.onDockedTopTask(); + } + } else { postToSystemUser(new Runnable() { @Override public void run() { try { - mUserToSystemCallbacks.sendDockingTopTaskEvent(event.dragMode, - event.initialRect); + mUserToSystemCallbacks.sendDockingTopTaskEvent(event.initialRect); } catch (RemoteException e) { Log.e(TAG, "Callback failed", e); } @@ -756,7 +726,12 @@ public class Recents extends SystemUI public final void onBusEvent(final RecentsActivityStartingEvent event) { int processUser = sSystemServicesProxy.getProcessUser(); - if (!sSystemServicesProxy.isSystemUser(processUser)) { + if (sSystemServicesProxy.isSystemUser(processUser)) { + final Divider divider = getComponent(Divider.class); + if (divider != null) { + divider.onRecentsActivityStarting(); + } + } else { postToSystemUser(new Runnable() { @Override public void run() { diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java index 63a65d030f6d..d95c7313a282 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java @@ -49,6 +49,7 @@ import android.widget.Toast; import com.android.systemui.Dependency; import com.android.systemui.OverviewProxyService; import com.android.systemui.SysUiServiceProvider; +import com.android.systemui.pip.phone.ForegroundThread; import com.google.android.collect.Lists; import com.android.internal.logging.MetricsLogger; @@ -72,7 +73,6 @@ import com.android.systemui.recents.events.ui.DraggingInRecentsEndedEvent; import com.android.systemui.recents.events.ui.DraggingInRecentsEvent; import com.android.systemui.recents.events.ui.TaskSnapshotChangedEvent; import com.android.systemui.recents.misc.DozeTrigger; -import com.android.systemui.recents.misc.ForegroundThread; import com.android.systemui.recents.misc.SystemServicesProxy; import com.android.systemui.recents.misc.SysUiTaskStackChangeListener; import com.android.systemui.shared.recents.model.RecentsTaskLoadPlan; @@ -690,14 +690,13 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener showRelativeAffiliatedTask(false); } - public void splitPrimaryTask(int taskId, int dragMode, int stackCreateMode, - Rect initialBounds) { + public void splitPrimaryTask(int taskId, int stackCreateMode, Rect initialBounds) { SystemServicesProxy ssp = Recents.getSystemServices(); // Make sure we inform DividerView before we actually start the activity so we can change // the resize mode already. if (ssp.setTaskWindowingModeSplitScreenPrimary(taskId, stackCreateMode, initialBounds)) { - EventBus.getDefault().send(new DockedTopTaskEvent(dragMode, initialBounds)); + EventBus.getDefault().send(new DockedTopTaskEvent(initialBounds)); } } diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsImplProxy.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsImplProxy.java index beec4b395e9c..a1da785f2a80 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsImplProxy.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsImplProxy.java @@ -87,12 +87,11 @@ public class RecentsImplProxy extends IRecentsNonSystemUserCallbacks.Stub { } @Override - public void splitPrimaryTask(int topTaskId, int dragMode, int stackCreateMode, - Rect initialBounds) throws RemoteException { + public void splitPrimaryTask(int topTaskId, int stackCreateMode, Rect initialBounds) + throws RemoteException { SomeArgs args = SomeArgs.obtain(); args.argi1 = topTaskId; - args.argi2 = dragMode; - args.argi3 = stackCreateMode; + args.argi2 = stackCreateMode; args.arg1 = initialBounds; mHandler.sendMessage(mHandler.obtainMessage(MSG_DOCK_TOP_TASK, args)); } @@ -141,7 +140,7 @@ public class RecentsImplProxy extends IRecentsNonSystemUserCallbacks.Stub { break; case MSG_DOCK_TOP_TASK: args = (SomeArgs) msg.obj; - mImpl.splitPrimaryTask(args.argi1, args.argi2, args.argi3 = 0, + mImpl.splitPrimaryTask(args.argi1, args.argi2 = 0, (Rect) args.arg1); break; case MSG_ON_DRAGGING_IN_RECENTS: diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsSystemUser.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsSystemUser.java index ff1f7dc5a2a8..c5e9f046aa16 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsSystemUser.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsSystemUser.java @@ -26,13 +26,13 @@ import android.util.SparseArray; import com.android.systemui.EventLogConstants; import com.android.systemui.EventLogTags; +import com.android.systemui.pip.phone.ForegroundThread; import com.android.systemui.recents.events.EventBus; import com.android.systemui.recents.events.activity.DockedFirstAnimationFrameEvent; import com.android.systemui.recents.events.activity.DockedTopTaskEvent; import com.android.systemui.recents.events.activity.RecentsActivityStartingEvent; import com.android.systemui.recents.events.component.SetWaitingForTransitionStartEvent; import com.android.systemui.recents.events.ui.RecentsDrawnEvent; -import com.android.systemui.recents.misc.ForegroundThread; /** * An implementation of the system user's Recents interface to be called remotely by secondary @@ -99,8 +99,8 @@ public class RecentsSystemUser extends IRecentsSystemUserCallbacks.Stub { } @Override - public void sendDockingTopTaskEvent(int dragMode, Rect initialRect) throws RemoteException { - EventBus.getDefault().post(new DockedTopTaskEvent(dragMode, initialRect)); + public void sendDockingTopTaskEvent(Rect initialRect) throws RemoteException { + EventBus.getDefault().post(new DockedTopTaskEvent(initialRect)); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/recents/events/activity/DockedTopTaskEvent.java b/packages/SystemUI/src/com/android/systemui/recents/events/activity/DockedTopTaskEvent.java index f1bc214670f5..9e3ced3f3757 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/events/activity/DockedTopTaskEvent.java +++ b/packages/SystemUI/src/com/android/systemui/recents/events/activity/DockedTopTaskEvent.java @@ -26,11 +26,9 @@ import com.android.systemui.recents.events.EventBus; */ public class DockedTopTaskEvent extends EventBus.Event { - public int dragMode; public Rect initialRect; - public DockedTopTaskEvent(int dragMode, Rect initialRect) { - this.dragMode = dragMode; + public DockedTopTaskEvent(Rect initialRect) { this.initialRect = initialRect; } } diff --git a/packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java b/packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java index 117872558f7f..3ed5f70b8915 100644 --- a/packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java +++ b/packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java @@ -460,7 +460,7 @@ public class BrightnessController implements ToggleSlider.Listener { private void animateSliderTo(int target) { if (!mControlValueInitialized) { - // Don't animate the first value since it's default state isn't meaningful to users. + // Don't animate the first value since its default state isn't meaningful to users. mControl.setValue(target); mControlValueInitialized = true; } @@ -470,10 +470,12 @@ public class BrightnessController implements ToggleSlider.Listener { mSliderAnimator = ValueAnimator.ofInt(mControl.getValue(), target); mSliderAnimator.addUpdateListener((ValueAnimator animation) -> { mExternalChange = true; - mControl.setValue((int)animation.getAnimatedValue()); + mControl.setValue((int) animation.getAnimatedValue()); mExternalChange = false; }); - mSliderAnimator.setDuration(SLIDER_ANIMATION_DURATION); + final long animationDuration = SLIDER_ANIMATION_DURATION * Math.abs( + mControl.getValue() - target) / GAMMA_SPACE_MAX; + mSliderAnimator.setDuration(animationDuration); mSliderAnimator.start(); } diff --git a/packages/SystemUI/src/com/android/systemui/shortcut/ShortcutKeyDispatcher.java b/packages/SystemUI/src/com/android/systemui/shortcut/ShortcutKeyDispatcher.java index 750002cbc5ca..64fa8f86c5f6 100644 --- a/packages/SystemUI/src/com/android/systemui/shortcut/ShortcutKeyDispatcher.java +++ b/packages/SystemUI/src/com/android/systemui/shortcut/ShortcutKeyDispatcher.java @@ -18,11 +18,7 @@ package com.android.systemui.shortcut; import static android.app.ActivityTaskManager.SPLIT_SCREEN_CREATE_MODE_BOTTOM_OR_RIGHT; import static android.app.ActivityTaskManager.SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT; -import static android.os.UserHandle.USER_CURRENT; -import static com.android.systemui.statusbar.phone.NavigationBarGestureHelper.DRAG_MODE_NONE; - -import android.app.ActivityManager; import android.content.res.Configuration; import android.os.RemoteException; import android.util.Log; @@ -30,17 +26,11 @@ import android.view.IWindowManager; import android.view.KeyEvent; import android.view.WindowManager; import android.view.WindowManagerGlobal; - import com.android.internal.policy.DividerSnapAlgorithm; import com.android.systemui.SystemUI; import com.android.systemui.recents.Recents; -import com.android.systemui.recents.misc.SystemServicesProxy; -import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.stackdivider.Divider; import com.android.systemui.stackdivider.DividerView; -import com.android.systemui.statusbar.phone.NavigationBarGestureHelper; - -import java.util.List; /** * Dispatches shortcut to System UI components @@ -94,7 +84,7 @@ public class ShortcutKeyDispatcher extends SystemUI if (dockSide == WindowManager.DOCKED_INVALID) { // Split the screen Recents recents = getComponent(Recents.class); - recents.splitPrimaryTask(DRAG_MODE_NONE, (shortcutCode == SC_DOCK_LEFT) + recents.splitPrimaryTask((shortcutCode == SC_DOCK_LEFT) ? SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT : SPLIT_SCREEN_CREATE_MODE_BOTTOM_OR_RIGHT, null, -1); } else { diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java b/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java index da0a43551f1f..ea194a70adf2 100644 --- a/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java +++ b/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java @@ -16,29 +16,28 @@ package com.android.systemui.stackdivider; +import static android.content.res.Configuration.ORIENTATION_LANDSCAPE; +import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; + import android.content.res.Configuration; import android.os.RemoteException; +import android.util.Log; import android.view.IDockedStackListener; import android.view.LayoutInflater; import android.view.View; - +import android.view.WindowManagerGlobal; import com.android.systemui.R; import com.android.systemui.SystemUI; import com.android.systemui.recents.Recents; -import com.android.systemui.recents.events.EventBus; -import com.android.systemui.recents.events.ui.RecentsDrawnEvent; -import com.android.systemui.recents.misc.SystemServicesProxy; - -import static android.content.res.Configuration.ORIENTATION_LANDSCAPE; -import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; - import java.io.FileDescriptor; import java.io.PrintWriter; /** * Controls the docked stack divider. */ -public class Divider extends SystemUI { +public class Divider extends SystemUI implements DividerView.DividerCallbacks { + private static final String TAG = "Divider"; + private DividerWindowManager mWindowManager; private DividerView mView; private final DividerState mDividerState = new DividerState(); @@ -55,10 +54,13 @@ public class Divider extends SystemUI { update(mContext.getResources().getConfiguration()); putComponent(Divider.class, this); mDockDividerVisibilityListener = new DockDividerVisibilityListener(); - SystemServicesProxy ssp = Recents.getSystemServices(); - ssp.registerDockedStackListener(mDockDividerVisibilityListener); + try { + WindowManagerGlobal.getWindowManagerService().registerDockedStackListener( + mDockDividerVisibilityListener); + } catch (Exception e) { + Log.e(TAG, "Failed to register docked stack listener", e); + } mForcedResizableController = new ForcedResizableInfoActivityController(mContext); - EventBus.getDefault().register(this); } @Override @@ -82,7 +84,7 @@ public class Divider extends SystemUI { private void addDivider(Configuration configuration) { mView = (DividerView) LayoutInflater.from(mContext).inflate(R.layout.docked_stack_divider, null); - mView.injectDependencies(mWindowManager, mDividerState); + mView.injectDependencies(mWindowManager, mDividerState, this); mView.setVisibility(mVisible ? View.VISIBLE : View.INVISIBLE); mView.setMinimizedDockStack(mMinimized, mHomeStackResizable); final int size = mContext.getResources().getDimensionPixelSize( @@ -156,18 +158,64 @@ public class Divider extends SystemUI { mWindowManager.setTouchable((mHomeStackResizable || !mMinimized) && !mAdjustedForIme); } + public void onRecentsActivityStarting() { + if (mView != null) { + mView.onRecentsActivityStarting(); + } + } + /** - * Workaround for b/62528361, at the time RecentsDrawnEvent is sent, it may happen before a + * Workaround for b/62528361, at the time recents has drawn, it may happen before a * configuration change to the Divider, and internally, the event will be posted to the * subscriber, or DividerView, which has been removed and prevented from resizing. Instead, * register the event handler here and proxy the event to the current DividerView. */ - public final void onBusEvent(RecentsDrawnEvent drawnEvent) { + public void onRecentsDrawn() { if (mView != null) { mView.onRecentsDrawn(); } } + public void onUndockingTask() { + if (mView != null) { + mView.onUndockingTask(); + } + } + + public void onDockedFirstAnimationFrame() { + if (mView != null) { + mView.onDockedFirstAnimationFrame(); + } + } + + public void onDockedTopTask() { + if (mView != null) { + mView.onDockedTopTask(); + } + } + + public void onAppTransitionFinished() { + mForcedResizableController.onAppTransitionFinished(); + } + + @Override + public void onDraggingStart() { + mForcedResizableController.onDraggingStart(); + } + + @Override + public void onDraggingEnd() { + mForcedResizableController.onDraggingEnd(); + } + + @Override + public void growRecents() { + Recents recents = getComponent(Recents.class); + if (recents != null) { + recents.growRecents(); + } + } + @Override public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { pw.print(" mVisible="); pw.println(mVisible); diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java index 98925b9ba9e5..fa01af68364e 100644 --- a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java +++ b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java @@ -55,7 +55,6 @@ import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction; import android.view.animation.Interpolator; import android.view.animation.PathInterpolator; import android.widget.FrameLayout; - import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.policy.DividerSnapAlgorithm; @@ -64,17 +63,8 @@ import com.android.internal.policy.DockedDividerUtils; import com.android.internal.view.SurfaceFlingerVsyncChoreographer; import com.android.systemui.Interpolators; import com.android.systemui.R; -import com.android.systemui.recents.events.EventBus; -import com.android.systemui.recents.events.activity.DockedFirstAnimationFrameEvent; -import com.android.systemui.recents.events.activity.DockedTopTaskEvent; -import com.android.systemui.recents.events.activity.RecentsActivityStartingEvent; -import com.android.systemui.recents.events.activity.UndockingTaskEvent; -import com.android.systemui.recents.events.ui.RecentsGrowingEvent; -import com.android.systemui.recents.misc.SystemServicesProxy; -import com.android.systemui.stackdivider.events.StartedDragingEvent; -import com.android.systemui.stackdivider.events.StoppedDragingEvent; +import com.android.systemui.shared.system.WindowManagerWrapper; import com.android.systemui.statusbar.FlingAnimationUtils; -import com.android.systemui.statusbar.phone.NavigationBarGestureHelper; /** * Docked stack divider. @@ -82,6 +72,12 @@ import com.android.systemui.statusbar.phone.NavigationBarGestureHelper; public class DividerView extends FrameLayout implements OnTouchListener, OnComputeInternalInsetsListener { + public interface DividerCallbacks { + void onDraggingStart(); + void onDraggingEnd(); + void growRecents(); + } + static final long TOUCH_ANIMATION_DURATION = 150; static final long TOUCH_RELEASE_ANIMATION_DURATION = 200; @@ -149,6 +145,7 @@ public class DividerView extends FrameLayout implements OnTouchListener, private FlingAnimationUtils mFlingAnimationUtils; private DividerSnapAlgorithm mSnapAlgorithm; private DividerSnapAlgorithm mMinimizedSnapAlgorithm; + private DividerCallbacks mCallback; private final Rect mStableInsets = new Rect(); private boolean mGrowRecents; @@ -162,6 +159,7 @@ public class DividerView extends FrameLayout implements OnTouchListener, private DividerState mState; private final SurfaceFlingerVsyncChoreographer mSfChoreographer; + // The view is removed or in the process of been removed from the system. private boolean mRemoved; @@ -306,7 +304,6 @@ public class DividerView extends FrameLayout implements OnTouchListener, @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); - EventBus.getDefault().register(this); // Save the current target if not minimized once attached to window if (mHomeStackResizable && mDockSide != WindowManager.DOCKED_INVALID @@ -315,14 +312,9 @@ public class DividerView extends FrameLayout implements OnTouchListener, } } - @Override - protected void onDetachedFromWindow() { - super.onDetachedFromWindow(); - EventBus.getDefault().unregister(this); - } - void onDividerRemoved() { mRemoved = true; + mCallback = null; mHandler.removeMessages(MSG_RESIZE_STACK); } @@ -364,13 +356,15 @@ public class DividerView extends FrameLayout implements OnTouchListener, } } - public void injectDependencies(DividerWindowManager windowManager, DividerState dividerState) { + public void injectDependencies(DividerWindowManager windowManager, DividerState dividerState, + DividerCallbacks callback) { mWindowManager = windowManager; mState = dividerState; + mCallback = callback; // Set the previous position ratio before minimized state after attaching this divider if (mStableInsets.isEmpty()) { - SystemServicesProxy.getInstance(mContext).getStableInsets(mStableInsets); + WindowManagerWrapper.getInstance().getStableInsets(mStableInsets); } if (mState.mRatioPositionBeforeMinimized == 0) { @@ -419,7 +413,9 @@ public class DividerView extends FrameLayout implements OnTouchListener, mWindowManager.setSlippery(false); liftBackground(); } - EventBus.getDefault().send(new StartedDragingEvent()); + if (mCallback != null) { + mCallback.onDraggingStart(); + } return mDockSide != WindowManager.DOCKED_INVALID; } @@ -617,7 +613,9 @@ public class DividerView extends FrameLayout implements OnTouchListener, mCurrentAnimator = null; mEntranceAnimationRunning = false; mExitAnimationRunning = false; - EventBus.getDefault().send(new StoppedDragingEvent()); + if (mCallback != null) { + mCallback.onDraggingEnd(); + } // Record last snap target the divider moved to if (mHomeStackResizable && !mIsInMinimizeInteraction) { @@ -776,7 +774,7 @@ public class DividerView extends FrameLayout implements OnTouchListener, if (mDisplayRotation != mDefaultDisplay.getRotation()) { // Splitscreen to minimize is about to starts after rotating landscape to seascape, // update insets, display info and snap algorithm targets - SystemServicesProxy.getInstance(mContext).getStableInsets(mStableInsets); + WindowManagerWrapper.getInstance().getStableInsets(mStableInsets); repositionSnapTargetBeforeMinimized(); updateDisplayInfo(); } else { @@ -910,7 +908,7 @@ public class DividerView extends FrameLayout implements OnTouchListener, requestLayout(); // Update the snap position to the new docked side with correct insets - SystemServicesProxy.getInstance(mContext).getStableInsets(mStableInsets); + WindowManagerWrapper.getInstance().getStableInsets(mStableInsets); mMinimizedSnapAlgorithm = null; initializeSnapAlgorithm(); @@ -1271,7 +1269,7 @@ public class DividerView extends FrameLayout implements OnTouchListener, } } - public final void onBusEvent(RecentsActivityStartingEvent recentsActivityStartingEvent) { + void onRecentsActivityStarting() { if (mGrowRecents && mDockSide == WindowManager.DOCKED_TOP && getSnapAlgorithm().getMiddleTarget() != getSnapAlgorithm().getLastSplitTarget() && getCurrentPosition() == getSnapAlgorithm().getLastSplitTarget().position) { @@ -1280,16 +1278,14 @@ public class DividerView extends FrameLayout implements OnTouchListener, } } - public final void onBusEvent(DockedFirstAnimationFrameEvent event) { + void onDockedFirstAnimationFrame() { saveSnapTargetBeforeMinimized(mSnapAlgorithm.getMiddleTarget()); } - public final void onBusEvent(DockedTopTaskEvent event) { - if (event.dragMode == NavigationBarGestureHelper.DRAG_MODE_NONE) { - mState.growAfterRecentsDrawn = false; - mState.animateAfterRecentsDrawn = true; - startDragging(false /* animate */, false /* touching */); - } + void onDockedTopTask() { + mState.growAfterRecentsDrawn = false; + mState.animateAfterRecentsDrawn = true; + startDragging(false /* animate */, false /* touching */); updateDockSide(); mEntranceAnimationRunning = true; @@ -1297,7 +1293,7 @@ public class DividerView extends FrameLayout implements OnTouchListener, mSnapAlgorithm.getMiddleTarget()); } - public void onRecentsDrawn() { + void onRecentsDrawn() { updateDockSide(); final int position = calculatePositionForInsetBounds(); if (mState.animateAfterRecentsDrawn) { @@ -1314,13 +1310,15 @@ public class DividerView extends FrameLayout implements OnTouchListener, if (mState.growAfterRecentsDrawn) { mState.growAfterRecentsDrawn = false; updateDockSide(); - EventBus.getDefault().send(new RecentsGrowingEvent()); + if (mCallback != null) { + mCallback.growRecents(); + } stopDragging(position, getSnapAlgorithm().getMiddleTarget(), 336, Interpolators.FAST_OUT_SLOW_IN); } } - public final void onBusEvent(UndockingTaskEvent undockingTaskEvent) { + void onUndockingTask() { int dockSide = mWindowManagerProxy.getDockSide(); if (dockSide != WindowManager.DOCKED_INVALID && (mHomeStackResizable || !mDockedStackMinimized)) { diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/ForcedResizableInfoActivity.java b/packages/SystemUI/src/com/android/systemui/stackdivider/ForcedResizableInfoActivity.java index 4415bd7a631b..02f75050c061 100644 --- a/packages/SystemUI/src/com/android/systemui/stackdivider/ForcedResizableInfoActivity.java +++ b/packages/SystemUI/src/com/android/systemui/stackdivider/ForcedResizableInfoActivity.java @@ -52,7 +52,7 @@ public class ForcedResizableInfoActivity extends Activity implements OnTouchList protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.forced_resizable_activity); - TextView tv = (TextView) findViewById(com.android.internal.R.id.message); + TextView tv = findViewById(com.android.internal.R.id.message); int reason = getIntent().getIntExtra(EXTRA_FORCED_RESIZEABLE_REASON, -1); String text; switch (reason) { diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/ForcedResizableInfoActivityController.java b/packages/SystemUI/src/com/android/systemui/stackdivider/ForcedResizableInfoActivityController.java index 826fa6cefccc..f66db48f441c 100644 --- a/packages/SystemUI/src/com/android/systemui/stackdivider/ForcedResizableInfoActivityController.java +++ b/packages/SystemUI/src/com/android/systemui/stackdivider/ForcedResizableInfoActivityController.java @@ -16,8 +16,7 @@ package com.android.systemui.stackdivider; -import static com.android.systemui.stackdivider.ForcedResizableInfoActivity - .EXTRA_FORCED_RESIZEABLE_REASON; +import static com.android.systemui.stackdivider.ForcedResizableInfoActivity.EXTRA_FORCED_RESIZEABLE_REASON; import android.app.ActivityOptions; import android.content.Context; @@ -26,16 +25,9 @@ import android.os.Handler; import android.os.UserHandle; import android.util.ArraySet; import android.widget.Toast; - import com.android.systemui.R; -import com.android.systemui.recents.events.EventBus; -import com.android.systemui.recents.events.activity.AppTransitionFinishedEvent; -import com.android.systemui.recents.events.component.ShowUserToastEvent; -import com.android.systemui.recents.misc.SysUiTaskStackChangeListener; -import com.android.systemui.recents.misc.SystemServicesProxy; import com.android.systemui.shared.system.ActivityManagerWrapper; -import com.android.systemui.stackdivider.events.StartedDragingEvent; -import com.android.systemui.stackdivider.events.StoppedDragingEvent; +import com.android.systemui.shared.system.TaskStackChangeListener; /** * Controller that decides when to show the {@link ForcedResizableInfoActivity}. @@ -49,7 +41,7 @@ public class ForcedResizableInfoActivityController { private final Handler mHandler = new Handler(); private final ArraySet<PendingTaskRecord> mPendingTasks = new ArraySet<>(); private final ArraySet<String> mPackagesShownInSession = new ArraySet<>(); - private boolean mDividerDraging; + private boolean mDividerDragging; private final Runnable mTimeoutRunnable = new Runnable() { @Override @@ -75,9 +67,8 @@ public class ForcedResizableInfoActivityController { public ForcedResizableInfoActivityController(Context context) { mContext = context; - EventBus.getDefault().register(this); ActivityManagerWrapper.getInstance().registerTaskStackListener( - new SysUiTaskStackChangeListener() { + new TaskStackChangeListener() { @Override public void onActivityForcedResizable(String packageName, int taskId, int reason) { @@ -102,19 +93,19 @@ public class ForcedResizableInfoActivityController { } } - public final void onBusEvent(AppTransitionFinishedEvent event) { - if (!mDividerDraging) { + public void onAppTransitionFinished() { + if (!mDividerDragging) { showPending(); } } - public final void onBusEvent(StartedDragingEvent event) { - mDividerDraging = true; + void onDraggingStart() { + mDividerDragging = true; mHandler.removeCallbacks(mTimeoutRunnable); } - public final void onBusEvent(StoppedDragingEvent event) { - mDividerDraging = false; + void onDraggingEnd() { + mDividerDragging = false; showPending(); } @@ -127,13 +118,13 @@ public class ForcedResizableInfoActivityController { } private void activityDismissingDockedStack() { - EventBus.getDefault().send(new ShowUserToastEvent( - R.string.dock_non_resizeble_failed_to_dock_text, Toast.LENGTH_SHORT)); + Toast.makeText(mContext, R.string.dock_non_resizeble_failed_to_dock_text, + Toast.LENGTH_SHORT).show(); } private void activityLaunchOnSecondaryDisplayFailed() { - EventBus.getDefault().send(new ShowUserToastEvent( - R.string.activity_launch_on_secondary_display_failed_text, Toast.LENGTH_SHORT)); + Toast.makeText(mContext, R.string.activity_launch_on_secondary_display_failed_text, + Toast.LENGTH_SHORT).show(); } private void showPending() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcuts.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcuts.java index 247e3d342bbb..00e0b954d7be 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcuts.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcuts.java @@ -16,6 +16,10 @@ package com.android.systemui.statusbar; +import static android.content.Context.LAYOUT_INFLATER_SERVICE; +import static android.view.View.IMPORTANT_FOR_ACCESSIBILITY_YES; +import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG; + import android.annotation.NonNull; import android.annotation.Nullable; import android.app.AlertDialog; @@ -30,10 +34,10 @@ import android.content.pm.IPackageManager; import android.content.pm.PackageInfo; import android.content.pm.ResolveInfo; import android.content.res.ColorStateList; -import android.graphics.drawable.Icon; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.drawable.Drawable; +import android.graphics.drawable.Icon; import android.hardware.input.InputManager; import android.os.Handler; import android.os.Looper; @@ -51,29 +55,23 @@ import android.view.View; import android.view.View.AccessibilityDelegate; import android.view.ViewGroup; import android.view.Window; +import android.view.WindowManager; import android.view.WindowManager.KeyboardShortcutsReceiver; import android.view.accessibility.AccessibilityNodeInfo; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; - import com.android.internal.app.AssistUtils; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto; import com.android.settingslib.Utils; import com.android.systemui.R; -import com.android.systemui.recents.misc.SystemServicesProxy; - import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; -import static android.content.Context.LAYOUT_INFLATER_SERVICE; -import static android.view.View.IMPORTANT_FOR_ACCESSIBILITY_YES; -import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG; - /** * Contains functionality for handling keyboard shortcuts. */ @@ -372,19 +370,19 @@ public final class KeyboardShortcuts { private void showKeyboardShortcuts(int deviceId) { retrieveKeyCharacterMap(deviceId); - SystemServicesProxy.getInstance(mContext).requestKeyboardShortcuts(mContext, - new KeyboardShortcutsReceiver() { - @Override - public void onKeyboardShortcutsReceived( - final List<KeyboardShortcutGroup> result) { - result.add(getSystemShortcuts()); - final KeyboardShortcutGroup appShortcuts = getDefaultApplicationShortcuts(); - if (appShortcuts != null) { - result.add(appShortcuts); - } - showKeyboardShortcutsDialog(result); - } - }, deviceId); + WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); + wm.requestAppKeyboardShortcuts(new KeyboardShortcutsReceiver() { + @Override + public void onKeyboardShortcutsReceived( + final List<KeyboardShortcutGroup> result) { + result.add(getSystemShortcuts()); + final KeyboardShortcutGroup appShortcuts = getDefaultApplicationShortcuts(); + if (appShortcuts != null) { + result.add(appShortcuts); + } + showKeyboardShortcutsDialog(result); + } + }, deviceId); } private void dismissKeyboardShortcuts() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java index 304a00fbba4a..2450e448c4f7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java @@ -17,7 +17,6 @@ package com.android.systemui.statusbar.car; import android.app.ActivityTaskManager; -import android.car.user.CarUserManagerHelper; import android.graphics.PixelFormat; import android.graphics.drawable.Drawable; import android.util.Log; @@ -36,8 +35,8 @@ import com.android.systemui.classifier.FalsingLog; import com.android.systemui.classifier.FalsingManager; import com.android.systemui.fragments.FragmentHostManager; import com.android.systemui.recents.Recents; -import com.android.systemui.recents.misc.SysUiTaskStackChangeListener; import com.android.systemui.shared.system.ActivityManagerWrapper; +import com.android.systemui.shared.system.TaskStackChangeListener; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.car.hvac.HvacController; import com.android.systemui.statusbar.car.hvac.TemperatureView; @@ -461,16 +460,11 @@ public class CarStatusBar extends StatusBar implements } } - - public boolean hasDockedTask() { - return Recents.getSystemServices().hasDockedTask(); - } - /** - * An implementation of SysUiTaskStackChangeListener, that listens for changes in the system + * An implementation of TaskStackChangeListener, that listens for changes in the system * task stack and notifies the navigation bar. */ - private class TaskStackListenerImpl extends SysUiTaskStackChangeListener { + private class TaskStackListenerImpl extends TaskStackChangeListener { @Override public void onTaskStackChanged() { try { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/UserGridRecyclerView.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/UserGridRecyclerView.java index 67e512cf23f9..618a4c134049 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/car/UserGridRecyclerView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/UserGridRecyclerView.java @@ -22,7 +22,7 @@ import static android.content.DialogInterface.BUTTON_POSITIVE; import android.app.AlertDialog; import android.app.AlertDialog.Builder; import android.app.Dialog; -import android.car.user.CarUserManagerHelper; +import android.car.userlib.CarUserManagerHelper; import android.content.Context; import android.content.DialogInterface; import android.content.pm.UserInfo; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java index d5a52740c6d4..a3e982e77522 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java @@ -35,6 +35,8 @@ import android.os.ServiceManager; import android.os.SystemClock; import android.os.UserHandle; import android.provider.Settings; +import android.service.dreams.DreamService; +import android.service.dreams.IDreamManager; import android.service.notification.NotificationListenerService; import android.service.notification.NotificationStats; import android.service.notification.StatusBarNotification; @@ -58,7 +60,6 @@ import com.android.systemui.EventLogTags; import com.android.systemui.ForegroundServiceController; import com.android.systemui.R; import com.android.systemui.UiOffloadThread; -import com.android.systemui.recents.misc.SystemServicesProxy; import com.android.systemui.statusbar.NotificationLifetimeExtender; import com.android.systemui.statusbar.AlertingNotificationManager; import com.android.systemui.statusbar.AmbientPulseManager; @@ -127,11 +128,11 @@ public class NotificationEntryManager implements Dumpable, NotificationInflater. Dependency.get(NotificationListener.class); protected AmbientPulseManager mAmbientPulseManager = Dependency.get(AmbientPulseManager.class); + protected IDreamManager mDreamManager; protected IStatusBarService mBarService; protected NotificationPresenter mPresenter; protected Callback mCallback; protected PowerManager mPowerManager; - protected SystemServicesProxy mSystemServicesProxy; protected NotificationListenerService.RankingMap mLatestRankingMap; protected HeadsUpManager mHeadsUpManager; protected NotificationData mNotificationData; @@ -223,8 +224,9 @@ public class NotificationEntryManager implements Dumpable, NotificationInflater. mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); mBarService = IStatusBarService.Stub.asInterface( ServiceManager.getService(Context.STATUS_BAR_SERVICE)); + mDreamManager = IDreamManager.Stub.asInterface( + ServiceManager.checkService(DreamService.DREAM_SERVICE)); mMessagingUtil = new NotificationMessagingUtil(context); - mSystemServicesProxy = SystemServicesProxy.getInstance(mContext); mGroupManager.setPendingEntries(mPendingNotifications); } @@ -687,7 +689,13 @@ public class NotificationEntryManager implements Dumpable, NotificationInflater. } else { // Stop screensaver if the notification has a fullscreen intent. // (like an incoming phone call) - SystemServicesProxy.getInstance(mContext).awakenDreamsAsync(); + Dependency.get(UiOffloadThread.class).submit(() -> { + try { + mDreamManager.awaken(); + } catch (RemoteException e) { + e.printStackTrace(); + } + }); // not immersive & a fullscreen alert should be shown if (DEBUG) @@ -898,7 +906,13 @@ public class NotificationEntryManager implements Dumpable, NotificationInflater. return false; } - boolean inUse = mPowerManager.isScreenOn() && !mSystemServicesProxy.isDreaming(); + boolean isDreaming = false; + try { + isDreaming = mDreamManager.isDreaming(); + } catch (RemoteException e) { + Log.e(TAG, "Failed to query dream manager.", e); + } + boolean inUse = mPowerManager.isScreenOn() && !isDreaming; if (!inUse) { if (DEBUG) { 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 72c2c0bec31f..9978ec364cdb 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 @@ -87,7 +87,6 @@ import com.android.systemui.classifier.FalsingManager; import com.android.systemui.colorextraction.SysuiColorExtractor; import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin; import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin.MenuItem; -import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin.OnMenuEventListener; import com.android.systemui.plugins.statusbar.NotificationSwipeActionHelper; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.DragDownHelper.DragDownCallback; @@ -109,6 +108,7 @@ import com.android.systemui.statusbar.notification.NotificationData; import com.android.systemui.statusbar.notification.row.NotificationGuts; import com.android.systemui.statusbar.notification.logging.NotificationLogger; import com.android.systemui.statusbar.NotificationShelf; +import com.android.systemui.statusbar.notification.row.NotificationGutsManager; import com.android.systemui.statusbar.notification.row.NotificationSnooze; import com.android.systemui.statusbar.notification.row.StackScrollerDecorView; import com.android.systemui.statusbar.StatusBarStateController; @@ -146,11 +146,9 @@ import java.util.function.BiConsumer; * A layout which handles a dynamic amount of notifications and presents them in a scrollable stack. */ public class NotificationStackScrollLayout extends ViewGroup - implements Callback, ExpandHelper.Callback, ScrollAdapter, - OnHeightChangedListener, OnGroupChangeListener, - OnMenuEventListener, VisibilityLocationProvider, - NotificationListContainer, ConfigurationListener, DragDownCallback, AnimationStateHandler, - Dumpable { + implements ExpandHelper.Callback, ScrollAdapter, OnHeightChangedListener, + OnGroupChangeListener, VisibilityLocationProvider, NotificationListContainer, + ConfigurationListener, DragDownCallback, AnimationStateHandler, Dumpable { public static final float BACKGROUND_ALPHA_DIMMED = 0.7f; private static final String TAG = "StackScroller"; @@ -164,7 +162,7 @@ public class NotificationStackScrollLayout extends ViewGroup private static final int INVALID_POINTER = -1; private ExpandHelper mExpandHelper; - private NotificationSwipeHelper mSwipeHelper; + private final NotificationSwipeHelper mSwipeHelper; private boolean mSwipingInProgress; private int mCurrentStackHeight = Integer.MAX_VALUE; private final Paint mBackgroundPaint = new Paint(); @@ -291,10 +289,6 @@ public class NotificationStackScrollLayout extends ViewGroup */ private int mMaxScrollAfterExpand; private ExpandableNotificationRow.LongPressListener mLongPressListener; - - private NotificationMenuRowPlugin mCurrMenuRow; - private View mTranslatingParentView; - private View mMenuExposedView; boolean mCheckForLeavebehind; /** @@ -466,6 +460,9 @@ public class NotificationStackScrollLayout extends ViewGroup private Interpolator mDarkXInterpolator = Interpolators.FAST_OUT_SLOW_IN; private NotificationPanelView mNotificationPanel; + private final NotificationGutsManager + mNotificationGutsManager = Dependency.get(NotificationGutsManager.class); + @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) public NotificationStackScrollLayout(Context context) { this(context, null); @@ -495,7 +492,8 @@ public class NotificationStackScrollLayout extends ViewGroup minHeight, maxHeight); mExpandHelper.setEventSource(this); mExpandHelper.setScrollAdapter(this); - mSwipeHelper = new NotificationSwipeHelper(SwipeHelper.X, this, getContext()); + mSwipeHelper = new NotificationSwipeHelper(SwipeHelper.X, new SwipeHelperCallback(), + getContext(), new NotificationMenuListener()); mStackScrollAlgorithm = createStackScrollAlgorithm(context); initView(context); mFalsingManager = FalsingManager.getInstance(context); @@ -639,41 +637,6 @@ public class NotificationStackScrollLayout extends ViewGroup } @Override - @ShadeViewRefactor(RefactorComponent.INPUT) - public void onMenuClicked(View view, int x, int y, MenuItem item) { - if (mLongPressListener == null) { - return; - } - if (view instanceof ExpandableNotificationRow) { - ExpandableNotificationRow row = (ExpandableNotificationRow) view; - MetricsLogger.action(mContext, MetricsEvent.ACTION_TOUCH_GEAR, - row.getStatusBarNotification().getPackageName()); - } - mLongPressListener.onLongPress(view, x, y, item); - } - - @Override - @ShadeViewRefactor(RefactorComponent.INPUT) - public void onMenuReset(View row) { - if (mTranslatingParentView != null && row == mTranslatingParentView) { - mMenuExposedView = null; - mTranslatingParentView = null; - } - } - - @Override - @ShadeViewRefactor(RefactorComponent.INPUT) - public void onMenuShown(View row) { - mMenuExposedView = mTranslatingParentView; - if (row instanceof ExpandableNotificationRow) { - MetricsLogger.action(mContext, MetricsEvent.ACTION_REVEAL_GEAR, - ((ExpandableNotificationRow) row).getStatusBarNotification() - .getPackageName()); - } - mSwipeHelper.onMenuShown(row); - } - - @Override @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) public void onUiModeChanged() { mBgColor = mContext.getColor(R.color.notification_shade_background_color); @@ -1295,111 +1258,6 @@ public class NotificationStackScrollLayout extends ViewGroup mQsContainer = qsContainer; } - /** - * Handles cleanup after the given {@code view} has been fully swiped out (including - * re-invoking dismiss logic in case the notification has not made its way out yet). - */ - @Override - @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) - public void onChildDismissed(View view) { - ExpandableNotificationRow row = (ExpandableNotificationRow) view; - if (!row.isDismissed()) { - handleChildViewDismissed(view); - } - ViewGroup transientContainer = row.getTransientContainer(); - if (transientContainer != null) { - transientContainer.removeTransientView(view); - } - } - - /** - * Starts up notification dismiss and tells the notification, if any, to remove itself from - * layout. - * - * @param view view (e.g. notification) to dismiss from the layout - */ - - @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) - private void handleChildViewDismissed(View view) { - if (mDismissAllInProgress) { - return; - } - - boolean isBlockingHelperShown = false; - - setSwipingInProgress(false); - if (mDragAnimPendingChildren.contains(view)) { - // We start the swipe and finish it in the same frame; we don't want a drag animation. - mDragAnimPendingChildren.remove(view); - } - mAmbientState.onDragFinished(view); - updateContinuousShadowDrawing(); - - if (view instanceof ExpandableNotificationRow) { - ExpandableNotificationRow row = (ExpandableNotificationRow) view; - if (row.isHeadsUp()) { - mHeadsUpManager.addSwipedOutNotification(row.getStatusBarNotification().getKey()); - } - isBlockingHelperShown = - row.performDismissWithBlockingHelper(false /* fromAccessibility */); - } - - if (!isBlockingHelperShown) { - mSwipedOutViews.add(view); - } - mFalsingManager.onNotificationDismissed(); - if (mFalsingManager.shouldEnforceBouncer()) { - mStatusBar.executeRunnableDismissingKeyguard( - null, - null /* cancelAction */, - false /* dismissShade */, - true /* afterKeyguardGone */, - false /* deferred */); - } - } - - @Override - @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) - public void onChildSnappedBack(View animView, float targetLeft) { - mAmbientState.onDragFinished(animView); - updateContinuousShadowDrawing(); - if (!mDragAnimPendingChildren.contains(animView)) { - if (mAnimationsEnabled) { - mSnappedBackChildren.add(animView); - mNeedsAnimation = true; - } - requestChildrenUpdate(); - } else { - // We start the swipe and snap back in the same frame, we don't want any animation - mDragAnimPendingChildren.remove(animView); - } - if (mCurrMenuRow != null && targetLeft == 0) { - mCurrMenuRow.resetMenu(); - mCurrMenuRow = null; - } - } - - @Override - @ShadeViewRefactor(RefactorComponent.INPUT) - public boolean updateSwipeProgress(View animView, boolean dismissable, float swipeProgress) { - // Returning true prevents alpha fading. - return !mFadeNotificationsOnDismiss; - } - - @Override - @ShadeViewRefactor(RefactorComponent.INPUT) - public void onBeginDrag(View v) { - mFalsingManager.onNotificatonStartDismissing(); - setSwipingInProgress(true); - mAmbientState.onBeginDrag(v); - updateContinuousShadowDrawing(); - if (mAnimationsEnabled && (mIsExpanded || !isPinnedHeadsUp(v))) { - mDragAnimPendingChildren.add(v); - mNeedsAnimation = true; - } - requestChildrenUpdate(); - } - @ShadeViewRefactor(RefactorComponent.ADAPTER) public static boolean isPinnedHeadsUp(View v) { if (v instanceof ExpandableNotificationRow) { @@ -1418,41 +1276,6 @@ public class NotificationStackScrollLayout extends ViewGroup return false; } - @Override - @ShadeViewRefactor(RefactorComponent.INPUT) - public void onDragCancelled(View v) { - mFalsingManager.onNotificatonStopDismissing(); - setSwipingInProgress(false); - } - - @Override - @ShadeViewRefactor(RefactorComponent.INPUT) - public float getFalsingThresholdFactor() { - return mStatusBar.isWakeUpComingFromTouch() ? 1.5f : 1.0f; - } - - @Override - @ShadeViewRefactor(RefactorComponent.INPUT) - public View getChildAtPosition(MotionEvent ev) { - View child = getChildAtPosition(ev.getX(), ev.getY()); - if (child instanceof ExpandableNotificationRow) { - ExpandableNotificationRow row = (ExpandableNotificationRow) child; - ExpandableNotificationRow parent = row.getNotificationParent(); - if (parent != null && parent.areChildrenExpanded() - && (parent.areGutsExposed() - || mMenuExposedView == parent - || (parent.getNotificationChildren().size() == 1 - && parent.isClearable()))) { - // In this case the group is expanded and showing the menu for the - // group, further interaction should apply to the group, not any - // child notifications so we use the parent of the child. We also do the same - // if we only have a single child. - child = parent; - } - } - return child; - } - @ShadeViewRefactor(RefactorComponent.INPUT) public ExpandableView getClosestChildAtRawPosition(float touchX, float touchY) { getLocationOnScreen(mTempInt2); @@ -1696,18 +1519,11 @@ public class NotificationStackScrollLayout extends ViewGroup return mScrollingEnabled; } - @Override @ShadeViewRefactor(RefactorComponent.ADAPTER) - public boolean canChildBeDismissed(View v) { + private boolean canChildBeDismissed(View v) { return StackScrollAlgorithm.canChildBeDismissed(v); } - @Override - @ShadeViewRefactor(RefactorComponent.INPUT) - public boolean isAntiFalsingNeeded() { - return onKeyguard(); - } - @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) private boolean onKeyguard() { return mStatusBarState == StatusBarState.KEYGUARD; @@ -1787,8 +1603,8 @@ public class NotificationStackScrollLayout extends ViewGroup } // Check if we need to clear any snooze leavebehinds - NotificationGuts guts = mStatusBar.getGutsManager().getExposedGuts(); - if (guts != null && !isTouchInView(ev, guts) + NotificationGuts guts = mNotificationGutsManager.getExposedGuts(); + if (guts != null && !NotificationSwipeHelper.isTouchInView(ev, guts) && guts.getGutsContent() instanceof NotificationSnooze) { NotificationSnooze ns = (NotificationSnooze) guts.getGutsContent(); if ((ns.isExpanded() && isCancelOrUp) @@ -3013,11 +2829,11 @@ public class NotificationStackScrollLayout extends ViewGroup } // Check if we need to clear any snooze leavebehinds boolean isUp = ev.getActionMasked() == MotionEvent.ACTION_UP; - NotificationGuts guts = mStatusBar.getGutsManager().getExposedGuts(); - if (!isTouchInView(ev, guts) && isUp && !swipeWantsIt && !expandWantsIt - && !scrollWantsIt) { + NotificationGuts guts = mNotificationGutsManager.getExposedGuts(); + if (!NotificationSwipeHelper.isTouchInView(ev, guts) && isUp && !swipeWantsIt && + !expandWantsIt && !scrollWantsIt) { mCheckForLeavebehind = false; - mStatusBar.getGutsManager().closeAndSaveGuts(true /* removeLeavebehind */, + mNotificationGutsManager.closeAndSaveGuts(true /* removeLeavebehind */, false /* force */, false /* removeControls */, -1 /* x */, -1 /* y */, false /* resetMenu */); } @@ -3077,8 +2893,8 @@ public class NotificationStackScrollLayout extends ViewGroup @ShadeViewRefactor(RefactorComponent.STATE_RESOLVER) @Override public void cleanUpViewState(View child) { - if (child == mTranslatingParentView) { - mTranslatingParentView = null; + if (child == mSwipeHelper.getTranslatingParentView()) { + mSwipeHelper.clearTranslatingParentView(); } mCurrentStackScrollState.removeViewStateForView(child); } @@ -3986,7 +3802,7 @@ public class NotificationStackScrollLayout extends ViewGroup @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) public void checkSnoozeLeavebehind() { if (mCheckForLeavebehind) { - mStatusBar.getGutsManager().closeAndSaveGuts(true /* removeLeavebehind */, + mNotificationGutsManager.closeAndSaveGuts(true /* removeLeavebehind */, false /* force */, false /* removeControls */, -1 /* x */, -1 /* y */, false /* resetMenu */); mCheckForLeavebehind = false; @@ -4068,7 +3884,7 @@ public class NotificationStackScrollLayout extends ViewGroup } @ShadeViewRefactor(RefactorComponent.COORDINATOR) - private void setIsExpanded(boolean isExpanded) { + public void setIsExpanded(boolean isExpanded) { boolean changed = isExpanded != mIsExpanded; mIsExpanded = isExpanded; mStackScrollAlgorithm.setIsExpanded(isExpanded); @@ -5242,8 +5058,8 @@ public class NotificationStackScrollLayout extends ViewGroup setFooterView(footerView); } - @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) - private void inflateEmptyShadeView() { + @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) + private void inflateEmptyShadeView() { EmptyShadeView view = (EmptyShadeView) LayoutInflater.from(mContext).inflate( R.layout.status_bar_no_notifications, this, false); view.setText(R.string.empty_shade_text); @@ -5274,8 +5090,8 @@ public class NotificationStackScrollLayout extends ViewGroup mScrimController.setNotificationCount(getNotGoneChildCount()); } - @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) - public void setNotificationPanel(NotificationPanelView notificationPanelView) { + @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) + public void setNotificationPanel(NotificationPanelView notificationPanelView) { mNotificationPanel = notificationPanelView; } @@ -5293,306 +5109,29 @@ public class NotificationStackScrollLayout extends ViewGroup @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) public interface OnOverscrollTopChangedListener { - /** - * Notifies a listener that the overscroll has changed. - * - * @param amount the amount of overscroll, in pixels - * @param isRubberbanded if true, this is a rubberbanded overscroll; if false, this is an - * unrubberbanded motion to directly expand overscroll view (e.g - * expand - * QS) - */ - void onOverscrollTopChanged(float amount, boolean isRubberbanded); - - /** - * Notify a listener that the scroller wants to escape from the scrolling motion and - * start a fling animation to the expanded or collapsed overscroll view (e.g expand the QS) - * - * @param velocity The velocity that the Scroller had when over flinging - * @param open Should the fling open or close the overscroll view. - */ - void flingTopOverscroll(float velocity, boolean open); - } - - @ShadeViewRefactor(RefactorComponent.INPUT) - private class NotificationSwipeHelper extends SwipeHelper - implements NotificationSwipeActionHelper { - private static final long COVER_MENU_DELAY = 4000; - private Runnable mFalsingCheck; - private Handler mHandler; - - private static final long SWIPE_MENU_TIMING = 200; - - public NotificationSwipeHelper(int swipeDirection, Callback callback, Context context) { - super(swipeDirection, callback, context); - mHandler = new Handler(); - mFalsingCheck = new Runnable() { - @Override - public void run() { - resetExposedMenuView(true /* animate */, true /* force */); - } - }; - } - - @Override - public void onDownUpdate(View currView, MotionEvent ev) { - mTranslatingParentView = currView; - if (mCurrMenuRow != null) { - mCurrMenuRow.onTouchStart(); - } - mCurrMenuRow = null; - mHandler.removeCallbacks(mFalsingCheck); - - // Slide back any notifications that might be showing a menu - resetExposedMenuView(true /* animate */, false /* force */); - - if (currView instanceof ExpandableNotificationRow) { - ExpandableNotificationRow row = (ExpandableNotificationRow) currView; - - if (row.getEntry().hasFinishedInitialization()) { - mCurrMenuRow = row.createMenu(); - mCurrMenuRow.setMenuClickListener(NotificationStackScrollLayout.this); - mCurrMenuRow.onTouchStart(); - } - } - } - - private boolean swipedEnoughToShowMenu(NotificationMenuRowPlugin menuRow) { - return !swipedFarEnough() && menuRow.isSwipedEnoughToShowMenu(); - } - - @Override - public void onMoveUpdate(View view, MotionEvent ev, float translation, float delta) { - mHandler.removeCallbacks(mFalsingCheck); - if (mCurrMenuRow != null) { - mCurrMenuRow.onTouchMove(delta); - } - } - - @Override - public boolean handleUpEvent(MotionEvent ev, View animView, float velocity, - float translation) { - if (mCurrMenuRow != null) { - mCurrMenuRow.onTouchEnd(); - handleMenuRowSwipe(ev, animView, velocity, mCurrMenuRow); - return true; - } - return false; - } - - @Override - public boolean swipedFarEnough(float translation, float viewSize) { - return swipedFarEnough(); - } - - private void handleMenuRowSwipe(MotionEvent ev, View animView, float velocity, - NotificationMenuRowPlugin menuRow) { - if (!menuRow.shouldShowMenu()) { - // If the menu should not be shown, then there is no need to check if the a swipe - // should result in a snapping to the menu. As a result, just check if the swipe - // was enough to dismiss the notification. - if (isDismissGesture(ev)) { - dismiss(animView, velocity); - } else { - snapBack(animView, velocity); - menuRow.onSnapClosed(); - } - return; - } - - if (menuRow.isSnappedAndOnSameSide()) { - // Menu was snapped to previously and we're on the same side - handleSwipeFromSnap(ev, animView, velocity, menuRow); - } else { - // Menu has not been snapped, or was snapped previously but is now on - // the opposite side. - handleSwipeFromNonSnap(ev, animView, velocity, menuRow); - } - } - - private void handleSwipeFromNonSnap(MotionEvent ev, View animView, float velocity, - NotificationMenuRowPlugin menuRow) { - boolean isDismissGesture = isDismissGesture(ev); - final boolean gestureTowardsMenu = menuRow.isTowardsMenu(velocity); - final boolean gestureFastEnough = - mSwipeHelper.getMinDismissVelocity() <= Math.abs(velocity); - - final double timeForGesture = ev.getEventTime() - ev.getDownTime(); - final boolean showMenuForSlowOnGoing = !menuRow.canBeDismissed() - && timeForGesture >= SWIPE_MENU_TIMING; - - if (!isFalseGesture(ev) - && (swipedEnoughToShowMenu(menuRow) - && (!gestureFastEnough || showMenuForSlowOnGoing)) - || (gestureTowardsMenu && !isDismissGesture)) { - // Menu has not been snapped to previously and this is menu revealing gesture - snapOpen(animView, menuRow.getMenuSnapTarget(), velocity); - menuRow.onSnapOpen(); - } else if (isDismissGesture(ev) && !gestureTowardsMenu) { - dismiss(animView, velocity); - menuRow.onDismiss(); - } else { - snapBack(animView, velocity); - menuRow.onSnapClosed(); - } - } - - private void handleSwipeFromSnap(MotionEvent ev, View animView, float velocity, - NotificationMenuRowPlugin menuRow) { - boolean isDismissGesture = isDismissGesture(ev); - - final boolean withinSnapMenuThreshold = - menuRow.isWithinSnapMenuThreshold(); - - if (withinSnapMenuThreshold && !isDismissGesture) { - // Haven't moved enough to unsnap from the menu - menuRow.onSnapOpen(); - snapOpen(animView, menuRow.getMenuSnapTarget(), velocity); - } else if (isDismissGesture && !menuRow.shouldSnapBack()) { - // Only dismiss if we're not moving towards the menu - dismiss(animView, velocity); - menuRow.onDismiss(); - } else { - snapBack(animView, velocity); - menuRow.onSnapClosed(); - } - } - - @Override - public void dismissChild(final View view, float velocity, - boolean useAccelerateInterpolator) { - super.dismissChild(view, velocity, useAccelerateInterpolator); - if (mIsExpanded) { - // We don't want to quick-dismiss when it's a heads up as this might lead to closing - // of the panel early. - handleChildViewDismissed(view); - } - mStatusBar.getGutsManager().closeAndSaveGuts(true /* removeLeavebehind */, - false /* force */, false /* removeControls */, -1 /* x */, -1 /* y */, - false /* resetMenu */); - handleMenuCoveredOrDismissed(); - } - - @Override - public void snapChild(final View animView, final float targetLeft, float velocity) { - super.snapChild(animView, targetLeft, velocity); - onDragCancelled(animView); - if (targetLeft == 0) { - handleMenuCoveredOrDismissed(); - } - } - - @Override - public void snooze(StatusBarNotification sbn, SnoozeOption snoozeOption) { - mStatusBar.setNotificationSnoozed(sbn, snoozeOption); - } - - private void handleMenuCoveredOrDismissed() { - if (mMenuExposedView != null && mMenuExposedView == mTranslatingParentView) { - mMenuExposedView = null; - } - } - - @Override - public Animator getViewTranslationAnimator(View v, float target, - AnimatorUpdateListener listener) { - if (v instanceof ExpandableNotificationRow) { - return ((ExpandableNotificationRow) v).getTranslateViewAnimator(target, listener); - } else { - return super.getViewTranslationAnimator(v, target, listener); - } - } - - @Override - public void setTranslation(View v, float translate) { - ((ExpandableView) v).setTranslation(translate); - } - - @Override - public float getTranslation(View v) { - return ((ExpandableView) v).getTranslation(); - } - - @Override - public void dismiss(View animView, float velocity) { - dismissChild(animView, velocity, - !swipedFastEnough(0, 0) /* useAccelerateInterpolator */); - } - - @Override - public void snapOpen(View animView, int targetLeft, float velocity) { - snapChild(animView, targetLeft, velocity); - } - - private void snapBack(View animView, float velocity) { - snapChild(animView, 0, velocity); - } - - @Override - public boolean swipedFastEnough(float translation, float velocity) { - return swipedFastEnough(); - } - - @Override - public float getMinDismissVelocity() { - return getEscapeVelocity(); - } - - public void onMenuShown(View animView) { - onDragCancelled(animView); - - // If we're on the lockscreen we want to false this. - if (isAntiFalsingNeeded()) { - mHandler.removeCallbacks(mFalsingCheck); - mHandler.postDelayed(mFalsingCheck, COVER_MENU_DELAY); - } - } - - public void closeControlsIfOutsideTouch(MotionEvent ev) { - NotificationGuts guts = mStatusBar.getGutsManager().getExposedGuts(); - View view = null; - if (guts != null && !guts.getGutsContent().isLeavebehind()) { - // Only close visible guts if they're not a leavebehind. - view = guts; - } else if (mCurrMenuRow != null && mCurrMenuRow.isMenuVisible() - && mTranslatingParentView != null) { - // Checking menu - view = mTranslatingParentView; - } - if (view != null && !isTouchInView(ev, view)) { - // Touch was outside visible guts / menu notification, close what's visible - mStatusBar.getGutsManager().closeAndSaveGuts(false /* removeLeavebehind */, - false /* force */, true /* removeControls */, -1 /* x */, -1 /* y */, - false /* resetMenu */); - resetExposedMenuView(true /* animate */, true /* force */); - } - } + /** + * Notifies a listener that the overscroll has changed. + * + * @param amount the amount of overscroll, in pixels + * @param isRubberbanded if true, this is a rubberbanded overscroll; if false, this is an + * unrubberbanded motion to directly expand overscroll view (e.g + * expand + * QS) + */ + void onOverscrollTopChanged(float amount, boolean isRubberbanded); - public void resetExposedMenuView(boolean animate, boolean force) { - if (mMenuExposedView == null - || (!force && mMenuExposedView == mTranslatingParentView)) { - // If no menu is showing or it's showing for this view we do nothing. - return; - } - final View prevMenuExposedView = mMenuExposedView; - if (animate) { - Animator anim = getViewTranslationAnimator(prevMenuExposedView, - 0 /* leftTarget */, null /* updateListener */); - if (anim != null) { - anim.start(); - } - } else if (mMenuExposedView instanceof ExpandableNotificationRow) { - ExpandableNotificationRow row = (ExpandableNotificationRow) mMenuExposedView; - if (!row.isRemoved()) { - row.resetTranslation(); - } - } - mMenuExposedView = null; - } - } + /** + * Notify a listener that the scroller wants to escape from the scrolling motion and + * start a fling animation to the expanded or collapsed overscroll view (e.g expand the QS) + * + * @param velocity The velocity that the Scroller had when over flinging + * @param open Should the fling open or close the overscroll view. + */ + void flingTopOverscroll(float velocity, boolean open); + } - @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) - public boolean hasActiveNotifications() { + @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) + public boolean hasActiveNotifications() { return !mEntryManager.getNotificationData().getActiveNotifications().isEmpty(); } @@ -5656,8 +5195,8 @@ public class NotificationStackScrollLayout extends ViewGroup return mStatusBarState == StatusBarState.KEYGUARD; } - @ShadeViewRefactor(RefactorComponent.INPUT) - public void updateSpeedBumpIndex() { + @ShadeViewRefactor(RefactorComponent.INPUT) + public void updateSpeedBumpIndex() { int speedBumpIndex = 0; int currentIndex = 0; final int N = getChildCount(); @@ -5677,24 +5216,6 @@ public class NotificationStackScrollLayout extends ViewGroup updateSpeedBumpIndex(speedBumpIndex, noAmbient); } - @ShadeViewRefactor(RefactorComponent.INPUT) - private boolean isTouchInView(MotionEvent ev, View view) { - if (view == null) { - return false; - } - final int height = (view instanceof ExpandableView) - ? ((ExpandableView) view).getActualHeight() - : view.getHeight(); - final int rx = (int) ev.getRawX(); - final int ry = (int) ev.getRawY(); - view.getLocationOnScreen(mTempInt2); - final int x = mTempInt2[0]; - final int y = mTempInt2[1]; - Rect rect = new Rect(x, y, x + view.getWidth(), y + height); - boolean ret = rect.contains(rx, ry); - return ret; - } - @ShadeViewRefactor(RefactorComponent.STATE_RESOLVER) private void updateContinuousShadowDrawing() { boolean continuousShadowUpdate = mAnimationRunning @@ -5718,11 +5239,29 @@ public class NotificationStackScrollLayout extends ViewGroup @ShadeViewRefactor(RefactorComponent.INPUT) public void closeControlsIfOutsideTouch(MotionEvent ev) { - mSwipeHelper.closeControlsIfOutsideTouch(ev); + NotificationGuts guts = mNotificationGutsManager.getExposedGuts(); + NotificationMenuRowPlugin menuRow = mSwipeHelper.getCurrentMenuRow(); + View translatingParentView = mSwipeHelper.getTranslatingParentView(); + View view = null; + if (guts != null && !guts.getGutsContent().isLeavebehind()) { + // Only close visible guts if they're not a leavebehind. + view = guts; + } else if (menuRow != null && menuRow.isMenuVisible() + && translatingParentView != null) { + // Checking menu + view = translatingParentView; + } + if (view != null && !NotificationSwipeHelper.isTouchInView(ev, view)) { + // Touch was outside visible guts / menu notification, close what's visible + mNotificationGutsManager.closeAndSaveGuts(false /* removeLeavebehind */, + false /* force */, true /* removeControls */, -1 /* x */, -1 /* y */, + false /* resetMenu */); + resetExposedMenuView(true /* animate */, true /* force */); + } } - @ShadeViewRefactor(RefactorComponent.STATE_RESOLVER) - static class AnimationEvent { + @ShadeViewRefactor(RefactorComponent.STATE_RESOLVER) + static class AnimationEvent { static AnimationFilter[] FILTERS = new AnimationFilter[]{ @@ -6022,8 +5561,8 @@ public class NotificationStackScrollLayout extends ViewGroup } } - @ShadeViewRefactor(RefactorComponent.STATE_RESOLVER) - private final StateListener mStateListener = new StateListener() { + @ShadeViewRefactor(RefactorComponent.STATE_RESOLVER) + private final StateListener mStateListener = new StateListener() { @Override public void onStatePreChange(int oldState, int newState) { if (oldState == StatusBarState.SHADE_LOCKED && newState == StatusBarState.KEYGUARD) { @@ -6036,9 +5575,222 @@ public class NotificationStackScrollLayout extends ViewGroup setStatusBarState(newState); } - @Override - public void onStatePostChange() { + @Override + public void onStatePostChange() { NotificationStackScrollLayout.this.onStatePostChange(); } - }; + }; + + class NotificationMenuListener implements NotificationMenuRowPlugin.OnMenuEventListener { + @Override + @ShadeViewRefactor(RefactorComponent.INPUT) + public void onMenuClicked(View view, int x, int y, MenuItem item) { + if (mLongPressListener == null) { + return; + } + if (view instanceof ExpandableNotificationRow) { + ExpandableNotificationRow row = (ExpandableNotificationRow) view; + MetricsLogger.action(mContext, MetricsEvent.ACTION_TOUCH_GEAR, + row.getStatusBarNotification().getPackageName()); + } + mLongPressListener.onLongPress(view, x, y, item); + } + + @Override + @ShadeViewRefactor(RefactorComponent.INPUT) + public void onMenuReset(View row) { + View translatingParentView = mSwipeHelper.getTranslatingParentView(); + if (translatingParentView != null && row == translatingParentView) { + mSwipeHelper.clearExposedMenuView(); + mSwipeHelper.clearTranslatingParentView(); + } + } + + @Override + @ShadeViewRefactor(RefactorComponent.INPUT) + public void onMenuShown(View row) { + if (row instanceof ExpandableNotificationRow) { + MetricsLogger.action(mContext, MetricsEvent.ACTION_REVEAL_GEAR, + ((ExpandableNotificationRow) row).getStatusBarNotification() + .getPackageName()); + } + mSwipeHelper.onMenuShown(row); + } + } + + class SwipeHelperCallback implements NotificationSwipeHelper.NotificationCallback { + @Override + public void onDismiss() { + mNotificationGutsManager.closeAndSaveGuts(true /* removeLeavebehind */, + false /* force */, false /* removeControls */, -1 /* x */, -1 /* y */, + false /* resetMenu */); + } + + @Override + public void onSnooze(StatusBarNotification sbn, + NotificationSwipeActionHelper.SnoozeOption snoozeOption) { + mStatusBar.setNotificationSnoozed(sbn, snoozeOption); + } + + @Override + public boolean isExpanded() { + return NotificationStackScrollLayout.this.isExpanded(); + } + + @Override + @ShadeViewRefactor(RefactorComponent.INPUT) + public void onDragCancelled(View v) { + mFalsingManager.onNotificatonStopDismissing(); + setSwipingInProgress(false); + } + + /** + * Handles cleanup after the given {@code view} has been fully swiped out (including + * re-invoking dismiss logic in case the notification has not made its way out yet). + */ + @Override + @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) + public void onChildDismissed(View view) { + ExpandableNotificationRow row = (ExpandableNotificationRow) view; + if (!row.isDismissed()) { + handleChildViewDismissed(view); + } + ViewGroup transientContainer = row.getTransientContainer(); + if (transientContainer != null) { + transientContainer.removeTransientView(view); + } + } + + /** + * Starts up notification dismiss and tells the notification, if any, to remove itself from + * layout. + * + * @param view view (e.g. notification) to dismiss from the layout + */ + + @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) + public void handleChildViewDismissed(View view) { + if (mDismissAllInProgress) { + return; + } + + boolean isBlockingHelperShown = false; + + setSwipingInProgress(false); + if (mDragAnimPendingChildren.contains(view)) { + // We start the swipe and finish it in the same frame; we don't want a drag + // animation. + mDragAnimPendingChildren.remove(view); + } + mAmbientState.onDragFinished(view); + updateContinuousShadowDrawing(); + + if (view instanceof ExpandableNotificationRow) { + ExpandableNotificationRow row = (ExpandableNotificationRow) view; + if (row.isHeadsUp()) { + mHeadsUpManager.addSwipedOutNotification( + row.getStatusBarNotification().getKey()); + } + isBlockingHelperShown = + row.performDismissWithBlockingHelper(false /* fromAccessibility */); + } + + if (!isBlockingHelperShown) { + mSwipedOutViews.add(view); + } + mFalsingManager.onNotificationDismissed(); + if (mFalsingManager.shouldEnforceBouncer()) { + mStatusBar.executeRunnableDismissingKeyguard( + null, + null /* cancelAction */, + false /* dismissShade */, + true /* afterKeyguardGone */, + false /* deferred */); + } + } + + @Override + @ShadeViewRefactor(RefactorComponent.INPUT) + public boolean isAntiFalsingNeeded() { + return onKeyguard(); + } + + @Override + @ShadeViewRefactor(RefactorComponent.INPUT) + public View getChildAtPosition(MotionEvent ev) { + View child = NotificationStackScrollLayout.this.getChildAtPosition(ev.getX(), + ev.getY()); + if (child instanceof ExpandableNotificationRow) { + ExpandableNotificationRow row = (ExpandableNotificationRow) child; + ExpandableNotificationRow parent = row.getNotificationParent(); + if (parent != null && parent.areChildrenExpanded() + && (parent.areGutsExposed() + || mSwipeHelper.getExposedMenuView() == parent + || (parent.getNotificationChildren().size() == 1 + && parent.isClearable()))) { + // In this case the group is expanded and showing the menu for the + // group, further interaction should apply to the group, not any + // child notifications so we use the parent of the child. We also do the same + // if we only have a single child. + child = parent; + } + } + return child; + } + + @Override + @ShadeViewRefactor(RefactorComponent.INPUT) + public void onBeginDrag(View v) { + mFalsingManager.onNotificatonStartDismissing(); + setSwipingInProgress(true); + mAmbientState.onBeginDrag(v); + updateContinuousShadowDrawing(); + if (mAnimationsEnabled && (mIsExpanded || !isPinnedHeadsUp(v))) { + mDragAnimPendingChildren.add(v); + mNeedsAnimation = true; + } + requestChildrenUpdate(); + } + + @Override + @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) + public void onChildSnappedBack(View animView, float targetLeft) { + mAmbientState.onDragFinished(animView); + updateContinuousShadowDrawing(); + if (!mDragAnimPendingChildren.contains(animView)) { + if (mAnimationsEnabled) { + mSnappedBackChildren.add(animView); + mNeedsAnimation = true; + } + requestChildrenUpdate(); + } else { + // We start the swipe and snap back in the same frame, we don't want any animation + mDragAnimPendingChildren.remove(animView); + } + NotificationMenuRowPlugin menuRow = mSwipeHelper.getCurrentMenuRow(); + if (menuRow != null && targetLeft == 0) { + menuRow.resetMenu(); + mSwipeHelper.clearCurrentMenuRow(); + } + } + + @Override + @ShadeViewRefactor(RefactorComponent.INPUT) + public boolean updateSwipeProgress(View animView, boolean dismissable, + float swipeProgress) { + // Returning true prevents alpha fading. + return !mFadeNotificationsOnDismiss; + } + + @Override + @ShadeViewRefactor(RefactorComponent.INPUT) + public float getFalsingThresholdFactor() { + return mStatusBar.isWakeUpComingFromTouch() ? 1.5f : 1.0f; + } + + @Override + public boolean canChildBeDismissed(View v) { + return NotificationStackScrollLayout.this.canChildBeDismissed(v); + } + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelper.java new file mode 100644 index 000000000000..028957d233ff --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelper.java @@ -0,0 +1,424 @@ +/* + * 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 Licen + */ + + +package com.android.systemui.statusbar.notification.stack; + +import android.animation.Animator; +import android.animation.ValueAnimator; +import android.content.Context; +import android.graphics.Rect; +import android.os.Handler; +import android.service.notification.StatusBarNotification; +import android.util.Log; +import android.view.MotionEvent; +import android.view.View; + +import com.android.internal.annotations.VisibleForTesting; +import com.android.systemui.SwipeHelper; +import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin; +import com.android.systemui.plugins.statusbar.NotificationSwipeActionHelper; +import com.android.systemui.statusbar.notification.ShadeViewRefactor; +import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; +import com.android.systemui.statusbar.notification.row.ExpandableView; + +@ShadeViewRefactor(ShadeViewRefactor.RefactorComponent.INPUT) +class NotificationSwipeHelper extends SwipeHelper + implements NotificationSwipeActionHelper { + @VisibleForTesting + protected static final long COVER_MENU_DELAY = 4000; + private static final String TAG = "NotificationSwipeHelper"; + private final Runnable mFalsingCheck; + private View mTranslatingParentView; + private View mMenuExposedView; + private final NotificationCallback mCallback; + private final NotificationMenuRowPlugin.OnMenuEventListener mMenuListener; + + private static final long SWIPE_MENU_TIMING = 200; + + private NotificationMenuRowPlugin mCurrMenuRow; + + public NotificationSwipeHelper(int swipeDirection, NotificationCallback callback, + Context context, NotificationMenuRowPlugin.OnMenuEventListener menuListener) { + super(swipeDirection, callback, context); + mMenuListener = menuListener; + mCallback = callback; + mFalsingCheck = new Runnable() { + @Override + public void run() { + resetExposedMenuView(true /* animate */, true /* force */); + } + }; + } + + public View getTranslatingParentView() { + return mTranslatingParentView; + } + + public void clearTranslatingParentView() { setTranslatingParentView(null); } + + @VisibleForTesting + protected void setTranslatingParentView(View view) { mTranslatingParentView = view; }; + + public void setExposedMenuView(View view) { + mMenuExposedView = view; + } + + public void clearExposedMenuView() { setExposedMenuView(null); } + + public void clearCurrentMenuRow() { setCurrentMenuRow(null); } + + public View getExposedMenuView() { + return mMenuExposedView; + } + + public void setCurrentMenuRow(NotificationMenuRowPlugin menuRow) { + mCurrMenuRow = menuRow; + } + + public NotificationMenuRowPlugin getCurrentMenuRow() { return mCurrMenuRow; } + + @VisibleForTesting + protected Handler getHandler() { return mHandler; } + + @VisibleForTesting + protected Runnable getFalsingCheck() { return mFalsingCheck; }; + + @Override + public void onDownUpdate(View currView, MotionEvent ev) { + mTranslatingParentView = currView; + NotificationMenuRowPlugin menuRow = getCurrentMenuRow(); + if (menuRow != null) { + menuRow.onTouchStart(); + } + clearCurrentMenuRow(); + getHandler().removeCallbacks(getFalsingCheck()); + + // Slide back any notifications that might be showing a menu + resetExposedMenuView(true /* animate */, false /* force */); + + if (currView instanceof ExpandableNotificationRow) { + initializeRow((ExpandableNotificationRow) currView); + } + } + + @VisibleForTesting + protected void initializeRow(ExpandableNotificationRow row) { + if (row.getEntry().hasFinishedInitialization()) { + mCurrMenuRow = row.createMenu(); + mCurrMenuRow.setMenuClickListener(mMenuListener); + mCurrMenuRow.onTouchStart(); + } + } + + private boolean swipedEnoughToShowMenu(NotificationMenuRowPlugin menuRow) { + return !swipedFarEnough() && menuRow.isSwipedEnoughToShowMenu(); + } + + @Override + public void onMoveUpdate(View view, MotionEvent ev, float translation, float delta) { + getHandler().removeCallbacks(getFalsingCheck()); + NotificationMenuRowPlugin menuRow = getCurrentMenuRow(); + if (menuRow != null) { + menuRow.onTouchMove(delta); + } + } + + @Override + public boolean handleUpEvent(MotionEvent ev, View animView, float velocity, + float translation) { + NotificationMenuRowPlugin menuRow = getCurrentMenuRow(); + if (menuRow != null) { + menuRow.onTouchEnd(); + handleMenuRowSwipe(ev, animView, velocity, menuRow); + return true; + } + return false; + } + + @VisibleForTesting + protected void handleMenuRowSwipe(MotionEvent ev, View animView, float velocity, + NotificationMenuRowPlugin menuRow) { + if (!menuRow.shouldShowMenu()) { + // If the menu should not be shown, then there is no need to check if the a swipe + // should result in a snapping to the menu. As a result, just check if the swipe + // was enough to dismiss the notification. + if (isDismissGesture(ev)) { + dismiss(animView, velocity); + } else { + snapClosed(animView, velocity); + menuRow.onSnapClosed(); + } + return; + } + + if (menuRow.isSnappedAndOnSameSide()) { + // Menu was snapped to previously and we're on the same side + handleSwipeFromSnap(ev, animView, velocity, menuRow); + } else { + // Menu has not been snapped, or was snapped previously but is now on + // the opposite side. + handleSwipeFromNonSnap(ev, animView, velocity, menuRow); + } + } + + private void handleSwipeFromNonSnap(MotionEvent ev, View animView, float velocity, + NotificationMenuRowPlugin menuRow) { + boolean isDismissGesture = isDismissGesture(ev); + final boolean gestureTowardsMenu = menuRow.isTowardsMenu(velocity); + final boolean gestureFastEnough = getEscapeVelocity() <= Math.abs(velocity); + + final double timeForGesture = ev.getEventTime() - ev.getDownTime(); + final boolean showMenuForSlowOnGoing = !menuRow.canBeDismissed() + && timeForGesture >= SWIPE_MENU_TIMING; + + if (!isFalseGesture(ev) + && (swipedEnoughToShowMenu(menuRow) + && (!gestureFastEnough || showMenuForSlowOnGoing)) + || (gestureTowardsMenu && !isDismissGesture)) { + // Menu has not been snapped to previously and this is menu revealing gesture + snapOpen(animView, menuRow.getMenuSnapTarget(), velocity); + menuRow.onSnapOpen(); + } else if (isDismissGesture(ev) && !gestureTowardsMenu) { + dismiss(animView, velocity); + menuRow.onDismiss(); + } else { + snapClosed(animView, velocity); + menuRow.onSnapClosed(); + } + } + + private void handleSwipeFromSnap(MotionEvent ev, View animView, float velocity, + NotificationMenuRowPlugin menuRow) { + boolean isDismissGesture = isDismissGesture(ev); + + final boolean withinSnapMenuThreshold = + menuRow.isWithinSnapMenuThreshold(); + + if (withinSnapMenuThreshold && !isDismissGesture) { + // Haven't moved enough to unsnap from the menu + menuRow.onSnapOpen(); + snapOpen(animView, menuRow.getMenuSnapTarget(), velocity); + } else if (isDismissGesture && !menuRow.shouldSnapBack()) { + // Only dismiss if we're not moving towards the menu + dismiss(animView, velocity); + menuRow.onDismiss(); + } else { + snapClosed(animView, velocity); + menuRow.onSnapClosed(); + } + } + + @Override + public void dismissChild(final View view, float velocity, + boolean useAccelerateInterpolator) { + superDismissChild(view, velocity, useAccelerateInterpolator); + if (mCallback.isExpanded()) { + // We don't want to quick-dismiss when it's a heads up as this might lead to closing + // of the panel early. + mCallback.handleChildViewDismissed(view); + } + mCallback.onDismiss(); + handleMenuCoveredOrDismissed(); + } + + @VisibleForTesting + protected void superDismissChild(final View view, float velocity, boolean useAccelerateInterpolator) { + super.dismissChild(view, velocity, useAccelerateInterpolator); + } + + @VisibleForTesting + protected void superSnapChild(final View animView, final float targetLeft, float velocity) { + super.snapChild(animView, targetLeft, velocity); + } + + @Override + public void snapChild(final View animView, final float targetLeft, float velocity) { + superSnapChild(animView, targetLeft, velocity); + mCallback.onDragCancelled(animView); + if (targetLeft == 0) { + handleMenuCoveredOrDismissed(); + } + } + + @Override + public void snooze(StatusBarNotification sbn, SnoozeOption snoozeOption) { + mCallback.onSnooze(sbn, snoozeOption); + } + + @VisibleForTesting + protected void handleMenuCoveredOrDismissed() { + View exposedMenuView = getExposedMenuView(); + if (exposedMenuView != null && exposedMenuView == mTranslatingParentView) { + clearExposedMenuView(); + } + } + + @VisibleForTesting + protected Animator superGetViewTranslationAnimator(View v, float target, + ValueAnimator.AnimatorUpdateListener listener) { + return super.getViewTranslationAnimator(v, target, listener); + } + + @Override + public Animator getViewTranslationAnimator(View v, float target, + ValueAnimator.AnimatorUpdateListener listener) { + if (v instanceof ExpandableNotificationRow) { + return ((ExpandableNotificationRow) v).getTranslateViewAnimator(target, listener); + } else { + return superGetViewTranslationAnimator(v, target, listener); + } + } + + @Override + public void setTranslation(View v, float translate) { + if (v instanceof ExpandableNotificationRow) { + ((ExpandableNotificationRow) v).setTranslation(translate); + } else { + Log.wtf(TAG, "setTranslation should only be called on an ExpandableNotificationRow."); + } + } + + @Override + public float getTranslation(View v) { + if (v instanceof ExpandableNotificationRow) { + return ((ExpandableNotificationRow) v).getTranslation(); + } + else { + Log.wtf(TAG, "getTranslation should only be called on an ExpandableNotificationRow."); + return 0f; + } + } + + @Override + public boolean swipedFastEnough(float translation, float viewSize) { + return swipedFastEnough(); + } + + @Override + @VisibleForTesting + protected boolean swipedFastEnough() { + return super.swipedFastEnough(); + } + + @Override + public boolean swipedFarEnough(float translation, float viewSize) { + return swipedFarEnough(); + } + + @Override + @VisibleForTesting + protected boolean swipedFarEnough() { + return super.swipedFarEnough(); + } + + @Override + public void dismiss(View animView, float velocity) { + dismissChild(animView, velocity, + !swipedFastEnough() /* useAccelerateInterpolator */); + } + + @Override + public void snapOpen(View animView, int targetLeft, float velocity) { + snapChild(animView, targetLeft, velocity); + } + + @VisibleForTesting + protected void snapClosed(View animView, float velocity) { + snapChild(animView, 0, velocity); + } + + @Override + @VisibleForTesting + protected float getEscapeVelocity() { + return super.getEscapeVelocity(); + } + + @Override + public float getMinDismissVelocity() { + return getEscapeVelocity(); + } + + public void onMenuShown(View animView) { + setExposedMenuView(getTranslatingParentView()); + mCallback.onDragCancelled(animView); + Handler handler = getHandler(); + + // If we're on the lockscreen we want to false this. + if (mCallback.isAntiFalsingNeeded()) { + handler.removeCallbacks(getFalsingCheck()); + handler.postDelayed(getFalsingCheck(), COVER_MENU_DELAY); + } + } + + @VisibleForTesting + protected boolean shouldResetMenu(boolean force) { + if (mMenuExposedView == null + || (!force && mMenuExposedView == mTranslatingParentView)) { + // If no menu is showing or it's showing for this view we do nothing. + return false; + } + return true; + } + + public void resetExposedMenuView(boolean animate, boolean force) { + if (!shouldResetMenu(force)) { + return; + } + final View prevMenuExposedView = getExposedMenuView(); + if (animate) { + Animator anim = getViewTranslationAnimator(prevMenuExposedView, + 0 /* leftTarget */, null /* updateListener */); + if (anim != null) { + anim.start(); + } + } else if (prevMenuExposedView instanceof ExpandableNotificationRow) { + ExpandableNotificationRow row = (ExpandableNotificationRow) prevMenuExposedView; + if (!row.isRemoved()) { + row.resetTranslation(); + } + } + clearExposedMenuView(); + } + + public static boolean isTouchInView(MotionEvent ev, View view) { + if (view == null) { + return false; + } + final int height = (view instanceof ExpandableView) + ? ((ExpandableView) view).getActualHeight() + : view.getHeight(); + final int rx = (int) ev.getRawX(); + final int ry = (int) ev.getRawY(); + int[] temp = new int[2]; + view.getLocationOnScreen(temp); + final int x = temp[0]; + final int y = temp[1]; + Rect rect = new Rect(x, y, x + view.getWidth(), y + height); + boolean ret = rect.contains(rx, ry); + return ret; + } + + public interface NotificationCallback extends SwipeHelper.Callback{ + boolean isExpanded(); + + void handleChildViewDismissed(View view); + + void onSnooze(StatusBarNotification sbn, SnoozeOption snoozeOption); + + void onDismiss(); + } +}
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ContextualButton.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ContextualButton.java index 4f957bfcbbcc..c7ab27ba715d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ContextualButton.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ContextualButton.java @@ -67,9 +67,15 @@ public class ContextualButton extends ButtonDispatcher { } protected KeyButtonDrawable getNewDrawable() { - return KeyButtonDrawable.create(getContext(), mIconResId, false /* shadow */); + return KeyButtonDrawable.create(getContext().getApplicationContext(), mIconResId, + false /* shadow */); } + /** + * This context is from the view that could be stale after rotation or config change. To get + * correct resources use getApplicationContext() as well. + * @return current view context + */ protected Context getContext() { return getCurrentView().getContext(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java index cbbb0e3dea96..9c579daa38c6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java @@ -35,6 +35,7 @@ import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; import android.annotation.IdRes; import android.annotation.Nullable; +import android.app.ActivityManager; import android.app.ActivityTaskManager; import android.app.Fragment; import android.app.IActivityManager; @@ -88,8 +89,8 @@ import com.android.systemui.assist.AssistManager; import com.android.systemui.fragments.FragmentHostManager; import com.android.systemui.fragments.FragmentHostManager.FragmentListener; import com.android.systemui.recents.Recents; -import com.android.systemui.recents.misc.SysUiTaskStackChangeListener; import com.android.systemui.shared.system.ActivityManagerWrapper; +import com.android.systemui.shared.system.TaskStackChangeListener; import com.android.systemui.stackdivider.Divider; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.CommandQueue.Callbacks; @@ -284,7 +285,7 @@ public class NavigationBarFragment extends Fragment implements Callbacks { mNavigationBarView = (NavigationBarView) view; mNavigationBarView.setDisabledFlags(mDisabledFlags1); - mNavigationBarView.setComponents(mRecents, mDivider, mStatusBar.getPanel()); + mNavigationBarView.setComponents(mStatusBar.getPanel()); mNavigationBarView.setOnVerticalChangedListener(this::onVerticalChanged); mNavigationBarView.setOnTouchListener(this::onNavigationTouch); if (savedInstanceState != null) { @@ -946,7 +947,7 @@ public class NavigationBarFragment extends Fragment implements Callbacks { private boolean onLongPressRecents() { if (mRecents == null || !ActivityTaskManager.supportsMultiWindow(getContext()) || !mDivider.getView().getSnapAlgorithm().isSplitScreenFeasible() - || Recents.getConfiguration().isLowRamDevice + || ActivityManager.isLowRamDeviceStatic() // If we are connected to the overview service, then disable the recents button || mOverviewProxyService.getProxy() != null) { return false; @@ -1110,7 +1111,7 @@ public class NavigationBarFragment extends Fragment implements Callbacks { } }; - class TaskStackListenerImpl extends SysUiTaskStackChangeListener { + class TaskStackListenerImpl extends TaskStackChangeListener { // Invalidate any rotation suggestion on task change or activity orientation change // Note: all callbacks happen on main thread diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarGestureHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarGestureHelper.java index 8c02e1f8220b..62d2099204e8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarGestureHelper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarGestureHelper.java @@ -16,93 +16,36 @@ package com.android.systemui.statusbar.phone; -import static android.app.ActivityTaskManager.SPLIT_SCREEN_CREATE_MODE_BOTTOM_OR_RIGHT; -import static android.app.ActivityTaskManager.SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT; -import static android.view.WindowManager.DOCKED_INVALID; -import static android.view.WindowManager.DOCKED_LEFT; -import static android.view.WindowManager.DOCKED_TOP; - -import android.app.ActivityManager; import android.content.Context; -import android.content.res.Resources; import android.graphics.Canvas; -import android.graphics.Rect; import android.view.MotionEvent; -import android.view.VelocityTracker; import android.view.View; -import com.android.internal.logging.nano.MetricsProto.MetricsEvent; -import com.android.internal.policy.DividerSnapAlgorithm.SnapTarget; -import com.android.systemui.Dependency; -import com.android.systemui.R; -import com.android.systemui.RecentsComponent; import com.android.systemui.SysUiServiceProvider; import com.android.systemui.plugins.statusbar.phone.NavGesture.GestureHelper; -import com.android.systemui.stackdivider.Divider; -import com.android.systemui.tuner.TunerService; /** - * Class to detect gestures on the navigation bar. + * TODO: Remove and replace with QuickStepController */ -public class NavigationBarGestureHelper implements TunerService.Tunable, GestureHelper { - - private static final String TAG = "NavBarGestureHelper"; - private static final String KEY_DOCK_WINDOW_GESTURE = "overview_nav_bar_gesture"; - /** - * When dragging from the navigation bar, we drag in recents. - */ - public static final int DRAG_MODE_NONE = -1; - - /** - * When dragging from the navigation bar, we drag in recents. - */ - public static final int DRAG_MODE_RECENTS = 0; +public class NavigationBarGestureHelper implements GestureHelper { - /** - * When dragging from the navigation bar, we drag the divider. - */ - public static final int DRAG_MODE_DIVIDER = 1; + private static final String TAG = "NavigationBarGestureHelper"; - private RecentsComponent mRecentsComponent; - private Divider mDivider; - private Context mContext; private NavigationBarView mNavigationBarView; - private boolean mIsVertical; private final QuickStepController mQuickStepController; - private final int mScrollTouchSlop; private final StatusBar mStatusBar; - private int mTouchDownX; - private int mTouchDownY; - private boolean mDownOnRecents; - private VelocityTracker mVelocityTracker; - - private boolean mDockWindowEnabled; - private boolean mDockWindowTouchSlopExceeded; - private int mDragMode; public NavigationBarGestureHelper(Context context) { - mContext = context; mStatusBar = SysUiServiceProvider.getComponent(context, StatusBar.class); - Resources r = context.getResources(); - mScrollTouchSlop = r.getDimensionPixelSize(R.dimen.navigation_bar_min_swipe_distance); mQuickStepController = new QuickStepController(context); - Dependency.get(TunerService.class).addTunable(this, KEY_DOCK_WINDOW_GESTURE); } - public void destroy() { - Dependency.get(TunerService.class).removeTunable(this); - } - - public void setComponents(RecentsComponent recentsComponent, Divider divider, - NavigationBarView navigationBarView) { - mRecentsComponent = recentsComponent; - mDivider = divider; + public void setComponents(NavigationBarView navigationBarView) { mNavigationBarView = navigationBarView; mQuickStepController.setComponents(mNavigationBarView); } public void setBarState(boolean isVertical, boolean isRTL) { - mIsVertical = isVertical; mQuickStepController.setBarState(isVertical, isRTL); } @@ -110,22 +53,14 @@ public class NavigationBarGestureHelper implements TunerService.Tunable, Gesture if (!canHandleGestures()) { return false; } - boolean result = mQuickStepController.onInterceptTouchEvent(event); - if (mDockWindowEnabled) { - result |= interceptDockWindowEvent(event); - } - return result; + return mQuickStepController.onInterceptTouchEvent(event); } public boolean onTouchEvent(MotionEvent event) { if (!canHandleGestures()) { return false; } - boolean result = mQuickStepController.onTouchEvent(event); - if (mDockWindowEnabled) { - result |= handleDockWindowEvent(event); - } - return result; + return mQuickStepController.onTouchEvent(event); } public void onDraw(Canvas canvas) { @@ -144,152 +79,7 @@ public class NavigationBarGestureHelper implements TunerService.Tunable, Gesture mQuickStepController.onNavigationButtonLongPress(v); } - private boolean interceptDockWindowEvent(MotionEvent event) { - switch (event.getActionMasked()) { - case MotionEvent.ACTION_DOWN: - handleDragActionDownEvent(event); - break; - case MotionEvent.ACTION_MOVE: - return handleDragActionMoveEvent(event); - case MotionEvent.ACTION_UP: - case MotionEvent.ACTION_CANCEL: - handleDragActionUpEvent(event); - break; - } - return false; - } - - private boolean handleDockWindowEvent(MotionEvent event) { - switch (event.getActionMasked()) { - case MotionEvent.ACTION_DOWN: - handleDragActionDownEvent(event); - break; - case MotionEvent.ACTION_MOVE: - handleDragActionMoveEvent(event); - break; - case MotionEvent.ACTION_UP: - case MotionEvent.ACTION_CANCEL: - handleDragActionUpEvent(event); - break; - } - return true; - } - - private void handleDragActionDownEvent(MotionEvent event) { - mVelocityTracker = VelocityTracker.obtain(); - mVelocityTracker.addMovement(event); - mDockWindowTouchSlopExceeded = false; - mTouchDownX = (int) event.getX(); - mTouchDownY = (int) event.getY(); - - if (mNavigationBarView != null) { - View recentsButton = mNavigationBarView.getRecentsButton().getCurrentView(); - if (recentsButton != null) { - mDownOnRecents = mTouchDownX >= recentsButton.getLeft() - && mTouchDownX <= recentsButton.getRight() - && mTouchDownY >= recentsButton.getTop() - && mTouchDownY <= recentsButton.getBottom(); - } else { - mDownOnRecents = false; - } - } - } - - private boolean handleDragActionMoveEvent(MotionEvent event) { - mVelocityTracker.addMovement(event); - int x = (int) event.getX(); - int y = (int) event.getY(); - int xDiff = Math.abs(x - mTouchDownX); - int yDiff = Math.abs(y - mTouchDownY); - if (mDivider == null || mRecentsComponent == null) { - return false; - } - if (!mDockWindowTouchSlopExceeded) { - boolean touchSlopExceeded = !mIsVertical - ? yDiff > mScrollTouchSlop && yDiff > xDiff - : xDiff > mScrollTouchSlop && xDiff > yDiff; - if (mDownOnRecents && touchSlopExceeded - && mDivider.getView().getWindowManagerProxy().getDockSide() == DOCKED_INVALID) { - Rect initialBounds = null; - int dragMode = calculateDragMode(); - int createMode = SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT; - if (dragMode == DRAG_MODE_DIVIDER) { - initialBounds = new Rect(); - mDivider.getView().calculateBoundsForPosition(mIsVertical - ? (int) event.getRawX() - : (int) event.getRawY(), - mDivider.getView().isHorizontalDivision() - ? DOCKED_TOP - : DOCKED_LEFT, - initialBounds); - } else if (dragMode == DRAG_MODE_RECENTS && mTouchDownX - < mContext.getResources().getDisplayMetrics().widthPixels / 2) { - createMode = SPLIT_SCREEN_CREATE_MODE_BOTTOM_OR_RIGHT; - } - boolean docked = mRecentsComponent.splitPrimaryTask(dragMode, createMode, - initialBounds, MetricsEvent.ACTION_WINDOW_DOCK_SWIPE); - if (docked) { - mDragMode = dragMode; - if (mDragMode == DRAG_MODE_DIVIDER) { - mDivider.getView().startDragging(false /* animate */, true /* touching*/); - } - mDockWindowTouchSlopExceeded = true; - return true; - } - } - } else { - if (mDragMode == DRAG_MODE_DIVIDER) { - int position = !mIsVertical ? (int) event.getRawY() : (int) event.getRawX(); - SnapTarget snapTarget = mDivider.getView().getSnapAlgorithm() - .calculateSnapTarget(position, 0f /* velocity */, false /* hardDismiss */); - mDivider.getView().resizeStack(position, snapTarget.position, snapTarget); - } else if (mDragMode == DRAG_MODE_RECENTS) { - mRecentsComponent.onDraggingInRecents(event.getRawY()); - } - } - return false; - } - - private void handleDragActionUpEvent(MotionEvent event) { - mVelocityTracker.addMovement(event); - mVelocityTracker.computeCurrentVelocity(1000); - if (mDockWindowTouchSlopExceeded && mDivider != null && mRecentsComponent != null) { - if (mDragMode == DRAG_MODE_DIVIDER) { - mDivider.getView().stopDragging(mIsVertical - ? (int) event.getRawX() - : (int) event.getRawY(), - mIsVertical - ? mVelocityTracker.getXVelocity() - : mVelocityTracker.getYVelocity(), - true /* avoidDismissStart */, false /* logMetrics */); - } else if (mDragMode == DRAG_MODE_RECENTS) { - mRecentsComponent.onDraggingInRecentsEnded(mVelocityTracker.getYVelocity()); - } - } - mVelocityTracker.recycle(); - mVelocityTracker = null; - } - private boolean canHandleGestures() { return !mStatusBar.isKeyguardShowing(); } - - private int calculateDragMode() { - if (mIsVertical && !mDivider.getView().isHorizontalDivision()) { - return DRAG_MODE_DIVIDER; - } - if (!mIsVertical && mDivider.getView().isHorizontalDivision()) { - return DRAG_MODE_DIVIDER; - } - return DRAG_MODE_RECENTS; - } - - @Override - public void onTuningChanged(String key, String newValue) { - switch (key) { - case KEY_DOCK_WINDOW_GESTURE: - mDockWindowEnabled = newValue != null && (Integer.parseInt(newValue) != 0); - break; - } - } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java index 71b35e043f77..e5c910069f82 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java @@ -144,8 +144,6 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav private Configuration mConfiguration; private NavigationBarInflaterView mNavigationInflaterView; - private RecentsComponent mRecentsComponent; - private Divider mDivider; private RecentsOnboarding mRecentsOnboarding; private NotificationPanelView mPanelView; @@ -314,14 +312,10 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav return mBarTransitions.getLightTransitionsController(); } - public void setComponents(RecentsComponent recentsComponent, Divider divider, - NotificationPanelView panel) { - mRecentsComponent = recentsComponent; - mDivider = divider; + public void setComponents(NotificationPanelView panel) { mPanelView = panel; if (mGestureHelper instanceof NavigationBarGestureHelper) { - ((NavigationBarGestureHelper) mGestureHelper).setComponents( - recentsComponent, divider, this); + ((NavigationBarGestureHelper) mGestureHelper).setComponents(this); } } @@ -1078,7 +1072,7 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav @Override public void onPluginDisconnected(NavGesture plugin) { NavigationBarGestureHelper defaultHelper = new NavigationBarGestureHelper(getContext()); - defaultHelper.setComponents(mRecentsComponent, mDivider, this); + defaultHelper.setComponents(this); if (mGestureHelper != null) { mGestureHelper.destroy(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java index 1afdc66b9227..553165b40153 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java @@ -67,8 +67,8 @@ import com.android.systemui.SysUiServiceProvider; import com.android.systemui.UiOffloadThread; import com.android.systemui.qs.tiles.DndTile; import com.android.systemui.qs.tiles.RotationLockTile; -import com.android.systemui.recents.misc.SysUiTaskStackChangeListener; import com.android.systemui.shared.system.ActivityManagerWrapper; +import com.android.systemui.shared.system.TaskStackChangeListener; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.CommandQueue.Callbacks; import com.android.systemui.statusbar.policy.BluetoothController; @@ -797,7 +797,7 @@ public class PhoneStatusBarPolicy implements Callback, Callbacks, mIconController.setIconVisibility(mSlotDataSaver, isDataSaving); } - private final SysUiTaskStackChangeListener mTaskListener = new SysUiTaskStackChangeListener() { + private final TaskStackChangeListener mTaskListener = new TaskStackChangeListener() { @Override public void onTaskStackChanged() { // Listen for changes to stacks and then check which instant apps are foreground. 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 ff38380b7aa8..226b6453dbab 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -102,6 +102,8 @@ import android.os.UserManager; import android.os.VibrationEffect; import android.os.Vibrator; import android.provider.Settings; +import android.service.dreams.DreamService; +import android.service.dreams.IDreamManager; import android.service.notification.StatusBarNotification; import android.service.vr.IVrManager; import android.service.vr.IVrStateCallbacks; @@ -154,6 +156,7 @@ import com.android.systemui.Interpolators; import com.android.systemui.Prefs; import com.android.systemui.R; import com.android.systemui.RecentsComponent; +import com.android.systemui.SysUiServiceProvider; import com.android.systemui.SystemUI; import com.android.systemui.SystemUIFactory; import com.android.systemui.UiOffloadThread; @@ -179,10 +182,6 @@ import com.android.systemui.qs.QSTileHost; import com.android.systemui.qs.car.CarQSFragment; import com.android.systemui.recents.Recents; import com.android.systemui.recents.ScreenPinningRequest; -import com.android.systemui.recents.events.EventBus; -import com.android.systemui.recents.events.activity.AppTransitionFinishedEvent; -import com.android.systemui.recents.events.activity.UndockingTaskEvent; -import com.android.systemui.recents.misc.SystemServicesProxy; import com.android.systemui.shared.system.WindowManagerWrapper; import com.android.systemui.stackdivider.Divider; import com.android.systemui.stackdivider.WindowManagerProxy; @@ -635,6 +634,8 @@ public class StatusBar extends SystemUI implements DemoMode, mStatusBarStateController.addListener(this, StatusBarStateController.RANK_STATUS_BAR); mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); + mDreamManager = IDreamManager.Stub.asInterface( + ServiceManager.checkService(DreamService.DREAM_SERVICE)); mDisplay = mWindowManager.getDefaultDisplay(); updateDisplaySize(); @@ -1214,17 +1215,18 @@ public class StatusBar extends SystemUI implements DemoMode, int createMode = navbarPos == NAV_BAR_POS_LEFT ? SPLIT_SCREEN_CREATE_MODE_BOTTOM_OR_RIGHT : SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT; - return mRecents.splitPrimaryTask(NavigationBarGestureHelper.DRAG_MODE_NONE, createMode, - null, metricsDockAction); + return mRecents.splitPrimaryTask(createMode, null, metricsDockAction); } else { Divider divider = getComponent(Divider.class); - if (divider != null && divider.isMinimized() && !divider.isHomeStackResizable()) { - // Undocking from the minimized state is not supported - return false; - } else { - EventBus.getDefault().send(new UndockingTaskEvent()); - if (metricsUndockAction != -1) { - mMetricsLogger.action(metricsUndockAction); + if (divider != null) { + if (divider.isMinimized() && !divider.isHomeStackResizable()) { + // Undocking from the minimized state is not supported + return false; + } else { + divider.onUndockingTask(); + if (metricsUndockAction != -1) { + mMetricsLogger.action(metricsUndockAction); + } } } } @@ -4246,12 +4248,12 @@ public class StatusBar extends SystemUI implements DemoMode, @Override public void appTransitionCancelled() { - EventBus.getDefault().send(new AppTransitionFinishedEvent()); + getComponent(Divider.class).onAppTransitionFinished(); } @Override public void appTransitionFinished() { - EventBus.getDefault().send(new AppTransitionFinishedEvent()); + getComponent(Divider.class).onAppTransitionFinished(); } @Override @@ -4663,6 +4665,7 @@ public class StatusBar extends SystemUI implements DemoMode, protected WindowManager mWindowManager; protected IWindowManager mWindowManagerService; + private IDreamManager mDreamManager; protected Display mDisplay; @@ -4967,7 +4970,13 @@ public class StatusBar extends SystemUI implements DemoMode, } void awakenDreams() { - SystemServicesProxy.getInstance(mContext).awakenDreamsAsync(); + Dependency.get(UiOffloadThread.class).submit(() -> { + try { + mDreamManager.awaken(); + } catch (RemoteException e) { + e.printStackTrace(); + } + }); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HotspotControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HotspotControllerImpl.java index e9efaa14ef7c..0a72c3f9e8d8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HotspotControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HotspotControllerImpl.java @@ -17,10 +17,7 @@ package com.android.systemui.statusbar.policy; import android.app.ActivityManager; -import android.content.BroadcastReceiver; import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; import android.net.ConnectivityManager; import android.net.wifi.WifiManager; import android.os.UserManager; @@ -38,14 +35,13 @@ public class HotspotControllerImpl implements HotspotController, WifiManager.Sof private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); private final ArrayList<Callback> mCallbacks = new ArrayList<>(); - private final WifiStateReceiver mWifiStateReceiver = new WifiStateReceiver(); private final ConnectivityManager mConnectivityManager; private final WifiManager mWifiManager; private final Context mContext; private int mHotspotState; private int mNumConnectedDevices; - private boolean mWaitingForCallback; + private boolean mWaitingForTerminalState; public HotspotControllerImpl(Context context) { mContext = context; @@ -63,7 +59,9 @@ public class HotspotControllerImpl implements HotspotController, WifiManager.Sof public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { pw.println("HotspotController state:"); - pw.print(" mHotspotEnabled="); pw.println(stateToString(mHotspotState)); + pw.print(" mHotspotState="); pw.println(stateToString(mHotspotState)); + pw.print(" mNumConnectedDevices="); pw.println(mNumConnectedDevices); + pw.print(" mWaitingForTerminalState="); pw.println(mWaitingForTerminalState); } private static String stateToString(int hotspotState) { @@ -99,7 +97,6 @@ public class HotspotControllerImpl implements HotspotController, WifiManager.Sof if (DEBUG) Log.d(TAG, "removeCallback " + callback); synchronized (mCallbacks) { mCallbacks.remove(callback); - updateWifiStateListeners(!mCallbacks.isEmpty()); } } @@ -112,7 +109,6 @@ public class HotspotControllerImpl implements HotspotController, WifiManager.Sof * @param shouldListen whether we should start listening to various wifi statuses */ private void updateWifiStateListeners(boolean shouldListen) { - mWifiStateReceiver.setListening(shouldListen); if (shouldListen) { mWifiManager.registerSoftApCallback( this, @@ -129,21 +125,27 @@ public class HotspotControllerImpl implements HotspotController, WifiManager.Sof @Override public boolean isHotspotTransient() { - return mWaitingForCallback || (mHotspotState == WifiManager.WIFI_AP_STATE_ENABLING); + return mWaitingForTerminalState || (mHotspotState == WifiManager.WIFI_AP_STATE_ENABLING); } @Override public void setHotspotEnabled(boolean enabled) { - if (mWaitingForCallback) { - if (DEBUG) Log.d(TAG, "Ignoring setHotspotEnabled; waiting for callback."); + if (mWaitingForTerminalState) { + if (DEBUG) Log.d(TAG, "Ignoring setHotspotEnabled; waiting for terminal state."); return; } if (enabled) { - OnStartTetheringCallback callback = new OnStartTetheringCallback(); - mWaitingForCallback = true; + mWaitingForTerminalState = true; if (DEBUG) Log.d(TAG, "Starting tethering"); - mConnectivityManager.startTethering( - ConnectivityManager.TETHERING_WIFI, false, callback); + mConnectivityManager.startTethering(ConnectivityManager.TETHERING_WIFI, false, + new ConnectivityManager.OnStartTetheringCallback() { + @Override + public void onTetheringFailed() { + if (DEBUG) Log.d(TAG, "onTetheringFailed"); + maybeResetSoftApState(); + fireHotspotChangedCallback(); + } + }); } else { mConnectivityManager.stopTethering(ConnectivityManager.TETHERING_WIFI); } @@ -155,99 +157,56 @@ public class HotspotControllerImpl implements HotspotController, WifiManager.Sof } /** - * Sends a hotspot changed callback with the new enabled status. Wraps - * {@link #fireHotspotChangedCallback(boolean, int)} and assumes that the number of devices has - * not changed. - * - * @param enabled whether the hotspot is enabled - */ - private void fireHotspotChangedCallback(boolean enabled) { - fireHotspotChangedCallback(enabled, mNumConnectedDevices); - } - - /** - * Sends a hotspot changed callback with the new enabled status & the number of devices - * connected to the hotspot. Be careful when calling over multiple threads, especially if one of - * them is the main thread (as it can be blocked). - * - * @param enabled whether the hotspot is enabled - * @param numConnectedDevices number of devices connected to the hotspot + * Sends a hotspot changed callback. + * Be careful when calling over multiple threads, especially if one of them is the main thread + * (as it can be blocked). */ - private void fireHotspotChangedCallback(boolean enabled, int numConnectedDevices) { + private void fireHotspotChangedCallback() { synchronized (mCallbacks) { for (Callback callback : mCallbacks) { - callback.onHotspotChanged(enabled, numConnectedDevices); + callback.onHotspotChanged(isHotspotEnabled(), mNumConnectedDevices); } } } @Override public void onStateChanged(int state, int failureReason) { - // Do nothing - we don't care about changing anything here. - } + // Update internal hotspot state for tracking before using any enabled/callback methods. + mHotspotState = state; + + maybeResetSoftApState(); + if (!isHotspotEnabled()) { + // Reset num devices if the hotspot is no longer enabled so we don't get ghost + // counters. + mNumConnectedDevices = 0; + } - @Override - public void onNumClientsChanged(int numConnectedDevices) { - mNumConnectedDevices = numConnectedDevices; - fireHotspotChangedCallback(isHotspotEnabled(), numConnectedDevices); + fireHotspotChangedCallback(); } - private final class OnStartTetheringCallback extends - ConnectivityManager.OnStartTetheringCallback { - @Override - public void onTetheringStarted() { - if (DEBUG) Log.d(TAG, "onTetheringStarted"); - mWaitingForCallback = false; - // Don't fire a callback here, instead wait for the next update from wifi. + private void maybeResetSoftApState() { + if (!mWaitingForTerminalState) { + return; // Only reset soft AP state if enabled from this controller. } - - @Override - public void onTetheringFailed() { - if (DEBUG) Log.d(TAG, "onTetheringFailed"); - mWaitingForCallback = false; - // TODO(b/110697252): stopTethering must be called to reset soft ap state after failure - mConnectivityManager.stopTethering(ConnectivityManager.TETHERING_WIFI); - fireHotspotChangedCallback(isHotspotEnabled()); - // TODO: Show error. + switch (mHotspotState) { + case WifiManager.WIFI_AP_STATE_FAILED: + // TODO(b/110697252): must be called to reset soft ap state after failure + mConnectivityManager.stopTethering(ConnectivityManager.TETHERING_WIFI); + // Fall through + case WifiManager.WIFI_AP_STATE_ENABLED: + case WifiManager.WIFI_AP_STATE_DISABLED: + mWaitingForTerminalState = false; + break; + case WifiManager.WIFI_AP_STATE_ENABLING: + case WifiManager.WIFI_AP_STATE_DISABLING: + default: + break; } } - /** - * Class to listen in on wifi state and update the hotspot state - */ - private final class WifiStateReceiver extends BroadcastReceiver { - private boolean mRegistered; - - public void setListening(boolean listening) { - if (listening && !mRegistered) { - if (DEBUG) Log.d(TAG, "Registering receiver"); - final IntentFilter filter = new IntentFilter(); - filter.addAction(WifiManager.WIFI_AP_STATE_CHANGED_ACTION); - mContext.registerReceiver(this, filter); - mRegistered = true; - } else if (!listening && mRegistered) { - if (DEBUG) Log.d(TAG, "Unregistering receiver"); - mContext.unregisterReceiver(this); - mRegistered = false; - } - } - - @Override - public void onReceive(Context context, Intent intent) { - int state = intent.getIntExtra( - WifiManager.EXTRA_WIFI_AP_STATE, WifiManager.WIFI_AP_STATE_FAILED); - if (DEBUG) Log.d(TAG, "onReceive " + state); - - // Update internal hotspot state for tracking before using any enabled/callback methods. - mHotspotState = state; - - if (!isHotspotEnabled()) { - // Reset num devices if the hotspot is no longer enabled so we don't get ghost - // counters. - mNumConnectedDevices = 0; - } - - fireHotspotChangedCallback(isHotspotEnabled()); - } + @Override + public void onNumClientsChanged(int numConnectedDevices) { + mNumConnectedDevices = numConnectedDevices; + fireHotspotChangedCallback(); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityControllerTest.java index f8aa28dbb945..199c4c283452 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityControllerTest.java @@ -40,9 +40,9 @@ import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; import com.android.systemui.SysuiTestCase; -import com.android.systemui.recents.misc.SysUiTaskStackChangeListener; import com.android.systemui.shared.system.ActivityManagerWrapper; +import com.android.systemui.shared.system.TaskStackChangeListener; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -65,7 +65,7 @@ public class WorkLockActivityControllerTest extends SysuiTestCase { private @Mock IActivityTaskManager mIActivityTaskManager; private WorkLockActivityController mController; - private SysUiTaskStackChangeListener mTaskStackListener; + private TaskStackChangeListener mTaskStackListener; @Before public void setUp() throws Exception { @@ -75,8 +75,8 @@ public class WorkLockActivityControllerTest extends SysuiTestCase { doReturn("com.example.test").when(mContext).getPackageName(); // Construct controller. Save the TaskStackListener for injecting events. - final ArgumentCaptor<SysUiTaskStackChangeListener> listenerCaptor = - ArgumentCaptor.forClass(SysUiTaskStackChangeListener.class); + final ArgumentCaptor<TaskStackChangeListener> listenerCaptor = + ArgumentCaptor.forClass(TaskStackChangeListener.class); mController = new WorkLockActivityController(mContext, mActivityManager, mIActivityTaskManager); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NonPhoneDependencyTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NonPhoneDependencyTest.java index 09c19319429b..da59450af4df 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NonPhoneDependencyTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NonPhoneDependencyTest.java @@ -79,13 +79,14 @@ public class NonPhoneDependencyTest extends SysuiTestCase { Dependency.get(NotificationLockscreenUserManager.class); NotificationViewHierarchyManager viewHierarchyManager = Dependency.get(NotificationViewHierarchyManager.class); + NotificationGroupManager groupManager = Dependency.get(NotificationGroupManager.class); when(mPresenter.getNotificationLockscreenUserManager()).thenReturn(lockscreenUserManager); - when(mPresenter.getGroupManager()).thenReturn( - Dependency.get(NotificationGroupManager.class)); + when(mPresenter.getGroupManager()).thenReturn(groupManager); entryManager.setUpWithPresenter(mPresenter, mListContainer, mEntryManagerCallback, mHeadsUpManager); + groupManager.setHeadsUpManager(mHeadsUpManager); gutsManager.setUpWithPresenter(mPresenter, mListContainer, mCheckSaveListener, mOnClickListener); notificationLogger.setUpWithEntryManager(entryManager, mListContainer); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java index 1e3d42ba6ede..b545e61a446a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java @@ -32,6 +32,7 @@ import android.os.Handler; import android.os.IPowerManager; import android.os.Looper; import android.os.PowerManager; +import android.service.dreams.IDreamManager; import android.support.test.annotation.UiThreadTest; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; @@ -39,7 +40,6 @@ import android.support.test.runner.AndroidJUnit4; import com.android.systemui.ExpandHelper; import com.android.systemui.R; import com.android.systemui.SysuiTestCase; -import com.android.systemui.recents.misc.SystemServicesProxy; import com.android.systemui.statusbar.EmptyShadeView; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.NotificationPresenter; @@ -91,7 +91,7 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { @Mock private NotificationData mNotificationData; @Mock private NotificationRemoteInputManager mRemoteInputManager; @Mock private RemoteInputController mRemoteInputController; - @Mock private SystemServicesProxy mSystemServicesProxy; + @Mock private IDreamManager mDreamManager; private PowerManager mPowerManager; private TestableNotificationEntryManager mEntryManager; @@ -111,7 +111,7 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { mPowerManager = new PowerManager(mContext, powerManagerService, Handler.createAsync(Looper.myLooper())); - mEntryManager = new TestableNotificationEntryManager(mSystemServicesProxy, mPowerManager, + mEntryManager = new TestableNotificationEntryManager(mDreamManager, mPowerManager, mContext); mEntryManager.setUpForTest(mock(NotificationPresenter.class), null, null, mHeadsUpManager, mNotificationData); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelperTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelperTest.java new file mode 100644 index 000000000000..b5f67c06b2d1 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelperTest.java @@ -0,0 +1,511 @@ +/* + * 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.systemui.statusbar.notification.stack; + +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertFalse; +import static junit.framework.Assert.assertNotNull; +import static junit.framework.Assert.assertTrue; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.atLeastOnce; +import static org.mockito.Mockito.clearInvocations; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.mockitoSession; +import static org.mockito.Mockito.reset; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.animation.Animator; +import android.animation.ValueAnimator.AnimatorUpdateListener; +import android.content.Context; +import android.graphics.Rect; +import android.os.Handler; +import android.os.IPowerManager; +import android.os.Looper; +import android.os.PowerManager; +import android.service.notification.StatusBarNotification; +import android.support.test.annotation.UiThreadTest; +import android.support.test.filters.SmallTest; +import android.support.test.runner.AndroidJUnit4; +import android.testing.TestableLooper.RunWithLooper; +import android.view.MotionEvent; +import android.view.VelocityTracker; +import android.view.View; +import android.view.MotionEvent; + +import com.android.systemui.SwipeHelper; +import com.android.systemui.SysuiTestCase; +import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin; +import com.android.systemui.plugins.statusbar.NotificationSwipeActionHelper.SnoozeOption; +import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; +import com.android.systemui.statusbar.notification.row.NotificationMenuRow; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Mock; +import org.mockito.MockitoSession; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; +import org.mockito.stubbing.Answer; + +import java.util.ArrayList; + +/** + * Tests for {@link NotificationSwipeHelper}. + */ +@SmallTest +@RunWith(AndroidJUnit4.class) +public class NotificationSwipeHelperTest extends SysuiTestCase { + + private NotificationSwipeHelper mSwipeHelper; + private NotificationSwipeHelper.NotificationCallback mCallback; + private NotificationMenuRowPlugin.OnMenuEventListener mListener; + private View mView; + private MotionEvent mEvent; + private NotificationMenuRowPlugin mMenuRow; + private Handler mHandler; + private ExpandableNotificationRow mNotificationRow; + private Runnable mFalsingCheck; + + @Rule public MockitoRule mockito = MockitoJUnit.rule(); + + @Before + @UiThreadTest + public void setUp() throws Exception { + mCallback = mock(NotificationSwipeHelper.NotificationCallback.class); + mListener = mock(NotificationMenuRowPlugin.OnMenuEventListener.class); + mSwipeHelper = spy(new NotificationSwipeHelper(SwipeHelper.X, mCallback, mContext, mListener)); + mView = mock(View.class); + mEvent = mock(MotionEvent.class); + mMenuRow = mock(NotificationMenuRowPlugin.class); + mNotificationRow = mock(ExpandableNotificationRow.class); + mHandler = mock(Handler.class); + mFalsingCheck = mock(Runnable.class); + } + + @Test + public void testSetExposedMenuView() { + assertEquals("intialized with null exposed menu view", null, + mSwipeHelper.getExposedMenuView()); + mSwipeHelper.setExposedMenuView(mView); + assertEquals("swipe helper has correct exposedMenuView after setExposedMenuView to a view", + mView, mSwipeHelper.getExposedMenuView()); + mSwipeHelper.setExposedMenuView(null); + assertEquals("swipe helper has null exposedMenuView after setExposedMenuView to null", + null, mSwipeHelper.getExposedMenuView()); + } + + @Test + public void testClearExposedMenuView() { + doNothing().when(mSwipeHelper).setExposedMenuView(mView); + mSwipeHelper.clearExposedMenuView(); + verify(mSwipeHelper, times(1)).setExposedMenuView(null); + } + + @Test + public void testGetTranslatingParentView() { + assertEquals("intialized with null translating parent view", null, + mSwipeHelper.getTranslatingParentView()); + mSwipeHelper.setTranslatingParentView(mView); + assertEquals("has translating parent view after setTranslatingParentView with a view", + mView, mSwipeHelper.getTranslatingParentView()); + } + + @Test + public void testClearTranslatingParentView() { + doNothing().when(mSwipeHelper).setTranslatingParentView(null); + mSwipeHelper.clearTranslatingParentView(); + verify(mSwipeHelper, times(1)).setTranslatingParentView(null); + } + + @Test + public void testSetCurrentMenuRow() { + assertEquals("currentMenuRow initializes to null", null, + mSwipeHelper.getCurrentMenuRow()); + mSwipeHelper.setCurrentMenuRow(mMenuRow); + assertEquals("currentMenuRow set correctly after setCurrentMenuRow", mMenuRow, + mSwipeHelper.getCurrentMenuRow()); + mSwipeHelper.setCurrentMenuRow(null); + assertEquals("currentMenuRow set to null after setCurrentMenuRow to null", + null, mSwipeHelper.getCurrentMenuRow()); + } + + @Test + public void testClearCurrentMenuRow() { + doNothing().when(mSwipeHelper).setCurrentMenuRow(null); + mSwipeHelper.clearCurrentMenuRow(); + verify(mSwipeHelper, times(1)).setCurrentMenuRow(null); + } + + @Test + public void testOnDownUpdate_ExpandableNotificationRow() { + when(mSwipeHelper.getHandler()).thenReturn(mHandler); + when(mSwipeHelper.getFalsingCheck()).thenReturn(mFalsingCheck); + doNothing().when(mSwipeHelper).resetExposedMenuView(true, false); + doNothing().when(mSwipeHelper).clearCurrentMenuRow(); + doNothing().when(mSwipeHelper).initializeRow(any()); + + mSwipeHelper.onDownUpdate(mNotificationRow, mEvent); + + verify(mSwipeHelper, times(1)).clearCurrentMenuRow(); + verify(mHandler, times(1)).removeCallbacks(mFalsingCheck); + verify(mSwipeHelper, times(1)).resetExposedMenuView(true, false); + verify(mSwipeHelper, times(1)).initializeRow(mNotificationRow); + } + + @Test + public void testOnDownUpdate_notExpandableNotificationRow() { + when(mSwipeHelper.getHandler()).thenReturn(mHandler); + when(mSwipeHelper.getFalsingCheck()).thenReturn(mFalsingCheck); + doNothing().when(mSwipeHelper).resetExposedMenuView(true, false); + doNothing().when(mSwipeHelper).clearCurrentMenuRow(); + doNothing().when(mSwipeHelper).initializeRow(any()); + + mSwipeHelper.onDownUpdate(mView, mEvent); + + verify(mSwipeHelper, times(1)).clearCurrentMenuRow(); + verify(mHandler, times(1)).removeCallbacks(mFalsingCheck); + verify(mSwipeHelper, times(1)).resetExposedMenuView(true, false); + verify(mSwipeHelper, times(0)).initializeRow(any()); + } + + @Test + public void testOnMoveUpdate_menuRow() { + when(mSwipeHelper.getCurrentMenuRow()).thenReturn(mMenuRow); + when(mSwipeHelper.getHandler()).thenReturn(mHandler); + when(mSwipeHelper.getFalsingCheck()).thenReturn(mFalsingCheck); + + mSwipeHelper.onMoveUpdate(mView, mEvent, 0, 10); + + verify(mHandler, times(1)).removeCallbacks(mFalsingCheck); + verify(mMenuRow, times(1)).onTouchMove(10); + } + + @Test + public void testOnMoveUpdate_noMenuRow() { + when(mSwipeHelper.getHandler()).thenReturn(mHandler); + when(mSwipeHelper.getFalsingCheck()).thenReturn(mFalsingCheck); + + mSwipeHelper.onMoveUpdate(mView, mEvent, 0, 10); + + verify(mHandler, times(1)).removeCallbacks(mFalsingCheck); + } + + @Test + public void testHandleUpEvent_noMenuRow() { + assertFalse("Menu row does not exist", + mSwipeHelper.handleUpEvent(mEvent, mView, 0, 0)); + } + + @Test + public void testHandleUpEvent_menuRow() { + when(mSwipeHelper.getCurrentMenuRow()).thenReturn(mMenuRow); + doNothing().when(mSwipeHelper).handleMenuRowSwipe(mEvent, mView, 0, mMenuRow); + + assertTrue("Menu row exists", + mSwipeHelper.handleUpEvent(mEvent, mView, 0, 0)); + verify(mMenuRow, times(1)).onTouchEnd(); + verify(mSwipeHelper, times(1)).handleMenuRowSwipe(mEvent, mView, 0, mMenuRow); + } + + @Test + public void testDismissChild_notExpanded() { + when(mCallback.isExpanded()).thenReturn(false); + doNothing().when(mSwipeHelper).superDismissChild(mView, 0, false); + doNothing().when(mSwipeHelper).handleMenuCoveredOrDismissed(); + + mSwipeHelper.dismissChild(mView, 0, false); + + verify(mSwipeHelper, times(1)).superDismissChild(mView, 0, false); + verify(mCallback, times(0)).handleChildViewDismissed(mView); + verify(mCallback, times(1)).onDismiss(); + verify(mSwipeHelper, times(1)).handleMenuCoveredOrDismissed(); + } + + @Test + public void testSnapchild_targetIsZero() { + doNothing().when(mSwipeHelper).superSnapChild(mView, 0, 0); + mSwipeHelper.snapChild(mView, 0, 0); + + verify(mCallback, times(1)).onDragCancelled(mView); + verify(mSwipeHelper, times(1)).superSnapChild(mView, 0, 0); + verify(mSwipeHelper, times(1)).handleMenuCoveredOrDismissed(); + } + + + @Test + public void testSnapchild_targetNotZero() { + doNothing().when(mSwipeHelper).superSnapChild(mView, 10, 0); + mSwipeHelper.snapChild(mView, 10, 0); + + verify(mCallback, times(1)).onDragCancelled(mView); + verify(mSwipeHelper, times(1)).superSnapChild(mView, 10, 0); + verify(mSwipeHelper, times(0)).handleMenuCoveredOrDismissed(); + } + + @Test + public void testSnooze() { + StatusBarNotification sbn = mock(StatusBarNotification.class); + SnoozeOption snoozeOption = mock(SnoozeOption.class); + mSwipeHelper.snooze(sbn, snoozeOption); + verify(mCallback, times(1)).onSnooze(sbn, snoozeOption); + } + + @Test + public void testGetViewTranslationAnimator_notExpandableNotificationRow() { + Animator animator = mock(Animator.class); + AnimatorUpdateListener listener = mock(AnimatorUpdateListener.class); + doReturn(animator).when(mSwipeHelper).superGetViewTranslationAnimator(mView, 0, listener); + + assertEquals("returns the correct animator from super", animator, + mSwipeHelper.getViewTranslationAnimator(mView, 0, listener)); + + verify(mSwipeHelper, times(1)).superGetViewTranslationAnimator(mView, 0, listener); + } + + @Test + public void testGetViewTranslationAnimator_expandableNotificationRow() { + Animator animator = mock(Animator.class); + AnimatorUpdateListener listener = mock(AnimatorUpdateListener.class); + doReturn(animator).when(mNotificationRow).getTranslateViewAnimator(0, listener); + + assertEquals("returns the correct animator from super when view is an ENR", animator, + mSwipeHelper.getViewTranslationAnimator(mNotificationRow, 0, listener)); + + verify(mNotificationRow, times(1)).getTranslateViewAnimator(0, listener); + } + + @Test + public void testSetTranslation() { + mSwipeHelper.setTranslation(mNotificationRow, 0); + verify(mNotificationRow, times(1)).setTranslation(0); + } + + @Test + public void testGetTranslation() { + doReturn(30f).when(mNotificationRow).getTranslation(); + + assertEquals("Returns getTranslation for the ENR", + mSwipeHelper.getTranslation(mNotificationRow), 30f); + + verify(mNotificationRow, times(1)).getTranslation(); + } + + @Test + public void testDismiss() { + doNothing().when(mSwipeHelper).dismissChild(mView, 0, true); + doReturn(false).when(mSwipeHelper).swipedFastEnough(); + + mSwipeHelper.dismiss(mView, 0); + + verify(mSwipeHelper, times(1)).swipedFastEnough(); + verify(mSwipeHelper, times(1)).dismissChild(mView, 0, true); + } + + @Test + public void testSnapOpen() { + doNothing().when(mSwipeHelper).snapChild(mView, 30, 0); + + mSwipeHelper.snapOpen(mView, 30, 0); + + verify(mSwipeHelper, times(1)).snapChild(mView, 30, 0); + } + + @Test + public void testSnapClosed() { + doNothing().when(mSwipeHelper).snapChild(mView, 0, 0); + + mSwipeHelper.snapClosed(mView, 0); + + verify(mSwipeHelper, times(1)).snapChild(mView, 0, 0); + } + + @Test + public void testGetMinDismissVelocity() { + doReturn(30f).when(mSwipeHelper).getEscapeVelocity(); + + assertEquals("Returns getEscapeVelocity", 30f, mSwipeHelper.getMinDismissVelocity()); + } + + @Test + public void onMenuShown_noAntiFalsing() { + doNothing().when(mSwipeHelper).setExposedMenuView(mView); + doReturn(mView).when(mSwipeHelper).getTranslatingParentView(); + doReturn(mHandler).when(mSwipeHelper).getHandler(); + doReturn(false).when(mCallback).isAntiFalsingNeeded(); + doReturn(mFalsingCheck).when(mSwipeHelper).getFalsingCheck(); + + mSwipeHelper.onMenuShown(mView); + + verify(mSwipeHelper, times(1)).setExposedMenuView(mView); + verify(mCallback, times(1)).onDragCancelled(mView); + verify(mCallback, times(1)).isAntiFalsingNeeded(); + + verify(mHandler, times(0)).removeCallbacks(mFalsingCheck); + verify(mHandler, times(0)).postDelayed(mFalsingCheck, mSwipeHelper.COVER_MENU_DELAY); + } + + @Test + public void onMenuShown_antiFalsing() { + doNothing().when(mSwipeHelper).setExposedMenuView(mView); + doReturn(mView).when(mSwipeHelper).getTranslatingParentView(); + doReturn(mHandler).when(mSwipeHelper).getHandler(); + doReturn(true).when(mCallback).isAntiFalsingNeeded(); + doReturn(mFalsingCheck).when(mSwipeHelper).getFalsingCheck(); + + mSwipeHelper.onMenuShown(mView); + + verify(mSwipeHelper, times(1)).setExposedMenuView(mView); + verify(mCallback, times(1)).onDragCancelled(mView); + verify(mCallback, times(1)).isAntiFalsingNeeded(); + + verify(mHandler, times(1)).removeCallbacks(mFalsingCheck); + verify(mHandler, times(1)).postDelayed(mFalsingCheck, mSwipeHelper.COVER_MENU_DELAY); + } + + @Test + public void testResetExposedMenuView_noReset() { + doReturn(false).when(mSwipeHelper).shouldResetMenu(false); + doNothing().when(mSwipeHelper).clearExposedMenuView(); + + mSwipeHelper.resetExposedMenuView(false, false); + + verify(mSwipeHelper, times(1)).shouldResetMenu(false); + + // should not clear exposed menu row + verify(mSwipeHelper, times(0)).clearExposedMenuView(); + } + + @Test + public void testResetExposedMenuView_animate() { + Animator animator = mock(Animator.class); + + doReturn(true).when(mSwipeHelper).shouldResetMenu(false); + doReturn(mNotificationRow).when(mSwipeHelper).getExposedMenuView(); + doReturn(false).when(mNotificationRow).isRemoved(); + doReturn(animator).when(mSwipeHelper).getViewTranslationAnimator(mNotificationRow, 0, null); + doNothing().when(mSwipeHelper).clearExposedMenuView(); + + mSwipeHelper.resetExposedMenuView(true, false); + + verify(mSwipeHelper, times(1)).shouldResetMenu(false); + + // should retrieve and start animator + verify(mSwipeHelper, times(1)).getViewTranslationAnimator(mNotificationRow, 0, null); + verify(animator, times(1)).start(); + + // should not reset translation on row directly + verify(mNotificationRow, times(0)).resetTranslation(); + + // should clear exposed menu row + verify(mSwipeHelper, times(1)).clearExposedMenuView(); + } + + + @Test + public void testResetExposedMenuView_noAnimate() { + Animator animator = mock(Animator.class); + + doReturn(true).when(mSwipeHelper).shouldResetMenu(false); + doReturn(mNotificationRow).when(mSwipeHelper).getExposedMenuView(); + doReturn(false).when(mNotificationRow).isRemoved(); + doReturn(animator).when(mSwipeHelper).getViewTranslationAnimator(mNotificationRow, 0, null); + doNothing().when(mSwipeHelper).clearExposedMenuView(); + + mSwipeHelper.resetExposedMenuView(false, false); + + verify(mSwipeHelper, times(1)).shouldResetMenu(false); + + // should not retrieve and start animator + verify(mSwipeHelper, times(0)).getViewTranslationAnimator(mNotificationRow, 0, null); + verify(animator, times(0)).start(); + + // should reset translation on row directly + verify(mNotificationRow, times(1)).resetTranslation(); + + // should clear exposed menu row + verify(mSwipeHelper, times(1)).clearExposedMenuView(); + } + + @Test + public void testIsTouchInView() { + assertEquals("returns false when view is null", false, + NotificationSwipeHelper.isTouchInView(mEvent, null)); + + doReturn(5f).when(mEvent).getRawX(); + doReturn(10f).when(mEvent).getRawY(); + + doReturn(20).when(mView).getWidth(); + doReturn(20).when(mView).getHeight(); + + Answer answer = (Answer) invocation -> { + int[] arr = invocation.getArgument(0); + arr[0] = 0; + arr[1] = 0; + return null; + }; + doAnswer(answer).when(mView).getLocationOnScreen(any()); + + assertTrue("Touch is within the view", + mSwipeHelper.isTouchInView(mEvent, mView)); + + doReturn(50f).when(mEvent).getRawX(); + + assertFalse("Touch is not within the view", + mSwipeHelper.isTouchInView(mEvent, mView)); + } + + @Test + public void testIsTouchInView_expandable() { + assertEquals("returns false when view is null", false, + NotificationSwipeHelper.isTouchInView(mEvent, null)); + + doReturn(5f).when(mEvent).getRawX(); + doReturn(10f).when(mEvent).getRawY(); + + doReturn(20).when(mNotificationRow).getWidth(); + doReturn(20).when(mNotificationRow).getActualHeight(); + + Answer answer = (Answer) invocation -> { + int[] arr = invocation.getArgument(0); + arr[0] = 0; + arr[1] = 0; + return null; + }; + doAnswer(answer).when(mNotificationRow).getLocationOnScreen(any()); + + assertTrue("Touch is within the view", + mSwipeHelper.isTouchInView(mEvent, mNotificationRow)); + + doReturn(50f).when(mEvent).getRawX(); + + assertFalse("Touch is not within the view", + mSwipeHelper.isTouchInView(mEvent, mNotificationRow)); + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java index 5006b0b29b0c..da93327061a8 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java @@ -50,6 +50,7 @@ import android.os.Looper; import android.os.PowerManager; import android.os.RemoteException; import android.os.UserHandle; +import android.service.dreams.IDreamManager; import android.service.notification.StatusBarNotification; import android.support.test.filters.SmallTest; import android.support.test.metricshelper.MetricsAsserts; @@ -119,9 +120,9 @@ public class StatusBarTest extends SysuiTestCase { @Mock private KeyguardIndicationController mKeyguardIndicationController; @Mock private NotificationStackScrollLayout mStackScroller; @Mock private HeadsUpManagerPhone mHeadsUpManager; - @Mock private SystemServicesProxy mSystemServicesProxy; @Mock private NotificationPanelView mNotificationPanelView; @Mock private IStatusBarService mBarService; + @Mock private IDreamManager mDreamManager; @Mock private ScrimController mScrimController; @Mock private ArrayList<Entry> mNotificationList; @Mock private BiometricUnlockController mBiometricUnlockController; @@ -194,8 +195,7 @@ public class StatusBarTest extends SysuiTestCase { return null; }).when(mStatusBarKeyguardViewManager).addAfterKeyguardGoneRunnable(any()); - mEntryManager = new TestableNotificationEntryManager(mSystemServicesProxy, mPowerManager, - mContext); + mEntryManager = new TestableNotificationEntryManager(mDreamManager, mPowerManager, mContext); when(mRemoteInputManager.getController()).thenReturn(mRemoteInputController); mStatusBar = new TestableStatusBar(mStatusBarKeyguardViewManager, mUnlockMethodCache, mKeyguardIndicationController, mStackScroller, mHeadsUpManager, @@ -358,12 +358,12 @@ public class StatusBarTest extends SysuiTestCase { } @Test - public void testShouldHeadsUp_nonSuppressedGroupSummary() { + public void testShouldHeadsUp_nonSuppressedGroupSummary() throws Exception { when(mPowerManager.isScreenOn()).thenReturn(true); when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false); when(mNotificationData.shouldSuppressStatusBar(any())).thenReturn(false); when(mNotificationData.shouldFilterOut(any())).thenReturn(false); - when(mSystemServicesProxy.isDreaming()).thenReturn(false); + when(mDreamManager.isDreaming()).thenReturn(false); when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH); Notification n = new Notification.Builder(getContext(), "a") @@ -379,12 +379,12 @@ public class StatusBarTest extends SysuiTestCase { } @Test - public void testShouldHeadsUp_suppressedGroupSummary() { + public void testShouldHeadsUp_suppressedGroupSummary() throws Exception { when(mPowerManager.isScreenOn()).thenReturn(true); when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false); when(mNotificationData.shouldSuppressStatusBar(any())).thenReturn(false); when(mNotificationData.shouldFilterOut(any())).thenReturn(false); - when(mSystemServicesProxy.isDreaming()).thenReturn(false); + when(mDreamManager.isDreaming()).thenReturn(false); when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH); Notification n = new Notification.Builder(getContext(), "a") @@ -400,11 +400,11 @@ public class StatusBarTest extends SysuiTestCase { } @Test - public void testShouldHeadsUp_suppressedHeadsUp() { + public void testShouldHeadsUp_suppressedHeadsUp() throws Exception { when(mPowerManager.isScreenOn()).thenReturn(true); when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false); when(mNotificationData.shouldFilterOut(any())).thenReturn(false); - when(mSystemServicesProxy.isDreaming()).thenReturn(false); + when(mDreamManager.isDreaming()).thenReturn(false); when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH); when(mNotificationData.shouldSuppressPeek(any())).thenReturn(true); @@ -418,11 +418,11 @@ public class StatusBarTest extends SysuiTestCase { } @Test - public void testShouldHeadsUp_noSuppressedHeadsUp() { + public void testShouldHeadsUp_noSuppressedHeadsUp() throws Exception { when(mPowerManager.isScreenOn()).thenReturn(true); when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false); when(mNotificationData.shouldFilterOut(any())).thenReturn(false); - when(mSystemServicesProxy.isDreaming()).thenReturn(false); + when(mDreamManager.isDreaming()).thenReturn(false); when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH); when(mNotificationData.shouldSuppressPeek(any())).thenReturn(false); @@ -690,10 +690,10 @@ public class StatusBarTest extends SysuiTestCase { public static class TestableNotificationEntryManager extends NotificationEntryManager { - public TestableNotificationEntryManager(SystemServicesProxy systemServicesProxy, + public TestableNotificationEntryManager(IDreamManager dreamManager, PowerManager powerManager, Context context) { super(context); - mSystemServicesProxy = systemServicesProxy; + mDreamManager = dreamManager; mPowerManager = powerManager; } diff --git a/services/backup/java/com/android/server/backup/encryption/chunk/Chunk.java b/services/backup/java/com/android/server/backup/encryption/chunk/Chunk.java new file mode 100644 index 000000000000..5bec1a94e915 --- /dev/null +++ b/services/backup/java/com/android/server/backup/encryption/chunk/Chunk.java @@ -0,0 +1,54 @@ +package com.android.server.backup.encryption.chunk; + +import android.util.proto.ProtoInputStream; + +import java.io.IOException; + +/** + * Information about a chunk entry in a protobuf. Only used for reading from a {@link + * ProtoInputStream}. + */ +public class Chunk { + /** + * Reads a Chunk from a {@link ProtoInputStream}. Expects the message to be of format {@link + * ChunksMetadataProto.Chunk}. + * + * @param inputStream currently at a {@link ChunksMetadataProto.Chunk} message. + * @throws IOException when the message is not structured as expected or a field can not be + * read. + */ + static Chunk readFromProto(ProtoInputStream inputStream) throws IOException { + Chunk result = new Chunk(); + + while (inputStream.nextField() != ProtoInputStream.NO_MORE_FIELDS) { + switch (inputStream.getFieldNumber()) { + case (int) ChunksMetadataProto.Chunk.HASH: + result.mHash = inputStream.readBytes(ChunksMetadataProto.Chunk.HASH); + break; + case (int) ChunksMetadataProto.Chunk.LENGTH: + result.mLength = inputStream.readInt(ChunksMetadataProto.Chunk.LENGTH); + break; + } + } + + return result; + } + + private int mLength; + private byte[] mHash; + + /** Private constructor. This class should only be instantiated by calling readFromProto. */ + private Chunk() { + // Set default values for fields in case they are not available in the proto. + mHash = new byte[]{}; + mLength = 0; + } + + public int getLength() { + return mLength; + } + + public byte[] getHash() { + return mHash; + } +}
\ No newline at end of file diff --git a/services/backup/java/com/android/server/backup/encryption/chunk/ChunkListing.java b/services/backup/java/com/android/server/backup/encryption/chunk/ChunkListing.java new file mode 100644 index 000000000000..2d2e88afccf1 --- /dev/null +++ b/services/backup/java/com/android/server/backup/encryption/chunk/ChunkListing.java @@ -0,0 +1,108 @@ +/* + * 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.backup.encryption.chunk; + +import android.annotation.Nullable; +import android.util.proto.ProtoInputStream; +import java.io.IOException; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +/** + * Chunk listing in a format optimized for quick look-up of chunks via their hash keys. This is + * useful when building an incremental backup. After a chunk has been produced, the algorithm can + * quickly look up whether the chunk existed in the previous backup by checking this chunk listing. + * It can then tell the server to use that chunk, through telling it the position and length of the + * chunk in the previous backup's blob. + */ +public class ChunkListing { + /** + * Reads a ChunkListing from a {@link ProtoInputStream}. Expects the message to be of format + * {@link ChunksMetadataProto.ChunkListing}. + * + * @param inputStream Currently at a {@link ChunksMetadataProto.ChunkListing} message. + * @throws IOException when the message is not structured as expected or a field can not be + * read. + */ + public static ChunkListing readFromProto(ProtoInputStream inputStream) throws IOException { + Map<ChunkHash, Entry> entries = new HashMap(); + + long start = 0; + + while (inputStream.nextField() != ProtoInputStream.NO_MORE_FIELDS) { + if (inputStream.getFieldNumber() == (int) ChunksMetadataProto.ChunkListing.CHUNKS) { + long chunkToken = inputStream.start(ChunksMetadataProto.ChunkListing.CHUNKS); + Chunk chunk = Chunk.readFromProto(inputStream); + entries.put(new ChunkHash(chunk.getHash()), new Entry(start, chunk.getLength())); + start += chunk.getLength(); + inputStream.end(chunkToken); + } + } + + return new ChunkListing(entries); + } + + private final Map<ChunkHash, Entry> mChunksByHash; + + private ChunkListing(Map<ChunkHash, Entry> chunksByHash) { + mChunksByHash = Collections.unmodifiableMap(new HashMap<>(chunksByHash)); + } + + /** Returns {@code true} if there is a chunk with the given SHA-256 MAC key in the listing. */ + public boolean hasChunk(ChunkHash hash) { + return mChunksByHash.containsKey(hash); + } + + /** + * Returns the entry for the chunk with the given hash. + * + * @param hash The SHA-256 MAC of the plaintext of the chunk. + * @return The entry, containing position and length of the chunk in the backup blob, or null if + * it does not exist. + */ + @Nullable + public Entry getChunkEntry(ChunkHash hash) { + return mChunksByHash.get(hash); + } + + /** Returns the number of chunks in this listing. */ + public int getChunkCount() { + return mChunksByHash.size(); + } + + /** Information about a chunk entry in a backup blob - i.e., its position and length. */ + public static final class Entry { + private final int mLength; + private final long mStart; + + private Entry(long start, int length) { + mStart = start; + mLength = length; + } + + /** Returns the length of the chunk in bytes. */ + public int getLength() { + return mLength; + } + + /** Returns the start position of the chunk in the backup blob, in bytes. */ + public long getStart() { + return mStart; + } + } +} diff --git a/services/backup/java/com/android/server/backup/encryption/chunk/EncryptedChunkOrdering.java b/services/backup/java/com/android/server/backup/encryption/chunk/EncryptedChunkOrdering.java new file mode 100644 index 000000000000..3a6d1f62faaa --- /dev/null +++ b/services/backup/java/com/android/server/backup/encryption/chunk/EncryptedChunkOrdering.java @@ -0,0 +1,67 @@ +/* + * 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.backup.encryption.chunk; + +import java.util.Arrays; + +/** + * Holds the bytes of an encrypted {@link ChunksMetadataProto.ChunkOrdering}. + * + * <p>TODO(b/116575321): After all code is ported, remove the factory method and rename + * encryptedChunkOrdering() to getBytes(). + */ +public class EncryptedChunkOrdering { + /** + * Constructs a new object holding the given bytes of an encrypted {@link + * ChunksMetadataProto.ChunkOrdering}. + * + * <p>Note that this just holds an ordering which is already encrypted, it does not encrypt the + * ordering. + */ + public static EncryptedChunkOrdering create(byte[] encryptedChunkOrdering) { + return new EncryptedChunkOrdering(encryptedChunkOrdering); + } + + private final byte[] mEncryptedChunkOrdering; + + public byte[] encryptedChunkOrdering() { + return mEncryptedChunkOrdering; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof EncryptedChunkOrdering)) { + return false; + } + + EncryptedChunkOrdering encryptedChunkOrdering = (EncryptedChunkOrdering) o; + return Arrays.equals( + mEncryptedChunkOrdering, encryptedChunkOrdering.mEncryptedChunkOrdering); + } + + @Override + public int hashCode() { + return Arrays.hashCode(mEncryptedChunkOrdering); + } + + private EncryptedChunkOrdering(byte[] encryptedChunkOrdering) { + mEncryptedChunkOrdering = encryptedChunkOrdering; + } +} diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index 510d333355a3..461d39d0a29a 100644 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -629,7 +629,7 @@ public final class ActiveServices { return false; } - IIntentSender target = mAm.getIntentSenderLocked( + IIntentSender target = mAm.mPendingIntentController.getIntentSender( ActivityManager.INTENT_SENDER_SERVICE, callingPackage, callingUid, userId, null, null, 0, new Intent[]{service}, new String[]{service.resolveType(mAm.mContext.getContentResolver())}, diff --git a/services/core/java/com/android/server/am/ActivityDisplay.java b/services/core/java/com/android/server/am/ActivityDisplay.java index 01421c7e65c2..fab967c01086 100644 --- a/services/core/java/com/android/server/am/ActivityDisplay.java +++ b/services/core/java/com/android/server/am/ActivityDisplay.java @@ -890,6 +890,8 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack> mRemoved = true; releaseSelfIfNeeded(); + + mSupervisor.getKeyguardController().onDisplayRemoved(mDisplayId); } private void releaseSelfIfNeeded() { diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 6e3ea9fad599..2fd699e5a829 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -134,7 +134,6 @@ import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_PSS; import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_SERVICE; import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_SWITCH; import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_UID_OBSERVERS; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_URI_PERMISSION; import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM; import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.am.ActivityStackSupervisor.PRESERVE_WINDOWS; @@ -417,7 +416,6 @@ public class ActivityManagerService extends IActivityManager.Stub private static final String TAG_SERVICE = TAG + POSTFIX_SERVICE; private static final String TAG_SWITCH = TAG + POSTFIX_SWITCH; private static final String TAG_UID_OBSERVERS = TAG + POSTFIX_UID_OBSERVERS; - private static final String TAG_URI_PERMISSION = TAG + POSTFIX_URI_PERMISSION; // Mock "pretend we're idle now" broadcast action to the job scheduler; declared // here so that while the job scheduler can depend on AMS, the other way around @@ -563,6 +561,7 @@ public class ActivityManagerService extends IActivityManager.Stub String mDeviceOwnerName; final UserController mUserController; + final PendingIntentController mPendingIntentController; final AppErrors mAppErrors; @@ -821,12 +820,6 @@ public class ActivityManagerService extends IActivityManager.Stub final SparseArray<UidRecord> mValidateUids = new SparseArray<>(); /** - * Set of IntentSenderRecord objects that are currently active. - */ - final HashMap<PendingIntentRecord.Key, WeakReference<PendingIntentRecord>> mIntentSenderRecords - = new HashMap<PendingIntentRecord.Key, WeakReference<PendingIntentRecord>>(); - - /** * Fingerprints (hashCode()) of stack traces that we've * already logged DropBox entries for. Guarded by itself. If * something (rogue user app) forces this over @@ -1426,7 +1419,6 @@ public class ActivityManagerService extends IActivityManager.Stub static final int UPDATE_TIME_ZONE = 13; static final int PROC_START_TIMEOUT_MSG = 20; static final int KILL_APPLICATION_MSG = 22; - static final int FINALIZE_PENDING_INTENT_MSG = 23; static final int SHOW_STRICT_MODE_VIOLATION_UI_MSG = 26; static final int CHECK_EXCESSIVE_POWER_USE_MSG = 27; static final int CLEAR_DNS_CACHE_MSG = 28; @@ -1445,7 +1437,6 @@ public class ActivityManagerService extends IActivityManager.Stub static final int IDLE_UIDS_MSG = 58; static final int HANDLE_TRUST_STORAGE_UPDATE_MSG = 63; static final int SERVICE_FOREGROUND_TIMEOUT_MSG = 66; - static final int DISPATCH_PENDING_INTENT_CANCEL_MSG = 67; static final int PUSH_TEMP_WHITELIST_UI_MSG = 68; static final int SERVICE_FOREGROUND_CRASH_MSG = 69; static final int DISPATCH_OOM_ADJ_OBSERVER_MSG = 70; @@ -1644,21 +1635,6 @@ public class ActivityManagerService extends IActivityManager.Stub mServices.serviceForegroundCrash( (ProcessRecord) msg.obj, msg.getData().getCharSequence(SERVICE_RECORD_KEY)); } break; - case DISPATCH_PENDING_INTENT_CANCEL_MSG: { - RemoteCallbackList<IResultReceiver> callbacks - = (RemoteCallbackList<IResultReceiver>)msg.obj; - int N = callbacks.beginBroadcast(); - for (int i = 0; i < N; i++) { - try { - callbacks.getBroadcastItem(i).send(Activity.RESULT_CANCELED, null); - } catch (RemoteException e) { - } - } - callbacks.finishBroadcast(); - // We have to clean up the RemoteCallbackList here, because otherwise it will - // needlessly hold the enclosed callbacks until the remote process dies. - callbacks.kill(); - } break; case UPDATE_TIME_ZONE: { synchronized (ActivityManagerService.this) { for (int i = mLruProcesses.size() - 1 ; i >= 0 ; i--) { @@ -1738,9 +1714,6 @@ public class ActivityManagerService extends IActivityManager.Stub false, userId, reason); } } break; - case FINALIZE_PENDING_INTENT_MSG: { - ((PendingIntentRecord)msg.obj).completeFinalize(); - } break; case CHECK_EXCESSIVE_POWER_USE_MSG: { synchronized (ActivityManagerService.this) { checkExcessivePowerUsageLocked(); @@ -2354,6 +2327,7 @@ public class ActivityManagerService extends IActivityManager.Stub mSystemThread = null; mUiHandler = injector.getUiHandler(null); mUserController = null; + mPendingIntentController = null; mProcStartHandlerThread = null; mProcStartHandler = null; mHiddenApiBlacklist = null; @@ -2407,7 +2381,8 @@ public class ActivityManagerService extends IActivityManager.Stub final File systemDir = SystemServiceManager.ensureSystemDir(); // TODO: Move creation of battery stats service outside of activity manager service. - mBatteryStatsService = new BatteryStatsService(systemContext, systemDir, mHandler); + mBatteryStatsService = new BatteryStatsService(systemContext, systemDir, + BackgroundThread.get().getHandler()); mBatteryStatsService.getActiveStatistics().readLocked(); mBatteryStatsService.scheduleWriteToDisk(); mOnBattery = DEBUG_POWER ? true @@ -2438,6 +2413,9 @@ public class ActivityManagerService extends IActivityManager.Stub mAtmInternal = LocalServices.getService(ActivityTaskManagerInternal.class); mStackSupervisor = mActivityTaskManager.mStackSupervisor; + mPendingIntentController = new PendingIntentController( + mHandlerThread.getLooper(), mUserController); + mProcessCpuThread = new Thread("CpuTracker") { @Override public void run() { @@ -2508,6 +2486,7 @@ public class ActivityManagerService extends IActivityManager.Stub LocalServices.addService(ActivityManagerInternal.class, new LocalService()); mActivityTaskManager.onActivityManagerInternalAdded(); mUgmInternal.onActivityManagerInternalAdded(); + mPendingIntentController.onActivityManagerInternalAdded(); // Wait for the synchronized block started in mProcessCpuThread, // so that any other access to mProcessCpuTracker from main thread // will be blocked during mProcessCpuTracker initialization. @@ -5511,55 +5490,8 @@ public class ActivityManagerService extends IActivityManager.Stub } if (packageName == null || uninstalling) { - // Remove pending intents. For now we only do this when force - // stopping users, because we have some problems when doing this - // for packages -- app widgets are not currently cleaned up for - // such packages, so they can be left with bad pending intents. - if (mIntentSenderRecords.size() > 0) { - Iterator<WeakReference<PendingIntentRecord>> it - = mIntentSenderRecords.values().iterator(); - while (it.hasNext()) { - WeakReference<PendingIntentRecord> wpir = it.next(); - if (wpir == null) { - it.remove(); - continue; - } - PendingIntentRecord pir = wpir.get(); - if (pir == null) { - it.remove(); - continue; - } - if (packageName == null) { - // Stopping user, remove all objects for the user. - if (pir.key.userId != userId) { - // Not the same user, skip it. - continue; - } - } else { - if (UserHandle.getAppId(pir.uid) != appId) { - // Different app id, skip it. - continue; - } - if (userId != UserHandle.USER_ALL && pir.key.userId != userId) { - // Different user, skip it. - continue; - } - if (!pir.key.packageName.equals(packageName)) { - // Different package, skip it. - continue; - } - } - if (!doit) { - return true; - } - didSomething = true; - it.remove(); - makeIntentSenderCanceledLocked(pir); - if (pir.key.activity != null && pir.key.activity.pendingResults != null) { - pir.key.activity.pendingResults.remove(pir.ref); - } - } - } + didSomething |= mPendingIntentController.removePendingIntentsForPackage( + packageName, userId, appId, doit); } if (doit) { @@ -6342,90 +6274,19 @@ public class ActivityManagerService extends IActivityManager.Stub } } - return getIntentSenderLocked(type, packageName, callingUid, userId, - token, resultWho, requestCode, intents, resolvedTypes, flags, bOptions); - + if (type == ActivityManager.INTENT_SENDER_ACTIVITY_RESULT) { + return mAtmInternal.getIntentSender(type, packageName, callingUid, userId, + token, resultWho, requestCode, intents, resolvedTypes, flags, bOptions); + } + return mPendingIntentController.getIntentSender(type, packageName, callingUid, + userId, token, resultWho, requestCode, intents, resolvedTypes, flags, + bOptions); } catch (RemoteException e) { throw new SecurityException(e); } } } - IIntentSender getIntentSenderLocked(int type, String packageName, - int callingUid, int userId, IBinder token, String resultWho, - int requestCode, Intent[] intents, String[] resolvedTypes, int flags, - Bundle bOptions) { - if (DEBUG_MU) Slog.v(TAG_MU, "getIntentSenderLocked(): uid=" + callingUid); - ActivityRecord activity = null; - if (type == ActivityManager.INTENT_SENDER_ACTIVITY_RESULT) { - activity = ActivityRecord.isInStackLocked(token); - if (activity == null) { - Slog.w(TAG, "Failed createPendingResult: activity " + token + " not in any stack"); - return null; - } - if (activity.finishing) { - Slog.w(TAG, "Failed createPendingResult: activity " + activity + " is finishing"); - return null; - } - } - - // We're going to be splicing together extras before sending, so we're - // okay poking into any contained extras. - if (intents != null) { - for (int i = 0; i < intents.length; i++) { - intents[i].setDefusable(true); - } - } - Bundle.setDefusable(bOptions, true); - - final boolean noCreate = (flags&PendingIntent.FLAG_NO_CREATE) != 0; - final boolean cancelCurrent = (flags&PendingIntent.FLAG_CANCEL_CURRENT) != 0; - final boolean updateCurrent = (flags&PendingIntent.FLAG_UPDATE_CURRENT) != 0; - flags &= ~(PendingIntent.FLAG_NO_CREATE|PendingIntent.FLAG_CANCEL_CURRENT - |PendingIntent.FLAG_UPDATE_CURRENT); - - PendingIntentRecord.Key key = new PendingIntentRecord.Key(type, packageName, activity, - resultWho, requestCode, intents, resolvedTypes, flags, - SafeActivityOptions.fromBundle(bOptions), userId); - WeakReference<PendingIntentRecord> ref; - ref = mIntentSenderRecords.get(key); - PendingIntentRecord rec = ref != null ? ref.get() : null; - if (rec != null) { - if (!cancelCurrent) { - if (updateCurrent) { - if (rec.key.requestIntent != null) { - rec.key.requestIntent.replaceExtras(intents != null ? - intents[intents.length - 1] : null); - } - if (intents != null) { - intents[intents.length-1] = rec.key.requestIntent; - rec.key.allIntents = intents; - rec.key.allResolvedTypes = resolvedTypes; - } else { - rec.key.allIntents = null; - rec.key.allResolvedTypes = null; - } - } - return rec; - } - makeIntentSenderCanceledLocked(rec); - mIntentSenderRecords.remove(key); - } - if (noCreate) { - return rec; - } - rec = new PendingIntentRecord(this, key, callingUid); - mIntentSenderRecords.put(key, rec.ref); - if (type == ActivityManager.INTENT_SENDER_ACTIVITY_RESULT) { - if (activity.pendingResults == null) { - activity.pendingResults - = new HashSet<WeakReference<PendingIntentRecord>>(); - } - activity.pendingResults.add(rec.ref); - } - return rec; - } - @Override public int sendIntentSender(IIntentSender target, IBinder whitelistToken, int code, Intent intent, String resolvedType, @@ -6465,44 +6326,7 @@ public class ActivityManagerService extends IActivityManager.Stub @Override public void cancelIntentSender(IIntentSender sender) { - if (!(sender instanceof PendingIntentRecord)) { - return; - } - synchronized(this) { - PendingIntentRecord rec = (PendingIntentRecord)sender; - try { - final int uid = AppGlobals.getPackageManager().getPackageUid(rec.key.packageName, - MATCH_DEBUG_TRIAGED_MISSING, UserHandle.getCallingUserId()); - if (!UserHandle.isSameApp(uid, Binder.getCallingUid())) { - String msg = "Permission Denial: cancelIntentSender() from pid=" - + Binder.getCallingPid() - + ", uid=" + Binder.getCallingUid() - + " is not allowed to cancel package " - + rec.key.packageName; - Slog.w(TAG, msg); - throw new SecurityException(msg); - } - } catch (RemoteException e) { - throw new SecurityException(e); - } - cancelIntentSenderLocked(rec, true); - } - } - - void cancelIntentSenderLocked(PendingIntentRecord rec, boolean cleanActivity) { - makeIntentSenderCanceledLocked(rec); - mIntentSenderRecords.remove(rec.key); - if (cleanActivity && rec.key.activity != null) { - rec.key.activity.pendingResults.remove(rec.ref); - } - } - - void makeIntentSenderCanceledLocked(PendingIntentRecord rec) { - rec.canceled = true; - RemoteCallbackList<IResultReceiver> callbacks = rec.detachCancelListenersLocked(); - if (callbacks != null) { - mHandler.obtainMessage(DISPATCH_PENDING_INTENT_CANCEL_MSG, callbacks).sendToTarget(); - } + mPendingIntentController.cancelIntentSender(sender); } @Override @@ -9607,9 +9431,10 @@ public class ActivityManagerService extends IActivityManager.Stub mBatteryStatsService.noteWakupAlarm(sourcePkg, sourceUid, workSource, tag); if (workSource != null) { - StatsLog.write(StatsLog.WAKEUP_ALARM_OCCURRED, workSource, tag); + StatsLog.write(StatsLog.WAKEUP_ALARM_OCCURRED, workSource, tag, sourcePkg); } else { - StatsLog.write_non_chained(StatsLog.WAKEUP_ALARM_OCCURRED, sourceUid, null, tag); + StatsLog.write_non_chained(StatsLog.WAKEUP_ALARM_OCCURRED, sourceUid, null, tag, + sourcePkg); } } @@ -10866,7 +10691,7 @@ public class ActivityManagerService extends IActivityManager.Stub pw.println("-------------------------------------------------------------------------------"); } - dumpPendingIntentsLocked(fd, pw, args, opti, dumpAll, dumpPackage); + mPendingIntentController.dumpPendingIntents(pw, dumpAll, dumpPackage); pw.println(); if (dumpAll) { pw.println("-------------------------------------------------------------------------------"); @@ -11159,7 +10984,7 @@ public class ActivityManagerService extends IActivityManager.Stub opti++; } synchronized (this) { - dumpPendingIntentsLocked(fd, pw, args, opti, true, dumpPackage); + mPendingIntentController.dumpPendingIntents(pw, true, dumpPackage); } } else if ("processes".equals(cmd) || "p".equals(cmd)) { if (opti < args.length) { @@ -12857,61 +12682,6 @@ public class ActivityManagerService extends IActivityManager.Stub mUgmInternal.dump(pw, dumpAll, dumpPackage); } - void dumpPendingIntentsLocked(FileDescriptor fd, PrintWriter pw, String[] args, - int opti, boolean dumpAll, String dumpPackage) { - boolean printed = false; - - pw.println("ACTIVITY MANAGER PENDING INTENTS (dumpsys activity intents)"); - - if (mIntentSenderRecords.size() > 0) { - // Organize these by package name, so they are easier to read. - final ArrayMap<String, ArrayList<PendingIntentRecord>> byPackage = new ArrayMap<>(); - final ArrayList<WeakReference<PendingIntentRecord>> weakRefs = new ArrayList<>(); - final Iterator<WeakReference<PendingIntentRecord>> it - = mIntentSenderRecords.values().iterator(); - while (it.hasNext()) { - WeakReference<PendingIntentRecord> ref = it.next(); - PendingIntentRecord rec = ref != null ? ref.get() : null; - if (rec == null) { - weakRefs.add(ref); - continue; - } - if (dumpPackage != null && !dumpPackage.equals(rec.key.packageName)) { - continue; - } - ArrayList<PendingIntentRecord> list = byPackage.get(rec.key.packageName); - if (list == null) { - list = new ArrayList<>(); - byPackage.put(rec.key.packageName, list); - } - list.add(rec); - } - for (int i = 0; i < byPackage.size(); i++) { - ArrayList<PendingIntentRecord> intents = byPackage.valueAt(i); - printed = true; - pw.print(" * "); pw.print(byPackage.keyAt(i)); - pw.print(": "); pw.print(intents.size()); pw.println(" items"); - for (int j = 0; j < intents.size(); j++) { - pw.print(" #"); pw.print(j); pw.print(": "); pw.println(intents.get(j)); - if (dumpAll) { - intents.get(j).dump(pw, " "); - } - } - } - if (weakRefs.size() > 0) { - printed = true; - pw.println(" * WEAK REFS:"); - for (int i = 0; i < weakRefs.size(); i++) { - pw.print(" #"); pw.print(i); pw.print(": "); pw.println(weakRefs.get(i)); - } - } - } - - if (!printed) { - pw.println(" (nothing)"); - } - } - private static final int dumpProcessList(PrintWriter pw, ActivityManagerService service, List list, String prefix, String normalLabel, String persistentLabel, @@ -15186,24 +14956,6 @@ public class ActivityManagerService extends IActivityManager.Stub } } - ComponentName startServiceInPackage(int uid, Intent service, String resolvedType, - boolean fgRequired, String callingPackage, int userId) - throws TransactionTooLargeException { - synchronized(this) { - if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, - "startServiceInPackage: " + service + " type=" + resolvedType); - final long origId = Binder.clearCallingIdentity(); - ComponentName res; - try { - res = mServices.startServiceLocked(null, service, - resolvedType, -1, uid, fgRequired, callingPackage, userId); - } finally { - Binder.restoreCallingIdentity(origId); - } - return res; - } - } - @Override public int stopService(IApplicationThread caller, Intent service, String resolvedType, int userId) { @@ -21092,6 +20844,46 @@ public class ActivityManagerService extends IActivityManager.Stub public void finishBooting() { ActivityManagerService.this.finishBooting(); } + + @Override + public void tempWhitelistForPendingIntent(int callerPid, int callerUid, int targetUid, + long duration, String tag) { + synchronized (ActivityManagerService.this) { + ActivityManagerService.this.tempWhitelistForPendingIntentLocked( + callerPid, callerUid, targetUid, duration, tag); + } + } + + @Override + public int broadcastIntentInPackage(String packageName, int uid, Intent intent, + String resolvedType, IIntentReceiver resultTo, int resultCode, String resultData, + Bundle resultExtras, String requiredPermission, Bundle bOptions, boolean serialized, + boolean sticky, int userId) { + synchronized (ActivityManagerService.this) { + return ActivityManagerService.this.broadcastIntentInPackage(packageName, uid, + intent, resolvedType, resultTo, resultCode, resultData, resultExtras, + requiredPermission, bOptions, serialized, sticky, userId); + } + } + + @Override + public ComponentName startServiceInPackage(int uid, Intent service, String resolvedType, + boolean fgRequired, String callingPackage, int userId) + throws TransactionTooLargeException { + synchronized(ActivityManagerService.this) { + if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, + "startServiceInPackage: " + service + " type=" + resolvedType); + final long origId = Binder.clearCallingIdentity(); + ComponentName res; + try { + res = mServices.startServiceLocked(null, service, + resolvedType, -1, uid, fgRequired, callingPackage, userId); + } finally { + Binder.restoreCallingIdentity(origId); + } + return res; + } + } } /** diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index 35a1eb8ff616..9f59bd8db62a 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -2450,13 +2450,24 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai if (shouldSleepOrShutDownActivities() && mLastPausedActivity == next && mStackSupervisor.allPausedActivitiesComplete()) { - // Make sure we have executed any pending transitions, since there - // should be nothing left to do at this point. - executeAppTransition(options); - if (DEBUG_STATES) Slog.d(TAG_STATES, - "resumeTopActivityLocked: Going to sleep and all paused"); - if (DEBUG_STACK) mStackSupervisor.validateTopActivitiesLocked(); - return false; + // If the current top activity may be able to occlude keyguard but the occluded state + // has not been set, update visibility and check again if we should continue to resume. + boolean nothingToResume = true; + if (!mService.mShuttingDown && !mTopActivityOccludesKeyguard + && next.canShowWhenLocked()) { + ensureActivitiesVisibleLocked(null /* starting */, 0 /* configChanges */, + !PRESERVE_WINDOWS); + nothingToResume = shouldSleepActivities(); + } + if (nothingToResume) { + // Make sure we have executed any pending transitions, since there + // should be nothing left to do at this point. + executeAppTransition(options); + if (DEBUG_STATES) Slog.d(TAG_STATES, + "resumeTopActivityLocked: Going to sleep and all paused"); + if (DEBUG_STACK) mStackSupervisor.validateTopActivitiesLocked(); + return false; + } } // Make sure that the user who owns this activity is started. If not, @@ -4144,7 +4155,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai for (WeakReference<PendingIntentRecord> apr : r.pendingResults) { PendingIntentRecord rec = apr.get(); if (rec != null) { - mService.mAm.cancelIntentSenderLocked(rec, false); + mService.mPendingIntentController.cancelIntentSender(rec, false); } } r.pendingResults = null; diff --git a/services/core/java/com/android/server/am/ActivityStartInterceptor.java b/services/core/java/com/android/server/am/ActivityStartInterceptor.java index 177e2f563a4b..1fb8f871efcd 100644 --- a/services/core/java/com/android/server/am/ActivityStartInterceptor.java +++ b/services/core/java/com/android/server/am/ActivityStartInterceptor.java @@ -126,7 +126,7 @@ class ActivityStartInterceptor { private IntentSender createIntentSenderForOriginalIntent(int callingUid, int flags) { Bundle activityOptions = deferCrossProfileAppsAnimationIfNecessary(); - final IIntentSender target = mService.mAm.getIntentSenderLocked( + final IIntentSender target = mService.getIntentSenderLocked( INTENT_SENDER_ACTIVITY, mCallingPackage, callingUid, mUserId, null /*token*/, null /*resultCode*/, 0 /*requestCode*/, new Intent[] { mIntent }, new String[] { mResolvedType }, diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java index 7da0519ef2f0..890aafefdf0f 100644 --- a/services/core/java/com/android/server/am/ActivityStarter.java +++ b/services/core/java/com/android/server/am/ActivityStarter.java @@ -783,7 +783,7 @@ class ActivityStarter { if (aInfo != null) { if (mService.getPackageManagerInternalLocked().isPermissionsReviewRequired( aInfo.packageName, userId)) { - IIntentSender target = mService.mAm.getIntentSenderLocked( + IIntentSender target = mService.getIntentSenderLocked( ActivityManager.INTENT_SENDER_ACTIVITY, callingPackage, callingUid, userId, null, null, 0, new Intent[]{intent}, new String[]{resolvedType}, PendingIntent.FLAG_CANCEL_CURRENT @@ -1096,7 +1096,7 @@ class ActivityStarter { } } - IIntentSender target = mService.mAm.getIntentSenderLocked( + IIntentSender target = mService.getIntentSenderLocked( ActivityManager.INTENT_SENDER_ACTIVITY, "android", appCallingUid, userId, null, null, 0, new Intent[] { intent }, new String[] { resolvedType }, PendingIntent.FLAG_CANCEL_CURRENT diff --git a/services/core/java/com/android/server/am/ActivityTaskManagerService.java b/services/core/java/com/android/server/am/ActivityTaskManagerService.java index 4dc28510c5ec..36261b505a94 100644 --- a/services/core/java/com/android/server/am/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/am/ActivityTaskManagerService.java @@ -239,7 +239,9 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; +import java.lang.ref.WeakReference; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.Locale; @@ -276,6 +278,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { UriGrantsManagerInternal mUgmInternal; private PackageManagerInternal mPmInternal; private ActivityTaskManagerInternal mInternal; + PendingIntentController mPendingIntentController; /* Global service lock used by the package the owns this service. */ Object mGlobalLock; ActivityStackSupervisor mStackSupervisor; @@ -628,6 +631,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { final File systemDir = SystemServiceManager.ensureSystemDir(); mAppWarnings = new AppWarnings(this, mUiContext, mH, mUiHandler, systemDir); mCompatModePackages = new CompatModePackages(this, systemDir, mH); + mPendingIntentController = mAm.mPendingIntentController; mTempConfig.setToDefaults(); mTempConfig.setLocales(LocaleList.getDefault()); @@ -1956,10 +1960,12 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { final TaskRecord task = mStackSupervisor.anyTaskForIdLocked(taskId); if (task == null) { Slog.d(TAG, "Could not find task for id: "+ taskId); + SafeActivityOptions.abort(options); return; } if (getLockTaskController().isLockTaskModeViolation(task)) { Slog.e(TAG, "moveTaskToFront: Attempt to violate Lock Task Mode"); + SafeActivityOptions.abort(options); return; } ActivityOptions realOptions = options != null @@ -1979,7 +1985,6 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } finally { Binder.restoreCallingIdentity(origId); } - SafeActivityOptions.abort(options); } boolean checkAppSwitchAllowedLocked(int sourcePid, int sourceUid, @@ -5019,6 +5024,39 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } + IIntentSender getIntentSenderLocked(int type, String packageName, int callingUid, int userId, + IBinder token, String resultWho, int requestCode, Intent[] intents, + String[] resolvedTypes, int flags, Bundle bOptions) { + + ActivityRecord activity = null; + if (type == ActivityManager.INTENT_SENDER_ACTIVITY_RESULT) { + activity = ActivityRecord.isInStackLocked(token); + if (activity == null) { + Slog.w(TAG, "Failed createPendingResult: activity " + token + " not in any stack"); + return null; + } + if (activity.finishing) { + Slog.w(TAG, "Failed createPendingResult: activity " + activity + " is finishing"); + return null; + } + } + + final PendingIntentRecord rec = mPendingIntentController.getIntentSender(type, packageName, + callingUid, userId, token, resultWho, requestCode, intents, resolvedTypes, flags, + bOptions); + final boolean noCreate = (flags & PendingIntent.FLAG_NO_CREATE) != 0; + if (noCreate) { + return rec; + } + if (type == ActivityManager.INTENT_SENDER_ACTIVITY_RESULT) { + if (activity.pendingResults == null) { + activity.pendingResults = new HashSet<>(); + } + activity.pendingResults.add(rec.ref); + } + return rec; + } + // TODO(b/111541062): Update app time tracking to make it aware of multiple resumed activities private void startTimeTrackingFocusedActivityLocked() { final ActivityRecord resumedActivity = mStackSupervisor.getTopResumedActivity(); @@ -5310,6 +5348,31 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } @Override + public int startActivitiesInPackage(int uid, String callingPackage, Intent[] intents, + String[] resolvedTypes, IBinder resultTo, SafeActivityOptions options, int userId, + boolean validateIncomingUser, PendingIntentRecord originatingPendingIntent) { + synchronized (mGlobalLock) { + return getActivityStartController().startActivitiesInPackage(uid, callingPackage, + intents, resolvedTypes, resultTo, options, userId, validateIncomingUser, + originatingPendingIntent); + } + } + + @Override + public int startActivityInPackage(int uid, int realCallingPid, int realCallingUid, + String callingPackage, Intent intent, String resolvedType, IBinder resultTo, + String resultWho, int requestCode, int startFlags, SafeActivityOptions options, + int userId, TaskRecord inTask, String reason, boolean validateIncomingUser, + PendingIntentRecord originatingPendingIntent) { + synchronized (mGlobalLock) { + return getActivityStartController().startActivityInPackage(uid, realCallingPid, + realCallingUid, callingPackage, intent, resolvedType, resultTo, resultWho, + requestCode, startFlags, options, userId, inTask, reason, + validateIncomingUser, originatingPendingIntent); + } + } + + @Override public int startActivityAsUser(IApplicationThread caller, String callerPacakge, Intent intent, Bundle options, int userId) { return ActivityTaskManagerService.this.startActivityAsUser( @@ -5684,5 +5747,39 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } }); } + + @Override + public void sendActivityResult(int callingUid, IBinder activityToken, String resultWho, + int requestCode, int resultCode, Intent data) { + synchronized (mGlobalLock) { + final ActivityRecord r = ActivityRecord.isInStackLocked(activityToken); + if (r != null && r.getStack() != null) { + r.getStack().sendActivityResultLocked(callingUid, r, resultWho, requestCode, + resultCode, data); + } + } + } + + @Override + public void clearPendingResultForActivity(IBinder activityToken, + WeakReference<PendingIntentRecord> pir) { + synchronized (mGlobalLock) { + final ActivityRecord r = ActivityRecord.isInStackLocked(activityToken); + if (r != null && r.pendingResults != null) { + r.pendingResults.remove(pir); + } + } + } + + @Override + public IIntentSender getIntentSender(int type, String packageName, + int callingUid, int userId, IBinder token, String resultWho, + int requestCode, Intent[] intents, String[] resolvedTypes, int flags, + Bundle bOptions) { + synchronized (mGlobalLock) { + return getIntentSenderLocked(type, packageName, callingUid, userId, token, + resultWho, requestCode, intents, resolvedTypes, flags, bOptions); + } + } } } diff --git a/services/core/java/com/android/server/am/BroadcastQueue.java b/services/core/java/com/android/server/am/BroadcastQueue.java index 16c3235cd729..e2035f67031a 100644 --- a/services/core/java/com/android/server/am/BroadcastQueue.java +++ b/services/core/java/com/android/server/am/BroadcastQueue.java @@ -741,7 +741,7 @@ public final class BroadcastQueue { // Show a permission review UI only for explicit broadcast from a foreground app if (callerForeground && receiverRecord.intent.getComponent() != null) { - IIntentSender target = mService.getIntentSenderLocked( + IIntentSender target = mService.mPendingIntentController.getIntentSender( ActivityManager.INTENT_SENDER_BROADCAST, receiverRecord.callerPackage, receiverRecord.callingUid, receiverRecord.userId, null, null, 0, new Intent[]{receiverRecord.intent}, diff --git a/services/core/java/com/android/server/am/KeyguardController.java b/services/core/java/com/android/server/am/KeyguardController.java index ee4e36ff1fd1..cfe282917f3b 100644 --- a/services/core/java/com/android/server/am/KeyguardController.java +++ b/services/core/java/com/android/server/am/KeyguardController.java @@ -29,16 +29,20 @@ import static android.view.WindowManager.TRANSIT_UNSET; import static android.view.WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG_NO_WINDOW_ANIMATIONS; import static android.view.WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG_TO_SHADE; import static android.view.WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG_WITH_WALLPAPER; + import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM; import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.am.ActivityStackSupervisor.PRESERVE_WINDOWS; -import static com.android.server.am.KeyguardControllerProto.KEYGUARD_OCCLUDED; +import static com.android.server.am.KeyguardControllerProto.KEYGUARD_OCCLUDED_STATES; import static com.android.server.am.KeyguardControllerProto.KEYGUARD_SHOWING; +import static com.android.server.am.KeyguardOccludedProto.DISPLAY_ID; +import static com.android.server.am.KeyguardOccludedProto.KEYGUARD_OCCLUDED; import android.os.IBinder; import android.os.RemoteException; import android.os.Trace; import android.util.Slog; +import android.util.SparseArray; import android.util.proto.ProtoOutputStream; import com.android.internal.policy.IKeyguardDismissCallback; @@ -58,19 +62,18 @@ class KeyguardController { private static final String TAG = TAG_WITH_CLASS_NAME ? "KeyguardController" : TAG_AM; - private final ActivityTaskManagerService mService; private final ActivityStackSupervisor mStackSupervisor; private WindowManagerService mWindowManager; private boolean mKeyguardShowing; private boolean mAodShowing; private boolean mKeyguardGoingAway; - private boolean mOccluded; private boolean mDismissalRequested; - private ActivityRecord mDismissingKeyguardActivity; private int mBeforeUnoccludeTransit; private int mVisibilityTransactionDepth; - private SleepToken mSleepToken; + // TODO(b/111955725): Support multiple external displays private int mSecondaryDisplayShowing = INVALID_DISPLAY; + private final SparseArray<KeyguardDisplayState> mDisplayStates = new SparseArray<>(); + private final ActivityTaskManagerService mService; KeyguardController(ActivityTaskManagerService service, ActivityStackSupervisor stackSupervisor) { @@ -87,8 +90,8 @@ class KeyguardController { * on the given display, false otherwise */ boolean isKeyguardOrAodShowing(int displayId) { - return (mKeyguardShowing || mAodShowing) && !mKeyguardGoingAway && - (displayId == DEFAULT_DISPLAY ? !mOccluded : displayId == mSecondaryDisplayShowing); + return (mKeyguardShowing || mAodShowing) && !mKeyguardGoingAway + && !isDisplayOccluded(displayId); } /** @@ -96,8 +99,7 @@ class KeyguardController { * display, false otherwise */ boolean isKeyguardShowing(int displayId) { - return mKeyguardShowing && !mKeyguardGoingAway && - (displayId == DEFAULT_DISPLAY ? !mOccluded : displayId == mSecondaryDisplayShowing); + return mKeyguardShowing && !mKeyguardGoingAway && !isDisplayOccluded(displayId); } /** @@ -133,6 +135,7 @@ class KeyguardController { if (showingChanged) { dismissDockedStackIfNeeded(); setKeyguardGoingAway(false); + // TODO(b/113840485): Check usage for non-default display mWindowManager.setKeyguardOrAodShowingOnDefaultDisplay( isKeyguardOrAodShowing(DEFAULT_DISPLAY)); if (keyguardShowing) { @@ -248,7 +251,8 @@ class KeyguardController { // already the dismissing activity, in which case we don't allow it to repeatedly dismiss // Keyguard. return dismissKeyguard && canDismissKeyguard() && !mAodShowing - && (mDismissalRequested || r != mDismissingKeyguardActivity); + && (mDismissalRequested + || getDisplay(r.getDisplayId()).mDismissingKeyguardActivity != r); } /** @@ -259,44 +263,16 @@ class KeyguardController { } private void visibilitiesUpdated() { - final boolean lastOccluded = mOccluded; - final ActivityRecord lastDismissingKeyguardActivity = mDismissingKeyguardActivity; - mOccluded = false; - mDismissingKeyguardActivity = null; - + boolean requestDismissKeyguard = false; for (int displayNdx = mStackSupervisor.getChildCount() - 1; displayNdx >= 0; displayNdx--) { final ActivityDisplay display = mStackSupervisor.getChildAt(displayNdx); - for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) { - final ActivityStack stack = display.getChildAt(stackNdx); - - // Only the top activity of the focused stack on the default display may control - // occluded state. - if (display.mDisplayId == DEFAULT_DISPLAY - && mStackSupervisor.isTopDisplayFocusedStack(stack)) { - - // A dismissing activity occludes Keyguard in the insecure case for legacy - // reasons. - final ActivityRecord topDismissing = stack.getTopDismissingKeyguardActivity(); - mOccluded = - stack.topActivityOccludesKeyguard() - || (topDismissing != null - && stack.topRunningActivityLocked() == topDismissing - && canShowWhileOccluded( - true /* dismissKeyguard */, - false /* showWhenLocked */)); - } - - if (mDismissingKeyguardActivity == null - && stack.getTopDismissingKeyguardActivity() != null) { - mDismissingKeyguardActivity = stack.getTopDismissingKeyguardActivity(); - } - } - } - mOccluded |= mWindowManager.isShowingDream(); - if (mOccluded != lastOccluded) { - handleOccludedChanged(); + final KeyguardDisplayState state = getDisplay(display.mDisplayId); + state.visibilitiesUpdated(this, display); + requestDismissKeyguard |= state.mRequestDismissKeyguard; } - if (mDismissingKeyguardActivity != lastDismissingKeyguardActivity) { + + // Dismissing Keyguard happens globally using the information from all displays. + if (requestDismissKeyguard) { handleDismissKeyguard(); } } @@ -305,7 +281,7 @@ class KeyguardController { * Called when occluded state changed. */ private void handleOccludedChanged() { - mWindowManager.onKeyguardOccludedChanged(mOccluded); + mWindowManager.onKeyguardOccludedChanged(isDisplayOccluded(DEFAULT_DISPLAY)); if (isKeyguardLocked()) { mWindowManager.deferSurfaceLayout(); try { @@ -322,14 +298,13 @@ class KeyguardController { } /** - * Called when somebody might want to dismiss the Keyguard. + * Called when somebody wants to dismiss the Keyguard via the flag. */ private void handleDismissKeyguard() { // We only allow dismissing Keyguard via the flag when Keyguard is secure for legacy // reasons, because that's how apps used to dismiss Keyguard in the secure case. In the // insecure case, we actually show it on top of the lockscreen. See #canShowWhileOccluded. - if (!mOccluded && mDismissingKeyguardActivity != null - && mWindowManager.isKeyguardSecure()) { + if (mWindowManager.isKeyguardSecure()) { mWindowManager.dismissKeyguard(null /* callback */, null /* message */); mDismissalRequested = true; @@ -345,6 +320,10 @@ class KeyguardController { } } + private boolean isDisplayOccluded(int displayId) { + return getDisplay(displayId).mOccluded; + } + /** * @return true if Keyguard can be currently dismissed without entering credentials. */ @@ -355,12 +334,14 @@ class KeyguardController { private int resolveOccludeTransit() { if (mBeforeUnoccludeTransit != TRANSIT_UNSET && mWindowManager.getPendingAppTransition() == TRANSIT_KEYGUARD_UNOCCLUDE - && mOccluded) { + // TODO(b/113840485): Handle app transition for individual display. + && isDisplayOccluded(DEFAULT_DISPLAY)) { // Reuse old transit in case we are occluding Keyguard again, meaning that we never // actually occclude/unocclude Keyguard, but just run a normal transition. return mBeforeUnoccludeTransit; - } else if (!mOccluded) { + // TODO(b/113840485): Handle app transition for individual display. + } else if (!isDisplayOccluded(DEFAULT_DISPLAY)) { // Save transit in case we dismiss/occlude Keyguard shortly after. mBeforeUnoccludeTransit = mWindowManager.getPendingAppTransition(); @@ -371,7 +352,8 @@ class KeyguardController { } private void dismissDockedStackIfNeeded() { - if (mKeyguardShowing && mOccluded) { + // TODO(b/113840485): Handle docked stack for individual display. + if (mKeyguardShowing && isDisplayOccluded(DEFAULT_DISPLAY)) { // The lock screen is currently showing, but is occluded by a window that can // show on top of the lock screen. In this can we want to dismiss the docked // stack since it will be complicated/risky to try to put the activity on top @@ -386,11 +368,116 @@ class KeyguardController { } private void updateKeyguardSleepToken() { - if (mSleepToken == null && isKeyguardOrAodShowing(DEFAULT_DISPLAY)) { - mSleepToken = mService.acquireSleepToken("Keyguard", DEFAULT_DISPLAY); - } else if (mSleepToken != null && !isKeyguardOrAodShowing(DEFAULT_DISPLAY)) { - mSleepToken.release(); - mSleepToken = null; + for (int displayNdx = mStackSupervisor.getChildCount() - 1; displayNdx >= 0; displayNdx--) { + final ActivityDisplay display = mStackSupervisor.getChildAt(displayNdx); + final KeyguardDisplayState state = getDisplay(display.mDisplayId); + if (isKeyguardOrAodShowing(display.mDisplayId) && state.mSleepToken == null) { + state.acquiredSleepToken(); + } else if (!isKeyguardOrAodShowing(display.mDisplayId) && state.mSleepToken != null) { + state.releaseSleepToken(); + } + } + } + + private KeyguardDisplayState getDisplay(int displayId) { + if (mDisplayStates.get(displayId) == null) { + mDisplayStates.append(displayId, + new KeyguardDisplayState(mService, displayId)); + } + return mDisplayStates.get(displayId); + } + + void onDisplayRemoved(int displayId) { + if (mDisplayStates.get(displayId) != null) { + mDisplayStates.get(displayId).onRemoved(); + mDisplayStates.remove(displayId); + } + } + + /** Represents Keyguard state per individual display. */ + private static class KeyguardDisplayState { + private final int mDisplayId; + private boolean mOccluded; + private ActivityRecord mDismissingKeyguardActivity; + private boolean mRequestDismissKeyguard; + private final ActivityTaskManagerService mService; + private SleepToken mSleepToken; + + KeyguardDisplayState(ActivityTaskManagerService service, int displayId) { + mService = service; + mDisplayId = displayId; + } + + void onRemoved() { + mDismissingKeyguardActivity = null; + releaseSleepToken(); + } + + void acquiredSleepToken() { + if (mSleepToken == null) { + mSleepToken = mService.acquireSleepToken("keyguard", mDisplayId); + } + } + + void releaseSleepToken() { + if (mSleepToken != null) { + mSleepToken.release(); + mSleepToken = null; + } + } + + void visibilitiesUpdated(KeyguardController controller, ActivityDisplay display) { + final boolean lastOccluded = mOccluded; + final ActivityRecord lastDismissActivity = mDismissingKeyguardActivity; + mRequestDismissKeyguard = false; + mOccluded = false; + mDismissingKeyguardActivity = null; + + // Only the top activity of the focused stack on each display may control it's + // occluded state. + final ActivityStack focusedStack = display.getFocusedStack(); + if (focusedStack != null) { + final ActivityRecord topDismissing = + focusedStack.getTopDismissingKeyguardActivity(); + mOccluded = focusedStack.topActivityOccludesKeyguard() || (topDismissing != null + && focusedStack.topRunningActivityLocked() == topDismissing + && controller.canShowWhileOccluded( + true /* dismissKeyguard */, + false /* showWhenLocked */)); + if (focusedStack.getTopDismissingKeyguardActivity() != null) { + mDismissingKeyguardActivity = focusedStack.getTopDismissingKeyguardActivity(); + } + mOccluded |= controller.mWindowManager.isShowingDream(); + } + + // TODO(b/113840485): Handle app transition for individual display. + // For now, only default display can change occluded. + if (lastOccluded != mOccluded && mDisplayId == DEFAULT_DISPLAY) { + controller.handleOccludedChanged(); + } + if (lastDismissActivity != mDismissingKeyguardActivity && !mOccluded + && mDismissingKeyguardActivity != null + && controller.mWindowManager.isKeyguardSecure()) { + mRequestDismissKeyguard = true; + } + } + + void dumpStatus(PrintWriter pw, String prefix) { + final StringBuilder sb = new StringBuilder(); + sb.append(prefix); + sb.append(" Occluded=").append(mOccluded) + .append(" DismissingKeyguardActivity=") + .append(mDismissingKeyguardActivity) + .append(" at display=") + .append(mDisplayId); + pw.println(sb.toString()); + } + + void writeToProto(ProtoOutputStream proto, long fieldId) { + final long token = proto.start(fieldId); + proto.write(DISPLAY_ID, mDisplayId); + proto.write(KEYGUARD_OCCLUDED, mOccluded); + proto.end(token); } } @@ -399,8 +486,7 @@ class KeyguardController { pw.println(prefix + " mKeyguardShowing=" + mKeyguardShowing); pw.println(prefix + " mAodShowing=" + mAodShowing); pw.println(prefix + " mKeyguardGoingAway=" + mKeyguardGoingAway); - pw.println(prefix + " mOccluded=" + mOccluded); - pw.println(prefix + " mDismissingKeyguardActivity=" + mDismissingKeyguardActivity); + dumpDisplayStates(pw, prefix); pw.println(prefix + " mDismissalRequested=" + mDismissalRequested); pw.println(prefix + " mVisibilityTransactionDepth=" + mVisibilityTransactionDepth); } @@ -408,7 +494,19 @@ class KeyguardController { void writeToProto(ProtoOutputStream proto, long fieldId) { final long token = proto.start(fieldId); proto.write(KEYGUARD_SHOWING, mKeyguardShowing); - proto.write(KEYGUARD_OCCLUDED, mOccluded); + writeDisplayStatesToProto(proto, KEYGUARD_OCCLUDED_STATES); proto.end(token); } + + private void dumpDisplayStates(PrintWriter pw, String prefix) { + for (int i = 0; i < mDisplayStates.size(); i++) { + mDisplayStates.valueAt(i).dumpStatus(pw, prefix); + } + } + + private void writeDisplayStatesToProto(ProtoOutputStream proto, long fieldId) { + for (int i = 0; i < mDisplayStates.size(); i++) { + mDisplayStates.valueAt(i).writeToProto(proto, fieldId); + } + } } diff --git a/services/core/java/com/android/server/am/PendingIntentController.java b/services/core/java/com/android/server/am/PendingIntentController.java new file mode 100644 index 000000000000..a9c00a70650c --- /dev/null +++ b/services/core/java/com/android/server/am/PendingIntentController.java @@ -0,0 +1,329 @@ +/* + * 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 static android.content.pm.PackageManager.MATCH_DEBUG_TRIAGED_MISSING; +import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_MU; +import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_MU; +import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM; +import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME; + +import android.app.Activity; +import android.app.ActivityManagerInternal; +import android.app.AppGlobals; +import android.app.PendingIntent; +import android.content.IIntentSender; +import android.content.Intent; +import android.os.Binder; +import android.os.Bundle; +import android.os.Handler; +import android.os.IBinder; +import android.os.Looper; +import android.os.Message; +import android.os.RemoteCallbackList; +import android.os.RemoteException; +import android.os.UserHandle; +import android.util.ArrayMap; +import android.util.Slog; +import com.android.internal.os.IResultReceiver; +import com.android.internal.util.function.pooled.PooledLambda; +import com.android.server.LocalServices; +import com.android.server.wm.ActivityTaskManagerInternal; + +import java.io.PrintWriter; +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; + +/** + * Helper class for {@link ActivityManagerService} responsible for managing pending intents. + * + * <p>This class uses {@link #mLock} to synchronize access to internal state and doesn't make use of + * {@link ActivityManagerService} lock since there can be direct calls into this class from outside + * AM. This helps avoid deadlocks. + */ +public class PendingIntentController { + private static final String TAG = TAG_WITH_CLASS_NAME ? "PendingIntentController" : TAG_AM; + private static final String TAG_MU = TAG + POSTFIX_MU; + + /** Lock for internal state. */ + final Object mLock = new Object(); + final Handler mH; + ActivityManagerInternal mAmInternal; + final UserController mUserController; + final ActivityTaskManagerInternal mAtmInternal; + + /** Set of IntentSenderRecord objects that are currently active. */ + final HashMap<PendingIntentRecord.Key, WeakReference<PendingIntentRecord>> mIntentSenderRecords + = new HashMap<>(); + + PendingIntentController(Looper looper, UserController userController) { + mH = new Handler(looper); + mAtmInternal = LocalServices.getService(ActivityTaskManagerInternal.class); + mUserController = userController; + } + + void onActivityManagerInternalAdded() { + synchronized (mLock) { + mAmInternal = LocalServices.getService(ActivityManagerInternal.class); + } + } + + PendingIntentRecord getIntentSender(int type, String packageName, int callingUid, int userId, + IBinder token, String resultWho, int requestCode, Intent[] intents, + String[] resolvedTypes, int flags, Bundle bOptions) { + synchronized (mLock) { + if (DEBUG_MU) Slog.v(TAG_MU, "getIntentSender(): uid=" + callingUid); + + // We're going to be splicing together extras before sending, so we're + // okay poking into any contained extras. + if (intents != null) { + for (int i = 0; i < intents.length; i++) { + intents[i].setDefusable(true); + } + } + Bundle.setDefusable(bOptions, true); + + final boolean noCreate = (flags & PendingIntent.FLAG_NO_CREATE) != 0; + final boolean cancelCurrent = (flags & PendingIntent.FLAG_CANCEL_CURRENT) != 0; + final boolean updateCurrent = (flags & PendingIntent.FLAG_UPDATE_CURRENT) != 0; + flags &= ~(PendingIntent.FLAG_NO_CREATE | PendingIntent.FLAG_CANCEL_CURRENT + | PendingIntent.FLAG_UPDATE_CURRENT); + + PendingIntentRecord.Key key = new PendingIntentRecord.Key(type, packageName, token, + resultWho, requestCode, intents, resolvedTypes, flags, + SafeActivityOptions.fromBundle(bOptions), userId); + WeakReference<PendingIntentRecord> ref; + ref = mIntentSenderRecords.get(key); + PendingIntentRecord rec = ref != null ? ref.get() : null; + if (rec != null) { + if (!cancelCurrent) { + if (updateCurrent) { + if (rec.key.requestIntent != null) { + rec.key.requestIntent.replaceExtras(intents != null ? + intents[intents.length - 1] : null); + } + if (intents != null) { + intents[intents.length - 1] = rec.key.requestIntent; + rec.key.allIntents = intents; + rec.key.allResolvedTypes = resolvedTypes; + } else { + rec.key.allIntents = null; + rec.key.allResolvedTypes = null; + } + } + return rec; + } + makeIntentSenderCanceled(rec); + mIntentSenderRecords.remove(key); + } + if (noCreate) { + return rec; + } + rec = new PendingIntentRecord(this, key, callingUid); + mIntentSenderRecords.put(key, rec.ref); + return rec; + } + } + + boolean removePendingIntentsForPackage(String packageName, int userId, int appId, + boolean doIt) { + + boolean didSomething = false; + synchronized (mLock) { + + // Remove pending intents. For now we only do this when force stopping users, because + // we have some problems when doing this for packages -- app widgets are not currently + // cleaned up for such packages, so they can be left with bad pending intents. + if (mIntentSenderRecords.size() <= 0) { + return false; + } + + Iterator<WeakReference<PendingIntentRecord>> it + = mIntentSenderRecords.values().iterator(); + while (it.hasNext()) { + WeakReference<PendingIntentRecord> wpir = it.next(); + if (wpir == null) { + it.remove(); + continue; + } + PendingIntentRecord pir = wpir.get(); + if (pir == null) { + it.remove(); + continue; + } + if (packageName == null) { + // Stopping user, remove all objects for the user. + if (pir.key.userId != userId) { + // Not the same user, skip it. + continue; + } + } else { + if (UserHandle.getAppId(pir.uid) != appId) { + // Different app id, skip it. + continue; + } + if (userId != UserHandle.USER_ALL && pir.key.userId != userId) { + // Different user, skip it. + continue; + } + if (!pir.key.packageName.equals(packageName)) { + // Different package, skip it. + continue; + } + } + if (!doIt) { + return true; + } + didSomething = true; + it.remove(); + makeIntentSenderCanceled(pir); + if (pir.key.activity != null) { + final Message m = PooledLambda.obtainMessage( + PendingIntentController::clearPendingResultForActivity, this, + pir.key.activity, pir.ref); + mH.sendMessage(m); + } + } + } + + return didSomething; + } + + public void cancelIntentSender(IIntentSender sender) { + if (!(sender instanceof PendingIntentRecord)) { + return; + } + synchronized (mLock) { + final PendingIntentRecord rec = (PendingIntentRecord) sender; + try { + final int uid = AppGlobals.getPackageManager().getPackageUid(rec.key.packageName, + MATCH_DEBUG_TRIAGED_MISSING, UserHandle.getCallingUserId()); + if (!UserHandle.isSameApp(uid, Binder.getCallingUid())) { + String msg = "Permission Denial: cancelIntentSender() from pid=" + + Binder.getCallingPid() + ", uid=" + Binder.getCallingUid() + + " is not allowed to cancel package " + rec.key.packageName; + Slog.w(TAG, msg); + throw new SecurityException(msg); + } + } catch (RemoteException e) { + throw new SecurityException(e); + } + cancelIntentSender(rec, true); + } + } + + public void cancelIntentSender(PendingIntentRecord rec, boolean cleanActivity) { + synchronized (mLock) { + makeIntentSenderCanceled(rec); + mIntentSenderRecords.remove(rec.key); + if (cleanActivity && rec.key.activity != null) { + final Message m = PooledLambda.obtainMessage( + PendingIntentController::clearPendingResultForActivity, this, + rec.key.activity, rec.ref); + mH.sendMessage(m); + } + } + } + + private void makeIntentSenderCanceled(PendingIntentRecord rec) { + rec.canceled = true; + final RemoteCallbackList<IResultReceiver> callbacks = rec.detachCancelListenersLocked(); + if (callbacks != null) { + final Message m = PooledLambda.obtainMessage( + PendingIntentController::handlePendingIntentCancelled, this, callbacks); + mH.sendMessage(m); + } + } + + private void handlePendingIntentCancelled(RemoteCallbackList<IResultReceiver> callbacks) { + int N = callbacks.beginBroadcast(); + for (int i = 0; i < N; i++) { + try { + callbacks.getBroadcastItem(i).send(Activity.RESULT_CANCELED, null); + } catch (RemoteException e) { + // Process is not longer running...whatever. + } + } + callbacks.finishBroadcast(); + // We have to clean up the RemoteCallbackList here, because otherwise it will + // needlessly hold the enclosed callbacks until the remote process dies. + callbacks.kill(); + } + + private void clearPendingResultForActivity(IBinder activityToken, + WeakReference<PendingIntentRecord> pir) { + mAtmInternal.clearPendingResultForActivity(activityToken, pir); + } + + void dumpPendingIntents(PrintWriter pw, boolean dumpAll, String dumpPackage) { + synchronized (mLock) { + boolean printed = false; + + pw.println("ACTIVITY MANAGER PENDING INTENTS (dumpsys activity intents)"); + + if (mIntentSenderRecords.size() > 0) { + // Organize these by package name, so they are easier to read. + final ArrayMap<String, ArrayList<PendingIntentRecord>> byPackage = new ArrayMap<>(); + final ArrayList<WeakReference<PendingIntentRecord>> weakRefs = new ArrayList<>(); + final Iterator<WeakReference<PendingIntentRecord>> it + = mIntentSenderRecords.values().iterator(); + while (it.hasNext()) { + WeakReference<PendingIntentRecord> ref = it.next(); + PendingIntentRecord rec = ref != null ? ref.get() : null; + if (rec == null) { + weakRefs.add(ref); + continue; + } + if (dumpPackage != null && !dumpPackage.equals(rec.key.packageName)) { + continue; + } + ArrayList<PendingIntentRecord> list = byPackage.get(rec.key.packageName); + if (list == null) { + list = new ArrayList<>(); + byPackage.put(rec.key.packageName, list); + } + list.add(rec); + } + for (int i = 0; i < byPackage.size(); i++) { + ArrayList<PendingIntentRecord> intents = byPackage.valueAt(i); + printed = true; + pw.print(" * "); pw.print(byPackage.keyAt(i)); + pw.print(": "); pw.print(intents.size()); pw.println(" items"); + for (int j = 0; j < intents.size(); j++) { + pw.print(" #"); pw.print(j); pw.print(": "); pw.println(intents.get(j)); + if (dumpAll) { + intents.get(j).dump(pw, " "); + } + } + } + if (weakRefs.size() > 0) { + printed = true; + pw.println(" * WEAK REFS:"); + for (int i = 0; i < weakRefs.size(); i++) { + pw.print(" #"); pw.print(i); pw.print(": "); pw.println(weakRefs.get(i)); + } + } + } + + if (!printed) { + pw.println(" (nothing)"); + } + } + } +} diff --git a/services/core/java/com/android/server/am/PendingIntentRecord.java b/services/core/java/com/android/server/am/PendingIntentRecord.java index ee1166e2a6e8..b9c6fa6020c4 100644 --- a/services/core/java/com/android/server/am/PendingIntentRecord.java +++ b/services/core/java/com/android/server/am/PendingIntentRecord.java @@ -38,15 +38,16 @@ import android.util.Slog; import android.util.TimeUtils; import com.android.internal.os.IResultReceiver; +import com.android.internal.util.function.pooled.PooledLambda; import java.io.PrintWriter; import java.lang.ref.WeakReference; import java.util.Objects; -final class PendingIntentRecord extends IIntentSender.Stub { +public final class PendingIntentRecord extends IIntentSender.Stub { private static final String TAG = TAG_WITH_CLASS_NAME ? "PendingIntentRecord" : TAG_AM; - final ActivityManagerService owner; + final PendingIntentController controller; final Key key; final int uid; final WeakReference<PendingIntentRecord> ref; @@ -62,7 +63,7 @@ final class PendingIntentRecord extends IIntentSender.Stub { final static class Key { final int type; final String packageName; - final ActivityRecord activity; + final IBinder activity; final String who; final int requestCode; final Intent requestIntent; @@ -76,7 +77,7 @@ final class PendingIntentRecord extends IIntentSender.Stub { private static final int ODD_PRIME_NUMBER = 37; - Key(int _t, String _p, ActivityRecord _a, String _w, + Key(int _t, String _p, IBinder _a, String _w, int _r, Intent[] _i, String[] _it, int _f, SafeActivityOptions _o, int _userId) { type = _t; packageName = _p; @@ -114,6 +115,7 @@ final class PendingIntentRecord extends IIntentSender.Stub { // + Integer.toHexString(hashCode)); } + @Override public boolean equals(Object otherObj) { if (otherObj == null) { return false; @@ -188,11 +190,11 @@ final class PendingIntentRecord extends IIntentSender.Stub { } } - PendingIntentRecord(ActivityManagerService _owner, Key _k, int _u) { - owner = _owner; + PendingIntentRecord(PendingIntentController _controller, Key _k, int _u) { + controller = _controller; key = _k; uid = _u; - ref = new WeakReference<PendingIntentRecord>(this); + ref = new WeakReference<>(this); } void setWhitelistDurationLocked(IBinder whitelistToken, long duration) { @@ -247,189 +249,196 @@ final class PendingIntentRecord extends IIntentSender.Stub { } int sendInner(int code, Intent intent, String resolvedType, IBinder whitelistToken, - IIntentReceiver finishedReceiver, - String requiredPermission, IBinder resultTo, String resultWho, int requestCode, - int flagsMask, int flagsValues, Bundle options) { + IIntentReceiver finishedReceiver, String requiredPermission, IBinder resultTo, + String resultWho, int requestCode, int flagsMask, int flagsValues, Bundle options) { if (intent != null) intent.setDefusable(true); if (options != null) options.setDefusable(true); - synchronized (owner) { - if (!canceled) { - sent = true; - if ((key.flags&PendingIntent.FLAG_ONE_SHOT) != 0) { - owner.cancelIntentSenderLocked(this, true); - } + Long duration = null; + Intent finalIntent = null; + Intent[] allIntents = null; + String[] allResolvedTypes = null; + SafeActivityOptions mergedOptions = null; + synchronized (controller.mLock) { + if (canceled) { + return ActivityManager.START_CANCELED; + } - Intent finalIntent = key.requestIntent != null - ? new Intent(key.requestIntent) : new Intent(); + sent = true; + if ((key.flags & PendingIntent.FLAG_ONE_SHOT) != 0) { + controller.cancelIntentSender(this, true); + } - final boolean immutable = (key.flags & PendingIntent.FLAG_IMMUTABLE) != 0; - if (!immutable) { - if (intent != null) { - int changes = finalIntent.fillIn(intent, key.flags); - if ((changes & Intent.FILL_IN_DATA) == 0) { - resolvedType = key.requestResolvedType; - } - } else { + finalIntent = key.requestIntent != null ? new Intent(key.requestIntent) : new Intent(); + + final boolean immutable = (key.flags & PendingIntent.FLAG_IMMUTABLE) != 0; + if (!immutable) { + if (intent != null) { + int changes = finalIntent.fillIn(intent, key.flags); + if ((changes & Intent.FILL_IN_DATA) == 0) { resolvedType = key.requestResolvedType; } - flagsMask &= ~Intent.IMMUTABLE_FLAGS; - flagsValues &= flagsMask; - finalIntent.setFlags((finalIntent.getFlags() & ~flagsMask) | flagsValues); } else { resolvedType = key.requestResolvedType; } + flagsMask &= ~Intent.IMMUTABLE_FLAGS; + flagsValues &= flagsMask; + finalIntent.setFlags((finalIntent.getFlags() & ~flagsMask) | flagsValues); + } else { + resolvedType = key.requestResolvedType; + } - final int callingUid = Binder.getCallingUid(); - final int callingPid = Binder.getCallingPid(); + // Extract options before clearing calling identity + mergedOptions = key.options; + if (mergedOptions == null) { + mergedOptions = SafeActivityOptions.fromBundle(options); + } else { + mergedOptions.setCallerOptions(ActivityOptions.fromBundle(options)); + } - // Extract options before clearing calling identity - SafeActivityOptions mergedOptions = key.options; - if (mergedOptions == null) { - mergedOptions = SafeActivityOptions.fromBundle(options); - } else { - mergedOptions.setCallerOptions(ActivityOptions.fromBundle(options)); + if (whitelistDuration != null) { + duration = whitelistDuration.get(whitelistToken); + } + + if (key.type == ActivityManager.INTENT_SENDER_ACTIVITY + && key.allIntents != null && key.allIntents.length > 1) { + // Copy all intents and resolved types while we have the controller lock so we can + // use it later when the lock isn't held. + allIntents = new Intent[key.allIntents.length]; + allResolvedTypes = new String[key.allIntents.length]; + System.arraycopy(key.allIntents, 0, allIntents, 0, key.allIntents.length); + if (key.allResolvedTypes != null) { + System.arraycopy(key.allResolvedTypes, 0, allResolvedTypes, 0, + key.allResolvedTypes.length); } + allIntents[allIntents.length - 1] = finalIntent; + allResolvedTypes[allResolvedTypes.length - 1] = resolvedType; + } - final long origId = Binder.clearCallingIdentity(); - - if (whitelistDuration != null) { - Long duration = whitelistDuration.get(whitelistToken); - if (duration != null) { - int procState = owner.getUidState(callingUid); - if (!ActivityManager.isProcStateBackground(procState)) { - StringBuilder tag = new StringBuilder(64); - tag.append("pendingintent:"); - UserHandle.formatUid(tag, callingUid); - tag.append(":"); - if (finalIntent.getAction() != null) { - tag.append(finalIntent.getAction()); - } else if (finalIntent.getComponent() != null) { - finalIntent.getComponent().appendShortString(tag); - } else if (finalIntent.getData() != null) { - tag.append(finalIntent.getData().toSafeString()); - } - owner.tempWhitelistForPendingIntentLocked(callingPid, - callingUid, uid, duration, tag.toString()); - } else { - Slog.w(TAG, "Not doing whitelist " + this + ": caller state=" - + procState); - } + } + // We don't hold the controller lock beyond this point as we will be calling into AM and WM. + + final int callingUid = Binder.getCallingUid(); + final int callingPid = Binder.getCallingPid(); + final long origId = Binder.clearCallingIdentity(); + + int res = START_SUCCESS; + try { + if (duration != null) { + int procState = controller.mAmInternal.getUidProcessState(callingUid); + if (!ActivityManager.isProcStateBackground(procState)) { + StringBuilder tag = new StringBuilder(64); + tag.append("pendingintent:"); + UserHandle.formatUid(tag, callingUid); + tag.append(":"); + if (finalIntent.getAction() != null) { + tag.append(finalIntent.getAction()); + } else if (finalIntent.getComponent() != null) { + finalIntent.getComponent().appendShortString(tag); + } else if (finalIntent.getData() != null) { + tag.append(finalIntent.getData().toSafeString()); } + controller.mAmInternal.tempWhitelistForPendingIntent(callingPid, callingUid, + uid, duration, tag.toString()); + } else { + Slog.w(TAG, "Not doing whitelist " + this + ": caller state=" + procState); } + } - boolean sendFinish = finishedReceiver != null; - int userId = key.userId; - if (userId == UserHandle.USER_CURRENT) { - userId = owner.mUserController.getCurrentOrTargetUserId(); - } - int res = START_SUCCESS; - switch (key.type) { - case ActivityManager.INTENT_SENDER_ACTIVITY: - try { - // Note when someone has a pending intent, even from different - // users, then there's no need to ensure the calling user matches - // the target user, so validateIncomingUser is always false below. - - if (key.allIntents != null && key.allIntents.length > 1) { - Intent[] allIntents = new Intent[key.allIntents.length]; - String[] allResolvedTypes = new String[key.allIntents.length]; - System.arraycopy(key.allIntents, 0, allIntents, 0, - key.allIntents.length); - if (key.allResolvedTypes != null) { - System.arraycopy(key.allResolvedTypes, 0, allResolvedTypes, 0, - key.allResolvedTypes.length); - } - allIntents[allIntents.length-1] = finalIntent; - allResolvedTypes[allResolvedTypes.length-1] = resolvedType; - - res = owner.mActivityTaskManager.getActivityStartController().startActivitiesInPackage( - uid, key.packageName, allIntents, allResolvedTypes, - resultTo, mergedOptions, userId, - false /* validateIncomingUser */, - this /* originatingPendingIntent */); - } else { - res = owner.mActivityTaskManager.getActivityStartController().startActivityInPackage(uid, - callingPid, callingUid, key.packageName, finalIntent, - resolvedType, resultTo, resultWho, requestCode, 0, - mergedOptions, userId, null, "PendingIntentRecord", - false /* validateIncomingUser */, - this /* originatingPendingIntent */); - } - } catch (RuntimeException e) { - Slog.w(TAG, "Unable to send startActivity intent", e); - } - break; - case ActivityManager.INTENT_SENDER_ACTIVITY_RESULT: - final ActivityStack stack = key.activity.getStack(); - if (stack != null) { - stack.sendActivityResultLocked(-1, key.activity, key.who, - key.requestCode, code, finalIntent); - } - break; - case ActivityManager.INTENT_SENDER_BROADCAST: - try { - // If a completion callback has been requested, require - // that the broadcast be delivered synchronously - int sent = owner.broadcastIntentInPackage(key.packageName, uid, - finalIntent, resolvedType, finishedReceiver, code, null, null, - requiredPermission, options, (finishedReceiver != null), - false, userId); - if (sent == ActivityManager.BROADCAST_SUCCESS) { - sendFinish = false; - } - } catch (RuntimeException e) { - Slog.w(TAG, "Unable to send startActivity intent", e); + boolean sendFinish = finishedReceiver != null; + int userId = key.userId; + if (userId == UserHandle.USER_CURRENT) { + userId = controller.mUserController.getCurrentOrTargetUserId(); + } + + switch (key.type) { + case ActivityManager.INTENT_SENDER_ACTIVITY: + try { + // Note when someone has a pending intent, even from different + // users, then there's no need to ensure the calling user matches + // the target user, so validateIncomingUser is always false below. + + if (key.allIntents != null && key.allIntents.length > 1) { + res = controller.mAtmInternal.startActivitiesInPackage( + uid, key.packageName, allIntents, allResolvedTypes, resultTo, + mergedOptions, userId, false /* validateIncomingUser */, + this /* originatingPendingIntent */); + } else { + res = controller.mAtmInternal.startActivityInPackage( + uid, callingPid, callingUid, key.packageName, finalIntent, + resolvedType, resultTo, resultWho, requestCode, 0, + mergedOptions, userId, null, "PendingIntentRecord", + false /* validateIncomingUser */, + this /* originatingPendingIntent */); } - break; - case ActivityManager.INTENT_SENDER_SERVICE: - case ActivityManager.INTENT_SENDER_FOREGROUND_SERVICE: - try { - owner.startServiceInPackage(uid, finalIntent, resolvedType, - key.type == ActivityManager.INTENT_SENDER_FOREGROUND_SERVICE, - key.packageName, userId); - } catch (RuntimeException e) { - Slog.w(TAG, "Unable to send startService intent", e); - } catch (TransactionTooLargeException e) { - res = ActivityManager.START_CANCELED; + } catch (RuntimeException e) { + Slog.w(TAG, "Unable to send startActivity intent", e); + } + break; + case ActivityManager.INTENT_SENDER_ACTIVITY_RESULT: + controller.mAtmInternal.sendActivityResult(-1, key.activity, key.who, + key.requestCode, code, finalIntent); + break; + case ActivityManager.INTENT_SENDER_BROADCAST: + try { + // If a completion callback has been requested, require + // that the broadcast be delivered synchronously + int sent = controller.mAmInternal.broadcastIntentInPackage(key.packageName, + uid, finalIntent, resolvedType, finishedReceiver, code, null, null, + requiredPermission, options, (finishedReceiver != null), + false, userId); + if (sent == ActivityManager.BROADCAST_SUCCESS) { + sendFinish = false; } - break; - } - - if (sendFinish && res != ActivityManager.START_CANCELED) { + } catch (RuntimeException e) { + Slog.w(TAG, "Unable to send startActivity intent", e); + } + break; + case ActivityManager.INTENT_SENDER_SERVICE: + case ActivityManager.INTENT_SENDER_FOREGROUND_SERVICE: try { - finishedReceiver.performReceive(new Intent(finalIntent), 0, - null, null, false, false, key.userId); - } catch (RemoteException e) { + controller.mAmInternal.startServiceInPackage(uid, finalIntent, resolvedType, + key.type == ActivityManager.INTENT_SENDER_FOREGROUND_SERVICE, + key.packageName, userId); + } catch (RuntimeException e) { + Slog.w(TAG, "Unable to send startService intent", e); + } catch (TransactionTooLargeException e) { + res = ActivityManager.START_CANCELED; } - } - - Binder.restoreCallingIdentity(origId); + break; + } - return res; + if (sendFinish && res != ActivityManager.START_CANCELED) { + try { + finishedReceiver.performReceive(new Intent(finalIntent), 0, + null, null, false, false, key.userId); + } catch (RemoteException e) { + } } + } finally { + Binder.restoreCallingIdentity(origId); } - return ActivityManager.START_CANCELED; + + return res; } @Override protected void finalize() throws Throwable { try { if (!canceled) { - owner.mHandler.sendMessage(owner.mHandler.obtainMessage( - ActivityManagerService.FINALIZE_PENDING_INTENT_MSG, this)); + controller.mH.sendMessage(PooledLambda.obtainMessage( + PendingIntentRecord::completeFinalize, this)); } } finally { super.finalize(); } } - public void completeFinalize() { - synchronized(owner) { - WeakReference<PendingIntentRecord> current = - owner.mIntentSenderRecords.get(key); + private void completeFinalize() { + synchronized(controller.mLock) { + WeakReference<PendingIntentRecord> current = controller.mIntentSenderRecords.get(key); if (current == ref) { - owner.mIntentSenderRecords.remove(key); + controller.mIntentSenderRecords.remove(key); } } } diff --git a/services/core/java/com/android/server/am/SafeActivityOptions.java b/services/core/java/com/android/server/am/SafeActivityOptions.java index f7de7f475b7b..fa0cb47ade02 100644 --- a/services/core/java/com/android/server/am/SafeActivityOptions.java +++ b/services/core/java/com/android/server/am/SafeActivityOptions.java @@ -44,7 +44,7 @@ import com.android.internal.annotations.VisibleForTesting; * the inner options. Also supports having two set of options: Once from the original caller, and * once from the caller that is overriding it, which happens when sending a {@link PendingIntent}. */ -class SafeActivityOptions { +public class SafeActivityOptions { private static final String TAG = TAG_WITH_CLASS_NAME ? "SafeActivityOptions" : TAG_AM; diff --git a/services/core/java/com/android/server/am/TaskRecord.java b/services/core/java/com/android/server/am/TaskRecord.java index 9b42d65483df..ef8cb1c07969 100644 --- a/services/core/java/com/android/server/am/TaskRecord.java +++ b/services/core/java/com/android/server/am/TaskRecord.java @@ -129,7 +129,8 @@ import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.Objects; -class TaskRecord extends ConfigurationContainer implements TaskWindowContainerListener { +// TODO: Make package private again once move to WM package is complete. +public class TaskRecord extends ConfigurationContainer implements TaskWindowContainerListener { private static final String TAG = TAG_WITH_CLASS_NAME ? "TaskRecord" : TAG_AM; private static final String TAG_ADD_REMOVE = TAG + POSTFIX_ADD_REMOVE; private static final String TAG_RECENTS = TAG + POSTFIX_RECENTS; diff --git a/services/core/java/com/android/server/appbinding/AppBindingService.java b/services/core/java/com/android/server/appbinding/AppBindingService.java new file mode 100644 index 000000000000..91b3b21632c6 --- /dev/null +++ b/services/core/java/com/android/server/appbinding/AppBindingService.java @@ -0,0 +1,81 @@ +/* + * 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.appbinding; + +import android.app.AppGlobals; +import android.content.Context; +import android.content.pm.IPackageManager; +import android.os.Binder; +import android.os.Handler; + +import com.android.internal.os.BackgroundThread; +import com.android.internal.util.DumpUtils; +import com.android.server.SystemService; + +import java.io.FileDescriptor; +import java.io.PrintWriter; + +/** + * System server that keeps a binding to an app to keep it always running. + */ +public class AppBindingService extends Binder { + public static final String TAG = "AppBindingService"; + + private static final boolean DEBUG = false; + + private final Object mLock = new Object(); + + private final Injector mInjector; + private final Context mContext; + private final Handler mHandler; + private final IPackageManager mIPackageManager; + + static class Injector { + public IPackageManager getIPackageManager() { + return AppGlobals.getPackageManager(); + } + } + + /** + * System service interacts with this service via this class. + */ + public static final class Lifecycle extends SystemService { + final AppBindingService mService; + + public Lifecycle(Context context) { + super(context); + mService = new AppBindingService(new Injector(), context); + } + + @Override + public void onStart() { + publishBinderService(Context.APP_BINDING_SERVICE, mService); + } + } + + private AppBindingService(Injector injector, Context context) { + mInjector = injector; + mContext = context; + mIPackageManager = injector.getIPackageManager(); + mHandler = BackgroundThread.getHandler(); + } + + @Override + public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { + if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return; + } +} diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 8caa70283acf..66c7c437284b 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -627,6 +627,13 @@ public class AudioService extends IAudioService.Stub // If absolute volume is supported in AVRCP device private boolean mAvrcpAbsVolSupported = false; + // Pre-scale for Bluetooth Absolute Volume + private float[] mPrescaleAbsoluteVolume = new float[] { + 0.5f, // Pre-scale for index 1 + 0.7f, // Pre-scale for index 2 + 0.85f, // Pre-scale for index 3 + }; + private static Long mLastDeviceConnectMsgTime = new Long(0); private NotificationManager mNm; @@ -878,6 +885,23 @@ public class AudioService extends IAudioService.Stub mUserManagerInternal.addUserRestrictionsListener(mUserRestrictionsListener); mRecordMonitor.initMonitor(); + + final float[] preScale = new float[3]; + preScale[0] = mContext.getResources().getFraction( + com.android.internal.R.fraction.config_prescaleAbsoluteVolume_index1, + 1, 1); + preScale[1] = mContext.getResources().getFraction( + com.android.internal.R.fraction.config_prescaleAbsoluteVolume_index2, + 1, 1); + preScale[2] = mContext.getResources().getFraction( + com.android.internal.R.fraction.config_prescaleAbsoluteVolume_index3, + 1, 1); + for (int i = 0; i < preScale.length; i++) { + if (0.0f <= preScale[i] && preScale[i] <= 1.0f) { + mPrescaleAbsoluteVolume[i] = preScale[i]; + } + } + } public void systemReady() { @@ -4926,18 +4950,12 @@ public class AudioService extends IAudioService.Stub if (index == 0) { // 0% for volume 0 index = 0; - } else if (index == 1) { - // 50% for volume 1 - index = (int)(mIndexMax * 0.5) /10; - } else if (index == 2) { - // 70% for volume 2 - index = (int)(mIndexMax * 0.70) /10; - } else if (index == 3) { - // 85% for volume 3 - index = (int)(mIndexMax * 0.85) /10; + } else if (index > 0 && index <= 3) { + // Pre-scale for volume steps 1 2 and 3 + index = (int) (mIndexMax * mPrescaleAbsoluteVolume[index - 1]) / 10; } else { // otherwise, full gain - index = (mIndexMax + 5)/10; + index = (mIndexMax + 5) / 10; } return index; } diff --git a/services/core/java/com/android/server/biometrics/BiometricService.java b/services/core/java/com/android/server/biometrics/BiometricService.java index 0f68c6889680..87cf9c434fc0 100644 --- a/services/core/java/com/android/server/biometrics/BiometricService.java +++ b/services/core/java/com/android/server/biometrics/BiometricService.java @@ -39,6 +39,7 @@ import android.os.Looper; import android.os.RemoteException; import android.os.ServiceManager; import android.os.UserHandle; +import android.provider.Settings; import android.util.Slog; import com.android.internal.R; @@ -156,9 +157,18 @@ public class BiometricService extends SystemService { } else if (mCurrentModality == BIOMETRIC_IRIS) { Slog.w(TAG, "Unsupported modality"); } else if (mCurrentModality == BIOMETRIC_FACE) { - mFaceService.authenticateFromService(true /* requireConfirmation */, token, - sessionId, userId, receiver, flags, opPackageName, bundle, - dialogReceiver, callingUid, callingPid, callingUserId); + // If the user disabled face for apps, return ERROR_HW_UNAVAILABLE + if (isFaceEnabledForApps()) { + receiver.onError(0 /* deviceId */, + BiometricConstants.BIOMETRIC_ERROR_HW_UNAVAILABLE, + FaceManager.getErrorString(getContext(), + BiometricConstants.BIOMETRIC_ERROR_HW_UNAVAILABLE, + 0 /* vendorCode */)); + } else { + mFaceService.authenticateFromService(true /* requireConfirmation */, + token, sessionId, userId, receiver, flags, opPackageName, + bundle, dialogReceiver, callingUid, callingPid, callingUserId); + } } else { Slog.w(TAG, "Unsupported modality"); } @@ -168,6 +178,15 @@ public class BiometricService extends SystemService { }); } + private boolean isFaceEnabledForApps() { + // TODO: maybe cache this and eliminate duplicated code with KeyguardUpdateMonitor + return Settings.Secure.getIntForUser( + getContext().getContentResolver(), + Settings.Secure.FACE_UNLOCK_APP_ENABLED, + 1 /* default */, + UserHandle.USER_CURRENT) == 0; + } + @Override // Binder call public void cancelAuthentication(IBinder token, String opPackageName) throws RemoteException { diff --git a/services/core/java/com/android/server/biometrics/face/FaceService.java b/services/core/java/com/android/server/biometrics/face/FaceService.java index 98c38dd41bfc..f6af52ae00a3 100644 --- a/services/core/java/com/android/server/biometrics/face/FaceService.java +++ b/services/core/java/com/android/server/biometrics/face/FaceService.java @@ -28,10 +28,11 @@ import android.content.pm.UserInfo; import android.hardware.biometrics.BiometricAuthenticator; import android.hardware.biometrics.BiometricConstants; import android.hardware.biometrics.IBiometricPromptReceiver; -import android.hardware.biometrics.IBiometricServiceReceiver; import android.hardware.biometrics.IBiometricServiceLockoutResetCallback; +import android.hardware.biometrics.IBiometricServiceReceiver; import android.hardware.biometrics.face.V1_0.IBiometricsFace; import android.hardware.biometrics.face.V1_0.IBiometricsFaceClientCallback; +import android.hardware.biometrics.face.V1_0.Status; import android.hardware.face.Face; import android.hardware.face.FaceManager; import android.hardware.face.IFaceService; @@ -121,15 +122,15 @@ public class FaceService extends BiometricServiceBase { * The following methods contain common code which is shared in biometrics/common. */ @Override // Binder call - public long preEnroll(IBinder token) { + public long generateChallenge(IBinder token) { checkPermission(MANAGE_BIOMETRIC); - return startPreEnroll(token); + return startGenerateChallenge(token); } @Override // Binder call - public int postEnroll(IBinder token) { + public int revokeChallenge(IBinder token) { checkPermission(MANAGE_BIOMETRIC); - return startPostEnroll(token); + return startRevokeChallenge(token); } @Override // Binder call @@ -346,6 +347,45 @@ public class FaceService extends BiometricServiceBase { // TODO: confirm security token when we move timeout management into the HAL layer. mHandler.post(mResetFailedAttemptsForCurrentUserRunnable); } + + @Override + public int setRequireAttention(boolean requireAttention, final byte[] token) { + checkPermission(MANAGE_BIOMETRIC); + + final ArrayList<Byte> byteToken = new ArrayList<>(); + for (int i = 0; i < token.length; i++) { + byteToken.add(token[i]); + } + + int result; + try { + result = mDaemon != null ? mDaemon.setRequireAttention(requireAttention, byteToken) + : Status.INTERNAL_ERROR; + } catch (RemoteException e) { + Slog.e(getTag(), "Unable to setRequireAttention to " + requireAttention); + result = Status.INTERNAL_ERROR; + } + + return result; + } + + @Override + public boolean getRequireAttention(final byte[] token) { + checkPermission(MANAGE_BIOMETRIC); + + final ArrayList<Byte> byteToken = new ArrayList<>(); + for (int i = 0; i < token.length; i++) { + byteToken.add(token[i]); + } + + boolean result = true; + try { + result = mDaemon != null ? mDaemon.getRequireAttention(byteToken).value : true; + } catch (RemoteException e) { + Slog.e(getTag(), "Unable to getRequireAttention"); + } + return result; + } } /** @@ -779,30 +819,30 @@ public class FaceService extends BiometricServiceBase { return mDaemon; } - private long startPreEnroll(IBinder token) { + private long startGenerateChallenge(IBinder token) { IBiometricsFace daemon = getFaceDaemon(); if (daemon == null) { - Slog.w(TAG, "startPreEnroll: no face HAL!"); + Slog.w(TAG, "startGenerateChallenge: no face HAL!"); return 0; } try { return daemon.generateChallenge(CHALLENGE_TIMEOUT_SEC).value; } catch (RemoteException e) { - Slog.e(TAG, "startPreEnroll failed", e); + Slog.e(TAG, "startGenerateChallenge failed", e); } return 0; } - private int startPostEnroll(IBinder token) { + private int startRevokeChallenge(IBinder token) { IBiometricsFace daemon = getFaceDaemon(); if (daemon == null) { - Slog.w(TAG, "startPostEnroll: no face HAL!"); + Slog.w(TAG, "startRevokeChallenge: no face HAL!"); return 0; } try { return daemon.revokeChallenge(); } catch (RemoteException e) { - Slog.e(TAG, "startPostEnroll failed", e); + Slog.e(TAG, "startRevokeChallenge failed", e); } return 0; } diff --git a/services/core/java/com/android/server/content/ContentService.java b/services/core/java/com/android/server/content/ContentService.java index d8d650b28dee..5698fdf439a8 100644 --- a/services/core/java/com/android/server/content/ContentService.java +++ b/services/core/java/com/android/server/content/ContentService.java @@ -1226,7 +1226,7 @@ public final class ContentService extends IContentService.Stub { if (userId == UserHandle.USER_ALL) { mContext.enforceCallingOrSelfPermission( - Manifest.permission.INTERACT_ACROSS_USERS_FULL, TAG); + Manifest.permission.INTERACT_ACROSS_USERS_FULL, "No access to " + uri); } else if (userId < 0) { throw new IllegalArgumentException("Invalid user: " + userId); } else if (userId != UserHandle.getCallingUserId()) { @@ -1247,7 +1247,7 @@ public final class ContentService extends IContentService.Stub { ? (Manifest.permission.INTERACT_ACROSS_USERS_FULL + " or " + Manifest.permission.INTERACT_ACROSS_USERS) : Manifest.permission.INTERACT_ACROSS_USERS_FULL; - throw new SecurityException(TAG + "Neither user " + uid + throw new SecurityException("No access to " + uri + ": neither user " + uid + " nor current process has " + permissions); } } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index e10827bc6101..10980b79f1f4 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -16004,7 +16004,8 @@ public class PackageManagerService extends IPackageManager.Stub } if (apkPath != null) { final VerityUtils.SetupResult result = - VerityUtils.generateApkVeritySetupData(apkPath); + VerityUtils.generateApkVeritySetupData(apkPath, null /* signaturePath */, + true /* skipSigningBlock */); if (result.isOk()) { if (Build.IS_DEBUGGABLE) Slog.i(TAG, "Enabling apk verity to " + apkPath); FileDescriptor fd = result.getUnownedFileDescriptor(); diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index deeae26d034c..2557f46ba34b 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -2828,7 +2828,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { // Assumes it's safe to show starting windows of launched apps while // the keyguard is being hidden. This is okay because starting windows never show // secret information. - if (mKeyguardOccluded) { + // TODO(b/113840485): Occluded may not only happen on default display + if (displayId == DEFAULT_DISPLAY && mKeyguardOccluded) { windowFlags |= FLAG_SHOW_WHEN_LOCKED; } } diff --git a/services/core/java/com/android/server/power/Notifier.java b/services/core/java/com/android/server/power/Notifier.java index 68e636a2afc2..5adc248cee79 100644 --- a/services/core/java/com/android/server/power/Notifier.java +++ b/services/core/java/com/android/server/power/Notifier.java @@ -190,6 +190,8 @@ public class Notifier { try { mBatteryStats.noteInteractive(true); } catch (RemoteException ex) { } + StatsLog.write(StatsLog.INTERACTIVE_STATE_CHANGED, + StatsLog.INTERACTIVE_STATE_CHANGED__STATE__ON); } /** @@ -401,6 +403,9 @@ public class Notifier { try { mBatteryStats.noteInteractive(interactive); } catch (RemoteException ex) { } + StatsLog.write(StatsLog.INTERACTIVE_STATE_CHANGED, + interactive ? StatsLog.INTERACTIVE_STATE_CHANGED__STATE__ON : + StatsLog.INTERACTIVE_STATE_CHANGED__STATE__OFF); // Handle early behaviors. mInteractive = interactive; diff --git a/services/core/java/com/android/server/security/VerityUtils.java b/services/core/java/com/android/server/security/VerityUtils.java index 9f69702911c9..37966108fe64 100644 --- a/services/core/java/com/android/server/security/VerityUtils.java +++ b/services/core/java/com/android/server/security/VerityUtils.java @@ -26,42 +26,76 @@ import android.system.Os; import android.util.Pair; import android.util.Slog; import android.util.apk.ApkSignatureVerifier; +import android.util.apk.ApkVerityBuilder; import android.util.apk.ByteBufferFactory; import android.util.apk.SignatureNotFoundException; +import libcore.util.HexEncoding; + import java.io.FileDescriptor; import java.io.IOException; +import java.io.RandomAccessFile; import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; import java.security.DigestException; +import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Arrays; +import sun.security.pkcs.PKCS7; + /** Provides fsverity related operations. */ abstract public class VerityUtils { private static final String TAG = "VerityUtils"; + /** The maximum size of signature file. This is just to avoid potential abuse. */ + private static final int MAX_SIGNATURE_FILE_SIZE_BYTES = 8192; + private static final boolean DEBUG = false; /** - * Generates Merkle tree and fsverity metadata. + * Generates Merkle tree and fs-verity metadata. * - * @return {@code SetupResult} that contains the {@code EsetupResultCode}, and when success, the + * @return {@code SetupResult} that contains the result code, and when success, the * {@code FileDescriptor} to read all the data from. */ - public static SetupResult generateApkVeritySetupData(@NonNull String apkPath) { - if (DEBUG) Slog.d(TAG, "Trying to install apk verity to " + apkPath); + public static SetupResult generateApkVeritySetupData(@NonNull String apkPath, + String signaturePath, boolean skipSigningBlock) { + if (DEBUG) { + Slog.d(TAG, "Trying to install apk verity to " + apkPath + " with signature file " + + signaturePath); + } SharedMemory shm = null; try { - byte[] signedRootHash = ApkSignatureVerifier.getVerityRootHash(apkPath); - if (signedRootHash == null) { + byte[] signedVerityHash; + if (skipSigningBlock) { + signedVerityHash = ApkSignatureVerifier.getVerityRootHash(apkPath); + } else { + Path path = Paths.get(signaturePath); + if (Files.exists(path)) { + // TODO(112037636): fail early if the signing key is not in .fs-verity keyring. + PKCS7 pkcs7 = new PKCS7(Files.readAllBytes(path)); + signedVerityHash = pkcs7.getContentInfo().getContentBytes(); + if (DEBUG) { + Slog.d(TAG, "fs-verity measurement = " + bytesToString(signedVerityHash)); + } + } else { + signedVerityHash = null; + } + } + + if (signedVerityHash == null) { if (DEBUG) { - Slog.d(TAG, "Skip verity tree generation since there is no root hash"); + Slog.d(TAG, "Skip verity tree generation since there is no signed root hash"); } return SetupResult.skipped(); } - Pair<SharedMemory, Integer> result = generateApkVerityIntoSharedMemory(apkPath, - signedRootHash); + Pair<SharedMemory, Integer> result = generateFsVerityIntoSharedMemory(apkPath, + signaturePath, signedVerityHash, skipSigningBlock); shm = result.first; int contentSize = result.second; FileDescriptor rfd = shm.getFileDescriptor(); @@ -97,22 +131,114 @@ abstract public class VerityUtils { } /** + * Generates fs-verity metadata for {@code filePath} in the buffer created by {@code + * trackedBufferFactory}. The metadata contains the Merkle tree, fs-verity descriptor and + * extensions, including a PKCS#7 signature provided in {@code signaturePath}. + * + * <p>It is worthy to note that {@code trackedBufferFactory} generates a "tracked" {@code + * ByteBuffer}. The data will be used outside this method via the factory itself. + * + * @return fs-verity measurement of {@code filePath}, which is a SHA-256 of fs-verity descriptor + * and authenticated extensions. + */ + private static byte[] generateFsverityMetadata(String filePath, String signaturePath, + @NonNull TrackedShmBufferFactory trackedBufferFactory) + throws IOException, SignatureNotFoundException, SecurityException, DigestException, + NoSuchAlgorithmException { + try (RandomAccessFile file = new RandomAccessFile(filePath, "r")) { + ApkVerityBuilder.ApkVerityResult result = ApkVerityBuilder.generateFsVerityTree( + file, trackedBufferFactory); + + ByteBuffer buffer = result.verityData; + buffer.position(result.merkleTreeSize); + return generateFsverityDescriptorAndMeasurement(file, result.rootHash, signaturePath, + buffer); + } + } + + /** + * Generates fs-verity descriptor including the extensions to the {@code output} and returns the + * fs-verity measurement. + * + * @return fs-verity measurement, which is a SHA-256 of fs-verity descriptor and authenticated + * extensions. + */ + private static byte[] generateFsverityDescriptorAndMeasurement( + @NonNull RandomAccessFile file, @NonNull byte[] rootHash, + @NonNull String pkcs7SignaturePath, @NonNull ByteBuffer output) + throws IOException, NoSuchAlgorithmException, DigestException { + final short kRootHashExtensionId = 1; + final short kPkcs7SignatureExtensionId = 3; + final int origPosition = output.position(); + + // For generating fs-verity file measurement, which consists of the descriptor and + // authenticated extensions (but not unauthenticated extensions and the footer). + MessageDigest md = MessageDigest.getInstance("SHA-256"); + + // 1. Generate fs-verity descriptor. + final byte[] desc = constructFsverityDescriptorNative(file.length()); + output.put(desc); + md.update(desc); + + // 2. Generate authenticated extensions. + final byte[] authExt = + constructFsverityExtensionNative(kRootHashExtensionId, rootHash.length); + output.put(authExt); + output.put(rootHash); + md.update(authExt); + md.update(rootHash); + + // 3. Generate unauthenticated extensions. + ByteBuffer header = ByteBuffer.allocate(8).order(ByteOrder.LITTLE_ENDIAN); + output.putShort((short) 1); // number of unauthenticated extensions below + output.position(output.position() + 6); + + // Generate PKCS#7 extension. NB: We do not verify agaist trusted certificate (should be + // done by the caller if needed). + Path path = Paths.get(pkcs7SignaturePath); + if (Files.size(path) > MAX_SIGNATURE_FILE_SIZE_BYTES) { + throw new IllegalArgumentException("Signature size is unexpectedly large: " + + pkcs7SignaturePath); + } + final byte[] pkcs7Signature = Files.readAllBytes(path); + output.put(constructFsverityExtensionNative(kPkcs7SignatureExtensionId, + pkcs7Signature.length)); + output.put(pkcs7Signature); + + // 4. Generate the footer. + output.put(constructFsverityFooterNative(output.position() - origPosition)); + + return md.digest(); + } + + private static native byte[] constructFsverityDescriptorNative(long fileSize); + private static native byte[] constructFsverityExtensionNative(short extensionId, + int extensionDataSize); + private static native byte[] constructFsverityFooterNative(int offsetToDescriptorHead); + + /** * Returns a pair of {@code SharedMemory} and {@code Integer}. The {@code SharedMemory} contains * Merkle tree and fsverity headers for the given apk, in the form that can immediately be used * for fsverity setup. The data is aligned to the beginning of {@code SharedMemory}, and has * length equals to the returned {@code Integer}. */ - private static Pair<SharedMemory, Integer> generateApkVerityIntoSharedMemory( - String apkPath, byte[] expectedRootHash) + private static Pair<SharedMemory, Integer> generateFsVerityIntoSharedMemory( + String apkPath, String signaturePath, @NonNull byte[] expectedRootHash, + boolean skipSigningBlock) throws IOException, SecurityException, DigestException, NoSuchAlgorithmException, SignatureNotFoundException { TrackedShmBufferFactory shmBufferFactory = new TrackedShmBufferFactory(); - byte[] generatedRootHash = ApkSignatureVerifier.generateApkVerity(apkPath, - shmBufferFactory); + byte[] generatedRootHash; + if (skipSigningBlock) { + generatedRootHash = ApkSignatureVerifier.generateApkVerity(apkPath, shmBufferFactory); + } else { + generatedRootHash = generateFsverityMetadata(apkPath, signaturePath, shmBufferFactory); + } // We only generate Merkle tree once here, so it's important to make sure the root hash // matches the signed one in the apk. if (!Arrays.equals(expectedRootHash, generatedRootHash)) { - throw new SecurityException("Locally generated verity root hash does not match"); + throw new SecurityException("verity hash mismatch: " + + bytesToString(generatedRootHash) + " != " + bytesToString(expectedRootHash)); } int contentSize = shmBufferFactory.getBufferLimit(); @@ -126,11 +252,15 @@ abstract public class VerityUtils { return Pair.create(shm, contentSize); } + private static String bytesToString(byte[] bytes) { + return HexEncoding.encodeToString(bytes); + } + public static class SetupResult { /** Result code if verity is set up correctly. */ private static final int RESULT_OK = 1; - /** Result code if the apk does not contain a verity root hash. */ + /** Result code if signature is not provided. */ private static final int RESULT_SKIPPED = 2; /** Result code if the setup failed. */ diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java index 7d2fc15a28c5..bcf9212464db 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java @@ -22,6 +22,7 @@ import android.app.AppProtoEnums; import android.app.IActivityManager; import android.app.IApplicationThread; import android.content.ComponentName; +import android.content.IIntentSender; import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.res.CompatibilityInfo; @@ -32,8 +33,12 @@ import android.service.voice.IVoiceInteractionSession; import android.util.SparseIntArray; import com.android.internal.app.IVoiceInteractor; +import com.android.server.am.PendingIntentRecord; +import com.android.server.am.SafeActivityOptions; +import com.android.server.am.TaskRecord; import com.android.server.am.WindowProcessController; +import java.lang.ref.WeakReference; import java.util.List; /** @@ -178,6 +183,27 @@ public abstract class ActivityTaskManagerInternal { int userId, Intent[] intents, Bundle bOptions); /** + * Start intents as a package. + * + * @param uid Make a call as if this UID did. + * @param callingPackage Make a call as if this package did. + * @param intents Intents to start. + * @param userId Start the intents on this user. + * @param validateIncomingUser Set true to skip checking {@code userId} with the calling UID. + * @param originatingPendingIntent PendingIntentRecord that originated this activity start or + * null if not originated by PendingIntent + */ + public abstract int startActivitiesInPackage(int uid, String callingPackage, Intent[] intents, + String[] resolvedTypes, IBinder resultTo, SafeActivityOptions options, int userId, + boolean validateIncomingUser, PendingIntentRecord originatingPendingIntent); + + public abstract int startActivityInPackage(int uid, int realCallingPid, int realCallingUid, + String callingPackage, Intent intent, String resolvedType, IBinder resultTo, + String resultWho, int requestCode, int startFlags, SafeActivityOptions options, + int userId, TaskRecord inTask, String reason, boolean validateIncomingUser, + PendingIntentRecord originatingPendingIntent); + + /** * Start activity {@code intent} without calling user-id check. * * - DO NOT call it with the calling UID cleared. @@ -297,4 +323,13 @@ public abstract class ActivityTaskManagerInternal { * @param displayId The ID of the display showing the IME. */ public abstract void onImeWindowSetOnDisplay(int pid, int displayId); + + public abstract void sendActivityResult(int callingUid, IBinder activityToken, + String resultWho, int requestCode, int resultCode, Intent data); + public abstract void clearPendingResultForActivity( + IBinder activityToken, WeakReference<PendingIntentRecord> pir); + public abstract IIntentSender getIntentSender(int type, String packageName, + int callingUid, int userId, IBinder token, String resultWho, + int requestCode, Intent[] intents, String[] resolvedTypes, int flags, + Bundle bOptions); } diff --git a/services/core/java/com/android/server/wm/RecentsAnimationController.java b/services/core/java/com/android/server/wm/RecentsAnimationController.java index 1eae56745a75..e718c7b2a36e 100644 --- a/services/core/java/com/android/server/wm/RecentsAnimationController.java +++ b/services/core/java/com/android/server/wm/RecentsAnimationController.java @@ -20,8 +20,8 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY; import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; import static android.view.RemoteAnimationTarget.MODE_CLOSING; +import static android.view.RemoteAnimationTarget.MODE_OPENING; import static android.view.WindowManager.INPUT_CONSUMER_RECENTS_ANIMATION; - import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER; import static com.android.server.wm.ActivityTaskManagerInternal.APP_TRANSITION_RECENTS_ANIM; import static com.android.server.wm.AnimationAdapterProto.REMOTE; @@ -48,16 +48,13 @@ import android.view.IRecentsAnimationRunner; import android.view.RemoteAnimationTarget; import android.view.SurfaceControl; import android.view.SurfaceControl.Transaction; - import com.android.internal.annotations.VisibleForTesting; import com.android.server.LocalServices; import com.android.server.input.InputWindowHandle; import com.android.server.inputmethod.InputMethodManagerInternal; import com.android.server.wm.SurfaceAnimator.OnAnimationFinishedCallback; import com.android.server.wm.utils.InsetUtils; - import com.google.android.collect.Sets; - import java.io.PrintWriter; import java.util.ArrayList; @@ -93,6 +90,7 @@ public class RecentsAnimationController implements DeathRecipient { // The recents component app token that is shown behind the visibile tasks private AppWindowToken mTargetAppToken; + private int mTargetActivityType; private Rect mMinimizedHomeBounds = new Rect(); // We start the RecentsAnimationController in a pending-start state since we need to wait for @@ -259,23 +257,37 @@ public class RecentsAnimationController implements DeathRecipient { mDisplayId = displayId; } + public void initialize(int targetActivityType, SparseBooleanArray recentTaskIds) { + initialize(mService.mRoot.getDisplayContent(mDisplayId), targetActivityType, recentTaskIds); + } + /** * Initializes the recents animation controller. This is a separate call from the constructor * because it may call cancelAnimation() which needs to properly clean up the controller * in the window manager. */ - public void initialize(int targetActivityType, SparseBooleanArray recentTaskIds) { - // Make leashes for each of the visible tasks and add it to the recents animation to be - // started - final DisplayContent dc = mService.mRoot.getDisplayContent(mDisplayId); + @VisibleForTesting + void initialize(DisplayContent dc, int targetActivityType, SparseBooleanArray recentTaskIds) { + mTargetActivityType = targetActivityType; + + // Make leashes for each of the visible/target tasks and add it to the recents animation to + // be started final ArrayList<Task> visibleTasks = dc.getVisibleTasks(); + final TaskStack targetStack = dc.getStack(WINDOWING_MODE_UNDEFINED, targetActivityType); + if (targetStack != null) { + for (int i = targetStack.getChildCount() - 1; i >= 0; i--) { + final Task t = targetStack.getChildAt(i); + if (!visibleTasks.contains(t)) { + visibleTasks.add(t); + } + } + } final int taskCount = visibleTasks.size(); for (int i = 0; i < taskCount; i++) { final Task task = visibleTasks.get(i); final WindowConfiguration config = task.getWindowConfiguration(); if (config.tasksAreFloating() - || config.getWindowingMode() == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY - || config.getActivityType() == targetActivityType) { + || config.getWindowingMode() == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY) { continue; } addAnimation(task, !recentTaskIds.get(task.mTaskId)); @@ -586,7 +598,10 @@ public class RecentsAnimationController implements DeathRecipient { final Rect insets = new Rect(); mainWindow.getContentInsets(insets); InsetUtils.addInsets(insets, mainWindow.mAppToken.getLetterboxInsets()); - mTarget = new RemoteAnimationTarget(mTask.mTaskId, MODE_CLOSING, mCapturedLeash, + final int mode = topApp.getActivityType() == mTargetActivityType + ? MODE_OPENING + : MODE_CLOSING; + mTarget = new RemoteAnimationTarget(mTask.mTaskId, mode, mCapturedLeash, !topApp.fillsParent(), mainWindow.mWinAnimator.mLastClipRect, insets, mTask.getPrefixOrderIndex(), mPosition, mBounds, mTask.getWindowConfiguration(), mIsRecentTaskInvisible); diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index d92818ac611c..a9571be9599d 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -48,7 +48,6 @@ import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_PLACING_SU import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_WILL_PLACE_SURFACES; import static com.android.server.wm.WindowManagerService.WINDOWS_FREEZING_SCREENS_NONE; import static com.android.server.wm.WindowManagerService.logSurface; -import static com.android.server.wm.WindowSurfacePlacer.SET_FORCE_HIDING_CHANGED; import static com.android.server.wm.WindowSurfacePlacer.SET_ORIENTATION_CHANGE_COMPLETE; import static com.android.server.wm.WindowSurfacePlacer.SET_UPDATE_ROTATION; import static com.android.server.wm.WindowSurfacePlacer.SET_WALLPAPER_ACTION_PENDING; @@ -91,7 +90,6 @@ class RootWindowContainer extends WindowContainer<DisplayContent> { private static final int SET_SCREEN_BRIGHTNESS_OVERRIDE = 1; private static final int SET_USER_ACTIVITY_TIMEOUT = 2; - private boolean mWallpaperForceHidingChanged = false; private Object mLastWindowFreezeSource = null; private Session mHoldScreen = null; private float mScreenBrightness = -1; @@ -626,18 +624,6 @@ class RootWindowContainer extends WindowContainer<DisplayContent> { recentsAnimationController.checkAnimationReady(mWallpaperController); } - if (mWallpaperForceHidingChanged && defaultDisplay.pendingLayoutChanges == 0 - && !mService.mAppTransition.isReady()) { - // At this point, there was a window with a wallpaper that was force hiding other - // windows behind it, but now it is going away. This may be simple -- just animate away - // the wallpaper and its window -- or it may be hard -- the wallpaper now needs to be - // shown behind something that was hidden. - defaultDisplay.pendingLayoutChanges |= FINISH_LAYOUT_REDO_LAYOUT; - if (DEBUG_LAYOUT_REPEATS) surfacePlacer.debugLayoutRepeats( - "after animateAwayWallpaperLocked", defaultDisplay.pendingLayoutChanges); - } - mWallpaperForceHidingChanged = false; - if (mWallpaperMayChange) { if (DEBUG_WALLPAPER_LIGHT) Slog.v(TAG, "Wallpaper may change! Adjusting"); defaultDisplay.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER; @@ -961,10 +947,6 @@ class RootWindowContainer extends WindowContainer<DisplayContent> { mWallpaperMayChange = true; doRequest = true; } - if ((bulkUpdateParams & SET_FORCE_HIDING_CHANGED) != 0) { - mWallpaperForceHidingChanged = true; - doRequest = true; - } if ((bulkUpdateParams & SET_ORIENTATION_CHANGE_COMPLETE) == 0) { mOrientationChangeComplete = false; } else { diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index cc23ab6f77d9..6aa0e0144c40 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -561,9 +561,10 @@ class Task extends WindowContainer<AppWindowToken> { @Override public SurfaceControl getAnimationLeashParent() { - // Reparent to the animation layer so that we aren't clipped by the non-minimized - // stack bounds, currently we only animate the task for the recents animation - return getAppAnimationLayer(ANIMATION_LAYER_STANDARD); + // Currently, only the recents animation will create animation leashes for tasks. In this + // case, reparent the task to the home animation layer while it is being animated to allow + // the home activity to reorder the app windows relative to its own. + return getAppAnimationLayer(ANIMATION_LAYER_HOME); } boolean isTaskAnimating() { diff --git a/services/core/java/com/android/server/wm/WindowAnimator.java b/services/core/java/com/android/server/wm/WindowAnimator.java index 793ffce2466e..a1d6ffd0249e 100644 --- a/services/core/java/com/android/server/wm/WindowAnimator.java +++ b/services/core/java/com/android/server/wm/WindowAnimator.java @@ -284,9 +284,6 @@ public class WindowAnimator { if ((bulkUpdateParams & WindowSurfacePlacer.SET_WALLPAPER_MAY_CHANGE) != 0) { builder.append(" WALLPAPER_MAY_CHANGE"); } - if ((bulkUpdateParams & WindowSurfacePlacer.SET_FORCE_HIDING_CHANGED) != 0) { - builder.append(" FORCE_HIDING_CHANGED"); - } if ((bulkUpdateParams & WindowSurfacePlacer.SET_ORIENTATION_CHANGE_COMPLETE) != 0) { builder.append(" ORIENTATION_CHANGE_COMPLETE"); } diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java index e86093952474..4883f972f1e5 100644 --- a/services/core/java/com/android/server/wm/WindowContainer.java +++ b/services/core/java/com/android/server/wm/WindowContainer.java @@ -42,10 +42,8 @@ import android.view.MagnificationSpec; import android.view.SurfaceControl; import android.view.SurfaceControl.Builder; import android.view.SurfaceSession; - import com.android.internal.util.ToBooleanFunction; import com.android.server.wm.SurfaceAnimator.Animatable; - import java.io.PrintWriter; import java.util.Comparator; import java.util.LinkedList; @@ -71,7 +69,8 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer< /** * Animation layer that is reserved for {@link WindowConfiguration#ACTIVITY_TYPE_HOME} - * activities that happens below all {@link TaskStack}s. + * activities and all activities that are being controlled by the recents animation. This + * layer is generally below all {@link TaskStack}s. */ static final int ANIMATION_LAYER_HOME = 2; diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 7caa7aedb873..b627df4a3313 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -227,6 +227,7 @@ import android.view.WindowManagerGlobal; import android.view.WindowManagerPolicyConstants.PointerEventListener; import com.android.internal.R; +import com.android.internal.annotations.VisibleForTesting; import com.android.internal.os.IResultReceiver; import com.android.internal.policy.IKeyguardDismissCallback; import com.android.internal.policy.IShortcutService; @@ -2714,6 +2715,11 @@ public class WindowManagerService extends IWindowManager.Stub } } + @VisibleForTesting + void setRecentsAnimationController(RecentsAnimationController controller) { + mRecentsAnimationController = controller; + } + public RecentsAnimationController getRecentsAnimationController() { return mRecentsAnimationController; } diff --git a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java index d6f9ac3a3ab9..c8d1a8b14e82 100644 --- a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java +++ b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java @@ -92,9 +92,8 @@ class WindowSurfacePlacer { static final int SET_UPDATE_ROTATION = 1 << 0; static final int SET_WALLPAPER_MAY_CHANGE = 1 << 1; - static final int SET_FORCE_HIDING_CHANGED = 1 << 2; - static final int SET_ORIENTATION_CHANGE_COMPLETE = 1 << 3; - static final int SET_WALLPAPER_ACTION_PENDING = 1 << 4; + static final int SET_ORIENTATION_CHANGE_COMPLETE = 1 << 2; + static final int SET_WALLPAPER_ACTION_PENDING = 1 << 3; private boolean mTraversalScheduled; private int mDeferDepth = 0; diff --git a/services/core/jni/Android.bp b/services/core/jni/Android.bp index becde7311607..061f8e2ba0fb 100644 --- a/services/core/jni/Android.bp +++ b/services/core/jni/Android.bp @@ -37,6 +37,7 @@ cc_library_static { "com_android_server_locksettings_SyntheticPasswordManager.cpp", "com_android_server_net_NetworkStatsService.cpp", "com_android_server_power_PowerManagerService.cpp", + "com_android_server_security_VerityUtils.cpp", "com_android_server_SerialService.cpp", "com_android_server_storage_AppFuseBridge.cpp", "com_android_server_SystemServer.cpp", diff --git a/services/core/jni/com_android_server_security_VerityUtils.cpp b/services/core/jni/com_android_server_security_VerityUtils.cpp new file mode 100644 index 000000000000..d0f173b572c8 --- /dev/null +++ b/services/core/jni/com_android_server_security_VerityUtils.cpp @@ -0,0 +1,137 @@ +/* + * 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. + */ + +#define LOG_TAG "VerityUtils" + +#include <nativehelper/JNIHelp.h> +#include "jni.h" +#include <utils/Log.h> + +#include <string.h> + +// TODO(112037636): Always include once fsverity.h is upstreamed and backported. +#define HAS_FSVERITY 0 + +#if HAS_FSVERITY +#include <linux/fsverity.h> +#endif + +namespace android { + +namespace { + +class JavaByteArrayHolder { + public: + static JavaByteArrayHolder* newArray(JNIEnv* env, jsize size) { + return new JavaByteArrayHolder(env, size); + } + + jbyte* getRaw() { + return mElements; + } + + jbyteArray release() { + mEnv->ReleaseByteArrayElements(mBytes, mElements, 0); + mElements = nullptr; + return mBytes; + } + + private: + JavaByteArrayHolder(JNIEnv* env, jsize size) { + mEnv = env; + mBytes = mEnv->NewByteArray(size); + mElements = mEnv->GetByteArrayElements(mBytes, nullptr); + memset(mElements, 0, size); + } + + virtual ~JavaByteArrayHolder() { + LOG_ALWAYS_FATAL_IF(mElements == nullptr, "Elements are not released"); + } + + JNIEnv* mEnv; + jbyteArray mBytes; + jbyte* mElements; +}; + +jbyteArray constructFsverityDescriptor(JNIEnv* env, jobject /* clazz */, jlong fileSize) { +#if HAS_FSVERITY + auto raii = JavaByteArrayHolder::newArray(env, sizeof(fsverity_descriptor)); + fsverity_descriptor* desc = reinterpret_cast<fsverity_descriptor*>(raii->getRaw()); + + memcpy(desc->magic, FS_VERITY_MAGIC, sizeof(desc->magic)); + desc->major_version = 1; + desc->minor_version = 0; + desc->log_data_blocksize = 12; + desc->log_tree_blocksize = 12; + desc->data_algorithm = FS_VERITY_ALG_SHA256; + desc->tree_algorithm = FS_VERITY_ALG_SHA256; + desc->flags = 0; + desc->orig_file_size = fileSize; + desc->auth_ext_count = 1; + + return raii->release(); +#else + LOG_ALWAYS_FATAL("fs-verity is used while not enabled"); + return 0; +#endif // HAS_FSVERITY +} + +jbyteArray constructFsverityExtension(JNIEnv* env, jobject /* clazz */, jshort extensionId, + jint extensionDataSize) { +#if HAS_FSVERITY + auto raii = JavaByteArrayHolder::newArray(env, sizeof(fsverity_extension)); + fsverity_extension* ext = reinterpret_cast<fsverity_extension*>(raii->getRaw()); + + ext->length = sizeof(fsverity_extension) + extensionDataSize; + ext->type = extensionId; + + return raii->release(); +#else + LOG_ALWAYS_FATAL("fs-verity is used while not enabled"); + return 0; +#endif // HAS_FSVERITY +} + +jbyteArray constructFsverityFooter(JNIEnv* env, jobject /* clazz */, + jint offsetToDescriptorHead) { +#if HAS_FSVERITY + auto raii = JavaByteArrayHolder::newArray(env, sizeof(fsverity_footer)); + fsverity_footer* footer = reinterpret_cast<fsverity_footer*>(raii->getRaw()); + + footer->desc_reverse_offset = offsetToDescriptorHead + sizeof(fsverity_footer); + memcpy(footer->magic, FS_VERITY_MAGIC, sizeof(footer->magic)); + + return raii->release(); +#else + LOG_ALWAYS_FATAL("fs-verity is used while not enabled"); + return 0; +#endif // HAS_FSVERITY +} + +const JNINativeMethod sMethods[] = { + { "constructFsverityDescriptorNative", "(J)[B", (void *)constructFsverityDescriptor }, + { "constructFsverityExtensionNative", "(SI)[B", (void *)constructFsverityExtension }, + { "constructFsverityFooterNative", "(I)[B", (void *)constructFsverityFooter }, +}; + +} // namespace + +int register_android_server_security_VerityUtils(JNIEnv* env) { + return jniRegisterNativeMethods(env, + "com/android/server/security/VerityUtils", sMethods, NELEM(sMethods)); +} + +} // namespace android diff --git a/services/core/jni/onload.cpp b/services/core/jni/onload.cpp index bb6e6840f3b4..918f57e2945e 100644 --- a/services/core/jni/onload.cpp +++ b/services/core/jni/onload.cpp @@ -54,6 +54,7 @@ int register_android_server_SyntheticPasswordManager(JNIEnv* env); int register_android_server_GraphicsStatsService(JNIEnv* env); int register_android_hardware_display_DisplayViewport(JNIEnv* env); int register_android_server_net_NetworkStatsService(JNIEnv* env); +int register_android_server_security_VerityUtils(JNIEnv* env); }; using namespace android; @@ -101,5 +102,6 @@ extern "C" jint JNI_OnLoad(JavaVM* vm, void* /* reserved */) register_android_server_GraphicsStatsService(env); register_android_hardware_display_DisplayViewport(env); register_android_server_net_NetworkStatsService(env); + register_android_server_security_VerityUtils(env); return JNI_VERSION_1_4; } diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index fb95f5972cbb..b8241d03a78e 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -65,6 +65,7 @@ import com.android.internal.util.EmergencyAffordanceManager; import com.android.internal.widget.ILockSettings; import com.android.server.am.ActivityManagerService; import com.android.server.am.ActivityTaskManagerService; +import com.android.server.appbinding.AppBindingService; import com.android.server.audio.AudioService; import com.android.server.biometrics.BiometricService; import com.android.server.broadcastradio.BroadcastRadioService; @@ -1710,6 +1711,10 @@ public final class SystemServer { traceEnd(); } + traceBeginAndSlog("AppServiceManager"); + mSystemServiceManager.startService(AppBindingService.Lifecycle.class); + traceEnd(); + // It is now time to start up the app processes... traceBeginAndSlog("MakeVibratorServiceReady"); diff --git a/services/net/java/android/net/util/SharedLog.java b/services/net/java/android/net/util/SharedLog.java index f7bf393f367b..5a73a4e492ee 100644 --- a/services/net/java/android/net/util/SharedLog.java +++ b/services/net/java/android/net/util/SharedLog.java @@ -17,6 +17,7 @@ package android.net.util; import android.annotation.NonNull; +import android.annotation.Nullable; import android.text.TextUtils; import android.util.LocalLog; import android.util.Log; @@ -92,10 +93,17 @@ public class SharedLog { } /** - * Log an error due to an exception, with the exception stacktrace. + * Log an error due to an exception, with the exception stacktrace if provided. + * + * <p>The error and exception message appear in the shared log, but the stacktrace is only + * logged in general log output (logcat). */ - public void e(@NonNull String msg, @NonNull Throwable e) { - Log.e(mTag, record(Category.ERROR, msg + ": " + e.getMessage()), e); + public void e(@NonNull String msg, @Nullable Throwable exception) { + if (exception == null) { + e(msg); + return; + } + Log.e(mTag, record(Category.ERROR, msg + ": " + exception.getMessage()), exception); } public void i(String msg) { diff --git a/services/robotests/Android.mk b/services/robotests/Android.mk index 8b5977144db1..78c0be42a448 100644 --- a/services/robotests/Android.mk +++ b/services/robotests/Android.mk @@ -61,6 +61,7 @@ LOCAL_SRC_FILES := \ $(call all-Iaidl-files-under, $(INTERNAL_BACKUP)) \ $(call all-java-files-under, ../../core/java/android/app/backup) \ $(call all-Iaidl-files-under, ../../core/java/android/app/backup) \ + $(call all-java-files-under, ../../core/java/android/util/proto) \ ../../core/java/android/content/pm/PackageInfo.java \ ../../core/java/android/app/IBackupAgent.aidl \ ../../core/java/android/util/KeyValueSettingObserver.java \ diff --git a/services/robotests/src/com/android/server/backup/encryption/chunk/ChunkListingTest.java b/services/robotests/src/com/android/server/backup/encryption/chunk/ChunkListingTest.java new file mode 100644 index 000000000000..383bf1d73416 --- /dev/null +++ b/services/robotests/src/com/android/server/backup/encryption/chunk/ChunkListingTest.java @@ -0,0 +1,197 @@ +/* + * 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.backup.encryption.chunk; + +import static com.google.common.truth.Truth.assertThat; + +import android.platform.test.annotations.Presubmit; +import android.util.proto.ProtoInputStream; +import android.util.proto.ProtoOutputStream; +import com.android.internal.util.Preconditions; +import com.android.server.testing.FrameworkRobolectricTestRunner; +import com.android.server.testing.SystemLoaderPackages; +import com.google.common.base.Charsets; +import java.io.ByteArrayInputStream; +import java.util.Arrays; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.annotation.Config; + +@RunWith(FrameworkRobolectricTestRunner.class) +@Config(manifest = Config.NONE, sdk = 26) +// Include android.util.proto in addition to classes under test because the latest versions of +// android.util.proto.Proto{Input|Output}Stream are not part of Robolectric. +@SystemLoaderPackages({"com.android.server.backup", "android.util.proto"}) +@Presubmit +public class ChunkListingTest { + private static final String CHUNK_A = "CHUNK_A"; + private static final String CHUNK_B = "CHUNK_B"; + private static final String CHUNK_C = "CHUNK_C"; + + private static final int CHUNK_A_LENGTH = 256; + private static final int CHUNK_B_LENGTH = 1024; + private static final int CHUNK_C_LENGTH = 4055; + + private ChunkHash mChunkHashA; + private ChunkHash mChunkHashB; + private ChunkHash mChunkHashC; + + @Before + public void setUp() throws Exception { + mChunkHashA = getHash(CHUNK_A); + mChunkHashB = getHash(CHUNK_B); + mChunkHashC = getHash(CHUNK_C); + } + + @Test + public void testHasChunk_whenChunkInListing_returnsTrue() throws Exception { + byte[] chunkListingProto = + createChunkListingProto( + new ChunkHash[] {mChunkHashA, mChunkHashB, mChunkHashC}, + new int[] {CHUNK_A_LENGTH, CHUNK_B_LENGTH, CHUNK_C_LENGTH}); + ChunkListing chunkListing = + ChunkListing.readFromProto( + new ProtoInputStream(new ByteArrayInputStream(chunkListingProto))); + + boolean chunkAInList = chunkListing.hasChunk(mChunkHashA); + boolean chunkBInList = chunkListing.hasChunk(mChunkHashB); + boolean chunkCInList = chunkListing.hasChunk(mChunkHashC); + + assertThat(chunkAInList).isTrue(); + assertThat(chunkBInList).isTrue(); + assertThat(chunkCInList).isTrue(); + } + + @Test + public void testHasChunk_whenChunkNotInListing_returnsFalse() throws Exception { + byte[] chunkListingProto = + createChunkListingProto( + new ChunkHash[] {mChunkHashA, mChunkHashB}, + new int[] {CHUNK_A_LENGTH, CHUNK_B_LENGTH}); + ChunkListing chunkListing = + ChunkListing.readFromProto( + new ProtoInputStream(new ByteArrayInputStream(chunkListingProto))); + ChunkHash chunkHashEmpty = getHash(""); + + boolean chunkCInList = chunkListing.hasChunk(mChunkHashC); + boolean emptyChunkInList = chunkListing.hasChunk(chunkHashEmpty); + + assertThat(chunkCInList).isFalse(); + assertThat(emptyChunkInList).isFalse(); + } + + @Test + public void testGetChunkEntry_returnsEntryWithCorrectLength() throws Exception { + byte[] chunkListingProto = + createChunkListingProto( + new ChunkHash[] {mChunkHashA, mChunkHashB, mChunkHashC}, + new int[] {CHUNK_A_LENGTH, CHUNK_B_LENGTH, CHUNK_C_LENGTH}); + ChunkListing chunkListing = + ChunkListing.readFromProto( + new ProtoInputStream(new ByteArrayInputStream(chunkListingProto))); + + ChunkListing.Entry entryA = chunkListing.getChunkEntry(mChunkHashA); + ChunkListing.Entry entryB = chunkListing.getChunkEntry(mChunkHashB); + ChunkListing.Entry entryC = chunkListing.getChunkEntry(mChunkHashC); + + assertThat(entryA.getLength()).isEqualTo(CHUNK_A_LENGTH); + assertThat(entryB.getLength()).isEqualTo(CHUNK_B_LENGTH); + assertThat(entryC.getLength()).isEqualTo(CHUNK_C_LENGTH); + } + + @Test + public void testGetChunkEntry_returnsEntryWithCorrectStart() throws Exception { + byte[] chunkListingProto = + createChunkListingProto( + new ChunkHash[] {mChunkHashA, mChunkHashB, mChunkHashC}, + new int[] {CHUNK_A_LENGTH, CHUNK_B_LENGTH, CHUNK_C_LENGTH}); + ChunkListing chunkListing = + ChunkListing.readFromProto( + new ProtoInputStream(new ByteArrayInputStream(chunkListingProto))); + + ChunkListing.Entry entryA = chunkListing.getChunkEntry(mChunkHashA); + ChunkListing.Entry entryB = chunkListing.getChunkEntry(mChunkHashB); + ChunkListing.Entry entryC = chunkListing.getChunkEntry(mChunkHashC); + + assertThat(entryA.getStart()).isEqualTo(0); + assertThat(entryB.getStart()).isEqualTo(CHUNK_A_LENGTH); + assertThat(entryC.getStart()).isEqualTo(CHUNK_A_LENGTH + CHUNK_B_LENGTH); + } + + @Test + public void testGetChunkEntry_returnsNullForNonExistentChunk() throws Exception { + byte[] chunkListingProto = + createChunkListingProto( + new ChunkHash[] {mChunkHashA, mChunkHashB}, + new int[] {CHUNK_A_LENGTH, CHUNK_B_LENGTH}); + ChunkListing chunkListing = + ChunkListing.readFromProto( + new ProtoInputStream(new ByteArrayInputStream(chunkListingProto))); + + ChunkListing.Entry chunkEntryNonexistentChunk = chunkListing.getChunkEntry(mChunkHashC); + + assertThat(chunkEntryNonexistentChunk).isNull(); + } + + @Test + public void testReadFromProto_whenEmptyProto_returnsChunkListingWith0Chunks() throws Exception { + ProtoInputStream emptyProto = new ProtoInputStream(new ByteArrayInputStream(new byte[] {})); + + ChunkListing chunkListing = ChunkListing.readFromProto(emptyProto); + + assertThat(chunkListing.getChunkCount()).isEqualTo(0); + } + + @Test + public void testReadFromProto_returnsChunkListingWithCorrectSize() throws Exception { + byte[] chunkListingProto = + createChunkListingProto( + new ChunkHash[] {mChunkHashA, mChunkHashB, mChunkHashC}, + new int[] {CHUNK_A_LENGTH, CHUNK_B_LENGTH, CHUNK_C_LENGTH}); + + ChunkListing chunkListing = + ChunkListing.readFromProto( + new ProtoInputStream(new ByteArrayInputStream(chunkListingProto))); + + assertThat(chunkListing.getChunkCount()).isEqualTo(3); + } + + private byte[] createChunkListingProto(ChunkHash[] hashes, int[] lengths) { + Preconditions.checkArgument(hashes.length == lengths.length); + ProtoOutputStream outputStream = new ProtoOutputStream(); + + for (int i = 0; i < hashes.length; ++i) { + writeToProtoOutputStream(outputStream, hashes[i], lengths[i]); + } + outputStream.flush(); + + return outputStream.getBytes(); + } + + private void writeToProtoOutputStream(ProtoOutputStream out, ChunkHash chunkHash, int length) { + long token = out.start(ChunksMetadataProto.ChunkListing.CHUNKS); + out.write(ChunksMetadataProto.Chunk.HASH, chunkHash.getHash()); + out.write(ChunksMetadataProto.Chunk.LENGTH, length); + out.end(token); + } + + private ChunkHash getHash(String name) { + return new ChunkHash( + Arrays.copyOf(name.getBytes(Charsets.UTF_8), ChunkHash.HASH_LENGTH_BYTES)); + } +} diff --git a/services/robotests/src/com/android/server/backup/encryption/chunk/ChunkTest.java b/services/robotests/src/com/android/server/backup/encryption/chunk/ChunkTest.java new file mode 100644 index 000000000000..1dd7dc834f9e --- /dev/null +++ b/services/robotests/src/com/android/server/backup/encryption/chunk/ChunkTest.java @@ -0,0 +1,125 @@ +/* + * 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.backup.encryption.chunk; + +import static com.google.common.truth.Truth.assertThat; + +import android.platform.test.annotations.Presubmit; +import android.util.proto.ProtoInputStream; +import android.util.proto.ProtoOutputStream; +import com.android.server.testing.FrameworkRobolectricTestRunner; +import com.android.server.testing.SystemLoaderPackages; +import com.google.common.base.Charsets; +import java.io.ByteArrayInputStream; +import java.util.Arrays; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.annotation.Config; + +@RunWith(FrameworkRobolectricTestRunner.class) +@Config(manifest = Config.NONE, sdk = 26) +// Include android.util.proto in addition to classes under test because the latest versions of +// android.util.proto.Proto{Input|Output}Stream are not part of Robolectric. +@SystemLoaderPackages({"com.android.server.backup", "android.util.proto"}) +@Presubmit +public class ChunkTest { + private static final String CHUNK_A = "CHUNK_A"; + private static final int CHUNK_A_LENGTH = 256; + + private ChunkHash mChunkHashA; + + @Before + public void setUp() throws Exception { + mChunkHashA = getHash(CHUNK_A); + } + + @Test + public void testReadFromProto_readsCorrectly() throws Exception { + ProtoOutputStream out = new ProtoOutputStream(); + out.write(ChunksMetadataProto.Chunk.HASH, mChunkHashA.getHash()); + out.write(ChunksMetadataProto.Chunk.LENGTH, CHUNK_A_LENGTH); + out.flush(); + byte[] protoBytes = out.getBytes(); + + Chunk chunk = + Chunk.readFromProto(new ProtoInputStream(new ByteArrayInputStream(protoBytes))); + + assertThat(chunk.getHash()).isEqualTo(mChunkHashA.getHash()); + assertThat(chunk.getLength()).isEqualTo(CHUNK_A_LENGTH); + } + + @Test + public void testReadFromProto_whenFieldsWrittenInReversedOrder_readsCorrectly() + throws Exception { + ProtoOutputStream out = new ProtoOutputStream(); + // Write fields of Chunk proto in reverse order. + out.write(ChunksMetadataProto.Chunk.LENGTH, CHUNK_A_LENGTH); + out.write(ChunksMetadataProto.Chunk.HASH, mChunkHashA.getHash()); + out.flush(); + byte[] protoBytes = out.getBytes(); + + Chunk chunk = + Chunk.readFromProto(new ProtoInputStream(new ByteArrayInputStream(protoBytes))); + + assertThat(chunk.getHash()).isEqualTo(mChunkHashA.getHash()); + assertThat(chunk.getLength()).isEqualTo(CHUNK_A_LENGTH); + } + + @Test + public void testReadFromProto_whenEmptyProto_returnsEmptyHash() throws Exception { + ProtoInputStream emptyProto = new ProtoInputStream(new ByteArrayInputStream(new byte[] {})); + + Chunk chunk = Chunk.readFromProto(emptyProto); + + assertThat(chunk.getHash()).asList().hasSize(0); + assertThat(chunk.getLength()).isEqualTo(0); + } + + @Test + public void testReadFromProto_whenOnlyHashSet_returnsChunkWithOnlyHash() throws Exception { + ProtoOutputStream out = new ProtoOutputStream(); + out.write(ChunksMetadataProto.Chunk.HASH, mChunkHashA.getHash()); + out.flush(); + byte[] protoBytes = out.getBytes(); + + Chunk chunk = + Chunk.readFromProto(new ProtoInputStream(new ByteArrayInputStream(protoBytes))); + + assertThat(chunk.getHash()).isEqualTo(mChunkHashA.getHash()); + assertThat(chunk.getLength()).isEqualTo(0); + } + + @Test + public void testReadFromProto_whenOnlyLengthSet_returnsChunkWithOnlyLength() throws Exception { + ProtoOutputStream out = new ProtoOutputStream(); + out.write(ChunksMetadataProto.Chunk.LENGTH, CHUNK_A_LENGTH); + out.flush(); + byte[] protoBytes = out.getBytes(); + + Chunk chunk = + Chunk.readFromProto(new ProtoInputStream(new ByteArrayInputStream(protoBytes))); + + assertThat(chunk.getHash()).isEqualTo(new byte[] {}); + assertThat(chunk.getLength()).isEqualTo(CHUNK_A_LENGTH); + } + + private ChunkHash getHash(String name) { + return new ChunkHash( + Arrays.copyOf(name.getBytes(Charsets.UTF_8), ChunkHash.HASH_LENGTH_BYTES)); + } +} diff --git a/services/robotests/src/com/android/server/backup/encryption/chunk/EncryptedChunkOrderingTest.java b/services/robotests/src/com/android/server/backup/encryption/chunk/EncryptedChunkOrderingTest.java new file mode 100644 index 000000000000..1cd1528b930c --- /dev/null +++ b/services/robotests/src/com/android/server/backup/encryption/chunk/EncryptedChunkOrderingTest.java @@ -0,0 +1,75 @@ +/* + * 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.backup.encryption.chunk; + +import static com.google.common.truth.Truth.assertThat; + +import android.platform.test.annotations.Presubmit; +import com.android.server.testing.FrameworkRobolectricTestRunner; +import com.android.server.testing.SystemLoaderPackages; +import com.google.common.primitives.Bytes; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.annotation.Config; + +@RunWith(FrameworkRobolectricTestRunner.class) +@Config(manifest = Config.NONE, sdk = 26) +@SystemLoaderPackages({"com.android.server.backup"}) +@Presubmit +public class EncryptedChunkOrderingTest { + private static final byte[] TEST_BYTE_ARRAY_1 = new byte[] {1, 2, 3, 4, 5}; + private static final byte[] TEST_BYTE_ARRAY_2 = new byte[] {5, 4, 3, 2, 1}; + + @Test + public void testEncryptedChunkOrdering_returnsValue() { + EncryptedChunkOrdering encryptedChunkOrdering = + EncryptedChunkOrdering.create(TEST_BYTE_ARRAY_1); + + byte[] bytes = encryptedChunkOrdering.encryptedChunkOrdering(); + + assertThat(bytes) + .asList() + .containsExactlyElementsIn(Bytes.asList(TEST_BYTE_ARRAY_1)) + .inOrder(); + } + + @Test + public void testEquals() { + EncryptedChunkOrdering chunkOrdering1 = EncryptedChunkOrdering.create(TEST_BYTE_ARRAY_1); + EncryptedChunkOrdering equalChunkOrdering1 = + EncryptedChunkOrdering.create(TEST_BYTE_ARRAY_1); + EncryptedChunkOrdering chunkOrdering2 = EncryptedChunkOrdering.create(TEST_BYTE_ARRAY_2); + + assertThat(chunkOrdering1).isEqualTo(equalChunkOrdering1); + assertThat(chunkOrdering1).isNotEqualTo(chunkOrdering2); + } + + @Test + public void testHashCode() { + EncryptedChunkOrdering chunkOrdering1 = EncryptedChunkOrdering.create(TEST_BYTE_ARRAY_1); + EncryptedChunkOrdering equalChunkOrdering1 = + EncryptedChunkOrdering.create(TEST_BYTE_ARRAY_1); + EncryptedChunkOrdering chunkOrdering2 = EncryptedChunkOrdering.create(TEST_BYTE_ARRAY_2); + + int hash1 = chunkOrdering1.hashCode(); + int equalHash1 = equalChunkOrdering1.hashCode(); + int hash2 = chunkOrdering2.hashCode(); + + assertThat(hash1).isEqualTo(equalHash1); + assertThat(hash1).isNotEqualTo(hash2); + } +} diff --git a/services/robotests/src/com/android/server/backup/testing/TransportData.java b/services/robotests/src/com/android/server/backup/testing/TransportData.java index 4c67180050e2..77f5d9a48c18 100644 --- a/services/robotests/src/com/android/server/backup/testing/TransportData.java +++ b/services/robotests/src/com/android/server/backup/testing/TransportData.java @@ -48,9 +48,9 @@ public class TransportData { public static TransportData localTransport() { return new TransportData( - "android/com.android.internal.backup.LocalTransport", - "android/com.android.internal.backup.LocalTransportService", - "com.android.internal.backup.LocalTransport", + "com.android.localtransport/.LocalTransport", + "com.android.localtransport/.LocalTransportService", + "com.android.localtransport.LocalTransport", null, "Backing up to debug-only private cache", null, diff --git a/services/tests/servicestests/src/com/android/server/wm/RecentsAnimationControllerTest.java b/services/tests/servicestests/src/com/android/server/wm/RecentsAnimationControllerTest.java index e7c45d59078c..aaa00452204b 100644 --- a/services/tests/servicestests/src/com/android/server/wm/RecentsAnimationControllerTest.java +++ b/services/tests/servicestests/src/com/android/server/wm/RecentsAnimationControllerTest.java @@ -16,6 +16,7 @@ package com.android.server.wm; +import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME; import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.view.Display.DEFAULT_DISPLAY; @@ -24,6 +25,8 @@ import static com.android.server.wm.RecentsAnimationController.REORDER_KEEP_IN_P import static com.android.server.wm.RecentsAnimationController.REORDER_MOVE_TO_ORIGINAL_POSITION; import static org.junit.Assert.fail; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.atLeast; import static org.mockito.Mockito.verify; @@ -33,6 +36,7 @@ import static org.mockito.Mockito.when; import android.os.Binder; import android.os.IInterface; import android.platform.test.annotations.Presubmit; +import android.util.SparseBooleanArray; import android.view.IRecentsAnimationRunner; import android.view.SurfaceControl; @@ -109,6 +113,24 @@ public class RecentsAnimationControllerTest extends WindowTestsBase { } } + @Test + public void testIncludedApps_expectTargetAndVisible() throws Exception { + sWm.setRecentsAnimationController(mController); + final AppWindowToken homeAppWindow = createAppWindowToken(mDisplayContent, + WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME); + final AppWindowToken appWindow = createAppWindowToken(mDisplayContent, + WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD); + final AppWindowToken hiddenAppWindow = createAppWindowToken(mDisplayContent, + WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD); + hiddenAppWindow.setHidden(true); + mController.initialize(mDisplayContent, ACTIVITY_TYPE_HOME, new SparseBooleanArray()); + + // Ensure that we are animating the target activity as well + assertTrue(mController.isAnimatingTask(homeAppWindow.getTask())); + assertTrue(mController.isAnimatingTask(appWindow.getTask())); + assertFalse(mController.isAnimatingTask(hiddenAppWindow.getTask())); + } + private static void verifyNoMoreInteractionsExceptAsBinder(IInterface binder) { verify(binder, atLeast(0)).asBinder(); verifyNoMoreInteractions(binder); diff --git a/telephony/java/android/telephony/NetworkScan.java b/telephony/java/android/telephony/NetworkScan.java index 7c7d7a0397ad..202da6817cb5 100644 --- a/telephony/java/android/telephony/NetworkScan.java +++ b/telephony/java/android/telephony/NetworkScan.java @@ -16,11 +16,10 @@ package android.telephony; +import android.annotation.IntDef; import android.content.Context; import android.os.RemoteException; import android.os.ServiceManager; -import android.annotation.IntDef; -import android.util.Log; import com.android.internal.telephony.ITelephony; @@ -113,6 +112,8 @@ public class NetworkScan { } try { telephony.stopNetworkScan(mSubId, mScanId); + } catch (IllegalArgumentException ex) { + Rlog.d(TAG, "stopNetworkScan - no active scan for ScanID=" + mScanId); } catch (RemoteException ex) { Rlog.e(TAG, "stopNetworkScan RemoteException", ex); } catch (RuntimeException ex) { diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java index 777b850bc9c5..38ee79f06690 100644 --- a/telephony/java/android/telephony/SubscriptionManager.java +++ b/telephony/java/android/telephony/SubscriptionManager.java @@ -1852,6 +1852,19 @@ public class SubscriptionManager { } /** + * Checks if the supplied subscription ID corresponds to an active subscription. + * + * @param subscriptionId the subscription ID. + * @return {@code true} if the supplied subscription ID corresponds to an active subscription; + * {@code false} if it does not correspond to an active subscription; or throw a + * SecurityException if the caller hasn't got the right permission. + */ + @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) + public boolean isActiveSubscriptionId(int subscriptionId) { + return isActiveSubId(subscriptionId); + } + + /** * @return true if the sub ID is active. i.e. The sub ID corresponds to a known subscription * and the SIM providing the subscription is present in a slot and in "LOADED" state. * @hide @@ -1861,7 +1874,7 @@ public class SubscriptionManager { try { ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub")); if (iSub != null) { - return iSub.isActiveSubId(subId); + return iSub.isActiveSubId(subId, mContext.getOpPackageName()); } } catch (RemoteException ex) { } diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index d58b932f2851..824533d59bf5 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -16,6 +16,8 @@ package android.telephony; +import static android.content.Context.TELECOM_SERVICE; + import static com.android.internal.util.Preconditions.checkNotNull; import android.annotation.IntDef; @@ -1201,6 +1203,15 @@ public class TelephonyManager { "android.intent.action.DATA_STALL_DETECTED"; /** + * A service action that identifies a {@link android.app.SmsAppService} subclass in the + * AndroidManifest.xml. + * + * <p>See {@link android.app.SmsAppService} for the details. + */ + @SdkConstant(SdkConstantType.SERVICE_ACTION) + public static final String ACTION_SMS_APP_SERVICE = "android.telephony.action.SMS_APP_SERVICE"; + + /** * An int extra used with {@link #ACTION_DATA_STALL_DETECTED} to indicate the * action associated with the data stall recovery. * @@ -4372,7 +4383,7 @@ public class TelephonyManager { * @hide */ private ITelecomService getTelecomService() { - return ITelecomService.Stub.asInterface(ServiceManager.getService(Context.TELECOM_SERVICE)); + return ITelecomService.Stub.asInterface(ServiceManager.getService(TELECOM_SERVICE)); } private ITelephonyRegistry getTelephonyRegistry() { @@ -5402,7 +5413,19 @@ public class TelephonyManager { } } - // ICC SIM Application Types + /** + * UICC SIM Application Types + * @hide + */ + @IntDef(prefix = { "APPTYPE_" }, value = { + APPTYPE_SIM, + APPTYPE_USIM, + APPTYPE_RUIM, + APPTYPE_CSIM, + APPTYPE_ISIM + }) + @Retention(RetentionPolicy.SOURCE) + public @interface UiccAppType{} /** UICC application type is SIM */ public static final int APPTYPE_SIM = PhoneConstants.APPTYPE_SIM; /** UICC application type is USIM */ @@ -5413,6 +5436,7 @@ public class TelephonyManager { public static final int APPTYPE_CSIM = PhoneConstants.APPTYPE_CSIM; /** UICC application type is ISIM */ public static final int APPTYPE_ISIM = PhoneConstants.APPTYPE_ISIM; + // authContext (parameter P2) when doing UICC challenge, // per 3GPP TS 31.102 (Section 7.1.2) /** Authentication type for UICC challenge is EAP SIM. See RFC 4186 for details. */ @@ -5679,6 +5703,202 @@ public class TelephonyManager { } } + /** @hide */ + @IntDef(prefix = { "NETWORK_MODE_" }, value = { + NETWORK_MODE_WCDMA_PREF, + NETWORK_MODE_GSM_ONLY, + NETWORK_MODE_WCDMA_ONLY, + NETWORK_MODE_GSM_UMTS, + NETWORK_MODE_CDMA_EVDO, + NETWORK_MODE_CDMA_NO_EVDO, + NETWORK_MODE_EVDO_NO_CDMA, + NETWORK_MODE_GLOBAL, + NETWORK_MODE_LTE_CDMA_EVDO, + NETWORK_MODE_LTE_GSM_WCDMA, + NETWORK_MODE_LTE_CDMA_EVDO_GSM_WCDMA, + NETWORK_MODE_LTE_ONLY, + NETWORK_MODE_LTE_WCDMA, + NETWORK_MODE_TDSCDMA_ONLY, + NETWORK_MODE_TDSCDMA_WCDMA, + NETWORK_MODE_LTE_TDSCDMA, + NETWORK_MODE_TDSCDMA_GSM, + NETWORK_MODE_LTE_TDSCDMA_GSM, + NETWORK_MODE_TDSCDMA_GSM_WCDMA, + NETWORK_MODE_LTE_TDSCDMA_WCDMA, + NETWORK_MODE_LTE_TDSCDMA_GSM_WCDMA, + NETWORK_MODE_TDSCDMA_CDMA_EVDO_GSM_WCDMA, + NETWORK_MODE_LTE_TDSCDMA_CDMA_EVDO_GSM_WCDMA + }) + @Retention(RetentionPolicy.SOURCE) + public @interface PrefNetworkMode{} + + /** + * preferred network mode is GSM/WCDMA (WCDMA preferred). + * @hide + */ + @SystemApi + public static final int NETWORK_MODE_WCDMA_PREF = RILConstants.NETWORK_MODE_WCDMA_PREF; + + /** + * preferred network mode is GSM only. + * @hide + */ + @SystemApi + public static final int NETWORK_MODE_GSM_ONLY = RILConstants.NETWORK_MODE_GSM_ONLY; + + /** + * preferred network mode is WCDMA only. + * @hide + */ + @SystemApi + public static final int NETWORK_MODE_WCDMA_ONLY = RILConstants.NETWORK_MODE_WCDMA_ONLY; + + /** + * preferred network mode is GSM/WCDMA (auto mode, according to PRL). + * @hide + */ + @SystemApi + public static final int NETWORK_MODE_GSM_UMTS = RILConstants.NETWORK_MODE_GSM_UMTS; + + /** + * preferred network mode is CDMA and EvDo (auto mode, according to PRL). + * @hide + */ + @SystemApi + public static final int NETWORK_MODE_CDMA_EVDO = RILConstants.NETWORK_MODE_CDMA; + + /** + * preferred network mode is CDMA only. + * @hide + */ + @SystemApi + public static final int NETWORK_MODE_CDMA_NO_EVDO = RILConstants.NETWORK_MODE_CDMA_NO_EVDO; + + /** + * preferred network mode is EvDo only. + * @hide + */ + @SystemApi + public static final int NETWORK_MODE_EVDO_NO_CDMA = RILConstants.NETWORK_MODE_EVDO_NO_CDMA; + + /** + * preferred network mode is GSM/WCDMA, CDMA, and EvDo (auto mode, according to PRL). + * @hide + */ + @SystemApi + public static final int NETWORK_MODE_GLOBAL = RILConstants.NETWORK_MODE_GLOBAL; + + /** + * preferred network mode is LTE, CDMA and EvDo. + * @hide + */ + @SystemApi + public static final int NETWORK_MODE_LTE_CDMA_EVDO = RILConstants.NETWORK_MODE_LTE_CDMA_EVDO; + + /** + * preferred network mode is LTE, GSM/WCDMA. + * @hide + */ + @SystemApi + public static final int NETWORK_MODE_LTE_GSM_WCDMA = RILConstants.NETWORK_MODE_LTE_GSM_WCDMA; + + /** + * preferred network mode is LTE, CDMA, EvDo, GSM/WCDMA. + * @hide + */ + @SystemApi + public static final int NETWORK_MODE_LTE_CDMA_EVDO_GSM_WCDMA = + RILConstants.NETWORK_MODE_LTE_CDMA_EVDO_GSM_WCDMA; + + /** + * preferred network mode is LTE Only. + * @hide + */ + @SystemApi + public static final int NETWORK_MODE_LTE_ONLY = RILConstants.NETWORK_MODE_LTE_ONLY; + + /** + * preferred network mode is LTE/WCDMA. + * @hide + */ + @SystemApi + public static final int NETWORK_MODE_LTE_WCDMA = RILConstants.NETWORK_MODE_LTE_WCDMA; + + /** + * preferred network mode is TD-SCDMA only. + * @hide + */ + @SystemApi + public static final int NETWORK_MODE_TDSCDMA_ONLY = RILConstants.NETWORK_MODE_TDSCDMA_ONLY; + + /** + * preferred network mode is TD-SCDMA and WCDMA. + * @hide + */ + @SystemApi + public static final int NETWORK_MODE_TDSCDMA_WCDMA = RILConstants.NETWORK_MODE_TDSCDMA_WCDMA; + + /** + * preferred network mode is TD-SCDMA and LTE. + * @hide + */ + @SystemApi + public static final int NETWORK_MODE_LTE_TDSCDMA = RILConstants.NETWORK_MODE_LTE_TDSCDMA; + + /** + * preferred network mode is TD-SCDMA and GSM. + * @hide + */ + @SystemApi + public static final int NETWORK_MODE_TDSCDMA_GSM = RILConstants.NETWORK_MODE_TDSCDMA_GSM; + + /** + * preferred network mode is TD-SCDMA,GSM and LTE. + * @hide + */ + @SystemApi + public static final int NETWORK_MODE_LTE_TDSCDMA_GSM = + RILConstants.NETWORK_MODE_LTE_TDSCDMA_GSM; + + /** + * preferred network mode is TD-SCDMA, GSM/WCDMA. + * @hide + */ + @SystemApi + public static final int NETWORK_MODE_TDSCDMA_GSM_WCDMA = + RILConstants.NETWORK_MODE_TDSCDMA_GSM_WCDMA; + + /** + * preferred network mode is TD-SCDMA, WCDMA and LTE. + * @hide + */ + @SystemApi + public static final int NETWORK_MODE_LTE_TDSCDMA_WCDMA = + RILConstants.NETWORK_MODE_LTE_TDSCDMA_WCDMA; + + /** + * preferred network mode is TD-SCDMA, GSM/WCDMA and LTE. + * @hide + */ + @SystemApi + public static final int NETWORK_MODE_LTE_TDSCDMA_GSM_WCDMA = + RILConstants.NETWORK_MODE_LTE_TDSCDMA_GSM_WCDMA; + + /** + * preferred network mode is TD-SCDMA,EvDo,CDMA,GSM/WCDMA. + * @hide + */ + @SystemApi + public static final int NETWORK_MODE_TDSCDMA_CDMA_EVDO_GSM_WCDMA = + RILConstants.NETWORK_MODE_TDSCDMA_CDMA_EVDO_GSM_WCDMA; + /** + * preferred network mode is TD-SCDMA/LTE/GSM/WCDMA, CDMA, and EvDo. + * @hide + */ + @SystemApi + public static final int NETWORK_MODE_LTE_TDSCDMA_CDMA_EVDO_GSM_WCDMA = + RILConstants.NETWORK_MODE_LTE_TDSCDMA_CDMA_EVDO_GSM_WCDMA; + /** * Get the preferred network type. * Used for device configuration by some CDMA operators. @@ -5687,11 +5907,12 @@ public class TelephonyManager { * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the calling * app has carrier privileges (see {@link #hasCarrierPrivileges}). * - * @return the preferred network type, defined in RILConstants.java. + * @return the preferred network type. * @hide */ - @UnsupportedAppUsage - public int getPreferredNetworkType(int subId) { + @RequiresPermission((android.Manifest.permission.MODIFY_PHONE_STATE)) + @SystemApi + public @PrefNetworkMode int getPreferredNetworkType(int subId) { try { ITelephony telephony = getITelephony(); if (telephony != null) @@ -6273,7 +6494,7 @@ public class TelephonyManager { } /** - * @deprecated Use {@link android.telecom.TelecomManager#endCall()} instead. + * @removed Use {@link android.telecom.TelecomManager#endCall()} instead. * @hide * @removed */ @@ -6285,7 +6506,7 @@ public class TelephonyManager { } /** - * @deprecated Use {@link android.telecom.TelecomManager#acceptRingingCall} instead + * @removed Use {@link android.telecom.TelecomManager#acceptRingingCall} instead * @hide * @removed */ @@ -6293,26 +6514,22 @@ public class TelephonyManager { @SystemApi @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void answerRingingCall() { - + // No-op } /** - * @deprecated Use {@link android.telecom.TelecomManager#silenceRinger} instead + * @removed Use {@link android.telecom.TelecomManager#silenceRinger} instead * @hide */ @Deprecated @SystemApi @SuppressLint("Doclava125") public void silenceRinger() { - try { - getTelecomService().silenceRinger(getOpPackageName()); - } catch (RemoteException e) { - Log.e(TAG, "Error calling ITelecomService#silenceRinger", e); - } + // No-op } /** - * @deprecated Use {@link android.telecom.TelecomManager#isInCall} instead + * @removed Use {@link android.telecom.TelecomManager#isInCall} instead * @hide */ @Deprecated @@ -6322,18 +6539,11 @@ public class TelephonyManager { android.Manifest.permission.READ_PHONE_STATE }) public boolean isOffhook() { - try { - ITelephony telephony = getITelephony(); - if (telephony != null) - return telephony.isOffhook(getOpPackageName()); - } catch (RemoteException e) { - Log.e(TAG, "Error calling ITelephony#isOffhook", e); - } return false; } /** - * @deprecated Use {@link android.telecom.TelecomManager#isRinging} instead + * @removed Use {@link android.telecom.TelecomManager#isRinging} instead * @hide */ @Deprecated @@ -6343,18 +6553,11 @@ public class TelephonyManager { android.Manifest.permission.READ_PHONE_STATE }) public boolean isRinging() { - try { - ITelephony telephony = getITelephony(); - if (telephony != null) - return telephony.isRinging(getOpPackageName()); - } catch (RemoteException e) { - Log.e(TAG, "Error calling ITelephony#isRinging", e); - } return false; } /** - * @deprecated Use {@link android.telecom.TelecomManager#isInCall} instead + * @removed Use {@link android.telecom.TelecomManager#isInCall} instead * @hide */ @Deprecated @@ -6364,13 +6567,6 @@ public class TelephonyManager { android.Manifest.permission.READ_PHONE_STATE }) public boolean isIdle() { - try { - ITelephony telephony = getITelephony(); - if (telephony != null) - return telephony.isIdle(getOpPackageName()); - } catch (RemoteException e) { - Log.e(TAG, "Error calling ITelephony#isIdle", e); - } return true; } @@ -7856,26 +8052,23 @@ public class TelephonyManager { } /** - * Return the application ID for the app type like {@link APPTYPE_CSIM}. - * - * Requires that the calling app has READ_PRIVILEGED_PHONE_STATE permission + * Return the application ID for the uicc application type like {@link #APPTYPE_CSIM}. + * All uicc applications are uniquely identified by application ID. See ETSI 102.221 and 101.220 + * <p>Requires Permission: + * {@link android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE} * - * @param appType the uicc app type like {@link APPTYPE_CSIM} - * @return Application ID for specificied app type or null if no uicc or error. + * @param appType the uicc app type. + * @return Application ID for specified app type or {@code null} if no uicc or error. * @hide */ - public String getAidForAppType(int appType) { + @SystemApi + @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) + public String getAidForAppType(@UiccAppType int appType) { return getAidForAppType(getSubId(), appType); } /** - * Return the application ID for the app type like {@link APPTYPE_CSIM}. - * - * Requires that the calling app has READ_PRIVILEGED_PHONE_STATE permission - * - * @param subId the subscription ID that this request applies to. - * @param appType the uicc app type, like {@link APPTYPE_CSIM} - * @return Application ID for specificied app type or null if no uicc or error. + * same as {@link #getAidForAppType(int)} * @hide */ public String getAidForAppType(int subId, int appType) { diff --git a/telephony/java/com/android/internal/telephony/ISub.aidl b/telephony/java/com/android/internal/telephony/ISub.aidl index 6521f0b41cb2..0ccd748c31df 100755 --- a/telephony/java/com/android/internal/telephony/ISub.aidl +++ b/telephony/java/com/android/internal/telephony/ISub.aidl @@ -232,5 +232,5 @@ interface ISub { */ int getSimStateForSlotIndex(int slotIndex); - boolean isActiveSubId(int subId); + boolean isActiveSubId(int subId, String callingPackage); } diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl index e1c770c8deec..ca2bcff2f4cd 100644 --- a/telephony/java/com/android/internal/telephony/ITelephony.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl @@ -75,116 +75,6 @@ interface ITelephony { void call(String callingPackage, String number); /** - * End call if there is a call in progress, otherwise does nothing. - * - * @return whether it hung up - */ - boolean endCall(); - - /** - * End call on particular subId or go to the Home screen - * @param subId user preferred subId. - * @return whether it hung up - */ - boolean endCallForSubscriber(int subId); - - /** - * Answer the currently-ringing call. - * - * If there's already a current active call, that call will be - * automatically put on hold. If both lines are currently in use, the - * current active call will be ended. - * - * TODO: provide a flag to let the caller specify what policy to use - * if both lines are in use. (The current behavior is hardwired to - * "answer incoming, end ongoing", which is how the CALL button - * is specced to behave.) - * - * TODO: this should be a oneway call (especially since it's called - * directly from the key queue thread). - */ - void answerRingingCall(); - - /** - * Answer the currently-ringing call on particular subId . - * - * If there's already a current active call, that call will be - * automatically put on hold. If both lines are currently in use, the - * current active call will be ended. - * - * TODO: provide a flag to let the caller specify what policy to use - * if both lines are in use. (The current behavior is hardwired to - * "answer incoming, end ongoing", which is how the CALL button - * is specced to behave.) - * - * TODO: this should be a oneway call (especially since it's called - * directly from the key queue thread). - */ - void answerRingingCallForSubscriber(int subId); - - /** - * Silence the ringer if an incoming call is currently ringing. - * (If vibrating, stop the vibrator also.) - * - * It's safe to call this if the ringer has already been silenced, or - * even if there's no incoming call. (If so, this method will do nothing.) - * - * TODO: this should be a oneway call too (see above). - * (Actually *all* the methods here that return void can - * probably be oneway.) - */ - void silenceRinger(); - - /** - * Check if we are in either an active or holding call - * @param callingPackage the name of the package making the call. - * @return true if the phone state is OFFHOOK. - */ - boolean isOffhook(String callingPackage); - - /** - * Check if a particular subId has an active or holding call - * - * @param subId user preferred subId. - * @param callingPackage the name of the package making the call. - * @return true if the phone state is OFFHOOK. - */ - boolean isOffhookForSubscriber(int subId, String callingPackage); - - /** - * Check if an incoming phone call is ringing or call waiting - * on a particular subId. - * - * @param subId user preferred subId. - * @param callingPackage the name of the package making the call. - * @return true if the phone state is RINGING. - */ - boolean isRingingForSubscriber(int subId, String callingPackage); - - /** - * Check if an incoming phone call is ringing or call waiting. - * @param callingPackage the name of the package making the call. - * @return true if the phone state is RINGING. - */ - boolean isRinging(String callingPackage); - - /** - * Check if the phone is idle. - * @param callingPackage the name of the package making the call. - * @return true if the phone state is IDLE. - */ - boolean isIdle(String callingPackage); - - /** - * Check if the phone is idle on a particular subId. - * - * @param subId user preferred subId. - * @param callingPackage the name of the package making the call. - * @return true if the phone state is IDLE. - */ - boolean isIdleForSubscriber(int subId, String callingPackage); - - /** * Check to see if the radio is on or not. * @param callingPackage the name of the package making the call. * @return returns true if the radio is on. diff --git a/tests/AppLaunch/src/com/android/tests/applaunch/AppLaunch.java b/tests/AppLaunch/src/com/android/tests/applaunch/AppLaunch.java index 4a6fe49f2676..1f60b71c3c0f 100644 --- a/tests/AppLaunch/src/com/android/tests/applaunch/AppLaunch.java +++ b/tests/AppLaunch/src/com/android/tests/applaunch/AppLaunch.java @@ -247,8 +247,14 @@ public class AppLaunch extends InstrumentationTestCase { mIterationCycle = false; // In the "applaunch.txt" file, trail launches is referenced using // "TRIAL_LAUNCH" - String appPkgName = mNameToIntent.get(launch.getApp()) - .getComponent().getPackageName(); + Intent startIntent = mNameToIntent.get(launch.getApp()); + if (startIntent == null) { + Log.w(TAG, "App does not exist: " + launch.getApp()); + mResult.putString(mNameToResultKey.get(launch.getApp()), + "App does not exist"); + continue; + } + String appPkgName = startIntent.getComponent().getPackageName(); if (SPEED_PROFILE_FILTER.equals(launch.getCompilerFilter())) { assertTrue(String.format("Not able to compile the app : %s", appPkgName), compileApp(VERIFY_FILTER, appPkgName)); diff --git a/tests/NativeProcessesMemoryTest/src/com/android/tests/nativeprocesses/NativeProcessesMemoryTest.java b/tests/NativeProcessesMemoryTest/src/com/android/tests/nativeprocesses/NativeProcessesMemoryTest.java index ae011a0316aa..c86f06eb88e4 100644 --- a/tests/NativeProcessesMemoryTest/src/com/android/tests/nativeprocesses/NativeProcessesMemoryTest.java +++ b/tests/NativeProcessesMemoryTest/src/com/android/tests/nativeprocesses/NativeProcessesMemoryTest.java @@ -21,6 +21,7 @@ import com.android.tradefed.log.LogUtil.CLog; import com.android.tradefed.result.ByteArrayInputStreamSource; import com.android.tradefed.result.ITestInvocationListener; import com.android.tradefed.result.LogDataType; +import com.android.tradefed.result.TestDescription; import com.android.tradefed.testtype.IDeviceTest; import com.android.tradefed.testtype.IRemoteTest; @@ -84,7 +85,10 @@ public class NativeProcessesMemoryTest implements IDeviceTest, IRemoteTest { // showmap requires root, we enable it here for the rest of the test mTestDevice.enableAdbRoot(); - listener.testRunStarted(RUN_NAME, 0 /* testCount */); + listener.testRunStarted(RUN_NAME, 1 /* testCount */); + + TestDescription testDescription = new TestDescription(getClass().getName(), "run"); + listener.testStarted(testDescription); // process name -> list of pids with that name Map<String, List<String>> nativeProcesses = collectNativeProcesses(); @@ -94,7 +98,8 @@ public class NativeProcessesMemoryTest implements IDeviceTest, IRemoteTest { mNativeProcessToMemory.put( NUM_NATIVE_PROCESSES_KEY, Integer.toString(nativeProcesses.size())); - listener.testRunEnded(0, mNativeProcessToMemory); + listener.testEnded(testDescription, mNativeProcessToMemory); + listener.testRunEnded(0, new HashMap<String, String>()); } /** Samples memory of all processes and logs the memory use. */ diff --git a/tests/net/java/android/net/util/SharedLogTest.java b/tests/net/java/android/net/util/SharedLogTest.java index d46facfaba06..86048604e95f 100644 --- a/tests/net/java/android/net/util/SharedLogTest.java +++ b/tests/net/java/android/net/util/SharedLogTest.java @@ -44,6 +44,8 @@ public class SharedLogTest { final SharedLog logLevel2a = logTop.forSubComponent("twoA"); final SharedLog logLevel2b = logTop.forSubComponent("twoB"); logLevel2b.e("2b or not 2b"); + logLevel2b.e("No exception", null); + logLevel2b.e("Wait, here's one", new Exception("Test")); logLevel2a.w("second post?"); final SharedLog logLevel3 = logLevel2a.forSubComponent("three"); @@ -54,6 +56,9 @@ public class SharedLogTest { final String[] expected = { " - MARK first post!", " - [twoB] ERROR 2b or not 2b", + " - [twoB] ERROR No exception", + // No stacktrace in shared log, only in logcat + " - [twoB] ERROR Wait, here's one: Test", " - [twoA] WARN second post?", " - still logging", " - [twoA.three] 3 >> 2", diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index e3db7e8a1354..fceaabddfec2 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -79,6 +79,7 @@ import static org.mockito.Mockito.when; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.BroadcastReceiver; +import android.content.ContentProvider; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; @@ -248,7 +249,7 @@ public class ConnectivityServiceTest { @Spy private Resources mResources; private final LinkedBlockingQueue<Intent> mStartedActivities = new LinkedBlockingQueue<>(); - MockContext(Context base) { + MockContext(Context base, ContentProvider settingsProvider) { super(base); mResources = spy(base.getResources()); @@ -260,7 +261,7 @@ public class ConnectivityServiceTest { }); mContentResolver = new MockContentResolver(); - mContentResolver.addProvider(Settings.AUTHORITY, new FakeSettingsProvider()); + mContentResolver.addProvider(Settings.AUTHORITY, settingsProvider); } @Override @@ -1048,7 +1049,9 @@ public class ConnectivityServiceTest { Looper.prepare(); } - mServiceContext = new MockContext(InstrumentationRegistry.getContext()); + FakeSettingsProvider.clearSettingsProvider(); + mServiceContext = new MockContext(InstrumentationRegistry.getContext(), + new FakeSettingsProvider()); LocalServices.removeServiceForTest(NetworkPolicyManagerInternal.class); LocalServices.addService( NetworkPolicyManagerInternal.class, mock(NetworkPolicyManagerInternal.class)); @@ -1086,6 +1089,7 @@ public class ConnectivityServiceTest { mEthernetNetworkAgent.disconnect(); mEthernetNetworkAgent = null; } + FakeSettingsProvider.clearSettingsProvider(); } private static int transportToLegacyType(int transport) { diff --git a/tools/aapt2/io/FileStream_test.cpp b/tools/aapt2/io/FileStream_test.cpp index c0eaa8e08418..7872738320c3 100644 --- a/tools/aapt2/io/FileStream_test.cpp +++ b/tools/aapt2/io/FileStream_test.cpp @@ -41,46 +41,46 @@ TEST(FileInputStreamTest, NextAndBackup) { ASSERT_FALSE(in.HadError()); EXPECT_THAT(in.ByteCount(), Eq(0u)); - const char* buffer; + const void* buffer; size_t size; - ASSERT_TRUE(in.Next(reinterpret_cast<const void**>(&buffer), &size)) << in.GetError(); + ASSERT_TRUE(in.Next(&buffer, &size)) << in.GetError(); ASSERT_THAT(size, Eq(10u)); ASSERT_THAT(buffer, NotNull()); EXPECT_THAT(in.ByteCount(), Eq(10u)); - EXPECT_THAT(StringPiece(buffer, size), Eq("this is a ")); + EXPECT_THAT(StringPiece(reinterpret_cast<const char*>(buffer), size), Eq("this is a ")); - ASSERT_TRUE(in.Next(reinterpret_cast<const void**>(&buffer), &size)); + ASSERT_TRUE(in.Next(&buffer, &size)); ASSERT_THAT(size, Eq(10u)); ASSERT_THAT(buffer, NotNull()); EXPECT_THAT(in.ByteCount(), Eq(20u)); - EXPECT_THAT(StringPiece(buffer, size), Eq("cool strin")); + EXPECT_THAT(StringPiece(reinterpret_cast<const char*>(buffer), size), Eq("cool strin")); in.BackUp(5u); EXPECT_THAT(in.ByteCount(), Eq(15u)); - ASSERT_TRUE(in.Next(reinterpret_cast<const void**>(&buffer), &size)); + ASSERT_TRUE(in.Next(&buffer, &size)); ASSERT_THAT(size, Eq(5u)); ASSERT_THAT(buffer, NotNull()); ASSERT_THAT(in.ByteCount(), Eq(20u)); - EXPECT_THAT(StringPiece(buffer, size), Eq("strin")); + EXPECT_THAT(StringPiece(reinterpret_cast<const char*>(buffer), size), Eq("strin")); // Backup 1 more than possible. Should clamp. in.BackUp(11u); EXPECT_THAT(in.ByteCount(), Eq(10u)); - ASSERT_TRUE(in.Next(reinterpret_cast<const void**>(&buffer), &size)); + ASSERT_TRUE(in.Next(&buffer, &size)); ASSERT_THAT(size, Eq(10u)); ASSERT_THAT(buffer, NotNull()); ASSERT_THAT(in.ByteCount(), Eq(20u)); - EXPECT_THAT(StringPiece(buffer, size), Eq("cool strin")); + EXPECT_THAT(StringPiece(reinterpret_cast<const char*>(buffer), size), Eq("cool strin")); - ASSERT_TRUE(in.Next(reinterpret_cast<const void**>(&buffer), &size)); + ASSERT_TRUE(in.Next(&buffer, &size)); ASSERT_THAT(size, Eq(1u)); ASSERT_THAT(buffer, NotNull()); ASSERT_THAT(in.ByteCount(), Eq(21u)); - EXPECT_THAT(StringPiece(buffer, size), Eq("g")); + EXPECT_THAT(StringPiece(reinterpret_cast<const char*>(buffer), size), Eq("g")); - EXPECT_FALSE(in.Next(reinterpret_cast<const void**>(&buffer), &size)); + EXPECT_FALSE(in.Next(&buffer, &size)); EXPECT_FALSE(in.HadError()); } @@ -93,25 +93,25 @@ TEST(FileOutputStreamTest, NextAndBackup) { ASSERT_FALSE(out.HadError()); EXPECT_THAT(out.ByteCount(), Eq(0u)); - char* buffer; + void* buffer; size_t size; - ASSERT_TRUE(out.Next(reinterpret_cast<void**>(&buffer), &size)); + ASSERT_TRUE(out.Next(&buffer, &size)); ASSERT_THAT(size, Eq(10u)); ASSERT_THAT(buffer, NotNull()); EXPECT_THAT(out.ByteCount(), Eq(10u)); - memcpy(buffer, input.c_str(), size); + memcpy(reinterpret_cast<char*>(buffer), input.c_str(), size); - ASSERT_TRUE(out.Next(reinterpret_cast<void**>(&buffer), &size)); + ASSERT_TRUE(out.Next(&buffer, &size)); ASSERT_THAT(size, Eq(10u)); ASSERT_THAT(buffer, NotNull()); EXPECT_THAT(out.ByteCount(), Eq(20u)); - memcpy(buffer, input.c_str() + 10u, size); + memcpy(reinterpret_cast<char*>(buffer), input.c_str() + 10u, size); - ASSERT_TRUE(out.Next(reinterpret_cast<void**>(&buffer), &size)); + ASSERT_TRUE(out.Next(&buffer, &size)); ASSERT_THAT(size, Eq(10u)); ASSERT_THAT(buffer, NotNull()); EXPECT_THAT(out.ByteCount(), Eq(30u)); - buffer[0] = input[20u]; + reinterpret_cast<char*>(buffer)[0] = input[20u]; out.BackUp(size - 1); EXPECT_THAT(out.ByteCount(), Eq(21u)); diff --git a/tools/apilint/apilint.py b/tools/apilint/apilint.py index 934847f6eec2..91cd1cba964d 100644 --- a/tools/apilint/apilint.py +++ b/tools/apilint/apilint.py @@ -492,6 +492,7 @@ def verify_parcelable(clazz): def verify_protected(clazz): """Verify that no protected methods or fields are allowed.""" for m in clazz.methods: + if m.name == "finalize": continue if "protected" in m.split: error(clazz, m, "M7", "Protected methods not allowed; must be public") for f in clazz.fields: @@ -1025,6 +1026,10 @@ def verify_resource_names(clazz): # Resources defined by files are foo_bar_baz if clazz.name in ["anim","animator","color","dimen","drawable","interpolator","layout","transition","menu","mipmap","string","plurals","raw","xml"]: for f in clazz.fields: + if re.match("config_[a-z][a-zA-Z1-9]*$", f.name): continue + if f.name.startswith("config_"): + error(clazz, f, None, "Expected config name to be config_fooBarBaz style") + if re.match("[a-z1-9_]+$", f.name): continue error(clazz, f, None, "Expected resource name in this class to be foo_bar_baz style") @@ -1361,6 +1366,60 @@ def verify_clone(clazz): error(clazz, m, None, "Provide an explicit copy constructor instead of implementing clone()") +def verify_pfd(clazz): + """Verify that android APIs use PFD over FD.""" + examine = clazz.ctors + clazz.methods + for m in examine: + if m.typ == "java.io.FileDescriptor": + error(clazz, m, "FW11", "Must use ParcelFileDescriptor") + if m.typ == "int": + if "Fd" in m.name or "FD" in m.name or "FileDescriptor" in m.name: + error(clazz, m, "FW11", "Must use ParcelFileDescriptor") + for arg in m.args: + if arg == "java.io.FileDescriptor": + error(clazz, m, "FW11", "Must use ParcelFileDescriptor") + + for f in clazz.fields: + if f.typ == "java.io.FileDescriptor": + error(clazz, f, "FW11", "Must use ParcelFileDescriptor") + + +def verify_numbers(clazz): + """Discourage small numbers types like short and byte.""" + + discouraged = ["short","byte"] + + for c in clazz.ctors: + for arg in c.args: + if arg in discouraged: + warn(clazz, c, "FW12", "Should avoid odd sized primitives; use int instead") + + for f in clazz.fields: + if f.typ in discouraged: + warn(clazz, f, "FW12", "Should avoid odd sized primitives; use int instead") + + for m in clazz.methods: + if m.typ in discouraged: + warn(clazz, m, "FW12", "Should avoid odd sized primitives; use int instead") + for arg in m.args: + if arg in discouraged: + warn(clazz, m, "FW12", "Should avoid odd sized primitives; use int instead") + + +def verify_singleton(clazz): + """Catch singleton objects with constructors.""" + + singleton = False + for m in clazz.methods: + if m.name.startswith("get") and m.name.endswith("Instance") and " static " in m.raw: + singleton = True + + if singleton: + for c in clazz.ctors: + error(clazz, c, None, "Singleton classes should use getInstance() methods") + + + def is_interesting(clazz): """Test if given class is interesting from an Android PoV.""" @@ -1431,6 +1490,9 @@ def examine_clazz(clazz): verify_tense(clazz) verify_icu(clazz) verify_clone(clazz) + verify_pfd(clazz) + verify_numbers(clazz) + verify_singleton(clazz) def examine_stream(stream): diff --git a/tools/stats_log_api_gen/main.cpp b/tools/stats_log_api_gen/main.cpp index 991547916919..56c842805190 100644 --- a/tools/stats_log_api_gen/main.cpp +++ b/tools/stats_log_api_gen/main.cpp @@ -234,9 +234,11 @@ static int write_stats_log_cpp(FILE *out, const Atoms &atoms, } } } else if (*arg == JAVA_TYPE_KEY_VALUE_PAIR) { - fprintf(out, ", const std::map<int, int64_t>& arg%d_1, " - "const std::map<int, char const*>& arg%d_2, " - "const std::map<int, float>& arg%d_3", argIndex, argIndex, argIndex); + fprintf(out, ", const std::map<int, int32_t>& arg%d_1, " + "const std::map<int, int64_t>& arg%d_2, " + "const std::map<int, char const*>& arg%d_3, " + "const std::map<int, float>& arg%d_4", + argIndex, argIndex, argIndex, argIndex); } else { fprintf(out, ", %s arg%d", cpp_type_name(*arg), argIndex); } @@ -302,6 +304,13 @@ static int write_stats_log_cpp(FILE *out, const Atoms &atoms, fprintf(out, " event.end();\n"); fprintf(out, " }\n"); + fprintf(out, " for (const auto& it : arg%d_4) {\n", argIndex); + fprintf(out, " event.begin();\n"); + fprintf(out, " event << it.first;\n"); + fprintf(out, " event << it.second;\n"); + fprintf(out, " event.end();\n"); + fprintf(out, " }\n"); + fprintf(out, " event.end();\n\n"); } else { if (*arg == JAVA_TYPE_STRING) { @@ -344,9 +353,11 @@ static int write_stats_log_cpp(FILE *out, const Atoms &atoms, } } } else if (*arg == JAVA_TYPE_KEY_VALUE_PAIR) { - fprintf(out, ", const std::map<int, int64_t>& arg%d_1, " - "const std::map<int, char const*>& arg%d_2, " - "const std::map<int, float>& arg%d_3", argIndex, argIndex, argIndex); + fprintf(out, ", const std::map<int, int32_t>& arg%d_1, " + "const std::map<int, int64_t>& arg%d_2, " + "const std::map<int, char const*>& arg%d_3, " + "const std::map<int, float>& arg%d_4", + argIndex, argIndex, argIndex, argIndex); } else { fprintf(out, ", %s arg%d", cpp_type_name(*arg), argIndex); } @@ -374,7 +385,8 @@ static int write_stats_log_cpp(FILE *out, const Atoms &atoms, } } } else if (*arg == JAVA_TYPE_KEY_VALUE_PAIR) { - fprintf(out, ", arg%d_1, arg%d_2, arg%d_3", argIndex, argIndex, argIndex); + fprintf(out, ", arg%d_1, arg%d_2, arg%d_3, arg%d_4", + argIndex, argIndex, argIndex, argIndex); } else { fprintf(out, ", arg%d", argIndex); } @@ -529,10 +541,14 @@ static void write_cpp_usage( } } } else if (field->javaType == JAVA_TYPE_KEY_VALUE_PAIR) { - fprintf(out, ", const std::map<int, int64_t>& %s_int" + fprintf(out, ", const std::map<int, int32_t>& %s_int" + ", const std::map<int, int64_t>& %s_long" ", const std::map<int, char const*>& %s_str" ", const std::map<int, float>& %s_float", - field->name.c_str(), field->name.c_str(), field->name.c_str()); + field->name.c_str(), + field->name.c_str(), + field->name.c_str(), + field->name.c_str()); } else { fprintf(out, ", %s %s", cpp_type_name(field->javaType), field->name.c_str()); } @@ -561,9 +577,11 @@ static void write_cpp_method_header( } } } else if (*arg == JAVA_TYPE_KEY_VALUE_PAIR) { - fprintf(out, ", const std::map<int, int64_t>& arg%d_1, " - "const std::map<int, char const*>& arg%d_2, " - "const std::map<int, float>& arg%d_3", argIndex, argIndex, argIndex); + fprintf(out, ", const std::map<int, int32_t>& arg%d_1, " + "const std::map<int, int64_t>& arg%d_2, " + "const std::map<int, char const*>& arg%d_3, " + "const std::map<int, float>& arg%d_4", + argIndex, argIndex, argIndex, argIndex); } else { fprintf(out, ", %s arg%d", cpp_type_name(*arg), argIndex); } @@ -976,6 +994,7 @@ jni_function_signature(const vector<java_type_t>& signature, const AtomDecl &att } static void write_key_value_map_jni(FILE* out) { + fprintf(out, " std::map<int, int32_t> int32_t_map;\n"); fprintf(out, " std::map<int, int64_t> int64_t_map;\n"); fprintf(out, " std::map<int, float> float_map;\n"); fprintf(out, " std::map<int, char const*> string_map;\n\n"); @@ -989,9 +1008,11 @@ static void write_key_value_map_jni(FILE* out) { fprintf(out, " std::vector<std::unique_ptr<ScopedUtfChars>> scoped_ufs;\n\n"); + fprintf(out, " jclass jint_class = env->FindClass(\"java/lang/Integer\");\n"); fprintf(out, " jclass jlong_class = env->FindClass(\"java/lang/Long\");\n"); fprintf(out, " jclass jfloat_class = env->FindClass(\"java/lang/Float\");\n"); fprintf(out, " jclass jstring_class = env->FindClass(\"java/lang/String\");\n"); + fprintf(out, " jmethodID jget_int_method = env->GetMethodID(jint_class, \"intValue\", \"()I\");\n"); fprintf(out, " jmethodID jget_long_method = env->GetMethodID(jlong_class, \"longValue\", \"()J\");\n"); fprintf(out, " jmethodID jget_float_method = env->GetMethodID(jfloat_class, \"floatValue\", \"()F\");\n\n"); @@ -1000,7 +1021,9 @@ static void write_key_value_map_jni(FILE* out) { fprintf(out, " jint key = env->CallIntMethod(value_map, jget_key_method, i);\n"); fprintf(out, " jobject jvalue_obj = env->CallObjectMethod(value_map, jget_value_method, i);\n"); fprintf(out, " if (jvalue_obj == NULL) { continue; }\n"); - fprintf(out, " if (env->IsInstanceOf(jvalue_obj, jlong_class)) {\n"); + fprintf(out, " if (env->IsInstanceOf(jvalue_obj, jint_class)) {\n"); + fprintf(out, " int32_t_map[key] = env->CallIntMethod(jvalue_obj, jget_int_method);\n"); + fprintf(out, " } else if (env->IsInstanceOf(jvalue_obj, jlong_class)) {\n"); fprintf(out, " int64_t_map[key] = env->CallLongMethod(jvalue_obj, jget_long_method);\n"); fprintf(out, " } else if (env->IsInstanceOf(jvalue_obj, jfloat_class)) {\n"); fprintf(out, " float_map[key] = env->CallFloatMethod(jvalue_obj, jget_float_method);\n"); @@ -1129,7 +1152,7 @@ write_stats_log_jni(FILE* out, const string& java_method_name, const string& cpp } } } else if (*arg == JAVA_TYPE_KEY_VALUE_PAIR) { - fprintf(out, ", int64_t_map, string_map, float_map"); + fprintf(out, ", int32_t_map, int64_t_map, string_map, float_map"); } else { const char *argName = (*arg == JAVA_TYPE_STRING) ? "str" : "arg"; fprintf(out, ", (%s)%s%d", cpp_type_name(*arg), argName, argIndex); diff --git a/wifi/java/android/net/wifi/WifiConfiguration.java b/wifi/java/android/net/wifi/WifiConfiguration.java index ce8d71d7ed2a..58c130017024 100644 --- a/wifi/java/android/net/wifi/WifiConfiguration.java +++ b/wifi/java/android/net/wifi/WifiConfiguration.java @@ -332,9 +332,10 @@ public class WifiConfiguration implements Parcelable { public String preSharedKey; /** - * Up to four WEP keys. Either an ASCII string enclosed in double - * quotation marks (e.g., {@code "abcdef"}) or a string - * of hex digits (e.g., {@code 0102030405}). + * Four WEP keys. For each of the four values, provide either an ASCII + * string enclosed in double quotation marks (e.g., {@code "abcdef"}), + * a string of hex digits (e.g., {@code 0102030405}), or an empty string + * (e.g., {@code ""}). * <p/> * When the value of one of these keys is read, the actual key is * not returned, just a "*" if the key has a value, or the null |