diff options
94 files changed, 891 insertions, 294 deletions
diff --git a/StubLibraries.bp b/StubLibraries.bp index 3bdd4ad909ef..4b0df44d8016 100644 --- a/StubLibraries.bp +++ b/StubLibraries.bp @@ -485,29 +485,3 @@ java_library_static { ":hwbinder-stubs-docs", ], } - -///////////////////////////////////////////////////////////////////// -// api/*-current.txt files for use by modules in other directories -// like the CTS test -///////////////////////////////////////////////////////////////////// - -filegroup { - name: "frameworks-base-api-current.txt", - srcs: [ - "api/current.txt", - ], -} - -filegroup { - name: "frameworks-base-api-system-current.txt", - srcs: [ - "api/system-current.txt", - ], -} - -filegroup { - name: "frameworks-base-api-system-removed.txt", - srcs: [ - "api/system-removed.txt", - ], -} diff --git a/apex/extservices/apex_manifest.json b/apex/extservices/apex_manifest.json index b4acf1283d3e..c0b59cc12311 100644 --- a/apex/extservices/apex_manifest.json +++ b/apex/extservices/apex_manifest.json @@ -1,4 +1,4 @@ { "name": "com.android.extservices", - "version": 300000000 + "version": 300900700 } diff --git a/apex/permission/apex_manifest.json b/apex/permission/apex_manifest.json index 7960598affa3..ab57930341fa 100644 --- a/apex/permission/apex_manifest.json +++ b/apex/permission/apex_manifest.json @@ -1,4 +1,4 @@ { "name": "com.android.permission", - "version": 300000000 + "version": 300900700 } diff --git a/apex/statsd/apex_manifest.json b/apex/statsd/apex_manifest.json index e2972e700880..7bf149308035 100644 --- a/apex/statsd/apex_manifest.json +++ b/apex/statsd/apex_manifest.json @@ -1,5 +1,5 @@ { "name": "com.android.os.statsd", - "version": 300000000 + "version": 300900700 } diff --git a/api/Android.bp b/api/Android.bp index 54ff82c97e17..54031da6e203 100644 --- a/api/Android.bp +++ b/api/Android.bp @@ -1,7 +1,45 @@ +// Copyright (C) 2020 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package { + default_visibility: ["//visibility:private"], +} + +// *-current.txt files for use by modules in other directories like cts +filegroup { + name: "frameworks-base-api-current.txt", + srcs: ["current.txt"], + visibility: ["//visibility:public"], +} + +filegroup { + name: "frameworks-base-api-system-current.txt", + srcs: ["system-current.txt"], + visibility: ["//visibility:public"], +} + +filegroup { + name: "frameworks-base-api-system-removed.txt", + srcs: ["system-removed.txt"], + visibility: ["//visibility:public"], +} + genrule { name: "current-api-xml", tools: ["metalava"], srcs: ["current.txt"], out: ["current.api"], cmd: "$(location metalava) --no-banner -convert2xmlnostrip $(in) $(out)", + visibility: ["//visibility:public"], } diff --git a/api/current.txt b/api/current.txt index 87b0cc85366a..68a22f2360cf 100644 --- a/api/current.txt +++ b/api/current.txt @@ -45970,6 +45970,8 @@ package android.telecom { field public static final int MISSED = 5; // 0x5 field public static final int OTHER = 9; // 0x9 field public static final String REASON_EMERGENCY_CALL_PLACED = "REASON_EMERGENCY_CALL_PLACED"; + field public static final String REASON_IMS_ACCESS_BLOCKED = "REASON_IMS_ACCESS_BLOCKED"; + field public static final String REASON_WIFI_ON_BUT_WFC_OFF = "REASON_WIFI_ON_BUT_WFC_OFF"; field public static final int REJECTED = 6; // 0x6 field public static final int REMOTE = 3; // 0x3 field public static final int RESTRICTED = 8; // 0x8 @@ -46064,6 +46066,7 @@ package android.telecom { field public static final int CAPABILITY_VIDEO_CALLING = 8; // 0x8 field public static final int CAPABILITY_VIDEO_CALLING_RELIES_ON_PRESENCE = 256; // 0x100 field @NonNull public static final android.os.Parcelable.Creator<android.telecom.PhoneAccount> CREATOR; + field public static final String EXTRA_ALWAYS_USE_VOIP_AUDIO_MODE = "android.telecom.extra.ALWAYS_USE_VOIP_AUDIO_MODE"; field public static final String EXTRA_CALL_SUBJECT_CHARACTER_ENCODING = "android.telecom.extra.CALL_SUBJECT_CHARACTER_ENCODING"; field public static final String EXTRA_CALL_SUBJECT_MAX_LENGTH = "android.telecom.extra.CALL_SUBJECT_MAX_LENGTH"; field public static final String EXTRA_LOG_SELF_MANAGED_CALLS = "android.telecom.extra.LOG_SELF_MANAGED_CALLS"; @@ -46630,6 +46633,7 @@ package android.telephony { field public static final String KEY_APN_EXPAND_BOOL = "apn_expand_bool"; field public static final String KEY_APN_SETTINGS_DEFAULT_APN_TYPES_STRING_ARRAY = "apn_settings_default_apn_types_string_array"; field public static final String KEY_AUTO_RETRY_ENABLED_BOOL = "auto_retry_enabled_bool"; + field public static final String KEY_CALL_BARRING_DEFAULT_SERVICE_CLASS_INT = "call_barring_default_service_class_int"; field public static final String KEY_CALL_BARRING_SUPPORTS_DEACTIVATE_ALL_BOOL = "call_barring_supports_deactivate_all_bool"; field public static final String KEY_CALL_BARRING_SUPPORTS_PASSWORD_CHANGE_BOOL = "call_barring_supports_password_change_bool"; field public static final String KEY_CALL_BARRING_VISIBILITY_BOOL = "call_barring_visibility_bool"; @@ -46857,6 +46861,8 @@ package android.telephony { field public static final String KEY_WFC_EMERGENCY_ADDRESS_CARRIER_APP_STRING = "wfc_emergency_address_carrier_app_string"; field public static final String KEY_WORLD_MODE_ENABLED_BOOL = "world_mode_enabled_bool"; field public static final String KEY_WORLD_PHONE_BOOL = "world_phone_bool"; + field public static final int SERVICE_CLASS_NONE = 0; // 0x0 + field public static final int SERVICE_CLASS_VOICE = 1; // 0x1 } public static final class CarrierConfigManager.Apn { diff --git a/api/system-current.txt b/api/system-current.txt index c0364a3de18f..7276b37ba20b 100755 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -1578,12 +1578,16 @@ package android.bluetooth { method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public void setBluetoothTethering(boolean); method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice, int); field public static final String ACTION_CONNECTION_STATE_CHANGED = "android.bluetooth.pan.profile.action.CONNECTION_STATE_CHANGED"; + field public static final String ACTION_TETHERING_STATE_CHANGED = "android.bluetooth.action.TETHERING_STATE_CHANGED"; field public static final String EXTRA_LOCAL_ROLE = "android.bluetooth.pan.extra.LOCAL_ROLE"; + field public static final String EXTRA_TETHERING_STATE = "android.bluetooth.extra.TETHERING_STATE"; field public static final int LOCAL_NAP_ROLE = 1; // 0x1 field public static final int LOCAL_PANU_ROLE = 2; // 0x2 field public static final int PAN_ROLE_NONE = 0; // 0x0 field public static final int REMOTE_NAP_ROLE = 1; // 0x1 field public static final int REMOTE_PANU_ROLE = 2; // 0x2 + field public static final int TETHERING_STATE_OFF = 1; // 0x1 + field public static final int TETHERING_STATE_ON = 2; // 0x2 } public class BluetoothPbap implements android.bluetooth.BluetoothProfile { @@ -9239,6 +9243,7 @@ package android.provider { field public static final String APN_SET_ID = "apn_set_id"; field public static final int CARRIER_EDITED = 4; // 0x4 field public static final String EDITED_STATUS = "edited"; + field public static final int MATCH_ALL_APN_SET_ID = -1; // 0xffffffff field public static final String MAX_CONNECTIONS = "max_conns"; field public static final String MODEM_PERSIST = "modem_cognitive"; field public static final String MTU = "mtu"; @@ -10249,6 +10254,10 @@ package android.telecom { method public final void addExistingConnection(@NonNull android.telecom.PhoneAccountHandle, @NonNull android.telecom.Connection, @NonNull android.telecom.Conference); } + public final class DisconnectCause implements android.os.Parcelable { + field public static final String REASON_EMULATING_SINGLE_CALL = "EMULATING_SINGLE_CALL"; + } + public abstract class InCallService extends android.app.Service { method @Deprecated public android.telecom.Phone getPhone(); method @Deprecated public void onPhoneCreated(android.telecom.Phone); @@ -10377,7 +10386,12 @@ package android.telecom { } public final class PhoneAccount implements android.os.Parcelable { + field public static final int CAPABILITY_EMERGENCY_CALLS_ONLY = 128; // 0x80 + field public static final int CAPABILITY_EMERGENCY_PREFERRED = 8192; // 0x2000 + field public static final int CAPABILITY_EMERGENCY_VIDEO_CALLING = 512; // 0x200 field public static final int CAPABILITY_MULTI_USER = 32; // 0x20 + field public static final String EXTRA_PLAY_CALL_RECORDING_TONE = "android.telecom.extra.PLAY_CALL_RECORDING_TONE"; + field public static final String EXTRA_SORT_ORDER = "android.telecom.extra.SORT_ORDER"; } public static class PhoneAccount.Builder { @@ -10463,10 +10477,20 @@ package android.telecom { method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean isInEmergencyCall(); method @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.READ_PHONE_STATE}) public boolean isRinging(); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setUserSelectedOutgoingPhoneAccount(@Nullable android.telecom.PhoneAccountHandle); + field public static final String ACTION_CURRENT_TTY_MODE_CHANGED = "android.telecom.action.CURRENT_TTY_MODE_CHANGED"; + field public static final String ACTION_TTY_PREFERRED_MODE_CHANGED = "android.telecom.action.TTY_PREFERRED_MODE_CHANGED"; + field public static final int CALL_SOURCE_EMERGENCY_DIALPAD = 1; // 0x1 + field public static final int CALL_SOURCE_EMERGENCY_SHORTCUT = 2; // 0x2 + field public static final int CALL_SOURCE_UNSPECIFIED = 0; // 0x0 field public static final String EXTRA_CALL_BACK_INTENT = "android.telecom.extra.CALL_BACK_INTENT"; + field public static final String EXTRA_CALL_SOURCE = "android.telecom.extra.CALL_SOURCE"; + field public static final String EXTRA_CALL_TECHNOLOGY_TYPE = "android.telecom.extra.CALL_TECHNOLOGY_TYPE"; field public static final String EXTRA_CLEAR_MISSED_CALLS_INTENT = "android.telecom.extra.CLEAR_MISSED_CALLS_INTENT"; field public static final String EXTRA_CONNECTION_SERVICE = "android.telecom.extra.CONNECTION_SERVICE"; + field public static final String EXTRA_CURRENT_TTY_MODE = "android.telecom.extra.CURRENT_TTY_MODE"; field public static final String EXTRA_IS_USER_INTENT_EMERGENCY_CALL = "android.telecom.extra.IS_USER_INTENT_EMERGENCY_CALL"; + field public static final String EXTRA_TTY_PREFERRED_MODE = "android.telecom.extra.TTY_PREFERRED_MODE"; + field public static final String EXTRA_UNKNOWN_CALL_HANDLE = "android.telecom.extra.UNKNOWN_CALL_HANDLE"; field public static final int TTY_MODE_FULL = 1; // 0x1 field public static final int TTY_MODE_HCO = 2; // 0x2 field public static final int TTY_MODE_OFF = 0; // 0x0 diff --git a/api/test-current.txt b/api/test-current.txt index 1576b9433976..415ed034f176 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -17,6 +17,7 @@ package android { field public static final String MANAGE_ROLLBACKS = "android.permission.MANAGE_ROLLBACKS"; field public static final String NETWORK_SETTINGS = "android.permission.NETWORK_SETTINGS"; field public static final String NETWORK_STACK = "android.permission.NETWORK_STACK"; + field public static final String OVERRIDE_DISPLAY_MODE_REQUESTS = "android.permission.OVERRIDE_DISPLAY_MODE_REQUESTS"; field public static final String READ_CELL_BROADCASTS = "android.permission.READ_CELL_BROADCASTS"; field public static final String REMOVE_TASKS = "android.permission.REMOVE_TASKS"; field public static final String SUSPEND_APPS = "android.permission.SUSPEND_APPS"; @@ -3928,6 +3929,10 @@ package android.telecom { method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean isInEmergencyCall(); method @RequiresPermission(anyOf={"android.permission.READ_PRIVILEGED_PHONE_STATE", android.Manifest.permission.READ_PHONE_STATE}) public boolean isRinging(); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setUserSelectedOutgoingPhoneAccount(@Nullable android.telecom.PhoneAccountHandle); + field public static final String ACTION_CURRENT_TTY_MODE_CHANGED = "android.telecom.action.CURRENT_TTY_MODE_CHANGED"; + field public static final String ACTION_TTY_PREFERRED_MODE_CHANGED = "android.telecom.action.TTY_PREFERRED_MODE_CHANGED"; + field public static final String EXTRA_CURRENT_TTY_MODE = "android.telecom.extra.CURRENT_TTY_MODE"; + field public static final String EXTRA_TTY_PREFERRED_MODE = "android.telecom.extra.TTY_PREFERRED_MODE"; field public static final int TTY_MODE_FULL = 1; // 0x1 field public static final int TTY_MODE_HCO = 2; // 0x2 field public static final int TTY_MODE_OFF = 0; // 0x0 diff --git a/core/java/android/bluetooth/BluetoothPan.java b/core/java/android/bluetooth/BluetoothPan.java index bfc28fae6e65..4698b077ff55 100644 --- a/core/java/android/bluetooth/BluetoothPan.java +++ b/core/java/android/bluetooth/BluetoothPan.java @@ -89,6 +89,33 @@ public final class BluetoothPan implements BluetoothProfile { @SuppressLint("ActionValue") public static final String EXTRA_LOCAL_ROLE = "android.bluetooth.pan.extra.LOCAL_ROLE"; + /** + * Intent used to broadcast the change in tethering state of the Pan + * Profile + * + * <p>This intent will have 1 extra: + * <ul> + * <li> {@link #EXTRA_TETHERING_STATE} - The current state of Bluetooth + * tethering. </li> + * </ul> + * + * <p> {@link #EXTRA_TETHERING_STATE} can be any of {@link #TETHERING_STATE_OFF} or + * {@link #TETHERING_STATE_ON} + * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission to + * receive. + */ + @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) + public static final String ACTION_TETHERING_STATE_CHANGED = + "android.bluetooth.action.TETHERING_STATE_CHANGED"; + + /** + * Extra for {@link #ACTION_TETHERING_STATE_CHANGED} intent + * The tethering state of the PAN profile. + * It can be one of {@link #TETHERING_STATE_OFF} or {@link #TETHERING_STATE_ON}. + */ + public static final String EXTRA_TETHERING_STATE = + "android.bluetooth.extra.TETHERING_STATE"; + /** @hide */ @IntDef({PAN_ROLE_NONE, LOCAL_NAP_ROLE, LOCAL_PANU_ROLE}) @Retention(RetentionPolicy.SOURCE) @@ -114,6 +141,14 @@ public final class BluetoothPan implements BluetoothProfile { public static final int REMOTE_PANU_ROLE = 2; + /** @hide **/ + @IntDef({TETHERING_STATE_OFF, TETHERING_STATE_ON}) + @Retention(RetentionPolicy.SOURCE) + public @interface TetheringState{} + + public static final int TETHERING_STATE_OFF = 1; + + public static final int TETHERING_STATE_ON = 2; /** * Return codes for the connect and disconnect Bluez / Dbus calls. * diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java index 2a78eb97513e..8f4fc261df37 100644 --- a/core/java/android/content/pm/ApplicationInfo.java +++ b/core/java/android/content/pm/ApplicationInfo.java @@ -146,8 +146,15 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { public int uiOptions = 0; /** - * Value for {@link #flags}: if set, this application is installed in the - * device's system image. + * Value for {@link #flags}: if set, this application is installed in the device's system image. + * This should not be used to make security decisions. Instead, rely on + * {@linkplain android.content.pm.PackageManager#checkSignatures(java.lang.String,java.lang.String) + * signature checks} or + * <a href="https://developer.android.com/training/articles/security-tips#Permissions">permissions</a>. + * + * <p><b>Warning:</b> Note that does flag not behave the same as + * {@link android.R.attr#protectionLevel android:protectionLevel} {@code system} or + * {@code signatureOrSystem}. */ public static final int FLAG_SYSTEM = 1<<0; diff --git a/core/java/android/provider/Telephony.java b/core/java/android/provider/Telephony.java index 784119f94679..2c2d127b0414 100644 --- a/core/java/android/provider/Telephony.java +++ b/core/java/android/provider/Telephony.java @@ -3948,8 +3948,7 @@ public final class Telephony { /** * The APN set id. When the user manually selects an APN or the framework sets an APN as - * preferred, all APNs with the same set id as the selected APN should be prioritized over - * APNs in other sets. + * preferred, the device can only use APNs with the same set id as the selected APN. * <p>Type: INTEGER</p> * @hide */ @@ -3957,9 +3956,7 @@ public final class Telephony { public static final String APN_SET_ID = "apn_set_id"; /** - * Possible value for the {@link #APN_SET_ID} field. By default APNs will not belong to a - * set. If the user manually selects an APN without apn set id, there is no need to - * prioritize any specific APN set ids. + * Possible value for the {@link #APN_SET_ID} field. By default APNs are added to set 0. * <p>Type: INTEGER</p> * @hide */ @@ -3967,6 +3964,16 @@ public final class Telephony { public static final int NO_APN_SET_ID = 0; /** + * Possible value for the {@link #APN_SET_ID} field. + * APNs with MATCH_ALL_APN_SET_ID will be used regardless of any set ids of + * the selected APN. + * <p>Type: INTEGER</p> + * @hide + */ + @SystemApi + public static final int MATCH_ALL_APN_SET_ID = -1; + + /** * A unique carrier id associated with this APN * {@see TelephonyManager#getSimCarrierId()} * <p>Type: STRING</p> diff --git a/core/java/android/telephony/TelephonyRegistryManager.java b/core/java/android/telephony/TelephonyRegistryManager.java index 0a47032354f5..2dbce7b0fc7b 100644 --- a/core/java/android/telephony/TelephonyRegistryManager.java +++ b/core/java/android/telephony/TelephonyRegistryManager.java @@ -104,6 +104,10 @@ public class TelephonyRegistryManager { public void addOnSubscriptionsChangedListener( @NonNull SubscriptionManager.OnSubscriptionsChangedListener listener, @NonNull Executor executor) { + if (mSubscriptionChangedListenerMap.get(listener) != null) { + Log.d(TAG, "addOnSubscriptionsChangedListener listener already present"); + return; + } IOnSubscriptionsChangedListener callback = new IOnSubscriptionsChangedListener.Stub() { @Override public void onSubscriptionsChanged () { @@ -153,6 +157,10 @@ public class TelephonyRegistryManager { public void addOnOpportunisticSubscriptionsChangedListener( @NonNull SubscriptionManager.OnOpportunisticSubscriptionsChangedListener listener, @NonNull Executor executor) { + if (mOpportunisticSubscriptionChangedListenerMap.get(listener) != null) { + Log.d(TAG, "addOnOpportunisticSubscriptionsChangedListener listener already present"); + return; + } /** * The callback methods need to be called on the executor thread where * this object was created. If the binder did that for us it'd be nice. @@ -188,6 +196,9 @@ public class TelephonyRegistryManager { */ public void removeOnOpportunisticSubscriptionsChangedListener( @NonNull SubscriptionManager.OnOpportunisticSubscriptionsChangedListener listener) { + if (mOpportunisticSubscriptionChangedListenerMap.get(listener) == null) { + return; + } try { sRegistry.removeOnSubscriptionsChangedListener(mContext.getOpPackageName(), mOpportunisticSubscriptionChangedListenerMap.get(listener)); diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 84e56b7d6749..8656820c4ea2 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -236,6 +236,8 @@ android:name="com.android.bluetooth.BluetoothMapContentObserver.action.MESSAGE_DELIVERY" /> <protected-broadcast android:name="android.bluetooth.pan.profile.action.CONNECTION_STATE_CHANGED" /> + <protected-broadcast + android:name="android.bluetooth.action.TETHERING_STATE_CHANGED" /> <protected-broadcast android:name="android.bluetooth.pbap.profile.action.CONNECTION_STATE_CHANGED" /> <protected-broadcast android:name="android.bluetooth.pbapclient.profile.action.CONNECTION_STATE_CHANGED" /> <protected-broadcast android:name="android.bluetooth.sap.profile.action.CONNECTION_STATE_CHANGED" /> @@ -3907,6 +3909,13 @@ <permission android:name="android.permission.CONTROL_DISPLAY_BRIGHTNESS" android:protectionLevel="signature" /> + <!-- @TestApi Allows an application to override the display mode requests + so the app requested mode will be selected and user settings and display + policies will be ignored. + @hide --> + <permission android:name="android.permission.OVERRIDE_DISPLAY_MODE_REQUESTS" + android:protectionLevel="signature" /> + <!-- @SystemApi Allows an application to control VPN. <p>Not for use by third-party applications.</p> @hide --> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index 1ba48ca046e8..a1478cf27f69 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -1169,7 +1169,7 @@ <string name="Midnight" msgid="8176019203622191377">"منتصف الليل"</string> <string name="elapsed_time_short_format_mm_ss" msgid="8689459651807876423">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string> <string name="elapsed_time_short_format_h_mm_ss" msgid="2302144714803345056">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string> - <string name="selectAll" msgid="1532369154488982046">"تحديد الكل"</string> + <string name="selectAll" msgid="1532369154488982046">"اختيار الكل"</string> <string name="cut" msgid="2561199725874745819">"قص"</string> <string name="copy" msgid="5472512047143665218">"نسخ"</string> <string name="failed_to_copy_to_clipboard" msgid="725919885138539875">"تعذّر النسخ في الحافظة"</string> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index 5ac57706d816..52c2be09bbce 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -1548,7 +1548,7 @@ <string name="launchBrowserDefault" msgid="6328349989932924119">"ब्राउज़र लॉन्च करें?"</string> <string name="SetupCallDefault" msgid="5581740063237175247">"कॉल स्वीकार करें?"</string> <string name="activity_resolver_use_always" msgid="5575222334666843269">"हमेशा"</string> - <string name="activity_resolver_use_once" msgid="948462794469672658">"सिर्फ़ एक बार"</string> + <string name="activity_resolver_use_once" msgid="948462794469672658">"केवल एक बार"</string> <string name="activity_resolver_work_profiles_support" msgid="4071345609235361269">"%1$s वर्क प्रोफ़ाइल का समर्थन नहीं करता"</string> <string name="default_audio_route_name" product="tablet" msgid="367936735632195517">"टैबलेट"</string> <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"टीवी"</string> diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml index c071fc7b63ca..bd85908dad1a 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -1108,7 +1108,7 @@ <string name="inputMethod" msgid="1784759500516314751">"Киргизүү ыкмасы"</string> <string name="editTextMenuTitle" msgid="857666911134482176">"Текст боюнча иштер"</string> <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Сактагычта орун калбай баратат"</string> - <string name="low_internal_storage_view_text" msgid="8172166728369697835">"Айрым функциялар иштебеши мүмкүн"</string> + <string name="low_internal_storage_view_text" msgid="8172166728369697835">"Системанын кээ бир функциялары иштебеши мүмкүн"</string> <string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"Тутумда сактагыч жетишсиз. 250МБ бош орун бар экенин текшерип туруп, өчүрүп күйгүзүңүз."</string> <string name="app_running_notification_title" msgid="8985999749231486569">"<xliff:g id="APP_NAME">%1$s</xliff:g> иштөөдө"</string> <string name="app_running_notification_text" msgid="5120815883400228566">"Көбүрөөк маалымат үчүн же колдонмону токтотуш үчүн таптап коюңуз."</string> diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml index faf1b3f50b64..f05ee8a414e6 100644 --- a/core/res/res/values-ml/strings.xml +++ b/core/res/res/values-ml/strings.xml @@ -1547,7 +1547,7 @@ <string name="sending" msgid="206925243621664438">"അയയ്ക്കുന്നു…"</string> <string name="launchBrowserDefault" msgid="6328349989932924119">"ബ്രൗസർ സമാരംഭിക്കണോ?"</string> <string name="SetupCallDefault" msgid="5581740063237175247">"കോൾ സ്വീകരിക്കണോ?"</string> - <string name="activity_resolver_use_always" msgid="5575222334666843269">"എല്ലായ്പ്പോഴും"</string> + <string name="activity_resolver_use_always" msgid="5575222334666843269">"എല്ലായ്പ്പോഴും"</string> <string name="activity_resolver_use_once" msgid="948462794469672658">"ഒരിക്കൽ മാത്രം"</string> <string name="activity_resolver_work_profiles_support" msgid="4071345609235361269">"%1$s, ഔദ്യോഗിക പ്രൊഫൈലിനെ പിന്തുണയ്ക്കുന്നില്ല"</string> <string name="default_audio_route_name" product="tablet" msgid="367936735632195517">"ടാബ്ലെറ്റ്"</string> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index 1a0ec2a1c763..9c99bddf18af 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -536,7 +536,7 @@ <string name="permdesc_imagesWrite" msgid="5195054463269193317">"Cho phép ứng dụng này sửa đổi bộ sưu tập ảnh của bạn."</string> <string name="permlab_mediaLocation" msgid="7368098373378598066">"đọc vị trí từ bộ sưu tập phương tiện"</string> <string name="permdesc_mediaLocation" msgid="597912899423578138">"Cho phép ứng dụng này đọc vị trí từ bộ sưu tập phương tiện của bạn."</string> - <string name="biometric_dialog_default_title" msgid="55026799173208210">"Xác minh danh tính của bạn"</string> + <string name="biometric_dialog_default_title" msgid="55026799173208210">"Xác minh đó là bạn"</string> <string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Không có phần cứng sinh trắc học"</string> <string name="biometric_error_user_canceled" msgid="6732303949695293730">"Đã hủy xác thực"</string> <string name="biometric_not_recognized" msgid="5106687642694635888">"Không nhận dạng được"</string> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index cba68d6f8648..e0b58dd83981 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -3420,7 +3420,7 @@ <string name="config_emergency_call_number" translatable="false">112</string> <!-- Package name that provides Emergency Dialer --> - <string name="config_emergency_dialer_package">com.android.phone</string> + <string name="config_emergency_dialer_package" translatable="false">com.android.phone</string> <!-- Do not translate. Mcc codes whose existence trigger the presence of emergency affordances--> diff --git a/graphics/java/android/graphics/ImageDecoder.java b/graphics/java/android/graphics/ImageDecoder.java index c8f065ad094c..71744eff8a56 100644 --- a/graphics/java/android/graphics/ImageDecoder.java +++ b/graphics/java/android/graphics/ImageDecoder.java @@ -308,7 +308,7 @@ public final class ImageDecoder implements AutoCloseable { ImageDecoder decoder = null; try { - decoder = nCreate(fd, preferAnimation, source); + decoder = nCreate(fd, AssetFileDescriptor.UNKNOWN_LENGTH, preferAnimation, source); } finally { if (decoder == null) { IoUtils.closeQuietly(stream); @@ -356,7 +356,7 @@ public final class ImageDecoder implements AutoCloseable { try { try { Os.lseek(fd, offset, SEEK_SET); - decoder = nCreate(fd, preferAnimation, source); + decoder = nCreate(fd, assetFd.getDeclaredLength(), preferAnimation, source); } catch (ErrnoException e) { decoder = createFromStream(new FileInputStream(fd), true, preferAnimation, source); } @@ -1995,7 +1995,7 @@ public final class ImageDecoder implements AutoCloseable { private static native ImageDecoder nCreate(InputStream is, byte[] storage, boolean preferAnimation, Source src) throws IOException; // The fd must be seekable. - private static native ImageDecoder nCreate(FileDescriptor fd, + private static native ImageDecoder nCreate(FileDescriptor fd, long length, boolean preferAnimation, Source src) throws IOException; @NonNull private static native Bitmap nDecodeBitmap(long nativePtr, diff --git a/libs/androidfw/include/androidfw/ConfigDescription.h b/libs/androidfw/include/androidfw/ConfigDescription.h index acf413aeaf91..61d10cd4e55b 100644 --- a/libs/androidfw/include/androidfw/ConfigDescription.h +++ b/libs/androidfw/include/androidfw/ConfigDescription.h @@ -177,9 +177,8 @@ inline ConfigDescription& ConfigDescription::operator=(ConfigDescription&& o) no return *this; } -inline bool ConfigDescription::MatchWithDensity( - const ConfigDescription& o) const { - return match(o) && (density == 0 || density == o.density); +inline bool ConfigDescription::MatchWithDensity(const ConfigDescription& o) const { + return match(o) && (density == 0 || o.density != 0); } inline bool ConfigDescription::operator<(const ConfigDescription& o) const { diff --git a/libs/hwui/jni/ImageDecoder.cpp b/libs/hwui/jni/ImageDecoder.cpp index 41d939bd6373..c8c3d3d5b078 100644 --- a/libs/hwui/jni/ImageDecoder.cpp +++ b/libs/hwui/jni/ImageDecoder.cpp @@ -152,7 +152,7 @@ static jobject native_create(JNIEnv* env, std::unique_ptr<SkStream> stream, } static jobject ImageDecoder_nCreateFd(JNIEnv* env, jobject /*clazz*/, - jobject fileDescriptor, jboolean preferAnimation, jobject source) { + jobject fileDescriptor, jlong length, jboolean preferAnimation, jobject source) { #ifndef __ANDROID__ // LayoutLib for Windows does not support F_DUPFD_CLOEXEC return throw_exception(env, kSourceException, "Only supported on Android", nullptr, source); #else @@ -172,7 +172,14 @@ static jobject ImageDecoder_nCreateFd(JNIEnv* env, jobject /*clazz*/, nullptr, source); } - std::unique_ptr<SkFILEStream> fileStream(new SkFILEStream(file)); + std::unique_ptr<SkFILEStream> fileStream; + if (length == -1) { + // -1 corresponds to AssetFileDescriptor.UNKNOWN_LENGTH. Pass no length + // so SkFILEStream will figure out the size of the file on its own. + fileStream.reset(new SkFILEStream(file)); + } else { + fileStream.reset(new SkFILEStream(file, length)); + } return native_create(env, std::move(fileStream), source, preferAnimation); #endif } @@ -494,7 +501,7 @@ static const JNINativeMethod gImageDecoderMethods[] = { { "nCreate", "(Ljava/nio/ByteBuffer;IIZLandroid/graphics/ImageDecoder$Source;)Landroid/graphics/ImageDecoder;", (void*) ImageDecoder_nCreateByteBuffer }, { "nCreate", "([BIIZLandroid/graphics/ImageDecoder$Source;)Landroid/graphics/ImageDecoder;", (void*) ImageDecoder_nCreateByteArray }, { "nCreate", "(Ljava/io/InputStream;[BZLandroid/graphics/ImageDecoder$Source;)Landroid/graphics/ImageDecoder;", (void*) ImageDecoder_nCreateInputStream }, - { "nCreate", "(Ljava/io/FileDescriptor;ZLandroid/graphics/ImageDecoder$Source;)Landroid/graphics/ImageDecoder;", (void*) ImageDecoder_nCreateFd }, + { "nCreate", "(Ljava/io/FileDescriptor;JZLandroid/graphics/ImageDecoder$Source;)Landroid/graphics/ImageDecoder;", (void*) ImageDecoder_nCreateFd }, { "nDecodeBitmap", "(JLandroid/graphics/ImageDecoder;ZIILandroid/graphics/Rect;ZIZZZJZ)Landroid/graphics/Bitmap;", (void*) ImageDecoder_nDecodeBitmap }, { "nGetSampledSize","(JI)Landroid/util/Size;", (void*) ImageDecoder_nGetSampledSize }, diff --git a/media/OWNERS b/media/OWNERS index c95ac6c210c0..36df3a05e0ee 100644 --- a/media/OWNERS +++ b/media/OWNERS @@ -9,6 +9,7 @@ hkuang@google.com hunga@google.com insun@google.com jaewan@google.com +jinpark@google.com jmtrivi@google.com jsharkey@android.com klhyun@google.com @@ -17,6 +18,3 @@ marcone@google.com philburk@google.com sungsoo@google.com wonsik@google.com - -# For maintaining sync with AndroidX code -per-file ExifInterface.java = jinpark@google.com, sungsoo@google.com diff --git a/non-updatable-api/current.txt b/non-updatable-api/current.txt index b1373de5ea6c..0aa060546513 100644 --- a/non-updatable-api/current.txt +++ b/non-updatable-api/current.txt @@ -44138,6 +44138,8 @@ package android.telecom { field public static final int MISSED = 5; // 0x5 field public static final int OTHER = 9; // 0x9 field public static final String REASON_EMERGENCY_CALL_PLACED = "REASON_EMERGENCY_CALL_PLACED"; + field public static final String REASON_IMS_ACCESS_BLOCKED = "REASON_IMS_ACCESS_BLOCKED"; + field public static final String REASON_WIFI_ON_BUT_WFC_OFF = "REASON_WIFI_ON_BUT_WFC_OFF"; field public static final int REJECTED = 6; // 0x6 field public static final int REMOTE = 3; // 0x3 field public static final int RESTRICTED = 8; // 0x8 @@ -44232,6 +44234,7 @@ package android.telecom { field public static final int CAPABILITY_VIDEO_CALLING = 8; // 0x8 field public static final int CAPABILITY_VIDEO_CALLING_RELIES_ON_PRESENCE = 256; // 0x100 field @NonNull public static final android.os.Parcelable.Creator<android.telecom.PhoneAccount> CREATOR; + field public static final String EXTRA_ALWAYS_USE_VOIP_AUDIO_MODE = "android.telecom.extra.ALWAYS_USE_VOIP_AUDIO_MODE"; field public static final String EXTRA_CALL_SUBJECT_CHARACTER_ENCODING = "android.telecom.extra.CALL_SUBJECT_CHARACTER_ENCODING"; field public static final String EXTRA_CALL_SUBJECT_MAX_LENGTH = "android.telecom.extra.CALL_SUBJECT_MAX_LENGTH"; field public static final String EXTRA_LOG_SELF_MANAGED_CALLS = "android.telecom.extra.LOG_SELF_MANAGED_CALLS"; @@ -44798,6 +44801,7 @@ package android.telephony { field public static final String KEY_APN_EXPAND_BOOL = "apn_expand_bool"; field public static final String KEY_APN_SETTINGS_DEFAULT_APN_TYPES_STRING_ARRAY = "apn_settings_default_apn_types_string_array"; field public static final String KEY_AUTO_RETRY_ENABLED_BOOL = "auto_retry_enabled_bool"; + field public static final String KEY_CALL_BARRING_DEFAULT_SERVICE_CLASS_INT = "call_barring_default_service_class_int"; field public static final String KEY_CALL_BARRING_SUPPORTS_DEACTIVATE_ALL_BOOL = "call_barring_supports_deactivate_all_bool"; field public static final String KEY_CALL_BARRING_SUPPORTS_PASSWORD_CHANGE_BOOL = "call_barring_supports_password_change_bool"; field public static final String KEY_CALL_BARRING_VISIBILITY_BOOL = "call_barring_visibility_bool"; @@ -45025,6 +45029,8 @@ package android.telephony { field public static final String KEY_WFC_EMERGENCY_ADDRESS_CARRIER_APP_STRING = "wfc_emergency_address_carrier_app_string"; field public static final String KEY_WORLD_MODE_ENABLED_BOOL = "world_mode_enabled_bool"; field public static final String KEY_WORLD_PHONE_BOOL = "world_phone_bool"; + field public static final int SERVICE_CLASS_NONE = 0; // 0x0 + field public static final int SERVICE_CLASS_VOICE = 1; // 0x1 } public static final class CarrierConfigManager.Apn { diff --git a/non-updatable-api/system-current.txt b/non-updatable-api/system-current.txt index 31b71fb5ca4d..6a6914a65a73 100644 --- a/non-updatable-api/system-current.txt +++ b/non-updatable-api/system-current.txt @@ -1526,12 +1526,16 @@ package android.bluetooth { method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public void setBluetoothTethering(boolean); method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice, int); field public static final String ACTION_CONNECTION_STATE_CHANGED = "android.bluetooth.pan.profile.action.CONNECTION_STATE_CHANGED"; + field public static final String ACTION_TETHERING_STATE_CHANGED = "android.bluetooth.action.TETHERING_STATE_CHANGED"; field public static final String EXTRA_LOCAL_ROLE = "android.bluetooth.pan.extra.LOCAL_ROLE"; + field public static final String EXTRA_TETHERING_STATE = "android.bluetooth.extra.TETHERING_STATE"; field public static final int LOCAL_NAP_ROLE = 1; // 0x1 field public static final int LOCAL_PANU_ROLE = 2; // 0x2 field public static final int PAN_ROLE_NONE = 0; // 0x0 field public static final int REMOTE_NAP_ROLE = 1; // 0x1 field public static final int REMOTE_PANU_ROLE = 2; // 0x2 + field public static final int TETHERING_STATE_OFF = 1; // 0x1 + field public static final int TETHERING_STATE_ON = 2; // 0x2 } public class BluetoothPbap implements android.bluetooth.BluetoothProfile { @@ -8121,6 +8125,7 @@ package android.provider { field public static final String APN_SET_ID = "apn_set_id"; field public static final int CARRIER_EDITED = 4; // 0x4 field public static final String EDITED_STATUS = "edited"; + field public static final int MATCH_ALL_APN_SET_ID = -1; // 0xffffffff field public static final String MAX_CONNECTIONS = "max_conns"; field public static final String MODEM_PERSIST = "modem_cognitive"; field public static final String MTU = "mtu"; @@ -9131,6 +9136,10 @@ package android.telecom { method public final void addExistingConnection(@NonNull android.telecom.PhoneAccountHandle, @NonNull android.telecom.Connection, @NonNull android.telecom.Conference); } + public final class DisconnectCause implements android.os.Parcelable { + field public static final String REASON_EMULATING_SINGLE_CALL = "EMULATING_SINGLE_CALL"; + } + public abstract class InCallService extends android.app.Service { method @Deprecated public android.telecom.Phone getPhone(); method @Deprecated public void onPhoneCreated(android.telecom.Phone); @@ -9259,7 +9268,12 @@ package android.telecom { } public final class PhoneAccount implements android.os.Parcelable { + field public static final int CAPABILITY_EMERGENCY_CALLS_ONLY = 128; // 0x80 + field public static final int CAPABILITY_EMERGENCY_PREFERRED = 8192; // 0x2000 + field public static final int CAPABILITY_EMERGENCY_VIDEO_CALLING = 512; // 0x200 field public static final int CAPABILITY_MULTI_USER = 32; // 0x20 + field public static final String EXTRA_PLAY_CALL_RECORDING_TONE = "android.telecom.extra.PLAY_CALL_RECORDING_TONE"; + field public static final String EXTRA_SORT_ORDER = "android.telecom.extra.SORT_ORDER"; } public static class PhoneAccount.Builder { @@ -9345,10 +9359,20 @@ package android.telecom { method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean isInEmergencyCall(); method @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.READ_PHONE_STATE}) public boolean isRinging(); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setUserSelectedOutgoingPhoneAccount(@Nullable android.telecom.PhoneAccountHandle); + field public static final String ACTION_CURRENT_TTY_MODE_CHANGED = "android.telecom.action.CURRENT_TTY_MODE_CHANGED"; + field public static final String ACTION_TTY_PREFERRED_MODE_CHANGED = "android.telecom.action.TTY_PREFERRED_MODE_CHANGED"; + field public static final int CALL_SOURCE_EMERGENCY_DIALPAD = 1; // 0x1 + field public static final int CALL_SOURCE_EMERGENCY_SHORTCUT = 2; // 0x2 + field public static final int CALL_SOURCE_UNSPECIFIED = 0; // 0x0 field public static final String EXTRA_CALL_BACK_INTENT = "android.telecom.extra.CALL_BACK_INTENT"; + field public static final String EXTRA_CALL_SOURCE = "android.telecom.extra.CALL_SOURCE"; + field public static final String EXTRA_CALL_TECHNOLOGY_TYPE = "android.telecom.extra.CALL_TECHNOLOGY_TYPE"; field public static final String EXTRA_CLEAR_MISSED_CALLS_INTENT = "android.telecom.extra.CLEAR_MISSED_CALLS_INTENT"; field public static final String EXTRA_CONNECTION_SERVICE = "android.telecom.extra.CONNECTION_SERVICE"; + field public static final String EXTRA_CURRENT_TTY_MODE = "android.telecom.extra.CURRENT_TTY_MODE"; field public static final String EXTRA_IS_USER_INTENT_EMERGENCY_CALL = "android.telecom.extra.IS_USER_INTENT_EMERGENCY_CALL"; + field public static final String EXTRA_TTY_PREFERRED_MODE = "android.telecom.extra.TTY_PREFERRED_MODE"; + field public static final String EXTRA_UNKNOWN_CALL_HANDLE = "android.telecom.extra.UNKNOWN_CALL_HANDLE"; field public static final int TTY_MODE_FULL = 1; // 0x1 field public static final int TTY_MODE_HCO = 2; // 0x2 field public static final int TTY_MODE_OFF = 0; // 0x0 diff --git a/packages/PackageInstaller/res/values-es/strings.xml b/packages/PackageInstaller/res/values-es/strings.xml index fa738734c598..1049c3ca6b93 100644 --- a/packages/PackageInstaller/res/values-es/strings.xml +++ b/packages/PackageInstaller/res/values-es/strings.xml @@ -56,8 +56,8 @@ <string name="uninstall_application_text" msgid="3816830743706143980">"¿Quieres desinstalar esta aplicación?"</string> <string name="uninstall_application_text_all_users" msgid="575491774380227119">"¿Quieres desinstalar esta aplicación para "<b>"todos"</b>" los usuarios? La aplicación y sus datos se borrarán de "<b>"todos"</b>" los usuarios del dispositivo."</string> <string name="uninstall_application_text_user" msgid="498072714173920526">"¿Quieres desinstalar esta aplicación para el usuario <xliff:g id="USERNAME">%1$s</xliff:g>?"</string> - <string name="uninstall_update_text" msgid="863648314632448705">"¿Quieres reemplazar esta aplicación con la versión de fábrica? Ten en cuenta que se borrarán todos los datos."</string> - <string name="uninstall_update_text_multiuser" msgid="8992883151333057227">"¿Quieres reemplazar esta aplicación con la versión de fábrica? Ten en cuenta que se borrarán todos los datos. Esto afecta a todos los usuarios del dispositivo, incluidos los que tienen perfiles de trabajo."</string> + <string name="uninstall_update_text" msgid="863648314632448705">"¿Quieres sustituir esta aplicación con la versión de fábrica? Ten en cuenta que se borrarán todos los datos."</string> + <string name="uninstall_update_text_multiuser" msgid="8992883151333057227">"¿Quieres sustituir esta aplicación con la versión de fábrica? Ten en cuenta que se borrarán todos los datos. Esto afecta a todos los usuarios del dispositivo, incluidos los que tienen perfiles de trabajo."</string> <string name="uninstall_keep_data" msgid="7002379587465487550">"Mantener <xliff:g id="SIZE">%1$s</xliff:g> de datos de aplicaciones."</string> <string name="uninstalling_notification_channel" msgid="840153394325714653">"Desinstalaciones en curso"</string> <string name="uninstall_failure_notification_channel" msgid="1136405866767576588">"Desinstalaciones fallidas"</string> diff --git a/packages/PackageInstaller/res/values-ne/strings.xml b/packages/PackageInstaller/res/values-ne/strings.xml index 495a05b941d6..60934b1e8ddb 100644 --- a/packages/PackageInstaller/res/values-ne/strings.xml +++ b/packages/PackageInstaller/res/values-ne/strings.xml @@ -30,11 +30,11 @@ <string name="install_failed_blocked" msgid="8512284352994752094">"यो प्याकेज स्थापना गर्ने क्रममा अवरोध गरियो।"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"प्याकेजका रूपमा स्थापना नगरिएको एप विद्यमान प्याकेजसँग मेल खाँदैन।"</string> <string name="install_failed_incompatible" product="tablet" msgid="6019021440094927928">"एपका रूपमा स्थापना नगरिएको एप तपाईंको ट्याब्लेटसँग मिल्दो छैन।"</string> - <string name="install_failed_incompatible" product="tv" msgid="2890001324362291683">"यो एप तपाईंको टिभी सँग मिल्दो छैन।"</string> + <string name="install_failed_incompatible" product="tv" msgid="2890001324362291683">"यो एप तपाईंको TV सँग मिल्दो छैन।"</string> <string name="install_failed_incompatible" product="default" msgid="7254630419511645826">"एपका रूपमा स्थापना नगरिएको एप तपाईंको फोनसँग मिल्दो छैन।"</string> <string name="install_failed_invalid_apk" msgid="8581007676422623930">"प्याकेजका रूपमा स्थापना नगरिएको एप अमान्य जस्तो देखिन्छ।"</string> <string name="install_failed_msg" product="tablet" msgid="6298387264270562442">"तपाईंको ट्याब्लेटमा <xliff:g id="APP_NAME">%1$s</xliff:g> स्थापना गर्न सकिएन।"</string> - <string name="install_failed_msg" product="tv" msgid="1920009940048975221">"तपाईंको टिभी मा <xliff:g id="APP_NAME">%1$s</xliff:g> स्थापना गर्न सकिएन।"</string> + <string name="install_failed_msg" product="tv" msgid="1920009940048975221">"तपाईंको TV मा <xliff:g id="APP_NAME">%1$s</xliff:g> स्थापना गर्न सकिएन।"</string> <string name="install_failed_msg" product="default" msgid="6484461562647915707">"तपाईंको फोनमा <xliff:g id="APP_NAME">%1$s</xliff:g> स्थापना गर्न सकिएन।"</string> <string name="launch" msgid="3952550563999890101">"खोल्नुहोस्"</string> <string name="unknown_apps_admin_dlg_text" msgid="4456572224020176095">"तपाईंका प्रशासकले अज्ञात स्रोतहरूबाट प्राप्त अनुप्रयोगहरूलाई स्थापना गर्ने अनुमति दिनुहुन्न"</string> @@ -81,11 +81,11 @@ <string name="message_staging" msgid="8032722385658438567">"एप स्थापना गर्न तयारी गर्दै…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"अज्ञात"</string> <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"तपाईंको सुरक्षाका लागि, तपाईंको ट्याब्लेटलाई यो स्रोतबाट प्राप्त हुने अज्ञात एपहरू स्थापना गर्ने अनुमति छैन।"</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"तपाईंको सुरक्षाका लागि, तपाईंको टिभी लाई यस स्रोतबाट प्राप्त हुने अज्ञात एपहरू स्थापना गर्ने अनुमति छैन।"</string> + <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"तपाईंको सुरक्षाका लागि, तपाईंको TV लाई यस स्रोतबाट प्राप्त हुने अज्ञात एपहरू स्थापना गर्ने अनुमति छैन।"</string> <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"तपाईंको सुरक्षाका लागि, तपाईंको फोनलाई यो स्रोतबाट प्राप्त हुने अज्ञात एपहरू स्थापना गर्ने अनुमति छैन।"</string> <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"तपाईंको फोन तथा व्यक्तिगत डेटा अज्ञात एपहरूबाट हुने आक्रमणको चपेटामा पर्ने बढी जोखिममा हुन्छन्। यो एप स्थापना गरेर तपाईं यसको प्रयोगबाट तपाईंको फोनमा हुन सक्ने क्षति वा डेटाको नोक्सानीका लागि स्वयं जिम्मेवार हुने कुरामा सहमत हुनुहुन्छ।"</string> <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"तपाईंको ट्याब्लेट तथा व्यक्तिगत डेटा अज्ञात एपहरूबाट हुने आक्रमणको चपेटामा पर्ने बढी जोखिममा हुन्छन्। यो एप स्थापना गरेर तपाईं यसको प्रयोगबाट तपाईंको ट्याब्लेटमा हुन सक्ने क्षति वा डेटाको नोक्सानीका लागि स्वयं जिम्मेवार हुने कुरामा सहमत हुनुहुन्छ।"</string> - <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"तपाईंको टिभी तथा व्यक्तिगत डेटा अज्ञात एपहरूबाट हुने आक्रमणको चपेटामा पर्ने बढी जोखिममा हुन्छन्। यो एप स्थापना गरेर तपाईं यसको प्रयोगबाट तपाईंको टिभी मा हुन सक्ने क्षति वा डेटाको नोक्सानीका लागि स्वयं जिम्मेवार हुने कुरामा सहमत हुनुहुन्छ।"</string> + <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"तपाईंको TV तथा व्यक्तिगत डेटा अज्ञात एपहरूबाट हुने आक्रमणको चपेटामा पर्ने बढी जोखिममा हुन्छन्। यो एप स्थापना गरेर तपाईं यसको प्रयोगबाट तपाईंको TV मा हुन सक्ने क्षति वा डेटाको नोक्सानीका लागि स्वयं जिम्मेवार हुने कुरामा सहमत हुनुहुन्छ।"</string> <string name="anonymous_source_continue" msgid="4375745439457209366">"जारी राख्नुहोस्"</string> <string name="external_sources_settings" msgid="4046964413071713807">"सेटिङहरू"</string> <string name="wear_app_channel" msgid="1960809674709107850">"वेयर एपहरूको स्थापना/स्थापना रद्द गर्दै"</string> diff --git a/packages/PackageInstaller/res/values-or/strings.xml b/packages/PackageInstaller/res/values-or/strings.xml index f3b97a98ccf4..b9908d299a49 100644 --- a/packages/PackageInstaller/res/values-or/strings.xml +++ b/packages/PackageInstaller/res/values-or/strings.xml @@ -19,7 +19,7 @@ <string name="app_name" msgid="7488448184431507488">"ପ୍ୟାକେଜ୍ ଇନଷ୍ଟଲର୍"</string> <string name="install" msgid="711829760615509273">"ଇନଷ୍ଟଲ୍ କରନ୍ତୁ"</string> <string name="done" msgid="6632441120016885253">"ହୋଇଗଲା"</string> - <string name="cancel" msgid="1018267193425558088">"ବାତିଲ୍ କରନ୍ତୁ"</string> + <string name="cancel" msgid="1018267193425558088">"କ୍ୟାନ୍ସଲ୍ କରନ୍ତୁ"</string> <string name="installing" msgid="4921993079741206516">"ଇନଷ୍ଟଲ୍ କରାଯାଉଛି…"</string> <string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ଇନଷ୍ଟଲ୍ କରାଯାଉଛି…"</string> <string name="install_done" msgid="5987363587661783896">"ଆପ୍ ଇନଷ୍ଟଲ୍ ହୋଇଗଲା।"</string> diff --git a/packages/PrintSpooler/res/values-ca/strings.xml b/packages/PrintSpooler/res/values-ca/strings.xml index a346cb2c1b2d..98687b40af16 100644 --- a/packages/PrintSpooler/res/values-ca/strings.xml +++ b/packages/PrintSpooler/res/values-ca/strings.xml @@ -16,7 +16,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="4469836075319831821">"Gestor de cues d\'impressió"</string> + <string name="app_label" msgid="4469836075319831821">"Gest. cues impr."</string> <string name="more_options_button" msgid="2243228396432556771">"Més opcions"</string> <string name="label_destination" msgid="9132510997381599275">"Destinació"</string> <string name="label_copies" msgid="3634531042822968308">"Còpies"</string> diff --git a/packages/SettingsLib/HelpUtils/res/values-en-rAU/strings.xml b/packages/SettingsLib/HelpUtils/res/values-en-rAU/strings.xml index 150020cb17c5..759da1d0b021 100644 --- a/packages/SettingsLib/HelpUtils/res/values-en-rAU/strings.xml +++ b/packages/SettingsLib/HelpUtils/res/values-en-rAU/strings.xml @@ -17,5 +17,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="help_feedback_label" msgid="7106780063063027882">"Help and feedback"</string> + <string name="help_feedback_label" msgid="7106780063063027882">"Help & feedback"</string> </resources> diff --git a/packages/SettingsLib/HelpUtils/res/values-en-rCA/strings.xml b/packages/SettingsLib/HelpUtils/res/values-en-rCA/strings.xml index 150020cb17c5..759da1d0b021 100644 --- a/packages/SettingsLib/HelpUtils/res/values-en-rCA/strings.xml +++ b/packages/SettingsLib/HelpUtils/res/values-en-rCA/strings.xml @@ -17,5 +17,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="help_feedback_label" msgid="7106780063063027882">"Help and feedback"</string> + <string name="help_feedback_label" msgid="7106780063063027882">"Help & feedback"</string> </resources> diff --git a/packages/SettingsLib/HelpUtils/res/values-en-rIN/strings.xml b/packages/SettingsLib/HelpUtils/res/values-en-rIN/strings.xml index 150020cb17c5..759da1d0b021 100644 --- a/packages/SettingsLib/HelpUtils/res/values-en-rIN/strings.xml +++ b/packages/SettingsLib/HelpUtils/res/values-en-rIN/strings.xml @@ -17,5 +17,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="help_feedback_label" msgid="7106780063063027882">"Help and feedback"</string> + <string name="help_feedback_label" msgid="7106780063063027882">"Help & feedback"</string> </resources> diff --git a/packages/SettingsLib/RestrictedLockUtils/res/values-da/strings.xml b/packages/SettingsLib/RestrictedLockUtils/res/values-da/strings.xml index 7f10edf158b6..3a0bc2d2eb77 100644 --- a/packages/SettingsLib/RestrictedLockUtils/res/values-da/strings.xml +++ b/packages/SettingsLib/RestrictedLockUtils/res/values-da/strings.xml @@ -18,5 +18,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="enabled_by_admin" msgid="6630472777476410137">"Aktiveret af administratoren"</string> - <string name="disabled_by_admin" msgid="4023569940620832713">"Deaktiveret af administrator"</string> + <string name="disabled_by_admin" msgid="4023569940620832713">"Deaktiveret af administratoren"</string> </resources> diff --git a/packages/SettingsLib/RestrictedLockUtils/res/values-eu/strings.xml b/packages/SettingsLib/RestrictedLockUtils/res/values-eu/strings.xml index 2a881247c3af..aaf607f6f3ce 100644 --- a/packages/SettingsLib/RestrictedLockUtils/res/values-eu/strings.xml +++ b/packages/SettingsLib/RestrictedLockUtils/res/values-eu/strings.xml @@ -18,5 +18,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="enabled_by_admin" msgid="6630472777476410137">"Administratzaileak gaitu egin du"</string> - <string name="disabled_by_admin" msgid="4023569940620832713">"Administratzaileak desgaitu du"</string> + <string name="disabled_by_admin" msgid="4023569940620832713">"Administratzaileak desgaitu egin du"</string> </resources> diff --git a/packages/SettingsLib/RestrictedLockUtils/res/values-fa/strings.xml b/packages/SettingsLib/RestrictedLockUtils/res/values-fa/strings.xml index 9c39f98aab17..aaf9116bc9d5 100644 --- a/packages/SettingsLib/RestrictedLockUtils/res/values-fa/strings.xml +++ b/packages/SettingsLib/RestrictedLockUtils/res/values-fa/strings.xml @@ -17,6 +17,6 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="enabled_by_admin" msgid="6630472777476410137">"توسط سرپرست فعال شده"</string> - <string name="disabled_by_admin" msgid="4023569940620832713">"توسط سرپرست غیرفعال شده"</string> + <string name="enabled_by_admin" msgid="6630472777476410137">"فعالشده توسط سرپرست"</string> + <string name="disabled_by_admin" msgid="4023569940620832713">"غیرفعالشده توسط سرپرست"</string> </resources> diff --git a/packages/SettingsLib/RestrictedLockUtils/res/values-or/strings.xml b/packages/SettingsLib/RestrictedLockUtils/res/values-or/strings.xml index 4ce6460f8b89..1d23c31f493d 100644 --- a/packages/SettingsLib/RestrictedLockUtils/res/values-or/strings.xml +++ b/packages/SettingsLib/RestrictedLockUtils/res/values-or/strings.xml @@ -18,5 +18,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="enabled_by_admin" msgid="6630472777476410137">"ଆଡମିନଙ୍କ ଦ୍ୱାରା ସକ୍ଷମ କରାଯାଇଛି"</string> - <string name="disabled_by_admin" msgid="4023569940620832713">"ଆଡମିନଙ୍କ ଦ୍ଵାରା ଅକ୍ଷମ କରାଯାଇଛି"</string> + <string name="disabled_by_admin" msgid="4023569940620832713">"ବ୍ୟବସ୍ଥାପକଙ୍କ ଦ୍ଵାରା ଅକ୍ଷମ କରାଯାଇଛି"</string> </resources> diff --git a/packages/SettingsLib/RestrictedLockUtils/res/values-pt-rPT/strings.xml b/packages/SettingsLib/RestrictedLockUtils/res/values-pt-rPT/strings.xml index 908e2fbbff5b..e57d1cc11a20 100644 --- a/packages/SettingsLib/RestrictedLockUtils/res/values-pt-rPT/strings.xml +++ b/packages/SettingsLib/RestrictedLockUtils/res/values-pt-rPT/strings.xml @@ -18,5 +18,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="enabled_by_admin" msgid="6630472777476410137">"Ativado pelo administrador"</string> - <string name="disabled_by_admin" msgid="4023569940620832713">"Desativado pelo administrador"</string> + <string name="disabled_by_admin" msgid="4023569940620832713">"Desativada pelo administrador"</string> </resources> diff --git a/packages/SettingsLib/RestrictedLockUtils/res/values-te/strings.xml b/packages/SettingsLib/RestrictedLockUtils/res/values-te/strings.xml index 8f17dc5ec1e8..2da347c4454f 100644 --- a/packages/SettingsLib/RestrictedLockUtils/res/values-te/strings.xml +++ b/packages/SettingsLib/RestrictedLockUtils/res/values-te/strings.xml @@ -17,6 +17,6 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="enabled_by_admin" msgid="6630472777476410137">"అడ్మిన్ ఎనేబుల్ చేశారు"</string> - <string name="disabled_by_admin" msgid="4023569940620832713">"అడ్మిన్ డిజేబుల్ చేశారు"</string> + <string name="enabled_by_admin" msgid="6630472777476410137">"నిర్వాహకులు ప్రారంభించారు"</string> + <string name="disabled_by_admin" msgid="4023569940620832713">"నిర్వాహకులు నిలిపివేసారు"</string> </resources> diff --git a/packages/SettingsLib/RestrictedLockUtils/res/values-vi/strings.xml b/packages/SettingsLib/RestrictedLockUtils/res/values-vi/strings.xml index 2c37652c850e..f664bb444bc1 100644 --- a/packages/SettingsLib/RestrictedLockUtils/res/values-vi/strings.xml +++ b/packages/SettingsLib/RestrictedLockUtils/res/values-vi/strings.xml @@ -18,5 +18,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="enabled_by_admin" msgid="6630472777476410137">"Do quản trị viên bật"</string> - <string name="disabled_by_admin" msgid="4023569940620832713">"Đã bị quản trị viên vô hiệu hóa"</string> + <string name="disabled_by_admin" msgid="4023569940620832713">"Bị quản trị viên tắt"</string> </resources> diff --git a/packages/SettingsLib/SearchWidget/res/values-el/strings.xml b/packages/SettingsLib/SearchWidget/res/values-el/strings.xml index d50436a29ac1..6f5ab78b304b 100644 --- a/packages/SettingsLib/SearchWidget/res/values-el/strings.xml +++ b/packages/SettingsLib/SearchWidget/res/values-el/strings.xml @@ -17,5 +17,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="search_menu" msgid="1914043873178389845">"Αναζήτηση στις ρυθμίσεις"</string> + <string name="search_menu" msgid="1914043873178389845">"Ρυθμίσεις αναζήτησης"</string> </resources> diff --git a/packages/SettingsLib/SearchWidget/res/values-fa/strings.xml b/packages/SettingsLib/SearchWidget/res/values-fa/strings.xml index 2c9aaa5e9f95..fa5f9bdfe07b 100644 --- a/packages/SettingsLib/SearchWidget/res/values-fa/strings.xml +++ b/packages/SettingsLib/SearchWidget/res/values-fa/strings.xml @@ -17,5 +17,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="search_menu" msgid="1914043873178389845">"تنظیمات جستجو"</string> + <string name="search_menu" msgid="1914043873178389845">"جستجوی تنظیمات"</string> </resources> diff --git a/packages/SettingsLib/SearchWidget/res/values-hr/strings.xml b/packages/SettingsLib/SearchWidget/res/values-hr/strings.xml index 34cb8e0fda38..9d83396689bd 100644 --- a/packages/SettingsLib/SearchWidget/res/values-hr/strings.xml +++ b/packages/SettingsLib/SearchWidget/res/values-hr/strings.xml @@ -17,5 +17,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="search_menu" msgid="1914043873178389845">"Pretražite postavke"</string> + <string name="search_menu" msgid="1914043873178389845">"Pretraži postavke"</string> </resources> diff --git a/packages/SettingsLib/SearchWidget/res/values-hy/strings.xml b/packages/SettingsLib/SearchWidget/res/values-hy/strings.xml index b68b792acc32..8fa5a84acd79 100644 --- a/packages/SettingsLib/SearchWidget/res/values-hy/strings.xml +++ b/packages/SettingsLib/SearchWidget/res/values-hy/strings.xml @@ -17,5 +17,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="search_menu" msgid="1914043873178389845">"Որոնեք կարգավորումներ"</string> + <string name="search_menu" msgid="1914043873178389845">"Որոնման կարգավորումներ"</string> </resources> diff --git a/packages/SettingsLib/SearchWidget/res/values-in/strings.xml b/packages/SettingsLib/SearchWidget/res/values-in/strings.xml index ccf11d26273c..edf51cc601ac 100644 --- a/packages/SettingsLib/SearchWidget/res/values-in/strings.xml +++ b/packages/SettingsLib/SearchWidget/res/values-in/strings.xml @@ -17,5 +17,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="search_menu" msgid="1914043873178389845">"Telusuri setelan"</string> + <string name="search_menu" msgid="1914043873178389845">"Setelan penelusuran"</string> </resources> diff --git a/packages/SettingsLib/SearchWidget/res/values-is/strings.xml b/packages/SettingsLib/SearchWidget/res/values-is/strings.xml index 3378c84d7e08..7ab103b476f3 100644 --- a/packages/SettingsLib/SearchWidget/res/values-is/strings.xml +++ b/packages/SettingsLib/SearchWidget/res/values-is/strings.xml @@ -17,5 +17,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="search_menu" msgid="1914043873178389845">"Leita í stillingum"</string> + <string name="search_menu" msgid="1914043873178389845">"Leitarstillingar"</string> </resources> diff --git a/packages/SettingsLib/SearchWidget/res/values-pt-rPT/strings.xml b/packages/SettingsLib/SearchWidget/res/values-pt-rPT/strings.xml index 5fe116e86f94..85a8d7342827 100644 --- a/packages/SettingsLib/SearchWidget/res/values-pt-rPT/strings.xml +++ b/packages/SettingsLib/SearchWidget/res/values-pt-rPT/strings.xml @@ -17,5 +17,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="search_menu" msgid="1914043873178389845">"Pesquisar nas definições"</string> + <string name="search_menu" msgid="1914043873178389845">"Pesquisa de definições"</string> </resources> diff --git a/packages/SettingsLib/SearchWidget/res/values-sq/strings.xml b/packages/SettingsLib/SearchWidget/res/values-sq/strings.xml index 354941d39e12..a5313210a6f9 100644 --- a/packages/SettingsLib/SearchWidget/res/values-sq/strings.xml +++ b/packages/SettingsLib/SearchWidget/res/values-sq/strings.xml @@ -17,5 +17,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="search_menu" msgid="1914043873178389845">"Kërko te cilësimet"</string> + <string name="search_menu" msgid="1914043873178389845">"Cilësimet e kërkimit"</string> </resources> diff --git a/packages/SettingsLib/SearchWidget/res/values-tl/strings.xml b/packages/SettingsLib/SearchWidget/res/values-tl/strings.xml index 14b7b2f62eee..111cf5a15dba 100644 --- a/packages/SettingsLib/SearchWidget/res/values-tl/strings.xml +++ b/packages/SettingsLib/SearchWidget/res/values-tl/strings.xml @@ -17,5 +17,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="search_menu" msgid="1914043873178389845">"Maghanap sa mga setting"</string> + <string name="search_menu" msgid="1914043873178389845">"Mga setting ng paghahanap"</string> </resources> diff --git a/packages/SettingsLib/SearchWidget/res/values-uk/strings.xml b/packages/SettingsLib/SearchWidget/res/values-uk/strings.xml index 560ac1359e5a..dfd66b28aa7a 100644 --- a/packages/SettingsLib/SearchWidget/res/values-uk/strings.xml +++ b/packages/SettingsLib/SearchWidget/res/values-uk/strings.xml @@ -17,5 +17,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="search_menu" msgid="1914043873178389845">"Пошук налаштувань"</string> + <string name="search_menu" msgid="1914043873178389845">"Налаштування пошуку"</string> </resources> diff --git a/packages/SettingsLib/SearchWidget/res/values-vi/strings.xml b/packages/SettingsLib/SearchWidget/res/values-vi/strings.xml index 90daf11c712d..cb1a75a616f5 100644 --- a/packages/SettingsLib/SearchWidget/res/values-vi/strings.xml +++ b/packages/SettingsLib/SearchWidget/res/values-vi/strings.xml @@ -17,5 +17,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="search_menu" msgid="1914043873178389845">"Tìm trong thông tin cài đặt"</string> + <string name="search_menu" msgid="1914043873178389845">"Tìm kiếm trong các mục cài đặt"</string> </resources> diff --git a/packages/SettingsLib/res/values-bn/arrays.xml b/packages/SettingsLib/res/values-bn/arrays.xml index b19cde4f2778..a131a3b1ad91 100644 --- a/packages/SettingsLib/res/values-bn/arrays.xml +++ b/packages/SettingsLib/res/values-bn/arrays.xml @@ -40,7 +40,7 @@ <item msgid="8339720953594087771">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> এর সাথে কানেক্ট হচ্ছে…"</item> <item msgid="3028983857109369308">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> দিয়ে যাচাইকরণ করা হচ্ছে..."</item> <item msgid="4287401332778341890">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> থেকে আইপি অ্যাড্রেস জানা হচ্ছে…"</item> - <item msgid="1043944043827424501">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>-এ কানেক্ট হয়েছে"</item> + <item msgid="1043944043827424501">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> তে কানেক্ট হয়েছে"</item> <item msgid="7445993821842009653">"স্থগিত করা হয়েছে"</item> <item msgid="1175040558087735707">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> থেকে ডিসকানেক্ট হচ্ছে…"</item> <item msgid="699832486578171722">"ডিসকানেক্ট করা হয়েছে"</item> diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml index 287a1aca2fbd..c27973f8bc86 100644 --- a/packages/SettingsLib/res/values-es-rUS/strings.xml +++ b/packages/SettingsLib/res/values-es-rUS/strings.xml @@ -22,7 +22,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="wifi_fail_to_scan" msgid="2333336097603822490">"No se pueden buscar las redes."</string> <string name="wifi_security_none" msgid="7392696451280611452">"Ninguna"</string> - <string name="wifi_remembered" msgid="3266709779723179188">"Guardado"</string> + <string name="wifi_remembered" msgid="3266709779723179188">"Guardada"</string> <string name="wifi_disconnected" msgid="7054450256284661757">"Desconectado"</string> <string name="wifi_disabled_generic" msgid="2651916945380294607">"Inhabilitada"</string> <string name="wifi_disabled_network_failure" msgid="2660396183242399585">"Error de configuración IP"</string> diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml index f9d57c453f69..3e8b1c1b9cde 100644 --- a/packages/SettingsLib/res/values-gl/strings.xml +++ b/packages/SettingsLib/res/values-gl/strings.xml @@ -37,7 +37,7 @@ <string name="wifi_no_internet" msgid="1774198889176926299">"Sen acceso a Internet"</string> <string name="saved_network" msgid="7143698034077223645">"Gardada por <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="connected_via_network_scorer" msgid="7665725527352893558">"Conectouse automaticamente a través de %1$s"</string> - <string name="connected_via_network_scorer_default" msgid="7973529709744526285">"Conectada automaticamente a través dun provedor de valoración de redes"</string> + <string name="connected_via_network_scorer_default" msgid="7973529709744526285">"Conectada automaticamente a través dun provedor de valoración de rede"</string> <string name="connected_via_passpoint" msgid="7735442932429075684">"Conectado a través de %1$s"</string> <string name="connected_via_app" msgid="3532267661404276584">"Wifi conectada a través de <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="available_via_passpoint" msgid="1716000261192603682">"Dispoñible a través de %1$s"</string> diff --git a/packages/SettingsLib/res/values-in/arrays.xml b/packages/SettingsLib/res/values-in/arrays.xml index 5cdd954d3e6e..c0af2707dd4f 100644 --- a/packages/SettingsLib/res/values-in/arrays.xml +++ b/packages/SettingsLib/res/values-in/arrays.xml @@ -40,7 +40,7 @@ <item msgid="8339720953594087771">"Menyambung ke <xliff:g id="NETWORK_NAME">%1$s</xliff:g>…"</item> <item msgid="3028983857109369308">"Mengautentikasi dengan <xliff:g id="NETWORK_NAME">%1$s</xliff:g>…"</item> <item msgid="4287401332778341890">"Mendapatkan alamat IP dari <xliff:g id="NETWORK_NAME">%1$s</xliff:g>…"</item> - <item msgid="1043944043827424501">"Terhubung ke <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</item> + <item msgid="1043944043827424501">"Tersambung ke <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</item> <item msgid="7445993821842009653">"Ditangguhkan"</item> <item msgid="1175040558087735707">"Diputus dari <xliff:g id="NETWORK_NAME">%1$s</xliff:g>…"</item> <item msgid="699832486578171722">"Sambungan terputus"</item> diff --git a/packages/SettingsLib/res/values-it/arrays.xml b/packages/SettingsLib/res/values-it/arrays.xml index 30186831b113..de38625afcde 100644 --- a/packages/SettingsLib/res/values-it/arrays.xml +++ b/packages/SettingsLib/res/values-it/arrays.xml @@ -22,13 +22,13 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string-array name="wifi_status"> <item msgid="1596683495752107015"></item> - <item msgid="3288373008277313483">"Scansione in corso…"</item> - <item msgid="6050951078202663628">"Connessione…"</item> - <item msgid="8356618438494652335">"Autenticazione…"</item> - <item msgid="2837871868181677206">"Acquisizione indirizzo IP…"</item> + <item msgid="3288373008277313483">"Scansione in corso..."</item> + <item msgid="6050951078202663628">"Connessione..."</item> + <item msgid="8356618438494652335">"Autenticazione..."</item> + <item msgid="2837871868181677206">"Acquisizione indirizzo IP..."</item> <item msgid="4613015005934755724">"Connessa"</item> <item msgid="3763530049995655072">"Sospesa"</item> - <item msgid="7852381437933824454">"Disconnessione…"</item> + <item msgid="7852381437933824454">"Disconnessione..."</item> <item msgid="5046795712175415059">"Disconnessa"</item> <item msgid="2473654476624070462">"Operazione non riuscita"</item> <item msgid="9146847076036105115">"Bloccato"</item> @@ -36,13 +36,13 @@ </string-array> <string-array name="wifi_status_with_ssid"> <item msgid="5969842512724979061"></item> - <item msgid="1818677602615822316">"Scansione in corso…"</item> - <item msgid="8339720953594087771">"Connessione a <xliff:g id="NETWORK_NAME">%1$s</xliff:g>…"</item> - <item msgid="3028983857109369308">"Autenticazione con <xliff:g id="NETWORK_NAME">%1$s</xliff:g>…"</item> - <item msgid="4287401332778341890">"Acquisizione indirizzo IP da <xliff:g id="NETWORK_NAME">%1$s</xliff:g>…"</item> + <item msgid="1818677602615822316">"Scansione in corso..."</item> + <item msgid="8339720953594087771">"Connessione a <xliff:g id="NETWORK_NAME">%1$s</xliff:g>..."</item> + <item msgid="3028983857109369308">"Autenticazione con <xliff:g id="NETWORK_NAME">%1$s</xliff:g>..."</item> + <item msgid="4287401332778341890">"Acquisizione indirizzo IP da <xliff:g id="NETWORK_NAME">%1$s</xliff:g>..."</item> <item msgid="1043944043827424501">"Connessa a <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</item> <item msgid="7445993821842009653">"Sospesa"</item> - <item msgid="1175040558087735707">"Disconnessione da <xliff:g id="NETWORK_NAME">%1$s</xliff:g>…"</item> + <item msgid="1175040558087735707">"Disconnessione da <xliff:g id="NETWORK_NAME">%1$s</xliff:g>..."</item> <item msgid="699832486578171722">"Disconnessa"</item> <item msgid="522383512264986901">"Operazione non riuscita"</item> <item msgid="3602596701217484364">"Bloccato"</item> diff --git a/packages/SettingsLib/res/values-ja/arrays.xml b/packages/SettingsLib/res/values-ja/arrays.xml index 91c2fa20f59a..9f8a8e5c4a32 100644 --- a/packages/SettingsLib/res/values-ja/arrays.xml +++ b/packages/SettingsLib/res/values-ja/arrays.xml @@ -40,7 +40,7 @@ <item msgid="8339720953594087771">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>に接続中..."</item> <item msgid="3028983857109369308">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>による認証中..."</item> <item msgid="4287401332778341890">"IPアドレスを<xliff:g id="NETWORK_NAME">%1$s</xliff:g>から取得中..."</item> - <item msgid="1043944043827424501">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> に接続済み"</item> + <item msgid="1043944043827424501">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>に接続しました"</item> <item msgid="7445993821842009653">"保留中"</item> <item msgid="1175040558087735707">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>から切断中..."</item> <item msgid="699832486578171722">"切断されました"</item> diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml index 8407db6d3a08..08cf5f9fd5a9 100644 --- a/packages/SettingsLib/res/values-mn/strings.xml +++ b/packages/SettingsLib/res/values-mn/strings.xml @@ -211,8 +211,8 @@ <string name="adb_wireless_error" msgid="721958772149779856">"Алдаа"</string> <string name="adb_wireless_settings" msgid="2295017847215680229">"Wireless debugging"</string> <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Боломжтой төхөөрөмжүүдийг харах болох ашиглахын тулд wireless debugging-г асаана уу"</string> - <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"QR кодоор төхөөрөмжийг хослуул"</string> - <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"QR кодын сканнер ашиглан шинэ төхөөрөмжүүдийг хослуулна уу"</string> + <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Хурдан хариу үйлдлийн кодоор төхөөрөмжийг хослуул"</string> + <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Хурдан хариу үйлдлийн кодын сканнер ашиглан шинэ төхөөрөмжүүдийг хослуулна уу"</string> <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Хослуулах кодоор төхөөрөмжийг хослуулна уу"</string> <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Зургаан оронтой кодыг ашиглан шинэ төхөөрөмжүүдийг хослуулна уу"</string> <string name="adb_paired_devices_title" msgid="5268997341526217362">"Хослуулсан төхөөрөмжүүд"</string> @@ -226,12 +226,12 @@ <string name="adb_pairing_device_dialog_pairing_code_label" msgid="3639239786669722731">"Wi‑Fi хослуулах код"</string> <string name="adb_pairing_device_dialog_failed_title" msgid="3426758947882091735">"Хослуулалт амжилтгүй боллоо"</string> <string name="adb_pairing_device_dialog_failed_msg" msgid="6611097519661997148">"Төхөөрөмжийг ижил сүлжээнд холбосон эсэхийг шалгана уу."</string> - <string name="adb_wireless_qrcode_summary" msgid="8051414549011801917">"QR кодыг скан хийж Wi-Fi-р төхөөрөмжийг хослуулна уу"</string> + <string name="adb_wireless_qrcode_summary" msgid="8051414549011801917">"Хурдан хариу үйлдлийн кодыг скан хийж Wi-Fi-р төхөөрөмжийг хослуулна уу"</string> <string name="adb_wireless_verifying_qrcode_text" msgid="6123192424916029207">"Төхөөрөмжийг хослуулж байна…"</string> - <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Төхөөрөмжийг хослуулж чадсангүй. QR код буруу эсвэл төхөөрөмжийг ижил сүлжээнд холбоогүй байна."</string> + <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Төхөөрөмжийг хослуулж чадсангүй. Хурдан хариу үйлдлийн код буруу эсвэл төхөөрөмжийг ижил сүлжээнд холбоогүй байна."</string> <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP хаяг ба порт"</string> - <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"QR кодыг скан хийх"</string> - <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"QR кодыг скан хийж Wi-Fi-р төхөөрөмжийг хослуулна уу"</string> + <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Хурдан хариу үйлдлийн кодыг скан хийх"</string> + <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Хурдан хариу үйлдлийн кодыг скан хийж Wi-Fi-р төхөөрөмжийг хослуулна уу"</string> <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Wi-Fi сүлжээнд холбогдоно уу"</string> <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, дебаг хийх, dev"</string> <string name="bugreport_in_power" msgid="8664089072534638709">"Алдаа мэдээлэх товчлол"</string> diff --git a/packages/SettingsLib/res/values-ne/arrays.xml b/packages/SettingsLib/res/values-ne/arrays.xml index fb002c2c2f03..2895a02cbae4 100644 --- a/packages/SettingsLib/res/values-ne/arrays.xml +++ b/packages/SettingsLib/res/values-ne/arrays.xml @@ -238,7 +238,7 @@ </string-array> <string-array name="show_non_rect_clip_entries"> <item msgid="2482978351289846212">"बन्द"</item> - <item msgid="3405519300199774027">"गैर आयातकार क्षेत्र निलो रङमा कोर्नुहोस्"</item> + <item msgid="3405519300199774027">"गैर आयातकार क्षेत्र नीलो रङमा कोर्नुहोस्"</item> <item msgid="1212561935004167943">"हाइलाइट परीक्षण चित्र कोर्ने आदेशहरू हरियोमा"</item> </string-array> <string-array name="track_frame_time_entries"> diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java index 35bbbc0e8b39..34fdc1e45567 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java @@ -543,12 +543,13 @@ public class LocalBluetoothProfileManager { mPbapProfile.setEnabled(device, true); } - if (mMapClientProfile != null) { + if ((mMapClientProfile != null) + && BluetoothUuid.containsAnyUuid(uuids, MapClientProfile.UUIDS)) { profiles.add(mMapClientProfile); removedProfiles.remove(mMapClientProfile); } - if ((mPbapClientProfile != null) && ArrayUtils.contains(localUuids, BluetoothUuid.PBAP_PCE) + if ((mPbapClientProfile != null) && BluetoothUuid.containsAnyUuid(uuids, PbapClientProfile.SRC_UUIDS)) { profiles.add(mPbapClientProfile); removedProfiles.remove(mPbapClientProfile); diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/MapClientProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/MapClientProfile.java index 19cb2f59f321..4881a86b398a 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/MapClientProfile.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/MapClientProfile.java @@ -47,8 +47,6 @@ public final class MapClientProfile implements LocalBluetoothProfile { private final LocalBluetoothProfileManager mProfileManager; static final ParcelUuid[] UUIDS = { - BluetoothUuid.MAP, - BluetoothUuid.MNS, BluetoothUuid.MAS, }; diff --git a/packages/SettingsProvider/res/values-fa/strings.xml b/packages/SettingsProvider/res/values-fa/strings.xml index 946e2c07c576..cc0b55728310 100644 --- a/packages/SettingsProvider/res/values-fa/strings.xml +++ b/packages/SettingsProvider/res/values-fa/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="4567566098528588863">"تنظیم محل فضای ذخیرهسازی"</string> + <string name="app_label" msgid="4567566098528588863">"تنظیم محل ذخیره"</string> <string name="wifi_softap_config_change" msgid="5688373762357941645">"تنظیمات نقطه اتصال تغییر کرده است"</string> <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"برای مشاهده جزئیات ضربه بزنید"</string> </resources> diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml index 190015cebe30..f5f58efb72e6 100644 --- a/packages/Shell/AndroidManifest.xml +++ b/packages/Shell/AndroidManifest.xml @@ -323,6 +323,9 @@ <!-- Permissions required for CTS test - AdbManagerTest --> <uses-permission android:name="android.permission.MANAGE_DEBUGGING" /> + <!-- Permission needed for CTS test - DisplayTest --> + <uses-permission android:name="android.permission.OVERRIDE_DISPLAY_MODE_REQUESTS" /> + <application android:label="@string/app_label" android:theme="@android:style/Theme.DeviceDefault.DayNight" android:defaultToDeviceProtectedStorage="true" diff --git a/packages/Shell/res/values-it/strings.xml b/packages/Shell/res/values-it/strings.xml index 02531f2fb6e7..18ab908945ac 100644 --- a/packages/Shell/res/values-it/strings.xml +++ b/packages/Shell/res/values-it/strings.xml @@ -21,7 +21,7 @@ <string name="bugreport_in_progress_title" msgid="4311705936714972757">"Generazione segnalazione di bug <xliff:g id="ID">#%d</xliff:g> in corso"</string> <string name="bugreport_finished_title" msgid="4429132808670114081">"Segnalazione di bug <xliff:g id="ID">#%d</xliff:g> acquisita"</string> <string name="bugreport_updating_title" msgid="4423539949559634214">"Aggiunta di dettagli alla segnalazione di bug"</string> - <string name="bugreport_updating_wait" msgid="3322151947853929470">"Attendi…"</string> + <string name="bugreport_updating_wait" msgid="3322151947853929470">"Attendi..."</string> <string name="bugreport_finished_text" product="watch" msgid="1223616207145252689">"La segnalazione di bug comparirà a breve sul telefono"</string> <string name="bugreport_finished_text" product="tv" msgid="5758325479058638893">"Seleziona per condividere la segnalazione di bug"</string> <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"Tocca per condividere la segnalazione di bug"</string> diff --git a/packages/Shell/res/values-ky/strings.xml b/packages/Shell/res/values-ky/strings.xml index 3567ac276e63..969e9ed0654e 100644 --- a/packages/Shell/res/values-ky/strings.xml +++ b/packages/Shell/res/values-ky/strings.xml @@ -29,7 +29,7 @@ <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"Мүчүлүштүк тууралуу билдирүүңүздү скриншотсуз бөлүшүү үчүн таптап коюңуз же скриншот даяр болгуча күтө туруңуз"</string> <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"Мүчүлүштүк тууралуу билдирүүңүздү скриншотсуз бөлүшүү үчүн таптап коюңуз же скриншот даяр болгуча күтө туруңуз"</string> <string name="bugreport_confirm" msgid="5917407234515812495">"Мүчүлүштүктөр тууралуу билдирүүлөрдө тутумдун ар кандай таржымалдарынан алынган дайындар, ошондой эле купуя маалымат камтылышы мүмкүн (мисалы, жайгашкан жер сыяктуу). Мындай билдирүүлөрдү бир гана ишеничтүү адамдар жана колдонмолор менен бөлүшүңүз."</string> - <string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"Экинчи көрүнбөсүн"</string> + <string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"Экинчи көрсөтүлбөсүн"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Мүчүлүштүктөрдү кабарлоо"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"Мүчүлүштүк тууралуу кабарлаган файл окулбай койду"</string> <string name="bugreport_add_details_to_zip_failed" msgid="1302931926486712371">"Мүчүлүштүктөр жөнүндө кабардын чоо-жайы zip файлына кошулбай койду"</string> diff --git a/packages/SimAppDialog/res/values-ky/strings.xml b/packages/SimAppDialog/res/values-ky/strings.xml index 54cbb5bfe824..32db4210822a 100644 --- a/packages/SimAppDialog/res/values-ky/strings.xml +++ b/packages/SimAppDialog/res/values-ky/strings.xml @@ -19,7 +19,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="8898068901680117589">"SIM-картанын колдонмосунун диалогу"</string> <string name="install_carrier_app_title" msgid="334729104862562585">"Мобилдик кызматты жандыруу"</string> - <string name="install_carrier_app_description" msgid="4014303558674923797">"Жаңы SIM картаңыз талаптагыдай иштеши үчүн, <xliff:g id="ID_1">%1$s</xliff:g> колдонмосун орнотуп алышыңыз керек"</string> + <string name="install_carrier_app_description" msgid="4014303558674923797">"Жаңы SIM-картаңыз талаптагыдай иштеши үчүн, <xliff:g id="ID_1">%1$s</xliff:g> колдонмосун орнотуп алышыңыз керек"</string> <string name="install_carrier_app_description_default" msgid="7356830245205847840">"Жаңы SIM картаңыз талаптагыдай иштеши үчүн, байланыш операторунун колдонмосун орнотуп алышыңыз керек"</string> <string name="install_carrier_app_defer_action" msgid="2558576736886876209">"Азыр эмес"</string> <string name="install_carrier_app_download_action" msgid="7859229305958538064">"Колдонмону жүктөп алуу"</string> diff --git a/packages/SoundPicker/src/com/android/soundpicker/RingtonePickerActivity.java b/packages/SoundPicker/src/com/android/soundpicker/RingtonePickerActivity.java index d2f168eb5e3e..285730884a14 100644 --- a/packages/SoundPicker/src/com/android/soundpicker/RingtonePickerActivity.java +++ b/packages/SoundPicker/src/com/android/soundpicker/RingtonePickerActivity.java @@ -584,15 +584,19 @@ public final class RingtonePickerActivity extends AlertActivity implements } private Uri getCurrentlySelectedRingtoneUri() { - if (getCheckedItem() == mDefaultRingtonePos) { - // Use the default Uri that they originally gave us. - return mUriForDefaultItem; - } else if (getCheckedItem() == mSilentPos) { - // Use a null Uri for the 'Silent' item. - return null; - } else { - return mRingtoneManager.getRingtoneUri(getRingtoneManagerPosition(getCheckedItem())); - } + if (getCheckedItem() == POS_UNKNOWN) { + // When the getCheckItem is POS_UNKNOWN, it is not the case we expected. + // We return null for this case. + return null; + } else if (getCheckedItem() == mDefaultRingtonePos) { + // Use the default Uri that they originally gave us. + return mUriForDefaultItem; + } else if (getCheckedItem() == mSilentPos) { + // Use a null Uri for the 'Silent' item. + return null; + } else { + return mRingtoneManager.getRingtoneUri(getRingtoneManagerPosition(getCheckedItem())); + } } private void saveAnyPlayingRingtone() { diff --git a/packages/SystemUI/res/values-fi/strings_tv.xml b/packages/SystemUI/res/values-fi/strings_tv.xml index e22a1660db0c..3a80561e702f 100644 --- a/packages/SystemUI/res/values-fi/strings_tv.xml +++ b/packages/SystemUI/res/values-fi/strings_tv.xml @@ -24,5 +24,5 @@ <string name="pip_close" msgid="5775212044472849930">"Sulje PIP"</string> <string name="pip_fullscreen" msgid="3877997489869475181">"Koko näyttö"</string> <string name="mic_active" msgid="5766614241012047024">"Mikrofoni aktiivinen"</string> - <string name="app_accessed_mic" msgid="2754428675130470196">"%1$s sai pääsyn mikrofoniisi"</string> + <string name="app_accessed_mic" msgid="2754428675130470196">"%1$s käytti mikrofoniasi"</string> </resources> diff --git a/packages/SystemUI/res/values-nb/strings_tv.xml b/packages/SystemUI/res/values-nb/strings_tv.xml index 9b466788d9e0..22580e645ca0 100644 --- a/packages/SystemUI/res/values-nb/strings_tv.xml +++ b/packages/SystemUI/res/values-nb/strings_tv.xml @@ -24,5 +24,5 @@ <string name="pip_close" msgid="5775212044472849930">"Lukk PIP"</string> <string name="pip_fullscreen" msgid="3877997489869475181">"Fullskjerm"</string> <string name="mic_active" msgid="5766614241012047024">"Mikrofonen er aktiv"</string> - <string name="app_accessed_mic" msgid="2754428675130470196">"%1$s fikk tilgang til mikrofonen din"</string> + <string name="app_accessed_mic" msgid="2754428675130470196">"%1$s brukte mikrofonen din"</string> </resources> diff --git a/packages/SystemUI/res/values-pl/strings_tv.xml b/packages/SystemUI/res/values-pl/strings_tv.xml index 852ea5056460..5921aa7a9963 100644 --- a/packages/SystemUI/res/values-pl/strings_tv.xml +++ b/packages/SystemUI/res/values-pl/strings_tv.xml @@ -24,5 +24,5 @@ <string name="pip_close" msgid="5775212044472849930">"Zamknij PIP"</string> <string name="pip_fullscreen" msgid="3877997489869475181">"Pełny ekran"</string> <string name="mic_active" msgid="5766614241012047024">"Mikrofon aktywny"</string> - <string name="app_accessed_mic" msgid="2754428675130470196">"Aplikacja %1$s uzyskała dostęp do mikrofonu"</string> + <string name="app_accessed_mic" msgid="2754428675130470196">"Aplikacja %1$s korzystała z mikrofonu"</string> </resources> diff --git a/packages/SystemUI/res/values-sv/strings_tv.xml b/packages/SystemUI/res/values-sv/strings_tv.xml index cf40057a005a..64d61621b001 100644 --- a/packages/SystemUI/res/values-sv/strings_tv.xml +++ b/packages/SystemUI/res/values-sv/strings_tv.xml @@ -24,5 +24,5 @@ <string name="pip_close" msgid="5775212044472849930">"Stäng PIP"</string> <string name="pip_fullscreen" msgid="3877997489869475181">"Helskärm"</string> <string name="mic_active" msgid="5766614241012047024">"Mikrofonen är aktiv"</string> - <string name="app_accessed_mic" msgid="2754428675130470196">"%1$s har fått åtkomst till mikrofonen"</string> + <string name="app_accessed_mic" msgid="2754428675130470196">"%1$s har använt mikrofonen"</string> </resources> diff --git a/packages/SystemUI/res/values-zh-rHK/strings_tv.xml b/packages/SystemUI/res/values-zh-rHK/strings_tv.xml index 1cd63144b904..3cf2b43ed1ff 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings_tv.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings_tv.xml @@ -24,5 +24,5 @@ <string name="pip_close" msgid="5775212044472849930">"關閉 PIP"</string> <string name="pip_fullscreen" msgid="3877997489869475181">"全螢幕"</string> <string name="mic_active" msgid="5766614241012047024">"麥克風已啟用"</string> - <string name="app_accessed_mic" msgid="2754428675130470196">"「%1$s」已存取您的麥克風"</string> + <string name="app_accessed_mic" msgid="2754428675130470196">"%1$s 曾存取您的麥克風"</string> </resources> diff --git a/packages/Tethering/apex/Android.bp b/packages/Tethering/apex/Android.bp index 67097a79e5c0..05243749f765 100644 --- a/packages/Tethering/apex/Android.bp +++ b/packages/Tethering/apex/Android.bp @@ -19,6 +19,7 @@ apex { updatable: true, min_sdk_version: "current", java_libs: ["framework-tethering"], + bpfs: ["offload.o"], apps: ["Tethering"], manifest: "manifest.json", key: "com.android.tethering.key", diff --git a/packages/Tethering/apex/manifest.json b/packages/Tethering/apex/manifest.json index 538ffb3ad6e4..8836c4e50333 100644 --- a/packages/Tethering/apex/manifest.json +++ b/packages/Tethering/apex/manifest.json @@ -1,4 +1,4 @@ { "name": "com.android.tethering", - "version": 300000000 + "version": 300900700 } diff --git a/packages/Tethering/bpf_progs/Android.bp b/packages/Tethering/bpf_progs/Android.bp new file mode 100644 index 000000000000..d54f86148665 --- /dev/null +++ b/packages/Tethering/bpf_progs/Android.bp @@ -0,0 +1,33 @@ +// +// Copyright (C) 2020 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +// +// bpf kernel programs +// +bpf { + name: "offload.o", + srcs: ["offload.c"], + cflags: [ + "-Wall", + "-Werror", + ], + include_dirs: [ + // TODO: get rid of system/netd. + "system/netd/bpf_progs", // for bpf_net_helpers.h + "system/netd/libnetdbpf/include", // for bpf_shared.h + "system/netd/libnetdutils/include", // for UidConstants.h + ], +} diff --git a/packages/Tethering/bpf_progs/offload.c b/packages/Tethering/bpf_progs/offload.c new file mode 100644 index 000000000000..cc5af3127b02 --- /dev/null +++ b/packages/Tethering/bpf_progs/offload.c @@ -0,0 +1,207 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <linux/if.h> +#include <linux/ip.h> +#include <linux/ipv6.h> +#include <linux/pkt_cls.h> +#include <linux/tcp.h> + +#include "bpf_helpers.h" +#include "bpf_net_helpers.h" +#include "netdbpf/bpf_shared.h" + +DEFINE_BPF_MAP_GRW(tether_ingress_map, HASH, TetherIngressKey, TetherIngressValue, 64, + AID_NETWORK_STACK) + +// Tethering stats, indexed by upstream interface. +DEFINE_BPF_MAP_GRW(tether_stats_map, HASH, uint32_t, TetherStatsValue, 16, AID_NETWORK_STACK) + +// Tethering data limit, indexed by upstream interface. +// (tethering allowed when stats[iif].rxBytes + stats[iif].txBytes < limit[iif]) +DEFINE_BPF_MAP_GRW(tether_limit_map, HASH, uint32_t, uint64_t, 16, AID_NETWORK_STACK) + +static inline __always_inline int do_forward(struct __sk_buff* skb, bool is_ethernet) { + int l2_header_size = is_ethernet ? sizeof(struct ethhdr) : 0; + void* data = (void*)(long)skb->data; + const void* data_end = (void*)(long)skb->data_end; + struct ethhdr* eth = is_ethernet ? data : NULL; // used iff is_ethernet + struct ipv6hdr* ip6 = is_ethernet ? (void*)(eth + 1) : data; + + // Must be meta-ethernet IPv6 frame + if (skb->protocol != htons(ETH_P_IPV6)) return TC_ACT_OK; + + // Must have (ethernet and) ipv6 header + if (data + l2_header_size + sizeof(*ip6) > data_end) return TC_ACT_OK; + + // Ethertype - if present - must be IPv6 + if (is_ethernet && (eth->h_proto != htons(ETH_P_IPV6))) return TC_ACT_OK; + + // IP version must be 6 + if (ip6->version != 6) return TC_ACT_OK; + + // Cannot decrement during forward if already zero or would be zero, + // Let the kernel's stack handle these cases and generate appropriate ICMP errors. + if (ip6->hop_limit <= 1) return TC_ACT_OK; + + // Protect against forwarding packets sourced from ::1 or fe80::/64 or other weirdness. + __be32 src32 = ip6->saddr.s6_addr32[0]; + if (src32 != htonl(0x0064ff9b) && // 64:ff9b:/32 incl. XLAT464 WKP + (src32 & htonl(0xe0000000)) != htonl(0x20000000)) // 2000::/3 Global Unicast + return TC_ACT_OK; + + TetherIngressKey k = { + .iif = skb->ifindex, + .neigh6 = ip6->daddr, + }; + + TetherIngressValue* v = bpf_tether_ingress_map_lookup_elem(&k); + + // If we don't find any offload information then simply let the core stack handle it... + if (!v) return TC_ACT_OK; + + uint32_t stat_and_limit_k = skb->ifindex; + + TetherStatsValue* stat_v = bpf_tether_stats_map_lookup_elem(&stat_and_limit_k); + + // If we don't have anywhere to put stats, then abort... + if (!stat_v) return TC_ACT_OK; + + uint64_t* limit_v = bpf_tether_limit_map_lookup_elem(&stat_and_limit_k); + + // If we don't have a limit, then abort... + if (!limit_v) return TC_ACT_OK; + + // Required IPv6 minimum mtu is 1280, below that not clear what we should do, abort... + const int pmtu = v->pmtu; + if (pmtu < IPV6_MIN_MTU) return TC_ACT_OK; + + // Approximate handling of TCP/IPv6 overhead for incoming LRO/GRO packets: default + // outbound path mtu of 1500 is not necessarily correct, but worst case we simply + // undercount, which is still better then not accounting for this overhead at all. + // Note: this really shouldn't be device/path mtu at all, but rather should be + // derived from this particular connection's mss (ie. from gro segment size). + // This would require a much newer kernel with newer ebpf accessors. + // (This is also blindly assuming 12 bytes of tcp timestamp option in tcp header) + uint64_t packets = 1; + uint64_t bytes = skb->len; + if (bytes > pmtu) { + const int tcp_overhead = sizeof(struct ipv6hdr) + sizeof(struct tcphdr) + 12; + const int mss = pmtu - tcp_overhead; + const uint64_t payload = bytes - tcp_overhead; + packets = (payload + mss - 1) / mss; + bytes = tcp_overhead * packets + payload; + } + + // Are we past the limit? If so, then abort... + // Note: will not overflow since u64 is 936 years even at 5Gbps. + // Do not drop here. Offload is just that, whenever we fail to handle + // a packet we let the core stack deal with things. + // (The core stack needs to handle limits correctly anyway, + // since we don't offload all traffic in both directions) + if (stat_v->rxBytes + stat_v->txBytes + bytes > *limit_v) return TC_ACT_OK; + + if (!is_ethernet) { + is_ethernet = true; + l2_header_size = sizeof(struct ethhdr); + // Try to inject an ethernet header, and simply return if we fail + if (bpf_skb_change_head(skb, l2_header_size, /*flags*/ 0)) { + __sync_fetch_and_add(&stat_v->rxErrors, 1); + return TC_ACT_OK; + } + + // bpf_skb_change_head() invalidates all pointers - reload them + data = (void*)(long)skb->data; + data_end = (void*)(long)skb->data_end; + eth = data; + ip6 = (void*)(eth + 1); + + // I do not believe this can ever happen, but keep the verifier happy... + if (data + l2_header_size + sizeof(*ip6) > data_end) { + __sync_fetch_and_add(&stat_v->rxErrors, 1); + return TC_ACT_SHOT; + } + }; + + // CHECKSUM_COMPLETE is a 16-bit one's complement sum, + // thus corrections for it need to be done in 16-byte chunks at even offsets. + // IPv6 nexthdr is at offset 6, while hop limit is at offset 7 + uint8_t old_hl = ip6->hop_limit; + --ip6->hop_limit; + uint8_t new_hl = ip6->hop_limit; + + // bpf_csum_update() always succeeds if the skb is CHECKSUM_COMPLETE and returns an error + // (-ENOTSUPP) if it isn't. + bpf_csum_update(skb, 0xFFFF - ntohs(old_hl) + ntohs(new_hl)); + + __sync_fetch_and_add(&stat_v->rxPackets, packets); + __sync_fetch_and_add(&stat_v->rxBytes, bytes); + + // Overwrite any mac header with the new one + *eth = v->macHeader; + + // Redirect to forwarded interface. + // + // Note that bpf_redirect() cannot fail unless you pass invalid flags. + // The redirect actually happens after the ebpf program has already terminated, + // and can fail for example for mtu reasons at that point in time, but there's nothing + // we can do about it here. + return bpf_redirect(v->oif, 0 /* this is effectively BPF_F_EGRESS */); +} + +SEC("schedcls/ingress/tether_ether") +int sched_cls_ingress_tether_ether(struct __sk_buff* skb) { + return do_forward(skb, true); +} + +// Note: section names must be unique to prevent programs from appending to each other, +// so instead the bpf loader will strip everything past the final $ symbol when actually +// pinning the program into the filesystem. +// +// bpf_skb_change_head() is only present on 4.14+ and 2 trivial kernel patches are needed: +// ANDROID: net: bpf: Allow TC programs to call BPF_FUNC_skb_change_head +// ANDROID: net: bpf: permit redirect from ingress L3 to egress L2 devices at near max mtu +// (the first of those has already been upstreamed) +// +// 5.4 kernel support was only added to Android Common Kernel in R, +// and thus a 5.4 kernel always supports this. +// +// Hence, this mandatory (must load successfully) implementation for 5.4+ kernels: +DEFINE_BPF_PROG_KVER("schedcls/ingress/tether_rawip$5_4", AID_ROOT, AID_ROOT, + sched_cls_ingress_tether_rawip_5_4, KVER(5, 4, 0)) +(struct __sk_buff* skb) { + return do_forward(skb, false); +} + +// and this identical optional (may fail to load) implementation for [4.14..5.4) patched kernels: +DEFINE_OPTIONAL_BPF_PROG_KVER_RANGE("schedcls/ingress/tether_rawip$4_14", AID_ROOT, AID_ROOT, + sched_cls_ingress_tether_rawip_4_14, KVER(4, 14, 0), + KVER(5, 4, 0)) +(struct __sk_buff* skb) { + return do_forward(skb, false); +} + +// and define a no-op stub for [4.9,4.14) and unpatched [4.14,5.4) kernels. +// (if the above real 4.14+ program loaded successfully, then bpfloader will have already pinned +// it at the same location this one would be pinned at and will thus skip loading this stub) +DEFINE_BPF_PROG_KVER_RANGE("schedcls/ingress/tether_rawip$stub", AID_ROOT, AID_ROOT, + sched_cls_ingress_tether_rawip_stub, KVER_NONE, KVER(5, 4, 0)) +(struct __sk_buff* skb) { + return TC_ACT_OK; +} + +LICENSE("Apache 2.0"); +CRITICAL("netd"); diff --git a/services/core/java/com/android/server/BluetoothManagerService.java b/services/core/java/com/android/server/BluetoothManagerService.java index 2e4d44cef416..bb567b4e2c78 100644 --- a/services/core/java/com/android/server/BluetoothManagerService.java +++ b/services/core/java/com/android/server/BluetoothManagerService.java @@ -412,7 +412,8 @@ class BluetoothManagerService extends IBluetoothManager.Stub { if (BluetoothAdapter.ACTION_LOCAL_NAME_CHANGED.equals(action)) { String newName = intent.getStringExtra(BluetoothAdapter.EXTRA_LOCAL_NAME); if (DBG) { - Slog.d(TAG, "Bluetooth Adapter name changed to " + newName); + Slog.d(TAG, "Bluetooth Adapter name changed to " + newName + " by " + + mContext.getPackageName()); } if (newName != null) { storeNameAndAddress(newName, null); diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index aeb8fbb1b3e6..8a1baf25481b 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -5875,10 +5875,6 @@ public class ConnectivityService extends IConnectivityManager.Stub return nai == getDefaultNetwork(); } - private boolean isDefaultRequest(NetworkRequestInfo nri) { - return nri.request.requestId == mDefaultRequest.requestId; - } - // TODO : remove this method. It's a stopgap measure to help sheperding a number of dependent // changes that would conflict throughout the automerger graph. Having this method temporarily // helps with the process of going through with all these dependent changes across the entire diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java index 6eab0221b7ab..42af4dabc92b 100644 --- a/services/core/java/com/android/server/appop/AppOpsService.java +++ b/services/core/java/com/android/server/appop/AppOpsService.java @@ -1786,9 +1786,9 @@ public class AppOpsService extends IAppOpsService.Stub { } } } - - mHistoricalRegistry.clearHistory(uid, packageName); } + + mHistoricalRegistry.clearHistory(uid, packageName); } public void uidRemoved(int uid) { diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java index 5484bfca5851..9817abfec4bd 100644 --- a/services/core/java/com/android/server/connectivity/Vpn.java +++ b/services/core/java/com/android/server/connectivity/Vpn.java @@ -256,8 +256,8 @@ public class Vpn { @GuardedBy("this") private final Set<UidRange> mBlockedUidsAsToldToNetd = new ArraySet<>(); - // Handle of the user initiating VPN. - private final int mUserHandle; + // The user id of initiating VPN. + private final int mUserId; interface RetryScheduler { void checkInterruptAndDelay(boolean sleepLonger) throws InterruptedException; @@ -384,26 +384,26 @@ public class Vpn { } public Vpn(Looper looper, Context context, INetworkManagementService netService, - @UserIdInt int userHandle, @NonNull KeyStore keyStore) { - this(looper, context, new Dependencies(), netService, userHandle, keyStore, + @UserIdInt int userId, @NonNull KeyStore keyStore) { + this(looper, context, new Dependencies(), netService, userId, keyStore, new SystemServices(context), new Ikev2SessionCreator()); } @VisibleForTesting protected Vpn(Looper looper, Context context, Dependencies deps, INetworkManagementService netService, - int userHandle, @NonNull KeyStore keyStore, SystemServices systemServices, + int userId, @NonNull KeyStore keyStore, SystemServices systemServices, Ikev2SessionCreator ikev2SessionCreator) { mContext = context; mDeps = deps; mNetd = netService; - mUserHandle = userHandle; + mUserId = userId; mLooper = looper; mSystemServices = systemServices; mIkev2SessionCreator = ikev2SessionCreator; mPackage = VpnConfig.LEGACY_VPN; - mOwnerUID = getAppUid(mPackage, mUserHandle); + mOwnerUID = getAppUid(mPackage, mUserId); mIsPackageTargetingAtLeastQ = doesPackageTargetAtLeastQ(mPackage); try { @@ -613,7 +613,7 @@ public class Vpn { PackageManager pm = mContext.getPackageManager(); ApplicationInfo appInfo = null; try { - appInfo = pm.getApplicationInfoAsUser(packageName, 0 /*flags*/, mUserHandle); + appInfo = pm.getApplicationInfoAsUser(packageName, 0 /*flags*/, mUserId); } catch (NameNotFoundException unused) { Log.w(TAG, "Can't find \"" + packageName + "\" when checking always-on support"); } @@ -624,7 +624,7 @@ public class Vpn { final Intent intent = new Intent(VpnConfig.SERVICE_INTERFACE); intent.setPackage(packageName); List<ResolveInfo> services = - pm.queryIntentServicesAsUser(intent, PackageManager.GET_META_DATA, mUserHandle); + pm.queryIntentServicesAsUser(intent, PackageManager.GET_META_DATA, mUserId); if (services == null || services.size() == 0) { return false; } @@ -769,12 +769,12 @@ public class Vpn { final long token = Binder.clearCallingIdentity(); try { mSystemServices.settingsSecurePutStringForUser(Settings.Secure.ALWAYS_ON_VPN_APP, - getAlwaysOnPackage(), mUserHandle); + getAlwaysOnPackage(), mUserId); mSystemServices.settingsSecurePutIntForUser(Settings.Secure.ALWAYS_ON_VPN_LOCKDOWN, - (mAlwaysOn && mLockdown ? 1 : 0), mUserHandle); + (mAlwaysOn && mLockdown ? 1 : 0), mUserId); mSystemServices.settingsSecurePutStringForUser( LOCKDOWN_ALLOWLIST_SETTING_NAME, - String.join(",", mLockdownAllowlist), mUserHandle); + String.join(",", mLockdownAllowlist), mUserId); } finally { Binder.restoreCallingIdentity(token); } @@ -786,11 +786,11 @@ public class Vpn { final long token = Binder.clearCallingIdentity(); try { final String alwaysOnPackage = mSystemServices.settingsSecureGetStringForUser( - Settings.Secure.ALWAYS_ON_VPN_APP, mUserHandle); + Settings.Secure.ALWAYS_ON_VPN_APP, mUserId); final boolean alwaysOnLockdown = mSystemServices.settingsSecureGetIntForUser( - Settings.Secure.ALWAYS_ON_VPN_LOCKDOWN, 0 /*default*/, mUserHandle) != 0; + Settings.Secure.ALWAYS_ON_VPN_LOCKDOWN, 0 /*default*/, mUserId) != 0; final String allowlistString = mSystemServices.settingsSecureGetStringForUser( - LOCKDOWN_ALLOWLIST_SETTING_NAME, mUserHandle); + LOCKDOWN_ALLOWLIST_SETTING_NAME, mUserId); final List<String> allowedPackages = TextUtils.isEmpty(allowlistString) ? Collections.emptyList() : Arrays.asList(allowlistString.split(",")); setAlwaysOnPackageInternal( @@ -850,13 +850,13 @@ public class Vpn { DeviceIdleInternal idleController = LocalServices.getService(DeviceIdleInternal.class); idleController.addPowerSaveTempWhitelistApp(Process.myUid(), alwaysOnPackage, - VPN_LAUNCH_IDLE_ALLOWLIST_DURATION_MS, mUserHandle, false, "vpn"); + VPN_LAUNCH_IDLE_ALLOWLIST_DURATION_MS, mUserId, false, "vpn"); // Start the VPN service declared in the app's manifest. Intent serviceIntent = new Intent(VpnConfig.SERVICE_INTERFACE); serviceIntent.setPackage(alwaysOnPackage); try { - return mContext.startServiceAsUser(serviceIntent, UserHandle.of(mUserHandle)) != null; + return mContext.startServiceAsUser(serviceIntent, UserHandle.of(mUserId)) != null; } catch (RuntimeException e) { Log.e(TAG, "VpnService " + serviceIntent + " failed to start", e); return false; @@ -958,7 +958,7 @@ public class Vpn { // We can't just check that packageName matches mPackage, because if the app was uninstalled // and reinstalled it will no longer be prepared. Similarly if there is a shared UID, the // calling package may not be the same as the prepared package. Check both UID and package. - return getAppUid(packageName, mUserHandle) == mOwnerUID && mPackage.equals(packageName); + return getAppUid(packageName, mUserId) == mOwnerUID && mPackage.equals(packageName); } /** Prepare the VPN for the given package. Does not perform permission checks. */ @@ -998,7 +998,7 @@ public class Vpn { Log.i(TAG, "Switched from " + mPackage + " to " + newPackage); mPackage = newPackage; - mOwnerUID = getAppUid(newPackage, mUserHandle); + mOwnerUID = getAppUid(newPackage, mUserId); mIsPackageTargetingAtLeastQ = doesPackageTargetAtLeastQ(newPackage); try { mNetd.allowProtect(mOwnerUID); @@ -1019,7 +1019,7 @@ public class Vpn { // Check if the caller is authorized. enforceControlPermissionOrInternalCaller(); - final int uid = getAppUid(packageName, mUserHandle); + final int uid = getAppUid(packageName, mUserId); if (uid == -1 || VpnConfig.LEGACY_VPN.equals(packageName)) { // Authorization for nonexistent packages (or fake ones) can't be updated. return false; @@ -1095,14 +1095,14 @@ public class Vpn { || isVpnServicePreConsented(context, packageName); } - private int getAppUid(final String app, final int userHandle) { + private int getAppUid(final String app, final int userId) { if (VpnConfig.LEGACY_VPN.equals(app)) { return Process.myUid(); } PackageManager pm = mContext.getPackageManager(); return Binder.withCleanCallingIdentity(() -> { try { - return pm.getPackageUidAsUser(app, userHandle); + return pm.getPackageUidAsUser(app, userId); } catch (NameNotFoundException e) { return -1; } @@ -1116,7 +1116,7 @@ public class Vpn { PackageManager pm = mContext.getPackageManager(); try { ApplicationInfo appInfo = - pm.getApplicationInfoAsUser(packageName, 0 /*flags*/, mUserHandle); + pm.getApplicationInfoAsUser(packageName, 0 /*flags*/, mUserId); return appInfo.targetSdkVersion >= VERSION_CODES.Q; } catch (NameNotFoundException unused) { Log.w(TAG, "Can't find \"" + packageName + "\""); @@ -1241,7 +1241,7 @@ public class Vpn { mNetworkCapabilities.setOwnerUid(mOwnerUID); mNetworkCapabilities.setAdministratorUids(new int[] {mOwnerUID}); - mNetworkCapabilities.setUids(createUserAndRestrictedProfilesRanges(mUserHandle, + mNetworkCapabilities.setUids(createUserAndRestrictedProfilesRanges(mUserId, mConfig.allowedApplications, mConfig.disallowedApplications)); long token = Binder.clearCallingIdentity(); try { @@ -1315,7 +1315,7 @@ public class Vpn { enforceNotRestrictedUser(); ResolveInfo info = AppGlobals.getPackageManager().resolveService(intent, - null, 0, mUserHandle); + null, 0, mUserId); if (info == null) { throw new SecurityException("Cannot find " + config.user); } @@ -1352,7 +1352,7 @@ public class Vpn { Connection connection = new Connection(); if (!mContext.bindServiceAsUser(intent, connection, Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE, - new UserHandle(mUserHandle))) { + new UserHandle(mUserId))) { throw new IllegalStateException("Cannot bind " + config.user); } @@ -1427,10 +1427,10 @@ public class Vpn { } // Note: Return type guarantees results are deduped and sorted, which callers require. - private SortedSet<Integer> getAppsUids(List<String> packageNames, int userHandle) { + private SortedSet<Integer> getAppsUids(List<String> packageNames, int userId) { SortedSet<Integer> uids = new TreeSet<>(); for (String app : packageNames) { - int uid = getAppUid(app, userHandle); + int uid = getAppUid(app, userId); if (uid != -1) uids.add(uid); } return uids; @@ -1444,22 +1444,22 @@ public class Vpn { * the UID ranges will match the app list specified there. Otherwise, all UIDs * in each user and profile will be included. * - * @param userHandle The userId to create UID ranges for along with any of its restricted + * @param userId The userId to create UID ranges for along with any of its restricted * profiles. * @param allowedApplications (optional) List of applications to allow. * @param disallowedApplications (optional) List of applications to deny. */ @VisibleForTesting - Set<UidRange> createUserAndRestrictedProfilesRanges(@UserIdInt int userHandle, + Set<UidRange> createUserAndRestrictedProfilesRanges(@UserIdInt int userId, @Nullable List<String> allowedApplications, @Nullable List<String> disallowedApplications) { final Set<UidRange> ranges = new ArraySet<>(); // Assign the top-level user to the set of ranges - addUserToRanges(ranges, userHandle, allowedApplications, disallowedApplications); + addUserToRanges(ranges, userId, allowedApplications, disallowedApplications); // If the user can have restricted profiles, assign all its restricted profiles too - if (canHaveRestrictedProfile(userHandle)) { + if (canHaveRestrictedProfile(userId)) { final long token = Binder.clearCallingIdentity(); List<UserInfo> users; try { @@ -1468,7 +1468,7 @@ public class Vpn { Binder.restoreCallingIdentity(token); } for (UserInfo user : users) { - if (user.isRestricted() && (user.restrictedProfileParentId == userHandle)) { + if (user.isRestricted() && (user.restrictedProfileParentId == userId)) { addUserToRanges(ranges, user.id, allowedApplications, disallowedApplications); } } @@ -1485,18 +1485,18 @@ public class Vpn { * in the user will be included. * * @param ranges {@link Set} of {@link UidRange}s to which to add. - * @param userHandle The userId to add to {@param ranges}. + * @param userId The userId to add to {@param ranges}. * @param allowedApplications (optional) allowlist of applications to include. * @param disallowedApplications (optional) denylist of applications to exclude. */ @VisibleForTesting - void addUserToRanges(@NonNull Set<UidRange> ranges, @UserIdInt int userHandle, + void addUserToRanges(@NonNull Set<UidRange> ranges, @UserIdInt int userId, @Nullable List<String> allowedApplications, @Nullable List<String> disallowedApplications) { if (allowedApplications != null) { // Add ranges covering all UIDs for allowedApplications. int start = -1, stop = -1; - for (int uid : getAppsUids(allowedApplications, userHandle)) { + for (int uid : getAppsUids(allowedApplications, userId)) { if (start == -1) { start = uid; } else if (uid != stop + 1) { @@ -1508,9 +1508,9 @@ public class Vpn { if (start != -1) ranges.add(new UidRange(start, stop)); } else if (disallowedApplications != null) { // Add all ranges for user skipping UIDs for disallowedApplications. - final UidRange userRange = UidRange.createForUser(userHandle); + final UidRange userRange = UidRange.createForUser(userId); int start = userRange.start; - for (int uid : getAppsUids(disallowedApplications, userHandle)) { + for (int uid : getAppsUids(disallowedApplications, userId)) { if (uid == start) { start++; } else { @@ -1521,16 +1521,16 @@ public class Vpn { if (start <= userRange.stop) ranges.add(new UidRange(start, userRange.stop)); } else { // Add all UIDs for the user. - ranges.add(UidRange.createForUser(userHandle)); + ranges.add(UidRange.createForUser(userId)); } } // Returns the subset of the full list of active UID ranges the VPN applies to (mVpnUsers) that - // apply to userHandle. - static private List<UidRange> uidRangesForUser(int userHandle, Set<UidRange> existingRanges) { + // apply to userId. + private static List<UidRange> uidRangesForUser(int userId, Set<UidRange> existingRanges) { // UidRange#createForUser returns the entire range of UIDs available to a macro-user. // This is something like 0-99999 ; {@see UserHandle#PER_USER_RANGE} - final UidRange userRange = UidRange.createForUser(userHandle); + final UidRange userRange = UidRange.createForUser(userId); final List<UidRange> ranges = new ArrayList<>(); for (UidRange range : existingRanges) { if (userRange.containsRange(range)) { @@ -1545,15 +1545,15 @@ public class Vpn { * * <p>Should be called on primary ConnectivityService thread. */ - public void onUserAdded(int userHandle) { + public void onUserAdded(int userId) { // If the user is restricted tie them to the parent user's VPN - UserInfo user = UserManager.get(mContext).getUserInfo(userHandle); - if (user.isRestricted() && user.restrictedProfileParentId == mUserHandle) { + UserInfo user = UserManager.get(mContext).getUserInfo(userId); + if (user.isRestricted() && user.restrictedProfileParentId == mUserId) { synchronized(Vpn.this) { final Set<UidRange> existingRanges = mNetworkCapabilities.getUids(); if (existingRanges != null) { try { - addUserToRanges(existingRanges, userHandle, mConfig.allowedApplications, + addUserToRanges(existingRanges, userId, mConfig.allowedApplications, mConfig.disallowedApplications); // ConnectivityService will call {@link #updateCapabilities} and apply // those for VPN network. @@ -1572,16 +1572,16 @@ public class Vpn { * * <p>Should be called on primary ConnectivityService thread. */ - public void onUserRemoved(int userHandle) { + public void onUserRemoved(int userId) { // clean up if restricted - UserInfo user = UserManager.get(mContext).getUserInfo(userHandle); - if (user.isRestricted() && user.restrictedProfileParentId == mUserHandle) { + UserInfo user = UserManager.get(mContext).getUserInfo(userId); + if (user.isRestricted() && user.restrictedProfileParentId == mUserId) { synchronized(Vpn.this) { final Set<UidRange> existingRanges = mNetworkCapabilities.getUids(); if (existingRanges != null) { try { final List<UidRange> removedRanges = - uidRangesForUser(userHandle, existingRanges); + uidRangesForUser(userId, existingRanges); existingRanges.removeAll(removedRanges); // ConnectivityService will call {@link #updateCapabilities} and // apply those for VPN network. @@ -1639,7 +1639,7 @@ public class Vpn { final Set<UidRange> rangesToTellNetdToAdd; if (enforce) { final Set<UidRange> rangesThatShouldBeBlocked = - createUserAndRestrictedProfilesRanges(mUserHandle, + createUserAndRestrictedProfilesRanges(mUserId, /* allowedApplications */ null, /* disallowedApplications */ exemptedPackages); @@ -1909,7 +1909,7 @@ public class Vpn { private void updateAlwaysOnNotification(DetailedState networkState) { final boolean visible = (mAlwaysOn && networkState != DetailedState.CONNECTED); - final UserHandle user = UserHandle.of(mUserHandle); + final UserHandle user = UserHandle.of(mUserId); final long token = Binder.clearCallingIdentity(); try { final NotificationManager notificationManager = NotificationManager.from(mContext); @@ -2019,7 +2019,7 @@ public class Vpn { private void enforceNotRestrictedUser() { Binder.withCleanCallingIdentity(() -> { final UserManager mgr = UserManager.get(mContext); - final UserInfo user = mgr.getUserInfo(mUserHandle); + final UserInfo user = mgr.getUserInfo(mUserId); if (user.isRestricted()) { throw new SecurityException("Restricted users cannot configure VPNs"); @@ -2054,9 +2054,9 @@ public class Vpn { public void startLegacyVpnPrivileged(VpnProfile profile, KeyStore keyStore, LinkProperties egress) { UserManager mgr = UserManager.get(mContext); - UserInfo user = mgr.getUserInfo(mUserHandle); + UserInfo user = mgr.getUserInfo(mUserId); if (user.isRestricted() || mgr.hasUserRestriction(UserManager.DISALLOW_CONFIG_VPN, - new UserHandle(mUserHandle))) { + new UserHandle(mUserId))) { throw new SecurityException("Restricted users cannot establish VPNs"); } @@ -2984,14 +2984,14 @@ public class Vpn { } private void verifyCallingUidAndPackage(String packageName) { - if (getAppUid(packageName, mUserHandle) != Binder.getCallingUid()) { + if (getAppUid(packageName, mUserId) != Binder.getCallingUid()) { throw new SecurityException("Mismatched package and UID"); } } @VisibleForTesting String getProfileNameForPackage(String packageName) { - return Credentials.PLATFORM_VPN + mUserHandle + "_" + packageName; + return Credentials.PLATFORM_VPN + mUserId + "_" + packageName; } @VisibleForTesting diff --git a/services/core/java/com/android/server/hdmi/HdmiCecMessageValidator.java b/services/core/java/com/android/server/hdmi/HdmiCecMessageValidator.java index 0b4f31d365d3..28bd97e4843c 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecMessageValidator.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecMessageValidator.java @@ -117,14 +117,15 @@ public class HdmiCecMessageValidator { // TODO: Validate more than length for the following messages. // Messages for the One Touch Record. - FixedLengthValidator oneByteValidator = new FixedLengthValidator(1); addValidationInfo(Constants.MESSAGE_RECORD_ON, new VariableLengthValidator(1, 8), DEST_DIRECT); - addValidationInfo(Constants.MESSAGE_RECORD_STATUS, oneByteValidator, DEST_DIRECT); + addValidationInfo(Constants.MESSAGE_RECORD_STATUS, + new RecordStatusInfoValidator(), DEST_DIRECT); // TODO: Handle messages for the Timer Programming. // Messages for the System Information. + FixedLengthValidator oneByteValidator = new FixedLengthValidator(1); addValidationInfo(Constants.MESSAGE_CEC_VERSION, oneByteValidator, DEST_DIRECT); addValidationInfo(Constants.MESSAGE_SET_MENU_LANGUAGE, new FixedLengthValidator(3), DEST_BROADCAST); @@ -339,4 +340,23 @@ public class HdmiCecMessageValidator { isValidPhysicalAddress(params, 0) && isValidPhysicalAddress(params, 2)); } } + + /** + * Check if the given record status message parameter is valid. + * A valid parameter should lie within the range description of Record Status Info defined in + * CEC 1.4 Specification : Operand Descriptions (Section 17) + */ + private class RecordStatusInfoValidator implements ParameterValidator { + @Override + public int isValid(byte[] params) { + if (params.length < 1) { + return ERROR_PARAMETER_SHORT; + } + return toErrorCode(isWithinRange(params[0], 0x01, 0x07) + || isWithinRange(params[0], 0x09, 0x0E) + || isWithinRange(params[0], 0x10, 0x17) + || isWithinRange(params[0], 0x1A, 0x1B) + || params[0] == 0x1F); + } + } } diff --git a/telecomm/java/android/telecom/DisconnectCause.java b/telecomm/java/android/telecom/DisconnectCause.java index bebbbd01fd88..f7fe1ba1f998 100644 --- a/telecomm/java/android/telecom/DisconnectCause.java +++ b/telecomm/java/android/telecom/DisconnectCause.java @@ -16,6 +16,7 @@ package android.telecom; +import android.annotation.SystemApi; import android.media.ToneGenerator; import android.os.Parcel; import android.os.Parcelable; @@ -80,21 +81,26 @@ public final class DisconnectCause implements Parcelable { * Reason code (returned via {@link #getReason()}) which indicates that a call could not be * completed because the cellular radio is off or out of service, the device is connected to * a wifi network, but the user has not enabled wifi calling. - * @hide */ public static final String REASON_WIFI_ON_BUT_WFC_OFF = "REASON_WIFI_ON_BUT_WFC_OFF"; /** * Reason code (returned via {@link #getReason()}), which indicates that the video telephony * call was disconnected because IMS access is blocked. - * @hide */ public static final String REASON_IMS_ACCESS_BLOCKED = "REASON_IMS_ACCESS_BLOCKED"; /** - * Reason code, which indicates that the conference call is simulating single party conference. + * Reason code (returned via {@link #getReason()}), which indicates that the connection service + * is setting the call's state to {@link Call#STATE_DISCONNECTED} because it is internally + * changing the representation of an IMS conference call to simulate a single-party call. + * + * This reason code is only used for communication between a {@link ConnectionService} and + * Telecom and should not be surfaced to the user. + * * @hide */ + @SystemApi public static final String REASON_EMULATING_SINGLE_CALL = "EMULATING_SINGLE_CALL"; /** diff --git a/telecomm/java/android/telecom/PhoneAccount.java b/telecomm/java/android/telecom/PhoneAccount.java index 768c8eebf067..c20e5ad8ce7c 100644 --- a/telecomm/java/android/telecom/PhoneAccount.java +++ b/telecomm/java/android/telecom/PhoneAccount.java @@ -48,11 +48,15 @@ import java.util.Objects; public final class PhoneAccount implements Parcelable { /** - * {@link PhoneAccount} extras key (see {@link PhoneAccount#getExtras()}) which determines the - * sort order for {@link PhoneAccount}s from the same - * {@link android.telecom.ConnectionService}. + * String extra which determines the order in which {@link PhoneAccount}s are sorted + * + * This is an extras key set via {@link Builder#setExtras} which determines the order in which + * {@link PhoneAccount}s from the same {@link ConnectionService} are sorted. The accounts + * are sorted by this key via standard lexicographical order, and this ordering is used to + * determine priority when a call can be placed via multiple accounts. * @hide */ + @SystemApi public static final String EXTRA_SORT_ORDER = "android.telecom.extra.SORT_ORDER"; @@ -85,8 +89,7 @@ public final class PhoneAccount implements Parcelable { /** * Boolean {@link PhoneAccount} extras key (see {@link PhoneAccount#getExtras()}) which * indicates that all calls from this {@link PhoneAccount} should be treated as VoIP calls - * rather than cellular calls. - * @hide + * rather than cellular calls by the Telecom audio handling logic. */ public static final String EXTRA_ALWAYS_USE_VOIP_AUDIO_MODE = "android.telecom.extra.ALWAYS_USE_VOIP_AUDIO_MODE"; @@ -160,6 +163,7 @@ public final class PhoneAccount implements Parcelable { * in progress. * @hide */ + @SystemApi public static final String EXTRA_PLAY_CALL_RECORDING_TONE = "android.telecom.extra.PLAY_CALL_RECORDING_TONE"; @@ -254,6 +258,7 @@ public final class PhoneAccount implements Parcelable { * See {@link #getCapabilities} * @hide */ + @SystemApi public static final int CAPABILITY_EMERGENCY_CALLS_ONLY = 0x80; /** @@ -277,6 +282,7 @@ public final class PhoneAccount implements Parcelable { * convert all outgoing video calls to emergency numbers to audio-only. * @hide */ + @SystemApi public static final int CAPABILITY_EMERGENCY_VIDEO_CALLING = 0x200; /** @@ -323,9 +329,9 @@ public final class PhoneAccount implements Parcelable { /** * Flag indicating that this {@link PhoneAccount} is the preferred SIM subscription for - * emergency calls. A {@link PhoneAccount} that sets this capabilitiy must also + * emergency calls. A {@link PhoneAccount} that sets this capability must also * set the {@link #CAPABILITY_SIM_SUBSCRIPTION} and {@link #CAPABILITY_PLACE_EMERGENCY_CALLS} - * capabilities. There should only be one emergency preferred {@link PhoneAccount}. + * capabilities. There must only be one emergency preferred {@link PhoneAccount} on the device. * <p> * When set, Telecom will prefer this {@link PhoneAccount} over others for emergency calling, * even if the emergency call was placed with a specific {@link PhoneAccount} set using the @@ -334,6 +340,7 @@ public final class PhoneAccount implements Parcelable { * * @hide */ + @SystemApi public static final int CAPABILITY_EMERGENCY_PREFERRED = 0x2000; /** diff --git a/telecomm/java/android/telecom/TelecomManager.java b/telecomm/java/android/telecom/TelecomManager.java index bcb1736f416e..1f3740b76d1c 100644 --- a/telecomm/java/android/telecom/TelecomManager.java +++ b/telecomm/java/android/telecom/TelecomManager.java @@ -322,6 +322,7 @@ public class TelecomManager { * the remote handle of the new call. * @hide */ + @SystemApi public static final String EXTRA_UNKNOWN_CALL_HANDLE = "android.telecom.extra.UNKNOWN_CALL_HANDLE"; @@ -392,6 +393,7 @@ public class TelecomManager { * </ul> * @hide */ + @SystemApi public static final String EXTRA_CALL_TECHNOLOGY_TYPE = "android.telecom.extra.CALL_TECHNOLOGY_TYPE"; @@ -728,17 +730,22 @@ public class TelecomManager { public static final int TTY_MODE_VCO = 3; /** - * Broadcast intent action indicating that the current TTY mode has changed. An intent extra - * provides this state as an int. + * Broadcast intent action indicating that the current TTY mode has changed. * - * @see #EXTRA_CURRENT_TTY_MODE + * This intent will contain {@link #EXTRA_CURRENT_TTY_MODE} as an intent extra, giving the new + * TTY mode. * @hide */ + @TestApi + @SystemApi public static final String ACTION_CURRENT_TTY_MODE_CHANGED = "android.telecom.action.CURRENT_TTY_MODE_CHANGED"; /** - * The lookup key for an int that indicates the current TTY mode. + * Integer extra key that indicates the current TTY mode. + * + * Used with {@link #ACTION_CURRENT_TTY_MODE_CHANGED}. + * * Valid modes are: * <ul> * <li>{@link #TTY_MODE_OFF}</li> @@ -746,28 +753,45 @@ public class TelecomManager { * <li>{@link #TTY_MODE_HCO}</li> * <li>{@link #TTY_MODE_VCO}</li> * </ul> + * + * This TTY mode is distinct from the one sent via {@link #ACTION_TTY_PREFERRED_MODE_CHANGED}, + * since the current TTY mode will always be {@link #TTY_MODE_OFF}unless a TTY terminal is + * plugged into the device. * @hide */ + @TestApi + @SystemApi public static final String EXTRA_CURRENT_TTY_MODE = "android.telecom.extra.CURRENT_TTY_MODE"; /** - * Broadcast intent action indicating that the TTY preferred operating mode has changed. An - * intent extra provides the new mode as an int. + * Broadcast intent action indicating that the TTY preferred operating mode has changed. * - * @see #EXTRA_TTY_PREFERRED_MODE + * This intent will contain {@link #EXTRA_TTY_PREFERRED_MODE} as an intent extra, giving the new + * preferred TTY mode. * @hide */ + @TestApi + @SystemApi public static final String ACTION_TTY_PREFERRED_MODE_CHANGED = "android.telecom.action.TTY_PREFERRED_MODE_CHANGED"; /** - * The lookup key for an int that indicates preferred TTY mode. Valid modes are: - - * {@link #TTY_MODE_OFF} - {@link #TTY_MODE_FULL} - {@link #TTY_MODE_HCO} - - * {@link #TTY_MODE_VCO} + * Integer extra key that indicates the preferred TTY mode. + * + * Used with {@link #ACTION_TTY_PREFERRED_MODE_CHANGED}. * + * Valid modes are: + * <ul> + * <li>{@link #TTY_MODE_OFF}</li> + * <li>{@link #TTY_MODE_FULL}</li> + * <li>{@link #TTY_MODE_HCO}</li> + * <li>{@link #TTY_MODE_VCO}</li> + * </ul> * @hide */ + @TestApi + @SystemApi public static final String EXTRA_TTY_PREFERRED_MODE = "android.telecom.extra.TTY_PREFERRED_MODE"; @@ -843,8 +867,10 @@ public class TelecomManager { * {@link TelecomManager#CALL_SOURCE_EMERGENCY_DIALPAD}, * {@link TelecomManager#CALL_SOURCE_EMERGENCY_SHORTCUT}. * + * Intended for use with the platform emergency dialer only. * @hide */ + @SystemApi public static final String EXTRA_CALL_SOURCE = "android.telecom.extra.CALL_SOURCE"; /** @@ -852,6 +878,7 @@ public class TelecomManager { * * @hide */ + @SystemApi public static final int CALL_SOURCE_EMERGENCY_SHORTCUT = 2; /** @@ -859,6 +886,7 @@ public class TelecomManager { * * @hide */ + @SystemApi public static final int CALL_SOURCE_EMERGENCY_DIALPAD = 1; /** @@ -866,6 +894,7 @@ public class TelecomManager { * * @hide */ + @SystemApi public static final int CALL_SOURCE_UNSPECIFIED = 0; /** diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index c9781545a9eb..f2dae237b627 100755 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -32,6 +32,7 @@ import android.os.RemoteException; import android.service.carrier.CarrierService; import android.telecom.TelecomManager; import android.telephony.ims.ImsReasonInfo; +import android.telephony.ims.ImsSsData; import com.android.internal.telephony.ICarrierConfigLoader; import com.android.telephony.Rlog; @@ -66,6 +67,18 @@ public class CarrierConfigManager { public static final String EXTRA_SUBSCRIPTION_INDEX = SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX; + /** + * Service class flag if no specific service class is specified. + * Reference: 3GPP TS 27.007 Section 7.4 Facility lock +CLCK + */ + public static final int SERVICE_CLASS_NONE = ImsSsData.SERVICE_CLASS_NONE; + + /** + * Service class flag for voice telephony. + * Reference: 3GPP TS 27.007 Section 7.4 Facility lock +CLCK + */ + public static final int SERVICE_CLASS_VOICE = ImsSsData.SERVICE_CLASS_VOICE; + private final Context mContext; /** @@ -212,6 +225,18 @@ public class CarrierConfigManager { "call_barring_supports_deactivate_all_bool"; /** + * Specifies the service class for call barring service. Default value is + * {@link #SERVICE_CLASS_VOICE}. + * The value set as below: + * <ul> + * <li>0: {@link #SERVICE_CLASS_NONE}</li> + * <li>1: {@link #SERVICE_CLASS_VOICE}</li> + * </ul> + */ + public static final String KEY_CALL_BARRING_DEFAULT_SERVICE_CLASS_INT = + "call_barring_default_service_class_int"; + + /** * Flag indicating whether the Phone app should ignore EVENT_SIM_NETWORK_LOCKED * events from the Sim. * If true, this will prevent the IccNetworkDepersonalizationPanel from being shown, and @@ -3880,10 +3905,23 @@ public class CarrierConfigManager { * Indicating whether DUN APN should be disabled when the device is roaming. In that case, * the default APN (i.e. internet) will be used for tethering. * + * This config is only available when using Preset APN(not user edited) as Preferred APN. + * + * @hide + */ + public static final String KEY_DISABLE_DUN_APN_WHILE_ROAMING_WITH_PRESET_APN_BOOL = + "disable_dun_apn_while_roaming_with_preset_apn_bool"; + + /** + * Where there is no preferred APN, specifies the carrier's default preferred APN. + * Specifies the {@link android.provider.Telephony.Carriers.APN} of the default preferred apn. + * + * This config is only available with Preset APN(not user edited). + * * @hide */ - public static final String KEY_DISABLE_DUN_APN_WHILE_ROAMING = - "disable_dun_apn_while_roaming"; + public static final String KEY_DEFAULT_PREFERRED_APN_NAME_STRING = + "default_preferred_apn_name_string"; /** The default value for every variable. */ private final static PersistableBundle sDefaults; @@ -3959,6 +3997,7 @@ public class CarrierConfigManager { sDefaults.putBoolean(KEY_CALL_BARRING_VISIBILITY_BOOL, false); sDefaults.putBoolean(KEY_CALL_BARRING_SUPPORTS_PASSWORD_CHANGE_BOOL, true); sDefaults.putBoolean(KEY_CALL_BARRING_SUPPORTS_DEACTIVATE_ALL_BOOL, true); + sDefaults.putInt(KEY_CALL_BARRING_DEFAULT_SERVICE_CLASS_INT, SERVICE_CLASS_VOICE); sDefaults.putBoolean(KEY_CALL_FORWARDING_VISIBILITY_BOOL, true); sDefaults.putBoolean(KEY_CALL_FORWARDING_WHEN_UNREACHABLE_SUPPORTED_BOOL, true); sDefaults.putBoolean(KEY_CALL_FORWARDING_WHEN_UNANSWERED_SUPPORTED_BOOL, true); @@ -4422,7 +4461,8 @@ public class CarrierConfigManager { "ims:2", "cbs:2", "ia:2", "emergency:2", "mcx:3", "xcap:3" }); sDefaults.putStringArray(KEY_MISSED_INCOMING_CALL_SMS_PATTERN_STRING_ARRAY, new String[0]); - sDefaults.putBoolean(KEY_DISABLE_DUN_APN_WHILE_ROAMING, false); + sDefaults.putBoolean(KEY_DISABLE_DUN_APN_WHILE_ROAMING_WITH_PRESET_APN_BOOL, false); + sDefaults.putString(KEY_DEFAULT_PREFERRED_APN_NAME_STRING, ""); } /** diff --git a/telephony/java/android/telephony/ims/ImsService.java b/telephony/java/android/telephony/ims/ImsService.java index 2b3072eefe2e..da7311c08307 100644 --- a/telephony/java/android/telephony/ims/ImsService.java +++ b/telephony/java/android/telephony/ims/ImsService.java @@ -137,18 +137,30 @@ public class ImsService extends Service { } @Override - public IImsMmTelFeature createMmTelFeature(int slotId, IImsFeatureStatusCallback c) { - return createMmTelFeatureInternal(slotId, c); + public IImsMmTelFeature createMmTelFeature(int slotId) { + return createMmTelFeatureInternal(slotId); } @Override - public IImsRcsFeature createRcsFeature(int slotId, IImsFeatureStatusCallback c) { - return createRcsFeatureInternal(slotId, c); + public IImsRcsFeature createRcsFeature(int slotId) { + return createRcsFeatureInternal(slotId); } @Override - public void removeImsFeature(int slotId, int featureType, IImsFeatureStatusCallback c) { - ImsService.this.removeImsFeature(slotId, featureType, c); + public void addFeatureStatusCallback(int slotId, int featureType, + IImsFeatureStatusCallback c) { + ImsService.this.addImsFeatureStatusCallback(slotId, featureType, c); + } + + @Override + public void removeFeatureStatusCallback(int slotId, int featureType, + IImsFeatureStatusCallback c) { + ImsService.this.removeImsFeatureStatusCallback(slotId, featureType, c); + } + + @Override + public void removeImsFeature(int slotId, int featureType) { + ImsService.this.removeImsFeature(slotId, featureType); } @Override @@ -204,11 +216,10 @@ public class ImsService extends Service { return mFeaturesBySlot.get(slotId); } - private IImsMmTelFeature createMmTelFeatureInternal(int slotId, - IImsFeatureStatusCallback c) { + private IImsMmTelFeature createMmTelFeatureInternal(int slotId) { MmTelFeature f = createMmTelFeature(slotId); if (f != null) { - setupFeature(f, slotId, ImsFeature.FEATURE_MMTEL, c); + setupFeature(f, slotId, ImsFeature.FEATURE_MMTEL); return f.getBinder(); } else { Log.e(LOG_TAG, "createMmTelFeatureInternal: null feature returned."); @@ -216,11 +227,10 @@ public class ImsService extends Service { } } - private IImsRcsFeature createRcsFeatureInternal(int slotId, - IImsFeatureStatusCallback c) { + private IImsRcsFeature createRcsFeatureInternal(int slotId) { RcsFeature f = createRcsFeature(slotId); if (f != null) { - setupFeature(f, slotId, ImsFeature.FEATURE_RCS, c); + setupFeature(f, slotId, ImsFeature.FEATURE_RCS); return f.getBinder(); } else { Log.e(LOG_TAG, "createRcsFeatureInternal: null feature returned."); @@ -228,13 +238,45 @@ public class ImsService extends Service { } } - private void setupFeature(ImsFeature f, int slotId, int featureType, - IImsFeatureStatusCallback c) { + private void setupFeature(ImsFeature f, int slotId, int featureType) { f.initialize(this, slotId); - f.addImsFeatureStatusCallback(c); addImsFeature(slotId, featureType, f); } + private void addImsFeatureStatusCallback(int slotId, int featureType, + IImsFeatureStatusCallback c) { + synchronized (mFeaturesBySlot) { + // get ImsFeature associated with the slot/feature + SparseArray<ImsFeature> features = mFeaturesBySlot.get(slotId); + if (features == null) { + Log.w(LOG_TAG, "Can not add ImsFeatureStatusCallback - no features on slot " + + slotId); + return; + } + ImsFeature f = features.get(featureType); + if (f != null) { + f.addImsFeatureStatusCallback(c); + } + } + } + + private void removeImsFeatureStatusCallback(int slotId, int featureType, + IImsFeatureStatusCallback c) { + synchronized (mFeaturesBySlot) { + // get ImsFeature associated with the slot/feature + SparseArray<ImsFeature> features = mFeaturesBySlot.get(slotId); + if (features == null) { + Log.w(LOG_TAG, "Can not remove ImsFeatureStatusCallback - no features on slot " + + slotId); + return; + } + ImsFeature f = features.get(featureType); + if (f != null) { + f.removeImsFeatureStatusCallback(c); + } + } + } + private void addImsFeature(int slotId, int featureType, ImsFeature f) { synchronized (mFeaturesBySlot) { // Get SparseArray for Features, by querying slot Id @@ -248,8 +290,7 @@ public class ImsService extends Service { } } - private void removeImsFeature(int slotId, int featureType, - IImsFeatureStatusCallback c) { + private void removeImsFeature(int slotId, int featureType) { synchronized (mFeaturesBySlot) { // get ImsFeature associated with the slot/feature SparseArray<ImsFeature> features = mFeaturesBySlot.get(slotId); @@ -264,7 +305,6 @@ public class ImsService extends Service { + featureType + " exists on slot " + slotId); return; } - f.removeImsFeatureStatusCallback(c); f.onFeatureRemoved(); features.remove(featureType); } diff --git a/telephony/java/android/telephony/ims/aidl/IImsServiceController.aidl b/telephony/java/android/telephony/ims/aidl/IImsServiceController.aidl index c7da681b86a3..c956cbcc816c 100644 --- a/telephony/java/android/telephony/ims/aidl/IImsServiceController.aidl +++ b/telephony/java/android/telephony/ims/aidl/IImsServiceController.aidl @@ -31,12 +31,14 @@ import com.android.ims.internal.IImsFeatureStatusCallback; */ interface IImsServiceController { void setListener(IImsServiceControllerListener l); - IImsMmTelFeature createMmTelFeature(int slotId, in IImsFeatureStatusCallback c); - IImsRcsFeature createRcsFeature(int slotId, in IImsFeatureStatusCallback c); + IImsMmTelFeature createMmTelFeature(int slotId); + IImsRcsFeature createRcsFeature(int slotId); ImsFeatureConfiguration querySupportedImsFeatures(); + void addFeatureStatusCallback(int slotId, int featureType, in IImsFeatureStatusCallback c); + void removeFeatureStatusCallback(int slotId, int featureType, in IImsFeatureStatusCallback c); // Synchronous call to ensure the ImsService is ready before continuing with feature creation. void notifyImsServiceReadyForFeatureCreation(); - void removeImsFeature(int slotId, int featureType, in IImsFeatureStatusCallback c); + void removeImsFeature(int slotId, int featureType); IImsConfig getConfig(int slotId); IImsRegistration getRegistration(int slotId); oneway void enableIms(int slotId); diff --git a/telephony/java/android/telephony/ims/compat/ImsService.java b/telephony/java/android/telephony/ims/compat/ImsService.java index eafbb14539f5..41d1d726b3f4 100644 --- a/telephony/java/android/telephony/ims/compat/ImsService.java +++ b/telephony/java/android/telephony/ims/compat/ImsService.java @@ -21,7 +21,6 @@ import android.app.Service; import android.compat.annotation.UnsupportedAppUsage; import android.content.Intent; import android.os.IBinder; -import android.os.RemoteException; import android.telephony.CarrierConfigManager; import android.telephony.ims.compat.feature.ImsFeature; import android.telephony.ims.compat.feature.MMTelFeature; @@ -91,25 +90,35 @@ public class ImsService extends Service { protected final IBinder mImsServiceController = new IImsServiceController.Stub() { @Override - public IImsMMTelFeature createEmergencyMMTelFeature(int slotId, - IImsFeatureStatusCallback c) { - return createEmergencyMMTelFeatureInternal(slotId, c); + public IImsMMTelFeature createEmergencyMMTelFeature(int slotId) { + return createEmergencyMMTelFeatureInternal(slotId); } @Override - public IImsMMTelFeature createMMTelFeature(int slotId, IImsFeatureStatusCallback c) { - return createMMTelFeatureInternal(slotId, c); + public IImsMMTelFeature createMMTelFeature(int slotId) { + return createMMTelFeatureInternal(slotId); } @Override - public IImsRcsFeature createRcsFeature(int slotId, IImsFeatureStatusCallback c) { - return createRcsFeatureInternal(slotId, c); + public IImsRcsFeature createRcsFeature(int slotId) { + return createRcsFeatureInternal(slotId); } @Override - public void removeImsFeature(int slotId, int featureType, IImsFeatureStatusCallback c) - throws RemoteException { - ImsService.this.removeImsFeature(slotId, featureType, c); + public void removeImsFeature(int slotId, int featureType) { + ImsService.this.removeImsFeature(slotId, featureType); + } + + @Override + public void addFeatureStatusCallback(int slotId, int featureType, + IImsFeatureStatusCallback c) { + addImsFeatureStatusCallback(slotId, featureType, c); + } + + @Override + public void removeFeatureStatusCallback(int slotId, int featureType, + IImsFeatureStatusCallback c) { + removeImsFeatureStatusCallback(slotId, featureType, c); } }; @@ -137,46 +146,40 @@ public class ImsService extends Service { return mFeaturesBySlot.get(slotId); } - private IImsMMTelFeature createEmergencyMMTelFeatureInternal(int slotId, - IImsFeatureStatusCallback c) { + private IImsMMTelFeature createEmergencyMMTelFeatureInternal(int slotId) { MMTelFeature f = onCreateEmergencyMMTelImsFeature(slotId); if (f != null) { - setupFeature(f, slotId, ImsFeature.EMERGENCY_MMTEL, c); + setupFeature(f, slotId, ImsFeature.EMERGENCY_MMTEL); return f.getBinder(); } else { return null; } } - private IImsMMTelFeature createMMTelFeatureInternal(int slotId, - IImsFeatureStatusCallback c) { + private IImsMMTelFeature createMMTelFeatureInternal(int slotId) { MMTelFeature f = onCreateMMTelImsFeature(slotId); if (f != null) { - setupFeature(f, slotId, ImsFeature.MMTEL, c); + setupFeature(f, slotId, ImsFeature.MMTEL); return f.getBinder(); } else { return null; } } - private IImsRcsFeature createRcsFeatureInternal(int slotId, - IImsFeatureStatusCallback c) { + private IImsRcsFeature createRcsFeatureInternal(int slotId) { RcsFeature f = onCreateRcsFeature(slotId); if (f != null) { - setupFeature(f, slotId, ImsFeature.RCS, c); + setupFeature(f, slotId, ImsFeature.RCS); return f.getBinder(); } else { return null; } } - private void setupFeature(ImsFeature f, int slotId, int featureType, - IImsFeatureStatusCallback c) { + private void setupFeature(ImsFeature f, int slotId, int featureType) { f.setContext(this); f.setSlotId(slotId); - f.addImsFeatureStatusCallback(c); addImsFeature(slotId, featureType, f); - // TODO: Remove once new onFeatureReady AIDL is merged in. f.onFeatureReady(); } @@ -193,12 +196,45 @@ public class ImsService extends Service { } } - private void removeImsFeature(int slotId, int featureType, + private void addImsFeatureStatusCallback(int slotId, int featureType, + IImsFeatureStatusCallback c) { + synchronized (mFeaturesBySlot) { + // get ImsFeature associated with the slot/feature + SparseArray<ImsFeature> features = mFeaturesBySlot.get(slotId); + if (features == null) { + Log.w(LOG_TAG, "Can not add ImsFeatureStatusCallback. No ImsFeatures exist on" + + " slot " + slotId); + return; + } + ImsFeature f = features.get(featureType); + if (f != null) { + f.addImsFeatureStatusCallback(c); + } + } + } + + private void removeImsFeatureStatusCallback(int slotId, int featureType, IImsFeatureStatusCallback c) { synchronized (mFeaturesBySlot) { // get ImsFeature associated with the slot/feature SparseArray<ImsFeature> features = mFeaturesBySlot.get(slotId); if (features == null) { + Log.w(LOG_TAG, "Can not remove ImsFeatureStatusCallback. No ImsFeatures exist on" + + " slot " + slotId); + return; + } + ImsFeature f = features.get(featureType); + if (f != null) { + f.removeImsFeatureStatusCallback(c); + } + } + } + + private void removeImsFeature(int slotId, int featureType) { + synchronized (mFeaturesBySlot) { + // get ImsFeature associated with the slot/feature + SparseArray<ImsFeature> features = mFeaturesBySlot.get(slotId); + if (features == null) { Log.w(LOG_TAG, "Can not remove ImsFeature. No ImsFeatures exist on slot " + slotId); return; @@ -209,7 +245,6 @@ public class ImsService extends Service { + featureType + " exists on slot " + slotId); return; } - f.removeImsFeatureStatusCallback(c); f.onFeatureRemoved(); features.remove(featureType); } diff --git a/telephony/java/com/android/ims/internal/IImsServiceController.aidl b/telephony/java/com/android/ims/internal/IImsServiceController.aidl index 857089fac33a..e9528f474082 100644 --- a/telephony/java/com/android/ims/internal/IImsServiceController.aidl +++ b/telephony/java/com/android/ims/internal/IImsServiceController.aidl @@ -25,8 +25,10 @@ import com.android.ims.internal.IImsRcsFeature; * {@hide} */ interface IImsServiceController { - IImsMMTelFeature createEmergencyMMTelFeature(int slotId, in IImsFeatureStatusCallback c); - IImsMMTelFeature createMMTelFeature(int slotId, in IImsFeatureStatusCallback c); - IImsRcsFeature createRcsFeature(int slotId, in IImsFeatureStatusCallback c); - void removeImsFeature(int slotId, int featureType, in IImsFeatureStatusCallback c); + IImsMMTelFeature createEmergencyMMTelFeature(int slotId); + IImsMMTelFeature createMMTelFeature(int slotId); + IImsRcsFeature createRcsFeature(int slotId); + void removeImsFeature(int slotId, int featureType); + void addFeatureStatusCallback(int slotId, int featureType, in IImsFeatureStatusCallback c); + void removeFeatureStatusCallback(int slotId, int featureType, in IImsFeatureStatusCallback c); } diff --git a/tools/aapt2/DominatorTree_test.cpp b/tools/aapt2/DominatorTree_test.cpp index fe4f951a5cd0..3e49034310c3 100644 --- a/tools/aapt2/DominatorTree_test.cpp +++ b/tools/aapt2/DominatorTree_test.cpp @@ -173,4 +173,30 @@ TEST(DominatorTreeTest, LocalesAreNeverDominated) { EXPECT_EQ(expected, printer.ToString(&tree)); } +TEST(DominatorTreeTest, NonZeroDensitiesMatch) { + const ConfigDescription sw600_config = test::ParseConfigOrDie("sw600dp"); + const ConfigDescription sw600_hdpi_config = test::ParseConfigOrDie("sw600dp-hdpi"); + const ConfigDescription sw800_hdpi_config = test::ParseConfigOrDie("sw800dp-hdpi"); + const ConfigDescription sw800_xxhdpi_config = test::ParseConfigOrDie("sw800dp-xxhdpi"); + + std::vector<std::unique_ptr<ResourceConfigValue>> configs; + configs.push_back(util::make_unique<ResourceConfigValue>(ConfigDescription::DefaultConfig(), "")); + configs.push_back(util::make_unique<ResourceConfigValue>(sw600_config, "")); + configs.push_back(util::make_unique<ResourceConfigValue>(sw600_hdpi_config, "")); + configs.push_back(util::make_unique<ResourceConfigValue>(sw800_hdpi_config, "")); + configs.push_back(util::make_unique<ResourceConfigValue>(sw800_xxhdpi_config, "")); + + DominatorTree tree(configs); + PrettyPrinter printer; + + std::string expected = + "<default>\n" + " sw600dp-v13\n" + " sw600dp-hdpi-v13\n" + " sw800dp-hdpi-v13\n" + " sw800dp-xxhdpi-v13\n"; + EXPECT_EQ(expected, printer.ToString(&tree)); +} + + } // namespace aapt diff --git a/tools/aapt2/Resource.cpp b/tools/aapt2/Resource.cpp index ae01170a6894..b78f48ce7f17 100644 --- a/tools/aapt2/Resource.cpp +++ b/tools/aapt2/Resource.cpp @@ -96,8 +96,6 @@ StringPiece to_string(ResourceType type) { return "styleable"; case ResourceType::kTransition: return "transition"; - case ResourceType::kUnknown: - return "unknown"; case ResourceType::kXml: return "xml"; } diff --git a/tools/aapt2/Resource.h b/tools/aapt2/Resource.h index c49c370bcc44..4e051a37f3ed 100644 --- a/tools/aapt2/Resource.h +++ b/tools/aapt2/Resource.h @@ -66,11 +66,6 @@ enum class ResourceType { kStyle, kStyleable, kTransition, - - // Not a parsed type. It is only used when loading resource tables that may have modified type - // names - kUnknown, - kXml, }; diff --git a/tools/aapt2/cmd/Link.cpp b/tools/aapt2/cmd/Link.cpp index 72cb41a1b172..fd12d02434fa 100644 --- a/tools/aapt2/cmd/Link.cpp +++ b/tools/aapt2/cmd/Link.cpp @@ -2335,11 +2335,15 @@ int LinkCommand::Action(const std::vector<std::string>& args) { } // Populate some default no-compress extensions that are already compressed. - options_.extensions_to_not_compress.insert( - {".jpg", ".jpeg", ".png", ".gif", ".wav", ".mp2", ".mp3", ".ogg", - ".aac", ".mpg", ".mpeg", ".mid", ".midi", ".smf", ".jet", ".rtttl", - ".imy", ".xmf", ".mp4", ".m4a", ".m4v", ".3gp", ".3gpp", ".3g2", - ".3gpp2", ".amr", ".awb", ".wma", ".wmv", ".webm", ".mkv"}); + options_.extensions_to_not_compress.insert({ + // Image extensions + ".jpg", ".jpeg", ".png", ".gif", ".webp", + // Audio extensions + ".wav", ".mp2", ".mp3", ".ogg", ".aac", ".mid", ".midi", ".smf", ".jet", ".rtttl", ".imy", + ".xmf", ".amr", ".awb", + // Audio/video extensions + ".mpg", ".mpeg", ".mp4", ".m4a", ".m4v", ".3gp", ".3gpp", ".3g2", ".3gpp2", ".wma", ".wmv", + ".webm", ".mkv"}); // Turn off auto versioning for static-libs. if (context.GetPackageType() == PackageType::kStaticLib) { diff --git a/tools/aapt2/format/binary/BinaryResourceParser.cpp b/tools/aapt2/format/binary/BinaryResourceParser.cpp index f362744c0942..cccd9faa9b39 100644 --- a/tools/aapt2/format/binary/BinaryResourceParser.cpp +++ b/tools/aapt2/format/binary/BinaryResourceParser.cpp @@ -352,15 +352,15 @@ bool BinaryResourceParser::ParseType(const ResourceTablePackage* package, config.copyFromDtoH(type->config); const std::string type_str = util::GetString(type_pool_, type->id - 1); - - // Be lenient on the name of the type if the table is lenient on resource validation. - auto parsed_type = ResourceType::kUnknown; - if (const ResourceType* parsed = ParseResourceType(type_str)) { - parsed_type = *parsed; - } else if (table_->GetValidateResources()) { - diag_->Error(DiagMessage(source_) << "invalid type name '" << type_str << "' for type with ID " - << (int) type->id); - return false; + const ResourceType* parsed_type = ParseResourceType(type_str); + if (!parsed_type) { + // Be lenient on the name of the type if the table is lenient on resource validation. + bool log_error = table_->GetValidateResources(); + if (log_error) { + diag_->Error(DiagMessage(source_) << "invalid type name '" << type_str + << "' for type with ID " << type->id); + } + return !log_error; } TypeVariant tv(type); @@ -370,9 +370,8 @@ bool BinaryResourceParser::ParseType(const ResourceTablePackage* package, continue; } - const ResourceName name(package->name, parsed_type, + const ResourceName name(package->name, *parsed_type, util::GetString(key_pool_, util::DeviceToHost32(entry->key.index))); - const ResourceId res_id(package->id.value(), type->id, static_cast<uint16_t>(it.index())); std::unique_ptr<Value> resource_value; diff --git a/wifi/OWNERS b/wifi/OWNERS index 0601047d7caa..c1c70e2eba6f 100644 --- a/wifi/OWNERS +++ b/wifi/OWNERS @@ -1,6 +1,6 @@ set noparent +dysu@google.com etancohen@google.com -mplass@google.com rpius@google.com satk@google.com |